DialogBox不显示对话框的原因分析
DialogBox不顯示對話框的原因分析
- 0. 確認主窗口正常顯示
 - 1. 檢查資源文件格式是否正確
 - 1.1 確認窗口布局定義正確
 - 1.2 確認有窗口大小邊框坐標定義
 
- 2.檢查窗口ID是否正確定義
 - 3. 檢查DialogBox的調用
 - 4. 刪除編譯文件,重新編譯
 
本文介紹單純使用 win API 進行界面開發時,遇到DialogBox失敗或不彈出對話框的解決方式。
0. 確認主窗口正常顯示
這一步都不對的話,可以不用往下看了。
1. 檢查資源文件格式是否正確
.rc文件中需要有兩部分定義:
1.1 確認窗口布局定義正確
#include "resource.h" / // // Dialog // IDD_IMGINF DIALOGEX 0, 0, 287, 135 //IDD_IMGINF為窗口ID STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION //風格一般包括這些 CAPTION "Fill image info" //窗口的名字 FONT 8, "MS Shell Dlg", 400, 0, 0x1 //窗口使用字體 BEGIN LTEXT "Width:", IDC_STATIC, 45, 10, 20, 8 //顯示兩個Text控件 LTEXT "Height:", IDC_STATIC, 155, 10, 20, 8 EDITTEXT IDC_WIDTH, 42, 22, 80, 14 //顯示兩個Edit控件 EDITTEXT IDC_HEIGHT, 151, 22, 80, 14 DEFPUSHBUTTON "Ensure", IDOK, 85, 114, 50, 14 //顯示連兩個Button控件 PUSHBUTTON "Cancel", IDCANCEL, 151, 114, 50, 14 END此部分代碼的關鍵點是為窗口 id 要與 resource.h 中定義的 id 對應。此外控件的 id (IDC_WIDTH,IDC_HEIGHT)也需要與頭文件中的定義對應。
1.2 確認有窗口大小邊框坐標定義
/ // // DESIGNINFO //#ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGINIDD_IMGINF, DIALOG //注意窗口id 為 IDD_IMGINFBEGINLEFTMARGIN, 7RIGHTMARGIN, 302TOPMARGIN, 7BOTTOMMARGIN, 169END END #endif // APSTUDIO_INVOKED此部分代碼的關鍵也是 id 要與上面匹配
2.檢查窗口ID是否正確定義
Resource.h 中我們需要定義一個窗口 id ,其值選擇一個其他 id 未使用的值。
//創建WIN API 窗口應用程序時 VS 自己創建的定義 #define IDC_MYICON 2 #define IDD_BZVIEWER_DIALOG 102 #define IDS_APP_TITLE 103 #define IDD_ABOUTBOX 103 #define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDI_BZVIEWER 107 #define IDI_SMALL 108 #define IDC_BZVIEWER 109 #define IDR_MAINFRAME 128 #define IDCANCEL 1000 #define IDC_STATIC -1//自己添加的id定義 #define IDD_ADDIMGINF 200 //此作為窗口ID #define IDC_WIDTH 210 //此作為控件ID #define IDC_HEIGHT 211 //此作為控件// Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 134 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif這部分代碼的關鍵點是, 將 .rc 資源文件中使用的自定義的對話框的 Id 定義好。若資源文件使用了沒有定義的 id, 對話框將創建失敗。
3. 檢查DialogBox的調用
在任意可以獲取主窗口句柄或父窗口句柄的 .cpp 文件中調用就行
INT_PTR CALLBACK AddWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);void xxxxxFunc(HINSTANCE hInstance, HWND Hwnd){DialogBox(hInstance, (LPCWSTR)IDD_IMGINF, *pHwnd, AddWndProc); //AddWndProc為自定義的對話框響應函數 }INT_PTR CALLBACK AddWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;/*待添加控件的響應*/}return (INT_PTR)FALSE; }DialogBox的調用不必像網上很多人說的必須放在窗口響應回調函數中,它可以在任意地方調用,但需要獲取父窗口句柄,否則不能實現模態對話框優先處理頂層對話框的特性,即主窗口線程將不會被鎖住。
4. 刪除編譯文件,重新編譯
若前3步都檢查完畢,沒有錯誤的情況下還是不能正確顯示一個對話框,可以嘗試第4步。
 我的問題就是第4步的問題,查了兩天前3步,最終嘗試出此方法。
修改.rc文件后直接點擊調試,Visual Studio 貌似并沒有將我的修改重新編譯。導致的結果就是無論我怎么改,是一直不能顯示對話框。因此需要刪掉鏈接文件,重新編譯。
如果你使用的是Visual Studio創建的項目,請刪除編譯輸出的鏈接文件的所在文件夾,這個文件夾會根據x64或是 x86編譯器的不同而有不同的名字,但里面的文件類都一樣。
最終彈出對話框!
 
總結
以上是生活随笔為你收集整理的DialogBox不显示对话框的原因分析的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Java检验yyyymm合法,JAVA日
 - 下一篇: 手机c语言编译器ide文件位置,C语言编