[WinApi] Procedura wyłapująca zdarzenia - nie inicjalizuje.

0

Witam. Nie wiem czemu, ale procedurka nie chce się zainicjalizować.
Kod:

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); //<- definicja

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lStart, INT nShow)
{
	WNDCLASS wnd;
	wnd.cbClsExtra    = 0;
	wnd.cbWndExtra    = 0;
	wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wnd.hCursor       = LoadCursor(0,IDC_ARROW);
	wnd.hIcon         = LoadIcon(0,IDI_APPLICATION);
	wnd.hInstance     = hInst;
	wnd.lpfnWndProc   = DefWindowProc;
	wnd.lpszClassName = L"Program";
	wnd.lpszMenuName  = 0;
	wnd.style         = CS_DBLCLKS;  
	RegisterClass(&wnd);

	hWnd = CreateWindow(L"Program",L"Okno",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,hInst,0);
	ShowWindow(hWnd,SW_SHOW);

    mybutton = CreateWindow(L"Button",L"Dupa jasiu",WS_CHILD,50,80,100,40,hWnd,NULL,NULL,hInst,0);
    ShowWindow(mybutton,SW_SHOW);

	MSG msg;
	while(GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) // Procedura
{
	MessageBox(hWnd,L"Test",L"Test",0);
	switch(msg)
	{
	    case WM_PAINT:
		{

		}
		case BN_CLICKED:
		{
			if(hWnd == mybutton)
			{
				MessageBox(hWnd,L"Kliknąłeś w 'uchwyt' mybutton",L"Fuck Yea ;)",MB_OK);
			}
		}
	    case WM_DESTROY:
		{
			PostQuitMessage(0);
		}
		default:
		{
			DefWindowProc(hWnd,msg,wParam,lParam);
		}
	}
	return 1;
}
0

wnd.lpfnWndProc = DefWindowProc; // zle
Tutaj podstawiasz wskaźnik do obsługi a więc WindowProcedure a nie domyślną .
I wywal ten MessageBox(hWnd,L"Test",L"Test",0); z początku WindowProcedure bo zablokujesz aplikacje .
Możesz wstawić do WM_CREATE lub jeśli na początek to jakiś Beep aby sprawdzić czy proc chodzi .
/*
PROGRAM ŚCIĄGNIĘTY ZE STRONY:
WWW.LISEK99.PRV.PL
*/

#include <windows.h>

LRESULT CALLBACK ProcOkna(HWND, UINT, WPARAM, LPARAM);

// Nazwa klasy rejestrowanej w systemie dla naszego okna
char nazwaKlasy[] = "nazwa1";

int WINAPI WinMain(HINSTANCE zad, HINSTANCE, LPSTR, int trybOkna)
{
  WNDCLASS klasaOkna;
  /* Wypełnij strukturę służącą do zarejestrowania klasy
  okna w systemie */
  klasaOkna.style = 0;
  klasaOkna.hInstance = zad;
  klasaOkna.lpszClassName = nazwaKlasy;
  klasaOkna.lpfnWndProc = ProcOkna;
  klasaOkna.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  klasaOkna.hCursor = LoadCursor(NULL, IDC_ARROW);
  klasaOkna.lpszMenuName = NULL;
  klasaOkna.cbClsExtra = 0;
  klasaOkna.cbWndExtra = 0;
  klasaOkna.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
  // Rejestruj okno w systemie
  if(!RegisterClass(&klasaOkna)) return 0;

  /* Stwórz okno o standardowym stylu oraz domyślnym
     położeniu i rozmiarach */
  HWND okno = CreateWindowEx(0,nazwaKlasy, "Mój program", 
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT,
                CW_USEDEFAULT, CW_USEDEFAULT,
                NULL, NULL, zad, NULL);

  // Wyświetl okno
  ShowWindow(okno, trybOkna);
  UpdateWindow(okno);

  MSG komunikat;
  /* Pętla komunikatów rozsyłająca komunikaty do
     odpowiednich okien */
  while(GetMessage(&komunikat, NULL, 0, 0))
  {
    TranslateMessage(&komunikat);
    DispatchMessage(&komunikat);
  }
  return komunikat.wParam;
}

// Procedura obsługi komunikatów
LRESULT CALLBACK ProcOkna(HWND okno, UINT komunikat, 
                           WPARAM wParam, LPARAM lParam)
{
  switch(komunikat)
  {
    case WM_CREATE:

    /*Tu można tworzyć przyciski i inne badziewia*/

     return 0;

    case WM_DESTROY:
      PostQuitMessage(0); /* zakończ program */
      return 0;

    default:
      return DefWindowProc(okno, komunikat, 
      wParam, lParam);
  }
}

Raczej obsłużony komunikat powinien powodować wyjście z procedury obsługi - czyli return 0 .
Tylko Komunikaty nie obsługiwane przez WindowProc maja trafić do DefWindowProc .

Luknij tutaj , mogą być problemy z Literałami string "L" zależnie od kompilatora ale to nie powinien byc problem
http://darkcult.nazwa.pl/wiki/index.php/WinAPI
W internecie ciężko znaleźć coś konkretnie napisanego o WinApi , wszystko jest dokładnie roz*ne .
Dlatego jeśli Cię to interesuje polecam jednak książkę np: http://www.ceneo.pl/14196

0

Z tego co zauważyłem to do rodzica definiuje się strukturę oraz rejestruje ją ustalając przy tym callback'a, który odbiera komunikaty głównego okna - rodzica. Jego dzieci tj. button,richtext itp.. nie są obsługiwane przez "ProcOkna"? Czy też właśnie argument "hWnd" w ProcOkna odbiera dane ze wszystkich uchwytów? Hmm, tak w ogóle dzięki za poświęcenie czasu, a jeśli chodzi o książkę to ja z reguły popieram praktykę, a nie teorię :P Korzystam z VS c++ 2010.

0

Człowieku nie zawracaj gitary jak cię to nie interesuje , praktyka bez teorii nie istnieje w tym temacie , komunikaty kontrolek są przesyłane przez parametry lParam i wParam w komunikacie WM_COMMAND ( a nie przez hWnd WndProc) :

    case WM_COMMAND:
      switch(HIWORD(wParam)) // wyodrębnienie komunikatu
      { //
 
          case BN_CLICKED:
          if((HWND)lParam == hWndButtona) // identyfikacja danego buttona
          { 
              /* cos tam */
          }

         // itd ... 

można rzutować lParam na hWnd danej kontrolki lub użyć identyfikatorów przy tworzeniu danej kontrolki CO MASZ W LINKACH które Ci podałem :
http://darkcult.nazwa.pl/wiki/index.php/Kontrolki
ps. I nie wystawiaj jezora bo to nie ładnie .

1 użytkowników online, w tym zalogowanych: 0, gości: 1