button = Neues Fenster
-
-
Schreib einfach einen WM_COMMAND-Handler für deinen Button und ruf dort CreateWindow(Ex) auf.
-
huhu
meinste so:
case WM_COMMAND: { switch(LOWORD(wParam)) { case BUT_START: { hstart = CreateWindowEx (NULL ,"test" ,"muh" , WS_POPUPWINDOW | WS_CHILD | WS_VISIBLE, 0 ,0 , 500 ,500 , hwnd, (HMENU) 1, hInstance, NULL); } break;naja passiert nichts.... müsste doch irgendwie bei wm_create abgehandelt werden oderwie?
was hat es eigentliczh mit wm_create auf sich? wird die message nur bei programmstart gesendet oder wie?
mfg
-
schnalle schrieb:
naja passiert nichts.... müsste doch irgendwie bei wm_create abgehandelt werden oderwie?
Hm ist die Fensterklasse überhaupt regisitriert ?
schnalle schrieb:
was hat es eigentliczh mit wm_create auf sich? wird die message nur bei programmstart gesendet oder wie?
WM_CREATE wird beim Erstellen des Fensters gesendet. Also nur einmal.
-
huhu ich würde den Code gerne auslagern um alles ein wenig übersichtlicher zu halten. hab da erstmal folgendes entworfen
LRESULT CALLBACK WndProc_start (HWND, UINT, WPARAM, LPARAM); int but_start(HWND) { LPCSTR lpszAppName = " "; LPCSTR lpszTitle = " "; HINSTANCE hInstance; HWND hStart; MSG msg_start; WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc_start; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszClassName = lpszAppName; wc.lpszMenuName = lpszAppName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } hStart = CreateWindowEx(NULL, lpszAppName, lpszTitle, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, hwnd, NULL, hInstance, NULL); if(hStart == NULL) { MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hStart, SW_SHOW); UpdateWindow(hStart); while (GetMessage(&msg_start, NULL, 0, 0) > 0) { TranslateMessage(&msg_start); DispatchMessage(&msg_start); } return msg_start.wParam; } LRESULT CALLBACK WndProc_start(HWND hStart, UINT msg_start, WPARAM wParam, LPARAM lParam) { switch (msg_start) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hStart, msg_start, wParam, lParam); }würde die funktionen dann mit
but_start(hwnd);und
LRESULT CALLBACK WndProc_start(HWND hStart, UINT msg_start, WPARAM wParam, LPARAM lParam)im code einbinden
so klappt aber alles irgendwie nicht. kann auch irgnedwie keine klaren gedanken mehr fassen... kann mir vllt jemand weiterhelfen?mfg
-
Du solltest Dir besser noch einmal ein paar Tutorials
durchlesen.Siehe hier: http://win-api.de
-
Du musst für deine neue Fensterklasse schon auch einen neuen Fensterklassennamen verwenden. 2x lpszAppName wird nicht gehen.
-
schnalle schrieb:
case WM_COMMAND: { switch(LOWORD(wParam)) { case BUT_START: { hstart = CreateWindowEx (NULL ,"test" ,"muh" , WS_POPUPWINDOW | WS_CHILD | WS_VISIBLE, 0 ,0 , 500 ,500 , hwnd, (HMENU) 1, hInstance, NULL); } break;Bei hInstance eines Childfensters darf keine eigene Instanz stehen, sondern die hInstance des Parentfensters: ((LPCREATESTRUCT)lParam)->hInstance
-
also wenn ich das Fenster in meiner main aufrufe gibt es keine probleme. Das Fenster lässt sich ohne Probleme öffnen.
Nun hab ich aber immer noch das problem mit der Auslagerung... irgendwie bekomme ich es nicht mit den Argumenten vorwärtsdeklarationen etc... hab so ne auslagerung noch nicht gemacht deswegen bin ich atm ein wenig Ratlos
mfg
-
bediene dich doch mit CreateDialog falls das hier noch nicht angesprochen wurde
HWND dlghwnd;
switch(msg)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDD_BUTTON:
dlghwnd = CreateDialog(GetModuleHandl(NULL),
MAKEINTRESOURCE(IDD_TOOLBAR),
hwnd, DlgProc);
ShowWindow(dlghwnd,SW_SHOW);
break;
......oder bediene dich dem tutorial http://www.winprog.org/tutorial/ (ist mein liebling)
-
Elektronix schrieb:
[...]
Bei hInstance eines Childfensters darf keine eigene Instanz stehen, sondern die hInstance des Parentfensters: ((LPCREATESTRUCT)lParam)->hInstancelParam enthält NUR unter WM_CREATE ein Zeiger auf das CREATESTRUCT des entsprechenden Fensters. Man sollte hier
GetModuleHandle(NULL);verwenden oder in der WinMain die Instanz-Handle-Variable globalisieren
.Fachmann schrieb:
bediene dich doch mit CreateDialog falls das hier noch nicht angesprochen wurde
HWND dlghwnd;
switch(msg)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDD_BUTTON:
dlghwnd = CreateDialog(GetModuleHandl(NULL),
MAKEINTRESOURCE(IDD_TOOLBAR),
hwnd, DlgProc);
ShowWindow(dlghwnd,SW_SHOW);
break;
...Also CreateDialog erstellt Dialoge, keine Toolbars (?!)...und selbst wenn das irgendwie klappen könnte,
tippe ich auf Glück. Für solche Dinge gibt es CreateWindow(Ex). Übrigens braucht eine Toolbar keine
Dialog-Prozedur
.
-
toolbars werden häufig mit dem verfahren gemacht weil die nicht erst returnen wenn das fesnter geschlossen wird so wie es bei "DialogBox(...)" der fall ist. ausserdem kann man mit CreateDialog und DialogBox einfach eine fertige resource benutzen. ich benutz garkeine windowsklasse ich mach als hauptfenster einfach en dialog der flexibel ist
