2014-11-01 50 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。