MFC 程序托盘右键菜单 自绘.

其实我还是参考了网上的代码:

  1 //自绘右键菜单
2 void CDemoStandardDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
3 {
4 if (nIDCtl == 0)
5 {
6 lpMeasureItemStruct->itemWidth = 145;
7 lpMeasureItemStruct->itemHeight = 25;
8 }
9
10 CStandardDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
11 }
12
13 void CDemoStandardDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis)
14 {
15 if(nIDCtl == 0)
16 {
17 CBrush *brush = new CBrush;
18 CPen *pen = new CPen;
19 CString strText;
20 CDC *pDC = CDC::FromHandle(lpdis->hDC); //获取菜单项的设备句柄
21 CRect *rectIcon, *rectText;
22 CRect rectBox;
23 CFont hFont;
24 hFont.CreateFont(
25 14, // nHeight
26 0, // nWidth
27 0, // nEscapement
28 0, // nOrientation
29 FW_MEDIUM, // nWeight
30 FALSE, // bItalic
31 FALSE, // bUnderline//FALSE
32 0, // cStrikeOut
33 ANSI_CHARSET, // nCharSet
34 OUT_DEFAULT_PRECIS, // nOutPrecision
35 CLIP_DEFAULT_PRECIS, // nClipPrecision
36 CLEARTYPE_QUALITY, // nQuality
37 DEFAULT_PITCH | FF_MODERN, // nPitchAndFamily
38 L"Lucida Console"); // lpszFacename//Arial
39 CFont* hOldFont = pDC-> SelectObject(&hFont);
40
41 rectBox = lpdis->rcItem;
42 rectIcon = new CRect(rectBox.left+4,rectBox.top+3,rectBox.left+23,rectBox.top+26);
43 rectText = new CRect(rectBox.left+40,rectBox.top+4,rectBox.right,rectBox.bottom);
44
45 //菜单项是否为选中状态
46 if ((lpdis->itemState & ODS_SELECTED))
47 {
48 //在菜单项上自绘矩形框的背景颜色
49 brush->CreateSolidBrush(RGB(182, 189,210));
50 //在菜单项自绘矩形的边框颜色
51 pen->CreatePen(PS_SOLID, 1, RGB(10,36,106));
52 //设置菜单项的文字背景颜色
53 pDC->SetBkColor(RGB(182,189,210));
54 }
55 else
56 {
57 brush->CreateSolidBrush(GetSysColor(COLOR_MENU));
58 pen->CreatePen(PS_SOLID, 0, GetSysColor(COLOR_MENU));
59 pDC->SetBkColor(GetSysColor(COLOR_MENU));
60 }
61 pDC->SelectObject(pen);
62 pDC->SelectObject(brush);
63 /* 在当前菜单项上画一个矩形框 */
64 pDC->Rectangle(lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom);
65 //获取当前消息所在菜单项的文本
66 CMenu menu;
67 menu.Attach((HMENU)lpdis->hwndItem);
68 menu.GetMenuString(lpdis->itemID, strText,MF_BYCOMMAND);
69
70 //如果为菜单发出的DrawItem消息
71 //在菜单项上输出菜单文本
72 //DrawTextW(pDC-> GetSafeHdc(),strText,rectText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
73 if(lstrcmp(strText,L"Turn On")==0||lstrcmp(strText,L"Turn Off")==0)
74 {
75 if(BtnFlag == FALSE)
76 {
77 pDC->DrawText(L"Turn On",lstrlen(L"Turn On"),rectText, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
78 DrawIconEx(pDC-> GetSafeHdc(),rectIcon->left,rectIcon->top,AfxGetApp()->LoadIcon(IDI_TRAY_TURNON),19,19,0,NULL,DI_NORMAL);
79 }
80 if(BtnFlag == TRUE)
81 {
82 pDC->DrawText(L"Turn Off",lstrlen(L"Turn Off"),rectText, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
83 DrawIconEx(pDC-> GetSafeHdc(),rectIcon->left,rectIcon->top,AfxGetApp()->LoadIcon(IDI_TRAY_TURNOFF),19,19,0,NULL,DI_NORMAL);
84 }
85 }
86 else if(lstrcmp(strText,L"Setting")==0)
87 {
88 pDC->DrawText(strText,lstrlen(strText),rectText, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
89 DrawIconEx(pDC-> GetSafeHdc(),rectIcon->left,rectIcon->top,AfxGetApp()->LoadIcon(IDI_TRAY_SETTING),19,19,0,NULL,DI_NORMAL);
90 }
91 else if(lstrcmp(strText,L"Exit")==0)
92 {
93 pDC->DrawText(strText,lstrlen(strText),rectText, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
94 DrawIconEx(pDC-> GetSafeHdc(),rectIcon->left,rectIcon->top,AfxGetApp()->LoadIcon(IDI_TRAY_EXIT),19,19,0,NULL,DI_NORMAL);
95 }
96 pDC->SelectObject(hOldFont);
97
98 menu.Detach();
99 delete brush;
100 delete pen;
101 delete rectIcon;
102 delete rectText;
103 }
104 CStandardDialog::OnDrawItem(nIDCtl, lpdis);
105 }

主要是这个自绘的过程必须写在CXXXDialog中,独立写貌似不成功,不知道为什么?

转载于:https://www.cnblogs.com/lingyun1120/archive/2011/11/13/2247695.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值