日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DirectUI界面编程(六)实现右键弹出菜单 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節向大家介紹一下右鍵彈出菜單是如何實現的。效果如下,在窗口中點擊鼠標右鍵彈出菜單,點擊菜單項能夠響應菜單點擊事件。

使用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界面编程(六)实现右键弹出菜单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产丝袜美腿一区二区三区 | 欧美精品激情 | 欧美成人区 | 91精品国产综合久久久久久久 | 黄色片视频在线观看 | 悠悠av| 97超级碰碰碰 | 五月激情六月婷婷 | 亲子伦视频一区二区三区 | 国产熟妇一区二区三区aⅴ网站 | 日本福利一区二区三区 | 欧美日韩在线视频免费观看 | 国内精品偷拍视频 | 色屁屁www | 国产激情一区二区三区 | 中文字幕日韩一区 | 日韩在线精品视频一区二区涩爱 | 欧美视频一区二区在线 | 97香蕉久久夜色精品国产 | 国产精品免费视频一区二区 | 丰满少妇毛片 | 欧美熟妇久久久久 | 国产三级在线 | 久久久视频在线观看 | 日韩手机看片 | 黄色大片中文字幕 | 国产一区二区三区毛片 | 四虎影院免费视频 | 2019中文字幕在线免费观看 | 国产女同91疯狂高潮互磨 | 思思99热| 亚洲视频导航 | 黄色三级在线 | 欧美精品日韩在线观看 | 亚洲色图19p | 乱色精品无码一区二区国产盗 | 国产 日韩 欧美 综合 | 91娇羞白丝网站 | 欧美性狂猛xxxxxbbbbb | 成人av高清在线观看 | 毛片视屏 | 我们俩电影网mp4动漫官网 | 欧美成人69 | 欧美一区二区三区四区视频 | 明星双性精跪趴灌满h | 男女啪啪免费网站 | 日韩成人一区 | 中文字幕影片免费在线观看 | 国产美女网站视频 | 欧美一级片免费看 | 人妻 日韩 欧美 综合 制服 | 怡红院国产 | 美日韩一级 | 18无套直看片红桃 | 日本一区二区不卡视频 | 日韩激情视频在线观看 | 99成人精品 | 陪读偷伦初尝小说 | 日韩毛片在线观看 | 国产chinesehd天美传媒 | 国产在线中文字幕 | 亚洲精品66| 日韩三级精品 | 久久精品激情 | 四虎影视在线播放 | 午夜激情小视频 | www免费网站在线观看 | 夜夜操夜夜干 | 日韩成人免费在线视频 | 免费在线观看毛片视频 | 欧洲成人午夜精品无码区久久 | 美女扒开腿男人爽桶 | 四季av国产一区二区三区 | 色欧美色 | 苍井空亚洲精品aa片在线播放 | 久久色在线观看 | 久爱精品| 久久婷婷精品 | 最新国产精品自拍 | 欧洲免费av| 91成年版| 综合色视频| 一本色道久久88加勒比—综合 | 三级艳丽杨钰莹三级 | 99re在线视频免费观看 | 欧美又粗又大aaa片 老熟妇仑乱视频一区二区 亚洲妇女体内精汇编 | 欧美精品1区2区 | 亚洲精品一级二级 | 国产麻豆天美果冻无码视频 | 欧美性猛交ⅹxx | 男女搞黄网站 | www.国产成人 | 婷婷综合久久 | 国产美女精品久久 | 成人h动漫精品一区二区 | 在线视频久久 | 亚洲熟妇无码久久精品 | 欧美精品日韩精品 | 欧美aaaaaa |