本节向大家介绍一下右键弹出菜单是如何实现的。效果如下,在窗口中点击鼠标右键弹出菜单,点击菜单项能够响应菜单点击事件。

使用Duilib库实现的弹出菜单,实际上也是一个Windows窗口,因此我们需要创建两个窗口(主窗口和菜单窗口),然后响应主窗口的鼠标右键点击事件,在主窗口右键点击事件的响应函数中获取鼠标位置,將菜单窗口的位置调整为当前鼠标位置,同时把窗口设置为显示即可。

菜单窗口的xml布局文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<Window bktrans="true" size="120,102"><Font name="宋体" size="13" bold="false"/><Font name="宋体" size="12"/>
<VerticalLayout bkimage="file='menu_bk.png' corner='40,8,8,8'" hole="false"><List header="hidden" inset="8,8,8,8" itemhotimage="file='menu_hot_bk.png' corner='2,2,2,2'" itemdisabledbkcolor="#20000000"><ListContainerElement name="menu_Open" height="22" inset="40,0,0,0"><Label text="打开" mouse="false"/></ListContainerElement><ListContainerElement name="menu_Mark" height="22" inset="40,0,0,0"><Label text="标注" mouse="false"/></ListContainerElement><ListContainerElement name="menu_Delete" height="22" inset="40,0,0,0"><Label text="删除" mouse="false"/></ListContainerElement><ListContainerElement name="menu_Test" height="22" inset="40,0,0,0"><Label text="测试" mouse="false"/></ListContainerElement></List>
</VerticalLayout>
</Window>

我们需要编写一个菜单窗口类继承WindowImplBase来加载xml界面。和上节不同的是我们把这个类的声明和成员函数的定义放在一个单独的头文件中,这样代码容易维护一些。新建头文件MenuWnd.h:

#ifndef _MENUWND_H__
#define _MENUWND_H__
#include "win_impl_base.hpp"
#include <Windows.h>
class MenuWnd : public WindowImplBase
{ LPCTSTR GetWindowClassName() const{return L"MenuWnd";} UINT GetClassStyle() const{return UI_CLASSSTYLE_FRAME|CS_DBLCLKS;}tString GetSkinFile(){return L"tutorial6_menu.xml";}void Notify(TNotifyUI& msg){ if(msg.sType == L"itemclick"){//响应菜单事件::MessageBox(NULL,L"hello",L"hello",MB_OK);this->ShowWindow(false);} } };
#endif

接下来是主窗口,主窗口的xml界面布局文件内容和上节相同,仅仅是主窗口类的定义有些变化,我们同样把主窗口类的声明和定义放在一个单独的头文件MyWnd.h中:

#ifndef _MYWND_H__
#define _MYWND_H__
#include "win_impl_base.hpp"
#include "MenuWnd.h"
#include <Windows.h>
class MyWnd : public WindowImplBase
{
public: MyWnd(){pMenu = new MenuWnd();pMenu->Create(m_hWnd,L"Menu",WS_POPUP,WS_EX_TOOLWINDOW);pMenu->ShowWindow(false);}LPCTSTR GetWindowClassName() const{return L"MyWnd";}UINT GetClassStyle() const{return UI_CLASSSTYLE_FRAME|CS_DBLCLKS;}tString GetSkinFile(){return L"tutorial6.xml";}void Notify(TNotifyUI& msg){if(msg.sType == L"click"){if(msg.pSender->GetName() == L"CloseBtn"){::PostQuitMessage(0);}else if(msg.pSender->GetName() == L"MinBtn"){::SendMessage(m_hWnd,WM_SYSCOMMAND, SC_MINIMIZE, 0);}}} LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){switch(uMsg){case WM_RBUTTONDOWN:OnRButtonDown(wParam,lParam);return 0; default:return WindowImplBase::HandleMessage(uMsg,wParam,lParam);}}void OnRButtonDown(WPARAM wParam, LPARAM lParam){ int xPos = LOWORD(lParam); int yPos = HIWORD(lParam);POINT pt = {xPos,yPos};ClientToScreen(m_hWnd,&pt); pMenu->ShowWindow(true);::SetWindowPos(pMenu->GetHWND(), NULL, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE); } LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){//获取鼠标点击位置int xPos = LOWORD(lParam); int yPos = HIWORD(lParam);//將位置转换为屏幕坐标POINT pt = {xPos,yPos};ClientToScreen(m_hWnd,&pt); RECT menuWndRect = {0};::GetWindowRect(pMenu->GetHWND(),&menuWndRect);if(pt.x <= menuWndRect.left || pt.x >= menuWndRect.right || pt.y <= menuWndRect.top || pt.y >= menuWndRect.bottom){pMenu->ShowWindow(false);}bHandled = FALSE;return 0;}private:MenuWnd* pMenu;};
#endif

在主窗口类中定义一个MenuWnd指针类型的成员变量,在构造函数中创建菜单窗口设置显示风格为隐藏,重写父类的HandleMessage函数,响应主窗口鼠标右键点击事件,在右键点击事件的响应函数中重新设置菜单位置,并把窗口显示风格设置为显示。

最后在WinMain函数中创建并显示主窗口:

//tutorial6.cpp
#include <Windows.h>
#include "MyWnd.h"
INT WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpCmdLine,INT Show)
{CPaintManagerUI::SetInstance(hInst);CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetResourcePath());//创建主窗口MyWnd* pFrame = new MyWnd();pFrame->Create(NULL,L"Tutorial6",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);pFrame->CenterWindow(); pFrame->ShowWindow(true); CPaintManagerUI::MessageLoop();return 0;
}

博文源码:https://github.com/rongbo-j/duilib-tutorial
(参考tutorial6工程)

转载于:https://www.cnblogs.com/lanzhi/p/6468608.html

DirectUI界面编程(六)实现右键弹出菜单相关推荐

