2017-01-25 3 views
0

Я не уверен, что я делаю неправильно, но вот как это выглядит (нет кнопки закрытия, нет заголовка бара):DialogBox не отображается правильно?

enter image description here

Это выглядит так, как будто он не обновляет/тикает/перекрасил ,

Вот мой Resource.rc файл:

#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 
} 

Изменение стилей, подпись, размер шрифта и т.д., ничего не меняет. Обратите внимание, что я использую Windows Classic Theme, переход на стандартную Windows 7 не помогает, так что это не проблема темы.

Вот мой код окна:

#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); 
} 

Довольно уверен, что я не хватает простой вызов функции, но только не уверен, что это такое. Что мне не хватает?

+1

Попробуйте WS_OVERLAPPED (WINDOW) вместо WS_POPUP – VuVirt

+0

@VuVirt Это не сильно помогло. Ответ andlabs правильный! – vexe

ответ

3

Ваша диалоговая процедура безоговорочно возвращает TRUE каждому сообщению, что означает «Я обработал сообщение, вам не нужно ничего делать». Ваша процедура диалога делает это, установив Result на TRUE в верхней части функции, а затем никогда не меняя ее (если только вы не получите WM_COMMAND от неизвестного элемента управления). Это не верно; вам нужно вернуть FALSE, если вы не обрабатываете сообщение самостоятельно.

WM_INITDIALOG является одной из нескольких сообщений, которые возвращают свои значения непосредственно в диалоговую систему, а не через DWLP_MSGRESULT. В этом случае и только в этом случае вам нужно вернуть TRUE (если только вы не вручную отрегулировали вкладки).

+0

Решенный! Спасибо за ответ. На самом деле это было моим намерением. То, что я намеревался сказать, это: он обрабатывается (истинно) по умолчанию, если только я не нахожу команду, которую мне не волнует. Но это не относится к другим типам сообщений, кроме WM_COMMAND. – vexe

+0

Я не уверен, что вы имеете в виду с WM_INITDIALOG. То, что я делаю сейчас, я установил «Result» в FALSE по умолчанию и TRUE, когда я обрабатываю свои команды. Даже если я оставляю 'WM_INITDIALOG' пустым (т. Е. Все еще возвращать FALSE) или устанавливаю его в ИСТИНА, это не сильно влияет. [РЕДАКТИРОВАТЬ] Чтение документов, похоже, связано с Keyboard Focus, если я верну TRUE, я получу основной фокус клавиатуры. Это или есть что-то еще? – vexe

+0

Да, это он. Поскольку вы еще не настраиваете фокус клавиатуры, вы должны оставить его по умолчанию. – andlabs

Смежные вопросы