Ich komme mit Menüs nicht klar(GetMenu,Loadmenu,Resource.h etc.)
-
Ich schaffe das mit den menüs nicht. Ich habe mir den Artikel im Petzold schon x mal durchgelesen.
#include <windows.h> #include "resource.h" #define ID_EDIT 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (hInstance,MAKEINTRESOURCE(IDI_ICON)) ; wndclass.hCursor = LoadCursor (hInstance,MAKEINTRESOURCE(IDC_CURSOR)); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = TEXT("IDR_MENU1"); wndclass.lpszClassName = szAppName; if (!RegisterClass (&wndclass)) { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // Name der Fensterklasse TEXT ("Das erste echte Programm"), // Fenstertitel WS_OVERLAPPEDWINDOW, // Fensterstil CW_USEDEFAULT, // X-Position des Fensters CW_USEDEFAULT, // Y-Position des Fensters CW_USEDEFAULT, // Fensterbreite CW_USEDEFAULT, // Fensterhöhe NULL, // übergeordnetes Fenster NULL, // Menü hInstance, // Programm-Kopiezähler (Programm-ID) NULL) ; // zusätzliche Parameter ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; HMENU hMenu; static char szText[30]; static HWND hwndEdit; switch (message) { case WM_CREATE: //PlaySound ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; wsprintf(szText,"a"); hwndEdit = CreateWindow("edit",NULL, ES_LEFT|WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_BORDER| ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL, 0,0,0,0,hwnd,(HMENU) ID_EDIT, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));// stimmt das? return 0 ; case WM_SIZE: MoveWindow(hwndEdit,0,0,LOWORD(lParam)-500,HIWORD(lParam),TRUE); case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT (szText), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_COMMAND: hMenu = GetMenu(hwnd);//steht so im Petzold return 0; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by RESOURCE.RC // #define IDI_ICON 101 #define IDC_CURSOR 102 #define IDR_MENU1 103 #define ID_DATEI_BEENDEN 40001 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40002 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endifIch verstehe das nicht. Im Petzold wird nicht mal LoadMenu benutzt. Wenn ich das beispiel aus dem Petzold posten soll, dann sagt bescheid.
-
Du solltest
wndclass.lpszMenuName = TEXT("IDR_MENU1");durch
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);ersetzen...
-
hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));[quote"Compieler"]hInstance --- nicht declarierter Bezeichner[/quote]
-
"hInstance" ist in WinMain definiert... entweder Du machst jetzt eine globale Variable, wo Du diesen Wert speicherst, oder Du übergibst ihn eben...
-
Jochen Kalmbach schrieb:
"hInstance" ist in WinMain definiert... entweder Du machst jetzt eine globale Variable, wo Du diesen Wert speicherst, oder Du übergibst ihn eben...
wie mach ich das?
-
Vielleicht ganz einfach?
HMODULE g_hInstance; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { g_hInstance = hInstance;// ...
}
-
GetModuleHandle(NULL);
Ist meiner Meinung nach schöner, als globale Variablen...
-
Tc++H schrieb:
GetModuleHandle(NULL);
Ist meiner Meinung nach schöner, als globale Variablen...Da kann man sich drüber streiten...
Deine Lösung funktioniert nicht, wenn der Source in einer DLL steckt...Die "schönste" Lösung wäre es den passenden Funktionen/Klassen mitzugeben.
-
Herr Kalmbach,
ich bin ihnen zu ewigem Dank verpflichtet. Als Zeichen meiner Dankbarkeit wird ihr name absofort unter meinen artikeln stehen!
-
Leon++ schrieb:
Herr Kalmbach,
Normalerweise spricht man sich doch hier mit Vornamen oder Nick-Name an, oder?
Leon++ schrieb:
ich bin ihnen zu ewigem Dank verpflichtet. Als Zeichen meiner Dankbarkeit wird ihr name absofort unter meinen artikeln stehen!
Zu viel Ironie ist auch wieder schlecht...
