Dwa problemy z WinAPI


(K Szandarowski) #1

Witam po raz kolejny! Mam dwa problemy związane z oknem WinAPI pierwszy z nich to to, że nie mogę poradzić sobie z wstawieniem ikonki w menu a drugi z nich to obsługa menu za każdym razem wywala mi jakiś błąd. Albo ja nie w tym miejscu wkleiłem kod albo o czymś zapomniałem?

kod który wklejam do ikonki w menu:

HBITMAP hbmzakoncz = (HBITMAP)LoadImage(hThisInstance, "zakoncz.bmp",

IMAGE_BITMAP, 0,0, LR_LOADFROMFILE|LR_LOADTRANSPARENT);

SetMenuItemBitmaps(hMenu, 3, MF_BYCOMMAND, hbmzakoncz, hbmzakoncz);

tu wywala błąd: HBITMAP hbmzakoncz = (HBITMAP)LoadImage(hThisInstance, "zakoncz.bmp",

kod który wklejam do obsługi menu:

case WM_COMMAND:

{

if(LOWORD(wParam) == 3)

PostQuitMessage(0);

else

MessageBox(hwnd, "Dziękujemy za skorzystanie z naszego menu :stuck_out_tongue_winking_eye:",

"Zakończ", MB_ICONINFORMATION);

}

break;

tu wywala błąd: case WM_COMMAND:

A oto kod programu:

include

BOOL InitWindow();

LRESULT CALLBACK WndEventProc(HWND,UINT,WPARAM,LPARAM); // do komunikatów

LRESULT CloseWnd(HWND hwnd);//funkcja pyta się czy zamknąc program

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)

{

if(InitWindow()==FALSE) return 0;

MSG msg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

BOOL InitWindow()

{

//uchwyt programu pobrany za pomocą funkcji GetModuleHandle()

HINSTANCE hInstance=GetModuleHandle(0);

WNDCLASSEX wndcls;

char strClassName[]="Klasa okna programu";

wndcls.cbSize=sizeof(WNDCLASSEX);

wndcls.hInstance=hInstance;

wndcls.lpszClassName=strClassName;

wndcls.lpfnWndProc=WndEventProc;

wndcls.style=CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

wndcls.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(500));

wndcls.hIconSm=NULL;

wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);

wndcls.hbrBackground=(HBRUSH)COLOR_WINDOW;

wndcls.lpszMenuName="MENU_PROGRAMU";

wndcls.cbClsExtra=0;

wndcls.cbWndExtra=0;

if(RegisterClassEx(&wndcls))

{

HWND hwnd=CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_COMPOSITED,

strClassName,"www.awdc.yoyo.pl",WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE,

CW_USEDEFAULT,CW_USEDEFAULT,640,480,NULL,NULL,hInstance,NULL);

if(hwnd!=NULL) return TRUE;

//w przypadku błędu utworzenia okna, wyświetlenie treści błędu

else MessageBox(NULL,"Błąd tworzenia okna!.",NULL,MB_OK | MB_ICONERROR);

}

//w przypadku błędu rejestarcji klasy okna, wyświetlenie treści błędu

else MessageBox(NULL,"Błąd rejestarcji klasy!.",NULL,MB_OK | MB_ICONERROR);

return FALSE;

}

case WM_COMMAND:

{

if(LOWORD(wParam) == 3)

PostQuitMessage(0);

else

MessageBox(hwnd, "Dziękujemy za skorzystanie z naszego menu :stuck_out_tongue_winking_eye:",

"Zakończ", MB_ICONINFORMATION);

}

break;

HBITMAP hbmzakoncz = (HBITMAP)LoadImage(hThisInstance, "zakoncz.bmp",

IMAGE_BITMAP, 0,0, LR_LOADFROMFILE|LR_LOADTRANSPARENT);

SetMenuItemBitmaps(hMenu, 3, MF_BYCOMMAND, hbmzakoncz, hbmzakoncz);

LRESULT CALLBACK WndEventProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)

{

switch(msg)

{

case WM_CLOSE://obsługa komunikatu WM_CLOSE

return CloseWnd(hwnd);//obsługa tego zdarzenia-wykonuje się funckja CloseWnd

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd,msg,wParam,lParam);

}

return 0;

}

LRESULT CloseWnd(HWND hwnd)

{

int UserResult=MessageBox(hwnd,"Czy na pewno chcesz zakończyć i opuścić program?","www.awdc.yoyo.pl",MB_ICONEXCLAMATION | MB_YESNO);

if(UserResult==IDYES) DestroyWindow(hwnd);// użytkownik wybrał tak - zamykam

return 0;

}

Proszę o pomoc w rozwiązaniu tych problemów


(system) #2

Skąd u ciebie pojawiła się zmienna hMenu? Powinieneś albo stworzyć to menu przez CreateMenu lub pobrać adres systemowego menu przez GetMenu.


(K Szandarowski) #3

To co mam wstawić zamiast tej zmiennej hmenu? Menu jest stworzone w pliku zasobów i ono działa. A mnie chodzi o wyświetlenie w tym menu ikonki tak jak ma to np dev c++


(system) #4

Przecież napisałem GetMenu.