2017-01-25 6 views
0

Ich bin nicht sicher, was ich falsch mache, aber hier ist, wie es aussieht (es gibt keine Schließen-Schaltfläche, keine Titelleiste):DialogBox nicht korrekt gerendert?

enter image description here

Es sieht aus, als wenn es nicht die Aktualisierung/tickt/neu lackiert .

Hier ist meine Resource.rc Datei:

#include "resource.h" 
#include "windows.h" 

#define IDC_STATIC -1 

ID_ICON_MAIN ICON "Smile.ico" 

ID_DIALOG_ABOUT DIALOG 0, 0, 240, 70 
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_BORDER 
CAPTION "About" 
FONT 8, "Terminal" 
{ 
     DEFPUSHBUTTON "&OK", IDOK, 174, 18, 50, 14 
     PUSHBUTTON  "&Cancel", IDCANCEL, 174, 36, 50, 14 
     GROUPBOX  "About this program...", IDC_STATIC, 7, 7, 225, 52 
     CTEXT   "An example program\r\nBy vexe", IDC_STATIC, 16, 18, 144, 33 
} 

Ändern des Designs, Beschriftung, Schriftgröße, usw. ändert nichts. Beachten Sie, dass ich Windows Classic Theme verwende, das Ändern auf den Standard Windows 7 hilft auch nicht, es ist also kein Thema.

Hier mein Fenster Code:

#include <Windows.h> 
#include "resource.h" 

INT_PTR WINAPI DialogWndProc(HWND Window, UINT Message, 
          WPARAM WParam, LPARAM LParam) 
{ 
    INT_PTR Result = TRUE; 

    switch (Message) 
    { 
     case WM_INITDIALOG: 
     { 
      // UpdateWindow(Window); // Doesn't really help. Taking out the case didn't do anything either 
     } 
     break; 

     case WM_COMMAND: 
     { 
      int Command = LOWORD(WParam); 
      switch(Command) 
      { 
       case IDOK: 
       { 
        EndDialog(Window, IDOK); 
       } 
       break; 

       case IDCANCEL: 
       { 
        EndDialog(Window, IDCANCEL); 
       } 
       break; 

       default: 
       { 
        Result = FALSE; 
       } 
       break; 
      } 
     } 
     break; 
    } 

    return(Result); 
} 

LRESULT WINAPI MainWndProc(HWND Window, UINT Message, 
          WPARAM WParam, LPARAM LParam) 
{ 
    LRESULT Result = 0; 

    switch (Message) 
    { 
     // (Causes GetMessage to return false) 
     case WM_CLOSE: 
     { 
      DestroyWindow(Window); 
     } 
     break; 

     case WM_DESTROY: 
     { 
      PostQuitMessage(0); 
     } 
     break; 

     case WM_COMMAND: 
     { 
      int Command = LOWORD(WParam); 
      switch (Command) 
      { 
       case ID_MENU_FILE_EXIT: 
       { 
        PostMessage(Window, WM_QUIT, 0, 0); 
       } 
       break; 

       case ID_MENU_HELP_ABOUT: 
       { 
        int Choice = DialogBox(0, MAKEINTRESOURCE(ID_DIALOG_ABOUT), Window, DialogWndProc); 
        switch (Choice) 
        { 
         case IDOK: MessageBox(Window, "Okay!", "OK", MB_OK | MB_ICONINFORMATION); break; 
         case IDCANCEL: MessageBox(Window, "Canceled!", "Cancel", MB_OK | MB_ICONINFORMATION); break; 
        } 
       } 
       break; 
      } 
     } 
     break; 

     case WM_CREATE: 
     { 
      HMENU Menu; 
      HMENU SubMenu; 

      // Create the main menu 
      Menu = CreateMenu(); 

      // Create submenus 
      { 
       SubMenu = CreatePopupMenu(); 
       AppendMenu(SubMenu, MF_STRING, ID_MENU_FILE_EXIT, "E&xit"); 
       AppendMenu(Menu, MF_STRING | MF_POPUP, (UINT_PTR)SubMenu, "&File"); 

       SubMenu = CreatePopupMenu(); 
       AppendMenu(SubMenu, MF_STRING, ID_MENU_HELP_ABOUT, "&About"); 
       AppendMenu(Menu, MF_STRING | MF_POPUP, (UINT_PTR)SubMenu, "&Help"); 
      } 

      // Set the menu on the window 
      SetMenu(Window, Menu); 
     } 
     break; 

     default: 
     { 
      Result = DefWindowProc(Window, Message, WParam, LParam); 
     } 
    } 

    return(Result); 
} 

