/****************************************************************************
几大主要问题:
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,,,PareWnd,NULL,NULL,NULL) ; ::ShowWindow(hWnd,SW_SHOWNOACTIVATE); //把hWnd的默认窗口过程替换为WindowProc,返回默认函数过程的函数指针
OldWndProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC, (LONG) (WindowProc)); MSG msg;
while (GetMessage(&msg, NULL, , ))
{
//点击的不是菜单窗口就返回
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(); //会退出消息循环 GetMessage
break; default:
return ::CallWindowProc(OldWndProc, hWnd, message, wParam, lParam); //如果我们没有处理的再交给原窗口默认处理
}
return ;
} void CDemoDlg::OnRButtonUp(UINT nFlags, CPoint point)
{ POINT pt;
::GetCursorPos(&pt);
CMyMenu::CreateWnd(pt.x,pt.y,m_hWnd) ; CDialog::OnRButtonUp(nFlags, point);

win32 自定义右键菜单的更多相关文章

  1. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  2. JavaScript自定义右键菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]

    许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...

  4. JS简单实现自定义右键菜单

    RT,一个简单的例子,仅仅讲述原理 <div id="menu" style="width: 0;height: 0;background: cadetblue;p ...

  5. antd Tree组件中,自定义右键菜单

    最近项目中,有一个需求是自定义antd的Tree组件的右键菜单功能. 直接上代码 class Demo extends Component { state = { rightClickNodeTree ...

  6. AS3.0 自定义右键菜单类

    AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...

  7. js之自定义右键菜单

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. [ActionScript 3.0] 自定义右键菜单

    将自定义右键菜单的一些属性和方法归纳到AddRightMenu.as,通过实例化此类,调用相关方法即可测试! package { import flash.display.Sprite; import ...

  9. 【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单

    连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体 ...

随机推荐

  1. Oracle安装部署之linux(redhat/centos)快速安装oracle 11g rac

    安装oracle 11gR2 RAC 一.网络规划及安装虚拟主机 主机名 主机版本 Ip rac1.localdomain Redhat 6.5 RAC节点1 192.168.100.11 rac2. ...

  2. grub24dos

    Grub24Dos是个很好的软件,可用于Windows与Linux双系统的安装的工具.注意不是那个Grub4Dos.使你不必依赖于任何Linux分区启动您的计算机的可用性.在Windows MBR没有 ...

  3. ios-Objective-C中的各种遍历(迭代)方式(转载)

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  4. 总结web应用中常用的各种cache(转)

    add by zhj:还没来得及看,有空再细看 原文:https://ruby-china.org/topics/19389 cache是提高应用性能重要的一个环节,写篇文章总结一下用过的各种对于动态 ...

  5. java 8 学习资料

    出处: 总览 http://www.importnew.com/24300.html stream api 详解 : https://www.ibm.com/developerworks/cn/jav ...

  6. mysql python pymysql模块 增删改查 查询 fetchmany fetchall函数

    查询的fetchmany fetchall函数 import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' ...

  7. mysql 操作sql语句 操作数据表中的内容/记录

    #3. 操作文件中的内容/记录 往哪张表去插入 insert into 表名指定字段(id,name) 插入要加values(针对前面字段插入)(2,mike); insert into t1(id, ...

  8. Spark中的Spark Shuffle详解

    Shuffle简介 Shuffle描述着数据从map task输出到reduce task输入的这段过程.shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过s ...

  9. [LeetCode] 394. Decode String_Medium tag: stack 666

    Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...

  10. Lintcode: Find Peak Element

    There is an integer array which has the following features: * The numbers in adjacent positions are ...