  1. vb在 ListBox 之中点击右键弹出菜单

    '1.API 的声明: Const LB_ITEMFROMPOINT = &H1A9 Private Declare Function SendMessage Lib "user32 ...

  2. vc+如何添加右键弹出菜单

    2019独角兽企业重金招聘Python工程师标准>>> 一.创建新工程 二.编辑菜单资源 1.添加菜单 按"Ctrl+R",双击"Menu"图 ...

  3. Js+DVML:很酷实用的右键弹出菜单

    <HTML xmlns:v><HEAD> <head> <meta http-equiv="Content-Type" content=& ...

  4. java右键弹出菜单_javascript自定义右键弹出菜单实现方法

    本文实例讲述了javascript自定义右键弹出菜单实现方法.分享给大家供大家参考.具体实现方法如下: 无标题页 var oPopup = window.createPopup(); function ...

  5. wpf 代码获取contextmenu_[C#] 转:在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件...

    WPF的ContextMenu没有类似WinForm里面ContextMenu.SourceControl的概念,但是你可以通过ContextMenuService的GetPlacementTarge ...

  6. 右键弹出菜单和快捷键的设置

    写MFC,少不了用到菜单和快捷键,此处我用到了右键菜单.我的项目是一个播放器的实现,那么在屏幕中央右键点击,应该会弹出右键菜单,比如播放,暂停等,如我这样: 对应的每一个菜单应该还有相应的快捷键.那么 ...

  7. 梦想CAD控件网页版右键弹出菜单

    用户需要右键弹出菜单,则需要响应鼠标事件,右键按下后,弹出菜单分为在命令下运行及在非命令下运行,具体介绍如下 : 一.新建菜单文件 1.新一个文本文件: mxpoptest.mnu,内容如下(此文件为 ...

  8. 梦想CAD控件com接口界面控制右键弹出菜单

    用户需要右键弹出菜单,则需要响应鼠标事件,右键按下后,弹出菜单分为在命令下运行及在非命令下运行,具体介绍如下(C#语言参考例子:"samples\CSharpRightKeyMenu\CSh ...

  9. 孙鑫VC++深入详解:Lesson6 Part3 ---创建右键弹出菜单 TrackPopupMenu

    1 -----增加右键弹出菜单方法一:      Project-->Add to Project-->Components and Controls -->Visual C++ C ...

最新文章

  1. maven打包war,导入本地jar包
  2. Python函数参数匹配模型(上)
  3. 受限玻尔兹曼机——用在推荐系统里
  4. dede调用sql语句的方法
  5. python之列表推导式 内置函数
  6. c mysql 时间段查询_mySql 时间段查询
  7. Facebook欧盟垄断案陷入灰色地带 立法或调整
  8. 科目移动类型替代规则总结
  9. 以 library 方式启动的 SAP Spartacus Storefront,如何手动实现 User 模块的延迟加载
  10. 祝贺|合肥.NET俱乐部第二期技术沙龙活动圆满成功
  11. 【Azure学习.01】先从账号注册开始
  12. jeecg-easypoi-2.0.3版本发布
  13. Upload-Labs(11-15)
  14. WPF RadioButton按钮控件取消选中设置
  15. linux centos erlang,CentOS 7.7安装Erlang和Elixir
  16. JspStudy套件部署j2ee maven项目网址问题
  17. 离散时间傅里叶变换(一)
  18. 在项目中怎样写故障树或者类层次
  19. 输入法出现异常???输入英文字母分隔很大???你真的会使用输入法了吗???如何高效使用输入法???微软自带输入法切换
  20. 使用调式音阶即兴 一

热门文章

  1. html怎么随机放图片,HTML技术:如何在网页中图片的随机显示
  2. MyBatis Plus自定义SQL使用条件构造器QueryWrapper
  3. 图像识别中的深度学习【香港中文大学王晓刚】
  4. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理
  5. Kafka文件存储机制那些事
  6. Java 中 ConcurrentHashMap 原理分析
  7. 数据分类:决策树Decision Tree
  8. 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
  9. Go 语言简介(上)— 语法
  10. 机器学习算法与Python实践之(四)支持向量机(SVM)实现