Skocz do zawartości

Rodzic okna GMa


Gość

Rekomendowane odpowiedzi

Witam :) Ostatnio po konwersacji z YXE, doszedł on do wniosku (i ja w sumie trochę też :D) że okno GMa - to w którym robimy gry - ma rodzica.

Czy jest to prawda? Ponieważ po utworzeniu własnej procedury, przypisaniu jej do okna GMa, ono nadal nie obsługuje zdarzeń (a przecież powinno).

Więc jeśli jest ten rodzic, to w jaki sposób pobrać jego uchwyt, aby to w nim podmienić procedurę?

Dodam, że pracuję w C++ i ta cała podmiana etc. dzieje się w DLLce.

 

Pozdrawiam.

 

E: Tu akurat Snake by się mógł wypowiedzieć : )

Odnośnik do komentarza
Udostępnij na innych stronach

Snake wlasnie powiedzial mi ze GM nie ma raczej zadnego rodzica a My zapomnielismy o jednym malym szczegole :> sprawdz czy z SetClassLong zadziala

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, już sprawdzam, skutki dam w edicie.

 

E: A ja czytając dokładnie opis funkcji SetWindowLong, doczytałem, że funkcja ta zwraca POPRZEDNIĄ wymaganą wartość (czyli u mnie GWL_WNDPROC).

I w ten sposób ustawiłem wpOrig :)

 

E2: Po użyciu SetClassLong jest tak samo - nie działa :<

Odnośnik do komentarza
Udostępnij na innych stronach

Coś musisz robić nie tak, mi działa bez problemu używając SetWindowLong. Napisałem dla testów coś takiego:

#include <windows.h>

WNDPROC g_procPrev;

LRESULT CALLBACK WndProc( HWND aWnd, UINT aMsg, WPARAM aWparam, LPARAM aLparam ) {
  char character[2] = {0};

  switch ( aMsg ) {
    case WM_CHAR:
      character[0] = (char) aWparam;
      MessageBoxA( aWnd, character, "", 0 );
      break;

    case WM_LBUTTONDOWN:
      MessageBoxA( aWnd, "Click.", "", 0 );
  }

  return CallWindowProc( g_procPrev, aWnd, aMsg, aWparam, aLparam );
}

extern "C" __declspec( dllexport ) double Subclass( double aHandle ) {
  g_procPrev = (WNDPROC) SetWindowLong( (HWND) (DWORD) aHandle, GWL_WNDPROC, (LONG) WndProc );
  return 0.0;
}

i jest ok.

Odnośnik do komentarza
Udostępnij na innych stronach

Może mi nie działa, bo ja używam uchwytu, który pobieram funkcją z DLLki.

Mam funkcję Box_Handle(double gmhWnd) i ona ustawia m_hWnd. Potem w tych callbackach używam m_hWnd (w oby dwóch, w moim i tym głównym).

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki Snake, Twoim sposobem podmieniła się procedura. Ale zauważyłem, że w ogóle nie działa WM_MENUCOMMAND.

Kiedy dam:

switch (uMsg)
{
case WM_MENUCOMMAND:
MessageBox(hWnd, "test", "test", 0);
break;
}

To zero reakcji.

Odnośnik do komentarza
Udostępnij na innych stronach

bo nie ma menu podpietego pod okno, dla tego nie odbiera tego komunikatu

Odnośnik do komentarza
Udostępnij na innych stronach

HMENU menuMain = CreateMenu();
MENUINFO menuInfo;

menuInfo.cbSize = sizeof( menuInfo );
menuInfo.fMask = MIM_STYLE;
GetMenuInfo( menuMain, &menuInfo );

menuInfo.dwStyle |= MNS_NOTIFYBYPOS;
SetMenuInfo( menuMain, &menuInfo );

Po utworzeniu menu za pomocą CreateMenu.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...