阅读 132

SetWindowSubclass 设置窗口子类回调

SetWindowSubclass 设置窗口子类回调

今天想给一个 Static 控件添加一个鼠标相关的事件:移入,移出,按下,松开事件

一开始以为在

复制代码

while (GetMessage (&messages, NULL, 0, 0))
    {        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
...
}

复制代码

这里捕获,发现不行。搞了半天,也没达到效果。

后来无意发现一个API:SetWindowSubclass 

复制代码

LRESULT CALLBACK MySubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{    switch (uMsg)
    {        case WM_NCDESTROY:
        {
            RemoveWindowSubclass(hWnd, &MySubclassProc, uIdSubclass);            break;
        }        case WM_MOUSELEAVE:
        {            //printf("WM_MOUSELEAVE\n");
            SendMessage(hwnd_lbl_back, STM_SETIMAGE,  IMAGE_BITMAP, (LPARAM) hBitmap_back); //设置图标

            break;
        }        case WM_MOUSEMOVE:
        {            //printf("WM_MOUSEMOVE\n");            //为了捕获 WM_MOUSELEAVE
            TRACKMOUSEEVENT tme = {0};
            tme.cbSize = sizeof(tme);
            tme.hwndTrack = hWnd;
            tme.dwFlags = TME_LEAVE;            // tme.dwFlags = TME_LEAVE | TME_HOVER;            // tme.dwHoverTime = 1;
            TrackMouseEvent(&tme);            //--------------------------

            if(wParam & MK_LBUTTON) //按下            {
                SendMessage(hwnd_lbl_back, STM_SETIMAGE,  IMAGE_BITMAP, (LPARAM) hBitmap_back_pressed); //设置图标            }            else
            {
                SendMessage(hwnd_lbl_back, STM_SETIMAGE,  IMAGE_BITMAP, (LPARAM) hBitmap_back_over); //设置图标            }            break;
        }        case WM_LBUTTONDOWN: //按下        {            //printf("WM_LBUTTONDOWN\n");
            SendMessage(hwnd_lbl_back, STM_SETIMAGE,  IMAGE_BITMAP, (LPARAM) hBitmap_back_pressed); //设置图标
            break;
        }        case WM_LBUTTONUP: //松开        {            //printf("WM_LBUTTONUP\n");
            SendMessage(hwnd_lbl_back, STM_SETIMAGE,  IMAGE_BITMAP, (LPARAM) hBitmap_back_over); //设置图标
            break;
        }
    }    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

复制代码

 

复制代码

hwnd_lbl_back = CreateWindowEx(0, "static", "", //                                   WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_BITMAP,  //SS_GRAYFRAME 使用背景色  | WS_DISABLED
                                   4, // xpos
                                   4, // ypos
                                   28, //width
                                   28, //height                                   hwnd_frame, (HMENU)id_lbl_back, g_hInstance,  NULL) ;

SetWindowSubclass(hwnd_lbl_back, &MySubclassProc, 0, (DWORD_PTR) REF_BACK); //设置窗口子类回调

复制代码

问题解决,SetWindowSubclass () 这么好用的API,我还是刚刚知道,第一次使用。

惭愧惭愧


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