静态HWND -为什么是必要的

Static HWND - Why is it necessary?

本文关键字:为什么 HWND 静态      更新时间:2023-10-16

好吧,我问的唯一原因是因为我读到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,并且以任何方式使用它(除了初始化它)都会导致未定义行为