日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DialogBox不显示对话框的原因分析

發布時間:2024/8/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的調用不必像網上很多人說的必須放在窗口響應回調函數中,它可以在任意地方調用,但需要獲取父窗口句柄,否則不能實現模態對話框優先處理頂層對話框的特性,即主窗口線程將不會被鎖住。

  • 確定調用的地方可以獲取父窗口句柄,若此句柄為空則為非模態對話框。
  • 確認對話框響應的回調函數正確定義,此函數可以先拷貝一個創建程序時 vs 自己創建的,修改函數名,確認窗口正確顯示后再詳細添加響應功能。
  • 確認對話框 id 再 resource.h 中正確定義,其控件的 id 也正確定義。
  • 4. 刪除編譯文件,重新編譯

    若前3步都檢查完畢,沒有錯誤的情況下還是不能正確顯示一個對話框,可以嘗試第4步。
    我的問題就是第4步的問題,查了兩天前3步,最終嘗試出此方法。

    修改.rc文件后直接點擊調試,Visual Studio 貌似并沒有將我的修改重新編譯。導致的結果就是無論我怎么改,是一直不能顯示對話框。因此需要刪掉鏈接文件,重新編譯。

    如果你使用的是Visual Studio創建的項目,請刪除編譯輸出的鏈接文件的所在文件夾,這個文件夾會根據x64或是 x86編譯器的不同而有不同的名字,但里面的文件類都一樣。

  • 刪除包含.log,.obj,.res,.pdb,.idb的文件夾以及其子文件夾,一般此文件夾是在項目文件夾的下一層,叫Debug。
  • 重新編譯調試。
  • 最終彈出對話框!

    總結

    以上是生活随笔為你收集整理的DialogBox不显示对话框的原因分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。