博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
win32 自定义右键菜单
阅读量:7110 次
发布时间:2019-06-28

本文共 2339 字,大约阅读时间需要 7 分钟。

/****************************************************************************几大主要问题:1.通过处理WM_MOUSEACTIVATE,并返回MA_NOACTIVATE可以实现点窗口时不激活窗口(父窗口不会失去焦点)2.CreateWindowEx时窗口的样式一定要有 WS_EX_TOPMOST 和 WS_POPUP ,并且设置窗口的父句柄。3.用 ::ShowWindow(hWnd,SW_SHOWNOACTIVATE); 让窗口显示时无焦点4.消息阻塞:用 GetMessage 来阻塞父窗口,不让代码继续往下执行直到菜单窗口消失为止。未解决的问题:1.菜单窗口不处于激活状态,所以未能收到键盘消息2.窗口点击其他程序时,菜单不会自动消失****************************************************************************//****************************************************************************创建窗口 (不需要注册窗口类,只能创建一个)****************************************************************************/class CMyMenu{private:    static WNDPROC OldWndProc;    static LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);public:    static void CreateWnd(int x,int y,HWND PareWnd=NULL)  //创建窗口函数        {        HWND hWnd = CreateWindowEx(WS_EX_TOPMOST,            _T("#32770"),            _T("Demo"),            WS_POPUP| WS_BORDER,            x,y,100,100,PareWnd,NULL,NULL,NULL) ;                    ::ShowWindow(hWnd,SW_SHOWNOACTIVATE);        //把hWnd的默认窗口过程替换为WindowProc,返回默认函数过程的函数指针        OldWndProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC, (LONG) (WindowProc));        MSG msg;        while (GetMessage(&msg, NULL, 0, 0))        {            //点击的不是菜单窗口就返回            if ( msg.message==WM_LBUTTONDOWN || msg.message==WM_RBUTTONDOWN )            {                if ( msg.hwnd != hWnd )                    ::PostMessage(hWnd,WM_CLOSE,NULL,NULL);            }            TranslateMessage(&msg);            DispatchMessage(&msg);        }    }};WNDPROC CMyMenu::OldWndProc=NULL;LRESULT CALLBACK CMyMenu::WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){    switch(message)    {    case WM_LBUTTONDOWN:        {            ::PostMessage(hWnd,WM_CLOSE,NULL,NULL);        }        break;    case WM_MOUSEACTIVATE:        return MA_NOACTIVATE ;    case WM_CLOSE:        DestroyWindow(hWnd);         break;    case WM_DESTROY:         PostQuitMessage(0); //会退出消息循环 GetMessage        break;    default:        return ::CallWindowProc(OldWndProc, hWnd, message, wParam, lParam); //如果我们没有处理的再交给原窗口默认处理    }    return 0;}void CDemoDlg::OnRButtonUp(UINT nFlags, CPoint point){    POINT pt;    ::GetCursorPos(&pt);    CMyMenu::CreateWnd(pt.x,pt.y,m_hWnd) ;    CDialog::OnRButtonUp(nFlags, point);

 

转载地址:http://mnlhl.baihongyu.com/

你可能感兴趣的文章
EF架构~有时使用SQL更方便
查看>>
Jenkins内置环境变量的使用
查看>>
《微信生活白皮书》发布微信用户数据
查看>>
VSTO之旅系列(三):自定义Excel UI
查看>>
Android Studio 添加 Genymotion插件
查看>>
Office 365 – SharePoint 2013 Online 之WebPart开发、部署教程
查看>>
DJANGO中获取登陆用名及别名
查看>>
Novell基础架构方案引领云计算发展
查看>>
大数据正在改变客户服务的5种方式
查看>>
苹果回应FBI:若因错因开发软件将有害于数百万人
查看>>
软件测试管理工具—JIRA使用初体验
查看>>
法国政府宣布数字行业发展战略:3D打印和物联网
查看>>
Python 程序员必知必会的开发者工具
查看>>
《教孩子学编程(Python语言版)》——2.4 添加颜色
查看>>
《精通Spring MVC 4》——1.4 命令行方式简介
查看>>
《C++覆辙录》——1.12:嘴上无毛,办事不牢
查看>>
阿里云大数据公众趋势预测
查看>>
git问题-更新被拒绝
查看>>
聊聊并发(四)深入分析ConcurrentHashMap
查看>>
大数据workshop:《云数据·大计算:海量日志数据分析与应用》之《数据采集:日志数据上传》篇...
查看>>