Fenster
-
Ich habe mir auch zwei verschiedene Callback Funktionen erstellt:
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // UND: LRESULT CALLBACK SecondWindow (HWND hWndSec, UINT message, WPARAM wParam, LPARAM lParam);Hab dann wndproc bei beiden Fenster so initialisiert:
wndEx.lpfnWndProc = WindowProc; // First-Window wndEx.lpfnWndProc = SecondWindow; // Second-Window
-
zeig mal die funktion secondwindow evtl. abkürzen.
-
LRESULT CALLBACK SecondWindow (HWND hWndSec, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (wParam) { case ID_BTN_BEENDEN2: PostQuitMessage (0); return 0; break; } } return (DefWindowProc (hWndSec, message, wParam, lParam)); }
-
meinst du mit schliessen im ersten beitrag den x knopf oben rechts oder den button? Beim Button solltest du das postquitmessage mal durch SendMessage(hWndSec, WM_CLOSE, 0, 0) ersetzen.
-
Oder einfach ein DestroyWindow!
-
Super, danke funktioniert. Hab ein Fenster ohne X-Button erstellt. Man kann es nur mit einem selbst erstellten Beenden Button schließen.

-
Eine Frage hab ich aber noch: Wenn ich jetz das zweite Fenster per Button schließe kann ich es kein zweites mal öffnen. Wenn ich den Button drücke, der das zweite Fenster erstellen soll, passiert nichts.

-
sorry ich versteh jetzt grad nicht ganz genau, wie dein programm aussieht...
wenn du das PostQuitMessage(0) in deiner SecondWindow Procedur durch ein DestroyWindow ersetzt hast, dann müsste sichs eigentlich auch ein zweites mal öffnen lassen...
Wenn nicht, dann müsste sich doch eigentlich nachm Drücken auf den Beenden Button, der wohl denk ich mal WM_COMMAND mit ID_BTN_BEENDEN aufruft, müsste sich das Programm ganz beenden, also auch das hauptfenster...
aber einfach dein code wärs beste...
-
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int ncmdshow) { HWND hWnd; MSG message; Steuerelemente s; hWnd = ParentWindow (hInst); s.Buttons (hWnd, hInst, "Beenden", ID_BTN_BEENDEN, 50, 420); s.Buttons (hWnd, hInst, "Extra>>>", ID_BTN_EXTRA, 200, 420); s.Buttons (hWnd, hInst, "Daten Speichern", ID_BTN_DATSAVE, 350, 420); s.Statics ("Datum", ID_STATIC, 10, 10, hWnd, hInst); while (GetMessage (&message, NULL, 0, 0)) { TranslateMessage (&message); DispatchMessage (&message); } return (int)(message.wParam); } LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HINSTANCE hInstance = NULL; Steuerelemente s; switch (message) { case WM_DESTROY: PostQuitMessage (0); return 0; break; case WM_COMMAND: switch (wParam) { case ID_BTN_BEENDEN: PostQuitMessage (0); return 0; break; case ID_BTN_DATSAVE: return 0; break; case ID_BTN_EXTRA: s.Extra_Window (); s.Extra_Button (); return 0; break; } } return (DefWindowProc (hWnd, message, wParam, lParam)); } HWND ParentWindow (HINSTANCE hInst) { // Wichtig WNDCLASSEX wndEx; HWND hWnd; // Füllen von WNDCLASSEX wndEx.cbSize = sizeof(WNDCLASSEX); wndEx.style = CS_HREDRAW | CS_VREDRAW; wndEx.lpfnWndProc = WindowProc; wndEx.cbClsExtra = 0; wndEx.cbWndExtra = 0; wndEx.hInstance = hInst; wndEx.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndEx.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wndEx.hCursor = LoadCursor (NULL, IDC_ARROW); wndEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND +1; wndEx.lpszMenuName = NULL; wndEx.lpszClassName = "1"; if(!RegisterClassEx (&wndEx) ) return (NULL); hWnd = CreateWindowEx (NULL, "1", "Geschäft", WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 520, 509, NULL, NULL, hInst, NULL); return (hWnd); } LRESULT CALLBACK SecondWindow (HWND hWndSec, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (wParam) { case ID_BTN_BEENDEN2: DestroyWindow (hWndSec); return 0; break; } } return (DefWindowProc (hWndSec, message, wParam, lParam)); } //////////////////////////////////////////////////////////////////////// // Klasse Steuerelemente HWND Steuerelemente::Extra_Window () { WNDCLASSEX wndEx; wndEx.cbSize = sizeof(WNDCLASSEX); wndEx.style = CS_HREDRAW | CS_VREDRAW; wndEx.lpfnWndProc = SecondWindow; wndEx.cbClsExtra = 0; wndEx.cbWndExtra = 0; wndEx.hInstance = hInstance; wndEx.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndEx.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wndEx.hCursor = LoadCursor (NULL, IDC_ARROW); wndEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND +1; wndEx.lpszMenuName = NULL; wndEx.lpszClassName = "2"; if(!RegisterClassEx (&wndEx) ) return (NULL); hWndSec = CreateWindowEx (NULL, "2", "Toolbar", WS_BORDER | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL); return (hWndSec); return 0; } int Steuerelemente::Extra_Button () { Button = CreateWindow ("BUTTON", "Fenster Schließen", WS_CHILD | WS_VISIBLE | BS_FLAT, 100, 100, 120, 20, hWndSec, (HMENU)ID_BTN_BEENDEN2, hInstance, NULL); return 0; }
-
hi
also an den proceduren liegts glaub ich net...
den aufbau des programms find ich zwaretwas merkwürdig, aber das ist wohl geschmackssache...
ich glaube, dass das fenster nur einmal erstellt werden kann, weil beim zweiten aufruf von s.ExtraWindow() registerclassex feststellt, dass schon eine klasse mit dem gleichen Namen besteht und deshalb fehlschlägt. Dann wird die funktion abgebrochen und kein fenster erstellt...
lösen könntest du diese problem ganz einfach, in dem du die Registrierung von der SecondWindow Klasse in die WinMain reinpackst.. also ganz oben, unter den aufruf von ParentWindow() (und dann in s.ExtraWindow() natührlich löschen
)...
dann wird die klasse nur einmal registriert, und dein fenster beliebig oft erstellt..
das ist zumindest die einzige sinnvolle erklärung die mir jeztt einfällt...
probiers mal aus
MFG
-
Danke
Habs hinbekommen 