静态HWND -为什么是必要的
Static HWND - Why is it necessary?
好吧,我问的唯一原因是因为我读到HWND是一个指针,指针改变原始值,而不是创建一个副本存储在内存位置。
但是它并不像指针那样我这么说是因为如果我有一个switch语句,例如:
void ExampleFunction(int iSwitch)
{
HWND hButton;
switch (iSwitch)
{
case 1:
hButton = CreateWindow( Blah Blah blah); //<-- Shouldn't it return to hButton's location.
break;
case 2:
ShowWindow(hButton, SW_SHOW); //<-- Ops forgot what was stored in hButton.
break;
}
}
但作为一个新的c++ Win32程序员,它不应该忘记吗?只要找到内存地址,然后获取里面的内容。除非内存地址改变等
我真的不知道,你介意详细解释一下吗?谢谢。
这可能不是最高质量的答案;欢迎提出改进意见。
如果HWND指向的窗口仍然存在,那么HWND的值永远不会改变,这是正确的。
我猜你写的代码是这样的:
LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND button;
switch (uMsg) {
case WM_CREATE:
button = CreateWindowEx(...);
break;
case WM_COMMAND:
if (lParam == (LPARAM) button)
/* button was clicked; do something */;
}
return DefWindowProc(...);
}
并想知道为什么它不起作用,但更改
HWND button;
static HWND button;
修复它。
这不是hwnd的属性。代码失败不是因为HWND的值发生了变化。事实上,这与Windows完全无关,而与c有关。
代码不工作的原因是变量 button
在每次调用wndproc()
函数时都是新创建的。一个窗口过程会被调用很多次,在整个程序执行过程中,每个窗口接收到的消息都会被调用一次。每次,您都会获得一个全新的button
变量,并且button
变量在以前调用中的值将丢失。指针仍然在那里,但它没有存储在任何变量或任何其他内存位置!窗户没有被破坏。你再也不能通过正常的方式到达它了。
static
所做的是告诉C,您希望变量在每个函数调用中都保持不变。所以现在每个调用你的窗口过程都有相同的button
,指针值不再丢失了。
这是一个快速修复,它并不能很好地扩展到非常大的项目。在这些情况下,包含窗口句柄、(可能)全局变量或使用GWLP_USERDATA
或其他cbWndExtra
字节的结构更好。我想一个更好的问题是,为什么这个快速修复一直被建议作为解决其他人在Stack Overflow上类似问题的解决方案(或者至少为什么它是一个快速修复没有解释),但这是我们作为一个社区必须考虑的事情。
请记住,默认情况下,在大多数语言中(不仅仅是C和c++ !),函数的局部变量只在每个单独的函数调用期间存在。
中的代码的问题是缺少大量的上下文(这里只是猜测盲目),但如果代码是在一个单独的函数和变量hButton
是一个局部变量,函数,那么你必须记得,局部变量的函数在返回时,范围和下一次函数被调用时,该变量是一个全新的一个独特的电话,只有电话。
还值得一提的是,非静态局部变量不会以任何方式自动初始化。如果你不显式初始化这样的变量,它的值将是indeterminate,并且以任何方式使用它(除了初始化它)都会导致未定义行为。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- 静态HWND -为什么是必要的