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

#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之后才能起作用难道是错的?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值