关于Control 的WndProc()函数初试探

本文详细探讨了Windows控件的WndProc()函数与消息机制的关系,通过实例展示了如何发送和处理消息。作者通过Spy++捕获并分析了WM_MOUSEMOVE、WM_NCHITTEST等关键消息,揭示了消息传递的细节。在实验中,作者发现直接调用WndProc()无法触发预期的控件事件,而SendMessage则可以。文章以C#为背景,指出消息传递的正确方式以及常见误区。
摘要由CSDN通过智能技术生成

本篇文章较多图片,如需结论,直接看文章结尾

起初根据摘要我以为只要给该函数传递了相应的message,window消息机制就会自动执行这个相应的操作。

好了,接下来看下message的结构

是一个结构体

起初我的代码是这样写的,以为点击button1会触发button2的click事件

 private void button1_Click(object sender, EventArgs e)
        {
            Message message = Message.Create(button2.Handle,513,IntPtr.Zero,IntPtr.Zero);
            WndProc(ref message);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("我被点击了!");
        }

但是结果并不是这样,除了卡了一下,没有别的反应

看了下我之前的C++写界面的代码

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInst;

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    PSTR szCmdLine,
    int iCmdShow
) {
    static TCHAR szClassName[] = TEXT("Win32Demo");  //窗口类名
    HWND     hwnd;  //窗口句柄
    MSG      msg;  //消息
    WNDCLASS wndclass;  //窗口类

    hInst = hInstance;

    /**********第①步:注册窗口类**********/
    //为窗口类的各个字段赋值
    wndclass.style = CS_HREDRAW | CS_VREDRAW;  //窗口风格
    wndclass.lpfnWndProc = WndProc;  //窗口过程
    wndclass.cbClsExtra = 0;  //暂时不需要理解
    wndclass.cbWndExtra = 0;  //暂时不需要理解
    wndclass.hInstance = hInstance;  //当前窗口句柄
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);  //窗口图标
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //鼠标样式
    wndclass.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_BTNFACE);  //窗口背景画刷(灰色)
    wndclass.lpszMenuName = NULL;  //窗口菜单
    wndclass.lpszClassName = szClassName;  //窗口类名
    //注册窗口
    RegisterClass(&wndclass);

    /*****第②步:创建窗口(并让窗口显示出来)*****/
    hwnd = CreateWindow(
        szClassName,  //窗口名字
        TEXT("Welcome"),  //窗口标题(出现在标题栏)
        WS_OVERLAPPEDWINDOW,  //窗
        CW_USEDEFAULT,  //初始化时y轴的位置口风格
        CW_USEDEFAULT,  //初始化时x轴的位置
        800,  //窗口宽度
        500,  //窗口高度
        NULL,  //父窗口句柄
        NULL,  //窗口菜单句柄
        hInstance,  //当前窗口的句柄
        NULL  //不使用该值
    );

    //显示窗口
    ShowWindow(hwnd, iCmdShow);
    //更新(绘制)窗口
    UpdateWindow(hwnd);

    /**********第③步:消息循环**********/
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);  //翻译消息
        DispatchMessage(&msg);  //分派消息
    }

    return msg.wParam;
}

//窗口过程
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    //设置缓冲区
    static TCHAR szBufSex[10];
    static TCHAR szBufMarriage[10];
    static TCHAR szBufPet[20];
    static TCHAR szBufSubmit[100];
    static TCHAR szBufTmp[10];

    static HFONT hFont;  //逻辑字体
    //一组单选按钮
    static HWND labSex;  //静态文本框--性别
    static HWND radioMale;  //单选按钮--男
    static HWND radioFemale;  //单选按钮--女
    //一组单选按钮
    static HWND labMarriage;  //静态文本框--婚姻状况
    static HWND radioMarried;  //单选按钮--已婚
    static HWND radioSingle;  //单选按钮--未婚
    static HWND radioSecrecy;  //单选按钮--保密

    //一组复选框
    static HWND labPet;  //静态文本框--你的宠物
    static HWND checkboxDog;  //复选框--狗
    static HWND checkboxCat;  //复选框--猫
    static HWND checkboxFish;  //复选框--鱼
    static HWND checkboxOther;  //复选框--其他

    static HWND btnSubmit;  //按钮控件

    switch (message) {
    case  WM_CREATE:
        hFont = CreateFont(
            -14, -7, 0, 0, 400,
            FALSE, FALSE, FALSE, DEFAULT_CHARSET,
            OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
            FF_DONTCARE, TEXT("微软雅黑")
        );

        //选择性别
        labSex = CreateWindow(
            TEXT("static"), TEXT("你的性别:"),
            WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_RIGHT/*文字居右*/,
            10, 10, 80, 26,
            hWnd, (HMENU)1, hInst, NULL
        );

        radioMale = CreateWindow(
            TEXT("button"), TEXT("男"),
            WS_CHILD | WS_VISIBLE | BS_LEFT/*文字居左*/ | BS_AUTORADIOBUTTON /*单选按钮*/ | WS_GROUP,
            95, 10, 50, 26,
            hWnd, (HMENU)2, hInst, NULL
        );

        radioFemale = CreateWindow(
            TEXT("button"), TEXT("女"),
            WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
            150, 10, 50, 26,
            hWnd, (HMENU)2, hInst, NULL
        );

        //选择婚姻状况
        labMarriage = CreateWindow(
            TEXT("static"), TEXT("婚姻状况:"),
            WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_RIGHT,
            10, 40, 80, 26,
            hWnd, (HMENU)4, hInst, NULL
        );

        radioMarried = CreateWindow(
            TEXT("button"), TEXT("已婚"),
            WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON | WS_GROUP,
            95, 40, 65, 26,
            hWnd, (HMENU)5, hInst, NULL
        );

        radioSingle = CreateWindow(
            TEXT("button"), TEXT("未婚"),
            WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
            165, 40, 65, 26,
            hWnd, (HMENU)6, hInst, NULL
        );

        radioSecrecy = CreateWindow(
            TEXT("button"), TEXT("保密"),
            WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
            235, 40, 100, 26,
            hWnd, (HMENU)7, hInst, NULL
        );

        //你的宠物
        labPet = CreateWindow(
            TEXT("static"), TEXT("你的宠物:"),
            WS_CHILD | WS_VISIBLE | SS_CENTER
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值