首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 對話框句柄混淆:hDlg1/hDlg2/hDlg3 關係與 GetDlgItemText 失效解析

     編輯:程式設計疑難解答

句柄關係圖解

hDlg1 = CreateDialog(hInst, MAKEINTRESOURCE(IDD_INDLG), hWnd, DialogProc);
//          ↑ 返回值          ↑ 父窗口        ↑ 回調函數

BOOL CALLBACK DialogProc(HWND hDlg2, UINT msg, WPARAM wParam, LPARAM lParam)
//                              ↑ 系統傳入的當前對話框句柄
  • hDlg1 == hDlg2:`CreateDialog` 返回的句柄,與回調函數參數 `hDlg2` 為同一對話框窗口句柄。
  • hDlg3:代碼中未定義,若寫死為其他值則無效。

GetDlgItemText 失效常見原因

  1. 控件 ID 錯誤:資源文件中 `IDC_EDIT1` 與代碼不一致。
  2. 句柄錯誤:傳入 `hDlg3` 而非 `hDlg2`/`hDlg1`。
  3. 調用時機早:在 `WM_INITDIALOG` 之前調用,控件尚未創建。
  4. 緩衝區太小:第三參數 `str` 需足夠大(建議 `MAX_PATH` 或動態分配)。

正確調用模板

BOOL CALLBACK DialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_INITDIALOG:
        return TRUE;
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK) {
            TCHAR buf[256];
            // 使用回調參數 hDlg,即當前對話框句柄
            int len = GetDlgItemText(hDlg, IDC_EDIT1, buf, _countof(buf));
            if (len > 0) {
                // 成功獲取文本
            }
        }
        break;
    }
    return FALSE;
}

調試技巧

  • 用 `Spy++` 確認控件 ID 與對話框句柄。
  • 在 `GetDlgItemText` 返回 0 時調用 `GetLastError()` 獲取錯誤碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved