2014-11-01 48 views
1

我更新窗口的標題欄:更新標題欄WINAPI

/* inside the window procedure */ 
HWND edit_handle; 
/* ... */ 
case WM_COMMAND: { 
    if (LOWORD(wParam) == 2) { /* 2 is the code for the button */ 
     int len = GetWindowTextLengthW(edit_handle); 
     if (len > 0) { 
      wchar_t buf[len + 1]; 
      GetWindowTextW(edit_handle, buf, len + 1); 
      SetWindowTextW(hwnd, buf); 
     } 
    } 
    break; 
    } 

然而,當我打電話SetWindowTextW,標題欄並沒有改變:它仍然是以前的樣子。

​​是編輯控件的句柄。

之前(在剛剛加載的窗口):

Before I edited the EDIT

按下OK按鈕後 After Pressing the OK

+1

添加一個錯誤檢查,看看GetLastError關於它的一天。 – usr2564301 2014-11-01 01:15:25

+3

使用WinAPI時,**始終**檢查文檔中的返回值是什麼,**總是**檢查返回值。文檔告訴你返回值的含義(以及何時需要調用GetLastError()以獲取更多信息)。 **從不**認爲函數的工作,除非你已經得到一個表明成功的返回值。當我總是說,這意味着**總是**。 *每一次*,無一例外,不管函數調用看起來多麼簡單。 – 2014-11-01 01:34:59

+3

這裏常見的錯誤是在WndProc中聲明窗口句柄('edit_handle')作爲局部變量,這意味着它實際上是一個空指針。 – 2014-11-01 01:55:11

回答

4

正如指出的問題之前似乎是​​實際值。

請記住,每次窗口收到消息時,Windows都會調用您的窗口過程。因此,在處理以前的消息時分配的本地變量的值已不存在...

如果您需要「記住」與窗口相關的數據,請查看WIN API函數SetWindowLongPtr(hwnd, GWLP_USERDATA, ...)GetWindowLongPtr(hwnd, GWLP_USERDATA)。這些函數設置並查詢窗口的「變量」,該變量足夠大以容納要記錄的某些數據的指針。

在你的情況下,解決方案更簡單。由於每個窗口都分配了一個唯一的ID,你可以使用下面的語句來獲取你的編輯控件的窗口句柄:

edit_handle = GetDlgItem(hwnd, ...); 

你必須通過你的編輯控件的ID來代替...。如果您通過調用CreateWindow(..)自己創建編輯控件,則這是hMenu屬性的值。如果使用來自資源的對話框,它只是控件的ID。