2010-12-16 2 views
1

Ich schreibe eine Anwendung nach this tutorial. Ich bin mir bewusst, dass dieses Tutorial datiert, und so habe ich den Code angepasst, um den Unicode zu berücksichtigen.Win32: Toolbar Dialogfeld scheint nie den Fokus zu bekommen und verursacht das Hauptfenster langsam zu verarbeiten?

Ich habe ein Hauptfenster, das wie ein MDI aussieht. Dann habe ich ein View Menü, das einen Toolbar-Dialog ein- und ausblendet. Wenn ich den Dialog zeige, wird er angezeigt, aber die PUSHBUTTON s werden nicht korrekt angezeigt. Sie erscheinen nur, wenn ich wieder auf mein Hauptfenster klicke.

Außerdem scheint ich nicht in der Lage zu sein, keines der PUSHBUTTON s in meiner Symbolleiste Dialog zu klicken.

Die Ressourcen (resource.h) sind wie folgt definiert (nur zeigen, was auf diese Frage relevant ist):

#define IDD_TOOLBAR    102 
#define IDC_PRESS    1000 
#define IDC_OTHER    1001 
#define ID_VIEW_SHOWTOOLBAR 40002 
#define ID_VIEW_HIDETOOLBAR 40003 

und der Dialog wie in meiner .rc Datei folgt:

IDD_TOOLBAR DIALOGEX 0, 0, 85, 50 
    STYLE DS_FIXEDSYS | DS_MODALFRAME | WS_CAPTION | WS_POPUP 
    EXSTYLE WS_EX_TOOLWINDOW 
    CAPTION L"Toolbar" 
    FONT  8, "MS Shell Dlg" 
BEGIN 
    PUSHBUTTON  L"&Press this button",  IDC_PRESS, 7, 7, 70, 14 
    PUSHBUTTON  L"&Or this one",   IDC_OTHER, 7, 28, 70, 14 
END 

und zeigt es wie folgt in meinem WndProc Funktion:

// As a global variable I have my toolbar handler. 
HWND g_hToolbar = NULL; 

BOOL CALLBACK ToolbarDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { 
    switch (Msg) { 
     case IDC_OTHER: 
      MessageBoxW(hWnd, L"You just clicked IDC_OTHER!", L"Information", MB_OK | MB_ICONINFORMATION); 
      break; 
     case IDC_PRESS: 
      MessageBoxW(hWnd, L"You just clicked ODC_PRESS!", L"Information", MB_OK | MB_ICONINFORMATION); 
      break; 
     default: 
      return FALSE; 
    } 

    return TRUE; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { 
    switch (Msg) { 
     case WM_COMMAND: 
      switch (LOWORD(wParam)) { 
       case ID_VIEW_HIDETOOLBAR: 
        ShowWindow(g_hToolbar, SW_HIDE); 
        break; 
       case ID_VIEW_SHOWTOOLBAR: 
        if (NULL == g_hToolbar) 
         g_hToolbar = CreateDialogW(GetModuleHandle(NULL) 
                , MAKEINTRESOURCE(IDD_TOOLBAR) 
                , hWnd 
                , ToolbarDlgProc); 

        ShowWindow(g_hToolbar, SW_SHOW); 
        break; 
      } 
      break; 
     default: 
      return DefWindowProcW(hWnd, Msg, wParam, lParam); 
    } 
} 

Und hier ist die Art, wie ich die verschiedenen Nachrichten für mein Hauptfenster und mein Dialogfeld in meiner Nachrichtenschleife in meiner WinMain Funktion behandeln.

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { 
    // Declaring, registring and creating my main window to hWnd here... 
    MSG Msg; 

    ShowWindow(hWnd, nShowCmd); 
    UpdateWindow(hWnd); 

    while (GetMessageW(&Msg, hWnd, 0, 0) > 0) { 
     if (!IsDialogMessageW(g_hToolbar, &Msg)) { 
      TranslateMessage(&Msg); 
      DispatchMessageW(&Msg); 
     } 
    } 
} 

Mein Problem ist:

  1. scheine ich nicht in der Lage sein, auf meinem Dialog Schaltflächen zu klicken.

  2. Wenn ich versuche, auf die Schaltflächen meines Dialogs zu klicken, reagiert mein Hauptfenster sehr langsam auf seine eigenen Nachrichten.

Das heißt, wenn ich möchte, dass mein Toolbar Dialog als modalen Dialog zeigen, denn wenn ich es modal zeigen, es funktioniert perfekt!

Irgendwelche Hinweise, um dieses Problem zu lösen?

Danke!

+0

Ihr Code sieht ziemlich gut aus. Aus Ihrer Beschreibung sieht es so aus, als ob das Problem in der Nachrichtenpumpe liegt, aber es sieht gut aus. Haben Sie einen speziellen Code in ToolbarDlgProc, den wir betrachten müssen? – DReJ

+0

Die 'ToolbarDlgProc' wurde bearbeitet, um anzuzeigen, was darin enthalten ist. Danke, dass Sie sich die Zeit genommen haben, mein Problem zu betrachten. =) Ich bezweifle auch die Nachrichtenpumpe, aber da ich immer noch Win32s lerne, kann ich nicht richtig debuggen. –

+1

Gerade versuchte MDI und SDI-Anwendung mit Ihrem Code, es funktioniert OK für mich. Have keine Ahnung ... Ich weiß, es wird nicht mit Ihrem Problem helfen, aber wenn Sie Win32Api verwenden möchten, würde ich Ihnen empfehlen, auf WTL zu schauen, es ist guter Wrapper für WinApi, gute Sachen :) – DReJ

Antwort

0

Das Problem ist, wie DReJ im obigen Kommentar sagte, in meiner Nachrichtenpumpe.

Das Problem ist, dass ich schreibe:

while (GetMessageW(&Msg, hWnd, 0, 0) > 0) { 
    // Processing message here... 
} 

Und das werde ich schreiben:

while (GetMessageW(&Msg, NULL, 0, 0) > 0) { 
    // Processing message here... 
} 

Also, weil ich die Nachrichten für ein bestimmtes Fenster war immer, die hWnd Instanz, Mein ToolbarDialog schien zu wenig Zeit zu haben, sich komplett oder so ähnlich zu zeichnen.Ersetzen hWnd für NULL in diesem Szenario löste das Problem vollständig.

Verwandte Themen