2017-01-25 5 views
0

私は私が間違ってやっているかわからないんだけど、ここでは(何の閉じるボタン、ないキャプションバーがありません)、それがどのように見えるかです:DialogBoxが正しくレンダリングされませんか?

enter image description here

それが再描画/カチカチ/更新いないかのように見えます。スタイル、キャプション、フォントサイズを変更する

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

など何も変わりません:

は、ここに私のResource.rcファイルです。私はWindowsクラシックテーマを使用していることに注意してください。標準の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_POPUPの代わりにWS_OVERLAPPED(WINDOW)を試してください。 – VuVirt

+0

@VuVirtあまり効果がなかったです。 andlabsの答えは正しいです! – vexe

答えて

3

あなたのダイアログプロシージャは無条件ですべてのメッセージにTRUEを返します。つまり、「メッセージは処理したが、他に何もする必要はありません」という意味です。関数の先頭にResultTRUEに設定し、それを変更しないでください(不明なコントロールからWM_COMMANDを取得しない限り)。これは間違っています;ご自分でメッセージを処理しない場合は、FALSEを返す必要があります。

WM_INITDIALOGは、DWLP_MSGRESULTではなくダイアログシステムに直接値を返すメッセージの1つです。その場合とその場合のみ、TRUEを返す必要があります(手動でタブストップを調整しない限り)。

+0

解決済み!答えをありがとう。それは実際は私の意図だった。私が言いたいのは、気にしないコマンドを見つけなければ、デフォルトで処理される(真)ということです。しかし、それはWM_COMMAND以外の他のタイプのメッセージを考慮しません。 – vexe

+0

WM_INITDIALOGの意味がわかりません。私が今行っていることは、デフォルトでは 'Result'をFALSEに設定し、コマンドの場合はTRUEに設定します。 WM_INITDIALOGを空のままにしても(つまりFALSEを返す)、TRUEに設定してもそれほど影響はありません。 [編集]ドキュメントを読んで、それはキーボードフォーカスに関連しているようですが、私が真を返すと、私はデフォルトのキーボードフォーカスを取得します。それですか、それとも別のものがありますか? – vexe

+0

はい、それです。キーボードのフォーカスは調整していないので、デフォルトのままにしておく必要があります。 – andlabs

関連する問題