Win32开发入门(6):创建右键菜单

快捷菜单,说得容易理解一点,就是右键菜单,当我们在某个区域内单击鼠标右键,会弹出一些菜 单项。这种类型的菜单,是随处可见的,我们在桌面上右击一下,也会弹出一个菜单。

右键菜 单的好处就是方便,它经常和我们正在操作的某个UI元素联系起来,比如我们正在使用文本框输入文本 ,我们在文本框中右击,就会看到可能有【复制】【清空】【全选】之类的选项,所以,右键菜单也称 为“上下文菜单(Context Menu)”。

一般来说,创建并使用快捷菜单,可以按照以下步骤进 行:

1、用资源编辑器创建菜单。

2、当我们在窗口上按下鼠标右键,当系统处理 WM_RBUTTONUP时会向我们的应用程序发送一条WM_CONTEXTMENU消息,我们通过响应这条消息来决定是否 弹出菜单。

3、计算菜单弹出的位置,一般在我们鼠标指针的右下方,该坐标是基于屏幕的,不 是窗口的。

4、调用TrackPopupMenu函数显示快捷菜单。

5、因为这种菜单是不属于某个 窗口的,它的内存资源不会在窗口销毁时被回收,因此,在TrackPopupMenu返回后要调用DestroyMenu 来销毁菜单的资源,释放内存。

好的,基本思路有了,我们就按照这个思路来试一试,看能不 能实现一个右键菜单。

首先,用资源编辑器建立一个菜单,因为我们的弹出菜单一般只显示一 系列菜项,是没有菜单的头部,不像菜单栏。因此,我们把菜单做成这样:

开发入门(6):创建右键菜单-">

快捷菜单只会显示我用画笔圈起来的那部分,而上面的【abc】是不显示的,所以你可以让它 空着,也可以随便输入一些内容。

然后为每个菜单项设置ID就行了,资源编辑器有时候会产生 一堆没有被使用的ID宏,这些我们可以手动删除,当然也可以不管它,反正不影响程序的编译,因为头 文件是不参与编译的。我们编译的时候只是编译.cpp文件。

接下来就是捕捉WM_CONTEXTMENU消 息。显示菜单。

case WM_CONTEXTMENU:
    {
        //加载菜单资源
        HMENU hroot = LoadMenu((HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), 

MAKEINTRESOURCE(IDR_CONTEXT));
        if(hroot)
        {
            // 获取第一个弹出菜单
            HMENU hpop = GetSubMenu(hroot,0);
            // 获取鼠标右击是的坐标
            int px = GET_X_LPARAM(lParam);
            int py = GET_Y_LPARAM(lParam);
            //显示快捷菜单
            TrackPopupMenu(hpop,
                TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
                px,
                py,
                0,
                (HWND)wParam,
                NULL);
            // 用完后要销毁菜单资源
            DestroyMenu(hroot);
        }
    }
    break;

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索鼠标
, 编译
, 编辑器
, 菜单
, 窗口
资源
,以便于您获取更多的相关知识。

时间: 2024-08-07 14:57:05

Win32开发入门(6):创建右键菜单的相关文章

Win32开发入门(4) 创建菜单

我们当然知道 ,现在,在实际开发中肯定不会像我这样写Win32程序的,你看,连个WinMain都要N行代码.但很多人 不明白什么叫学习,什么叫探索.实际上,通常能用于实际开发中的技巧只是占我们对客观世界的认识 总和不到20%,所以,如果你有兴趣计算一下,估计有80%的知识你不知道用到哪里去了.就算我们今后 不会把Win32程序投入到实际操作中,然而如果你了解过这东西,你会发现很多时候对我们是有帮助的 . 哪怕只是简单认识一下Win32的一些原理,相信对于日后编程的学习和成长,是有益处的. 为了提

Win32开发入门(9) 绘图(B)

我们今天继续涂鸦,实践证明,涂鸦是人生一大乐趣. 首先,我们写一个程序骨架子,以便 做实验. #include <Windows.h> LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain( HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpsCmdln, int iShow) { WNDCLASS wc

Win32开发入门(7) 多边形窗口

通常情况下,窗口都是一个矩形,不过,调用下面这个函数,可以自定义窗口的形状. int SetWindowRgn( __in HWND hWnd, __in HRGN hRgn, __in BOOL bRedraw ); 第一个参数是窗口的句柄,第二个参数也是一个句柄--HRGN,一个多边形的区域,可 以用CreatePolygonRgn函数来创建.第三个参数指定函数调用成功后是否重画窗口,如果窗口还没有显 示,就不必了,如果窗口已经显示,可以考虑设为TRUE. 我们创建用于显示窗口形状的区域句

Win32开发入门(3) 窗口的重绘

我们今天来吹一下关于窗口重绘的事情,在开始吹牛之前,我们先用上一篇博文中说到的方法写一 个简单的Win32应用程序.代码如下: #include <Windows.h> //先声明一下消息处理函数 LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); // 入口点 int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrvInst

iOS开发入门:创建基于nib的iOS 6的Hello World工程

创建基于nib的HelloWorld工程 开发入门:创建基于nib的iOS 6的Hello World工程-maven helloworld工程"> 创建工程 启动Xcode,点击File→New→Project菜单,在打开的Choose a template for your new project界面中,选择Single View Application工程模板 然后点击Next按钮,随即出现界面.

Win32开发入门(10) 绘图(C)

今天我们来欣赏一下用于填充图形的函数,当然我不会逐个去介绍,因为我们参考MSDN直接套参数 就可以了. SetDCBrushColor函数有必要扯一下,它的声明如下: COLORREF SetDCBrushColor( __in HDC hdc, __in COLORREF crColor ); 第二个参数,通过RGB宏产生COLORREF传进去就可以了,比如这样: SetDCBrushColor(ps.hdc,RGB(211,254,41)); 但是,如果只是调用这个函数,你会发现 在绘图的时

Win32开发入门(8) 绘图(A)

从本篇开始,我就不吹牛皮,那就吹吹兔皮吧.说说与绘图有关的东东. 要进行绘制,首先 要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们 封装了一些与显示设备相关的交互操作,我们这里说的是图形的绘制,自然指的是显卡.当然,对于同 一客观事物,世界上并不存在唯一的理解方案,技术上的东西最终拿来用的,不应该有硬性的去统一. 我们之中的很多人,最大的失败在于,人家说要这样理解他就毫不怀疑地这样理解,权威人士说要这样 这样,他就不经过大脑思考地跟着那样那样.

SharePoint 2013开发入门:创建内容类型

SharePoint内容类型,是很有特色的,就好比发布新闻,同在一张列表里,可以由内容类型区分图片新闻.文字新闻等,顾名思义,就是在一张列表里发布不同类型的项目. 1.添加新项目,选择SharePoint 2013 空项目,如下图: 开发入门:创建内容类型-sharepoint 2013"> 2.选择调试网站和解决方案类型,如下图: 3.添加新项,选择内容类型,如下图:

iOS开发入门:创建基于故事板的iOS 6的Hello World

基于故事板的HelloWorld工程 Storyboard(故事板)是用来替代xib的技术,也是iOS 5最重要的新特性之一.我们用Storyboard(故事板)重构HelloWorld. 使用故事板重构HelloWorld 勾选"Use Storyboards"项. 工程创建完成之后,通过导航进入MainStoryboard.storyboard 开发入门:创建基于故事板的iOS 6的Hello World-vc6 hello world"> 添加Label控件 本文