Seltsamer Dialog =)
-
Hi Leute !
Also habe mir einen Dialog mit dazu gehörigem Handler gebastelt. Soweit so gut, wenn ich jetzt via WM_COMMAND die Nachricht abfangen will, gehts im begrenzten Maße
Und zwar erscheint der Dialog erst dann wenn ich die ALT Taste drücken.So hier zu mein Aufruf des Dialogs:
case WM_COMMAND: switch (LOWORD (wPara)) { case ID_MAP: DialogBox(hInstMain,MAKEINTRESOURCE(DLG_NEWMAP), hWnd, MapSetProc); break; }So dann der MessageHandler für den Dialog:
BOOL CALLBACK MapSetProc (HWND hDialog,UINT msg,WPARAM wParam,LPARAM lParam) { switch (msg) { case WM_INITDIALOG: break; break; case WM_COMMAND: switch (LOWORD (wParam)) { case WM_DESTROY: EndDialog(hDialog,0); return 0; break; } break; default: return FALSE; } return TRUE; }Für Hilfe wäre ich echt dankbar.
Mfg
Reasar
-
1.) Was hat das zweite break; bei WM_INITDIALOG zu suchen?
2.) Warum fängst du WM_DESTROY in WM_COMMAND ab
Was genau hast du mit diesem komischen Konstruk überhaupt vor?!
Vielleicht solltest du dir hier nochmal die Beispielcodes anschauen

-
Sorry das ich mich erst so spät melde
Also hab es nach dem MSDN Beispiel abgeglichen, trotzdem öffnet sich erst der Dialog nachdem ich irgendeine beliebge Taste gedrüclt habe.
Also der ersten Codeteil ist nur der Aufruf des Dialoges. Hab als ein Menü gebastelt welcher aus Punkt ID_MAP enthält !
Der zweite Codeteil soll einfach der Messagehandler für den Dialog sein ist aber auch auf simpelste reduziert (zur Zeit).
Ist es vielleicht von Bedeuting das ich mein Hauptfenster mit Scrollbalken (horizontal und vertikal) versehen habe ? Weil man ja da auch nach den wParam "switcht" ???
MfG
Reasar
-
Noch als kleiner Nachtrag: Selbst wenn ich eine einfach Message Box erscheinen lassen will (im ersten Codeteil), erscheint dieser erst nach drücken einer beliebigen Taste

-
Wie sieht denn dann dein korrigierter Code jetzt aus - aus deiner Beschreibung werde ich nicht so richtig schlau

-
Also hab noch ein wenig rumgedocktort
Also allgemein hat das Programm das Problem, wenn irgendetwas im WM_COMMAND case abgearbeitet werden soll:
Also ich schreibe zum Beispiel:case WM_COMMAND: MessageBox(NULL, "Hallo", "MyMessage", MB_OK); break;Selbst dabei muß ich erst irgendeine Taste drücken damit die MessageBox erscheint:
Wenn es vielleicht weiter hilft hier der MessageHandler zum Fenster:
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { int VertMin=0; int VertMax=VerticalFields * FieldHigth - WinY; int HorzMin=0; int HorzMax=HorizontalFields * FieldWidth - WinX; int iVertScrollPos = GetScrollPos(hWnd, SB_VERT); int iHorzScrollPos = GetScrollPos(hWnd, SB_HORZ); filesave[0] = NULL; SetScrollRange(hWnd, SB_VERT, VertMin, VertMax, TRUE); SetScrollRange(hWnd, SB_HORZ, HorzMin, HorzMax, TRUE); switch (msg) { case WM_VSCROLL: switch (LOWORD(wParam)) { if (VertMax > 0) { case SB_LINEDOWN: if (iVertScrollPos < VertMax) { iVertScrollPos+=FieldHigth; } break ; case SB_LINEUP: if (iVertScrollPos <= VertMax) { iVertScrollPos-=FieldHigth; } break; case SB_THUMBPOSITION: iVertScrollPos = HIWORD(wParam); break; case SB_PAGEUP: iVertScrollPos = 0; break; case SB_PAGEDOWN: iVertScrollPos = VertMax; break; default: return 0; break; } } SetScrollPos(hWnd, SB_VERT, iVertScrollPos, TRUE); InvalidateRect(hWnd, NULL, TRUE); return 0; break; case WM_HSCROLL: switch (LOWORD(wParam)) { case SB_LINERIGHT: if (iHorzScrollPos < HorzMax) { iHorzScrollPos+=FieldWidth; } break; case SB_LINELEFT: if (iHorzScrollPos > 0) { iHorzScrollPos-=FieldWidth; } break; case SB_PAGERIGHT: iHorzScrollPos = HorzMax; break; case SB_PAGELEFT: iHorzScrollPos = HorzMin; break; case SB_THUMBPOSITION: iHorzScrollPos = HIWORD(wParam); break; default: return 0; break; } SetScrollPos(hWnd, SB_HORZ, iHorzScrollPos, TRUE); InvalidateRect(hWnd, NULL, TRUE); return 0; break; // Irgendwo hier ist ein Problem =) case WM_COMMAND: switch (LOWORD(wParam)) { case MI_NEW: DialogBox(hInstMain, MAKEINTRESOURCE(DLG_DIALOG), hWnd, (DLGPROC) MapSetProc); break; } break; //Wo ist es bloß ???? case WM_DESTROY: PostQuitMessage(0); return 0; break; case WM_PAINT: if (NewMap == true || load == true) { Brett.drawMap(hWnd,hDC, iVertScrollPos); InvalidateRect(hWnd, NULL, FALSE); } return 0; // Return 0 end wichtig !!!! break; } return DefWindowProc(hWnd, msg, wParam, lParam); }
-
Reasar schrieb:
Also allgemein hat das Programm das Problem, wenn irgendetwas im WM_COMMAND case abgearbeitet werden soll:
Also ich schreibe zum Beispiel:case WM_COMMAND: MessageBox(NULL, "Hallo", "MyMessage", MB_OK); break;Selbst dabei muß ich erst irgendeine Taste drücken damit die MessageBox erscheint:
Das ist doch logisch - sonst bekommst du ja auch kein WM_COMMAND

-
Und deshalb muß ich eine Taste drücken ?
-
Acho so, versteh jetzt was du meinst
Ja aber das Problem habe ich ja auch wenn ich schreibecase WM_COMMAND: switch (LOWORD wParam)) { case ID_Test: MessageBox(NULL, "Hallo", "MyMessage", MB_OK); break; } break;Also hier bei ist ID_Test ein Menü Item
-
Das sollte dann kommen, wenn du den Menü-Eintrag anklickst

-
Das ist ja grade der springende Punkt :p Das tut es erst, wenn ich den Menüpunkt anklicke und dann eine beliebege Taste drücke
-
Mir fällt noch so auf, dass du in WM_PAINT den Fensterinhalt nirgendswo als gültig markierst.
D.h. Windows wird vermutl. laufen dein Fenster mit WM_PAINT Nachrichten zuspammen
Du solltest entweder BeginPaint() und EndPaint() benutzen oder ValidateRect() aufrufen...
-
Hatte den Code gar nicht so genau angeschaut, aber das von geeky ist natürlich vollkommen richtig.
Und dann noch InvalidateRect in WM_PAINT *schauder*