封装窗口类用到的两个函数的效果验证

来源:互联网 发布:股票交易统计软件 编辑:程序博客网 时间:2024/05/17 21:40

#include <windows.h>

 

HINSTANCE g_hInst1 = NULL;
HINSTANCE g_hInst2 = NULL;
HWND g_hWnd1 = NULL;
HWND g_hWnd2 = NULL;
HWND g_hWnd3 = NULL;

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    g_hWnd3 = hWnd;// 核实一下窗口句柄
    switch(uMsg)
    {
        case WM_CREATE:
        {
            g_hInst2 = (HINSTANCE)(((LPCREATESTRUCT)lParam)->lpCreateParams);// 提取出传过来的程序句柄存入g_hInst2
            SetWindowLong(hWnd, GWL_USERDATA, (LONG)hWnd);// 压入当前的窗口句柄
        }
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
{
    g_hInst1 = hInst;// 记录程序句柄在g_hInst1;
    WNDCLASS wc;
    wc.style            = 0;
    wc.lpfnWndProc      = WndProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInst;
    wc.hIcon            = NULL;
    wc.hCursor          = NULL;
    wc.hbrBackground    = NULL;
    wc.lpszMenuName     = NULL;
    wc.lpszClassName    = "haha";

    RegisterClass(&wc);

    g_hWnd1 = CreateWindowEx(0, "haha", "hahaha", WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                            NULL, NULL, hInst, (void*)hInst) ;// 记录窗口句柄在g_hWnd1,并把程序句柄给消息处理函数

    g_hWnd2 = (HWND)GetWindowLong(g_hWnd1, GWL_USERDATA);// 提取消息函数中被压入的数值

    DestroyWindow(g_hWnd1);

    UnregisterClass("haha", hInst);

    return 0;
}

 

上面是我的验证程序,试图自己封装窗口类的应该已经看明白了,几个全局变量用来记录数据传递情况

下面是调试跟踪的情况:

 

可以看到数据被正确传递了,但是也带来两个问题:

1.WNDCLASS的cvWndExtra在这种情况下没用,它的具体作用到底是什么?

2.windows API参考大全上说的,SetWindowLong只有在SetWindowPos之后才能起作用难道是错的?