Skocz do zawartości

Rodzic okna GMa


Rekomendowane odpowiedzi

Opublikowano

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ć : )

Opublikowano

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

Opublikowano

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 :<

Opublikowano

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.

Opublikowano

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).

Opublikowano

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.

Opublikowano

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

Opublikowano

A SetMenu nie podpina ?

Co dziwne, WM_COMMAND obsługuje.

 

E: No to w jaki sposób podpiąć to menu?

Opublikowano

Podpina. Jeśli WM_COMMAND obsługuje to w czym problem? Jak wolisz obsługiwać komunikat WM_MENUCOMMAND zamiast tamtego to dodaj styl MNS_NOTIFYBYPOS do głównego menu.

Opublikowano

A to mam umieścić w DLL_PROCESS_ATTACH?

Tak jak w aplikacji EXE się to umieszcza w WinMain.

Opublikowano

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.

Opublikowano

A, no dzięki wielkie ;) Temat jeszcze zostawię.

 

E: A w jaki sposób wyświetlić w MessageBox wartość zmiennej ClickedItem, jeśli jest ona liczbą?

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ę...