int CALLBACK WinMain(HINSTANCE Instance, HINSTANCE Previous, LPSTR CommandLine, int CmdShow) 
{ 
    // Create window class 
    WNDCLASSEX WindowClass = {0}; 
    WindowClass.cbSize = sizeof(WNDCLASSEX); 
    WindowClass.style = CS_HREDRAW | CS_VREDRAW; 
    WindowClass.lpfnWndProc = (WNDPROC)MainWndProc; 
    WindowClass.hInstance = Instance; 
    WindowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 
    WindowClass.lpszMenuName = MAKEINTRESOURCE(ID_MENU_MAIN); 
    WindowClass.lpszClassName = "SaedoGames_0"; 
    WindowClass.hIcon = LoadIcon(Instance, MAKEINTRESOURCE(ID_ICON_MAIN)); 
    WindowClass.hIconSm = (HICON)LoadImage(0, "Smile.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); 
    RegisterClassEx(&WindowClass); 

    // Create window 
    HWND Window = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "SaedoGames_0", "Test Window", 
     WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
     CW_USEDEFAULT, CW_USEDEFAULT, 
     640, 480, 
     0, 0, 
     Instance, 0 
    ); 

    // Show window 
    ShowWindow(Window, CmdShow); 
    UpdateWindow(Window); 

    // Message loop 
    MSG Msg; 
    while (GetMessage(&Msg, Window, 0, 0) > 0) 
    { 
     TranslateMessage(&Msg); 
     DispatchMessage(&Msg); 
    } 

    return(0); 
} 

Ziemlich sicher, dass ich einen einfachen Funktionsaufruf fehle aber einfach nicht sicher, was es ist. Was vermisse ich?

+1

Versuchen WS_OVERLAPPED (WINDOW) anstelle von WS_POPUP – VuVirt

+0

@VuVirt Das hat nicht viel getan. Andlabs Antwort ist korrekt! – vexe

Antwort

3

Ihre Dialogprozedur gibt bedingungslos TRUE an jede Nachricht zurück, was bedeutet "Ich habe die Nachricht bearbeitet, Sie müssen nichts anderes tun". Ihre Dialogprozedur führt dies durch Setzen von Result auf TRUE am Anfang der Funktion und dann nie ändern (es sei denn, Sie erhalten eine WM_COMMAND von einem unbekannten Steuerelement). Das ist falsch; Sie müssen FALSE zurückgeben, wenn Sie eine Nachricht nicht selbst behandeln.

WM_INITDIALOG ist eine der wenigen Meldungen, die ihre Werte direkt an das Dialogsystem zurückgeben, anstatt über DWLP_MSGRESULT. In diesem Fall und nur in diesem Fall müssen Sie TRUE zurückgeben (es sei denn, Sie haben Tabstopps manuell angepasst).

+0

Gelöst! Danke für die Antwort. Das war eigentlich meine Absicht. Was ich sagen wollte, ist: Es wird standardmäßig behandelt, es sei denn, ich stoße auf einen Befehl, der mir egal ist. Aber das berücksichtigt neben WM_COMMAND keine anderen Arten von Nachrichten. – vexe

+0

Ich bin mir nicht sicher, was Sie mit WM_INITDIALOG meinen. Was ich jetzt mache, ist, dass ich 'Result' standardmäßig auf FALSE setze, und TRUE, wenn ich meine Befehlsfälle behandle. Selbst wenn ich den 'WM_INITDIALOG' leer lasse (d. H. Immer noch FALSE zurückgebe) oder ihn auf TRUE setze, ist nicht viel betroffen. [EDIT] Das Lesen der Dokumente scheint mit dem Tastaturfokus zu tun zu haben, wenn ich TRUE zurückgebe, bekomme ich den Standard-Tastaturfokus. Ist es das oder ist da noch etwas anderes? – vexe

+0

Ja, das ist es. Da Sie den Tastaturfokus noch nicht anpassen, sollten Sie ihn auf der Standardeinstellung belassen. – andlabs

Verwandte Themen