下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Visual C+窗体设计技巧集前言:有好的界面软件就成功了一半,本文将向您介绍怎样设计一些有 “稀奇古怪 ”形状的窗体,如何设 定窗体的颜色、如何设置任务栏和状态栏以及菜单图标等等,通过这些技巧能更深入的理解 VC 的文档 -视 图结构。如何制作透明窗体使用 SetLayeredWindowAttributes 可以方便的制作透明窗体, 此函数在 w2k 以上才支持 , 而且如果希望 直接使用的话,可能需要下载最新的 SDK 。不过此函数在 w2k 的 user32.dll 里有实现,所以如果你不希望 下载巨大的 sdk的话,可以直接使用 GetProcAddress 获取该函数的指针。Se
2、tLayeredWindowAttributes 的函数原型如下:BOOL SetLayeredWindowAttributes(HWND hwnd, / handle to the layered windowCOLORREF crKey, / specifies the color keyBYTE bAlpha, / value for the blend functionDWORD dwFlags / action);Windows NT/2000/XP: Included in Windows 2000 and later.Windows 95/98/Me: Unsupported.
3、(注意了,在 win9x 里没法使用的)Header: Declared in Winuser.h; include Windows.h.Library: Use User32.lib.一些常量 :WS_EX_LAYERED = 0 x80000;LWA_ALPHA = 0 x2; LWA_COLORKEY=0 x1;其中 dwFlags 有 LWA_ALPHA 和 LWA_COLORKEYLWA_ALPHA 被设置的话 ,通过 bAlpha 决定透明度 .LWA_COLORKEY 被设置的话 ,则指定被透明掉的颜色为 crKey, 其他颜色则正常显示 .要使使窗体拥有透明效果 ,首先要有 W
4、S_EX_LAYERED 扩展属性 (旧的 sdk 没有定义这个属性 ,所以可 以直接指定为 0 x80000).例子代码 :在 OnInitDialog() 加入 :/加入 WS_EX_LAYERED 扩展属性SetWindowLong(this-GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this-GetSafeHwnd(),GWL_EXSTYLEF0 x80000);HINSTANCE hInst = LoadLibrary(User32.DLL);if(hInst)typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF
5、,BYTE,DWORD);MYFUNC fun = NULL;/取得 SetLayeredWindowAttributes 函数指针fun=(MYFUNC)GetProcAddress(hInst, SetLayeredWindowAttributes); if(fun)fun(this-GetSafeHwnd(),0,128,2);FreeLibrary(hInst);稍加修改还可以作出淡出淡入的效果 . 注意第三个参数 (128)不要取得太小了 ,为 0 的话就完全透明 ,看 不到了。如何使框架窗口的图标为动画显示可以用 TIMER ,但是 TIMER 不能有效的定时。因为 TIMER 发
6、送的是窗口消息,当窗口忙于处理键 盘、鼠标等消息时就不能及时处理 TIMER ,会使间隔时间变得很长 。可以考虑用一个单独得TIMER 线程,用 Sleep()定时来解决此问题。UINT Timer(LPVOID param)HWND hWnd=(HWND)param;while(1)Sleep(ms);PostMessage(hWnd,CH_PICTURE,NULL,NULL)Sleep(ms)后发送自定义消息。消息处理函数就选择某一个ICON 或 BITMAP 来显示。如MyBotton.SetBitmap(HBITMAP)Bitmapi);Bitmap 是一个位图数组,存放有 j 个位图
7、。消息处理函数运行一次, i 就累加一次,当 i=j 时, i 就 回到 0;防止窗口闪烁的方法1、将 Invalidate() 替换为 InvalidateRect() 。Invalidate。会导致整个窗口的图象重画,需要的时间比较长,而lnvalidateRect()仅仅重画 Rect 区域内的内容,所以所需时间会少一些。虫虫以前很懒,经常为一小块区域的重画就调用Invalidate。,不愿意自己去计算需要重画的 Rect,但是事实是,如果你确实需要改善闪烁的情况,计算一个Rect 所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。2、 禁止系统搽除你的窗口。系统在需要重画窗口
8、的时候会帮你用指定的背景色来搽除窗口。可是, 也许需要重画的区域也许非常小。或者,在你重画这些东西之间还要经过大量的计算才能开始。这个时候你可以禁止系统搽掉原来的图 象。 直到你已经计算好了所有的数据, 自己把那些需要搽掉的部分用背景色覆盖掉(如: dc.FillRect(rect,&brush);rect 是需要搽除的区域, brush 是带背景色的刷子) ,再画上新的图形。要禁止系统 搽除你的窗口,可以重载 OnEraseBkgnd()函数,让其直接返回 TRUE 就可以了。如BOOL CMyWin:OnEraseBkgnd(CDC* pDC)return TRUE;/return
9、 CWnd:OnEraseBkgnd(pDC);/ 把系统原来的这条语句注释掉。3、 有效的进行搽除。搽除背景的时候,不要该搽不该搽的地方都搽。比如,你在一个窗口上放了一个很大的Edit 框,几乎占了整个窗口,那么你频繁的搽除整个窗口背景将导致Edit 不停重画形成剧烈的闪烁。事实上你可以CRgn 创建一个需要搽除的区域,只搽除这一部分。如GetClientRect(rectClient);rgn1.CreateRectRgnIndirect(rectClient); rgn2.CreateRectRgnIndirect(m_rectEdit);if(rgn1.CombineRgn(&
10、rgn1,&rgn2,RGN_XOR) = ERROR)/ 处理后的 rgn1 只包括了 Edit 框之外的客户区域, 这样,Edit 将不会被我的背景覆盖而导致重画。ASSERT(FALSE);return ;brush.CreateSolidBrush(m_clrBackgnd);pDC-FillRgn(&rgn1,&brush);brush.DeleteObject();注意:在使用这个方法的时候要同时使用方法二。别忘了,到时候又说虫虫的办法不灵4、使用 MemoryDC 先在内存里把图画好,再复制到屏幕上。这对于一次画图过程很长的情况比较管用。 毕竟内存操作比较
11、快, 而且复制到屏幕又是一次性的, 至 少不会出现可以明显看出一个东东从左画到右的情况。void CMyWin:OnPaint()CPaintDC dc1(this); / device context for painting dcMemory.CreateCompatibleDC(&dc1);CBitmap bmp;/ 这里的 Bitmap 是必须的,否则当心弄出一个大黑块哦。bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height(); dcMemory.SelectObject(&b
12、mp);/接下来你想怎么画就怎么画吧。 /dcMemory.FillRect(rectClient,&brush);dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY); dcMemory.DeleteDC();/ Do not call CWnd:OnPaint() for painting messages如何实现全屏显示全屏显示是一些应用软件程序必不可少的功能。比如在用VC 编辑工程源文件或编辑对话框等资源时,选择菜单 “ViewFull Screen,”即可进入全屏显示状
13、态,按“Esc 键后会退出全屏显示状态。在 VC 6.0 中我们用 AppWizard 按默认方式生成单文档界面的应用程序框架。下面将先讨论点击 菜单项“ViewFull Screen 实现全屏显示的方法,再讲述按“Esc 键后如何退出全屏显示状态。1)在 CMainFrame 类中,增加如下三个成员变量。private:WINDOWPLACEMENT m_OldWndPlacement; / 用来保存原窗口位置BOOL m_bFullScreen; / 全屏显示标志CRect m_FullScreenRect; /表示全屏显示时的窗口位置2)在资源编辑器中编辑菜单IDR_MAINFRAME
14、。在“View菜单栏下添加菜单项“Full Screen。”在其属性框中,ID 设置为 ID_FULL_SCREEN,Caption 为“Full Screen。”还可以在工具栏中添加新的工具图标,并使之与菜单项 “Full Screen 相关联,即将其 ID 值也设置为 ID_FULL_SCREEN。3)设计全屏显示处理函数,在响应函数如下:CMainFrame 类增加上述菜单项 ID_FULL_SCREEN 消息的响应函数。void CMainFrame:OnFullScreen()GetWindowPlacement( m_OldWndPlacement);CRect WindowRec
15、t;GetWindowRect( WindowRect);CRect ClientRect;RepositionBars(0, 0 xffff, AFX_IDW_PANE_FIRST, reposQuery, ClientRect);ClientToScreen( ClientRect);/ 获取屏幕的分辨率int nFullWidth=GetSystemMetrics(SM_CXSCREEN);int nFullHeight=GetSystemMetrics(SM_CYSCREEN);将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域,将(0,
16、0)和(nFullWidth,nFullHeight) 两个点外扩充原窗口和除控制条之外的 客户区位置间的差值 , 就得到全屏显示的窗口位置m_FullScreenRect.left=WindowRect.left-ClientRect.left;m_FullScreenRect.top=WindowRect.top-ClientRect.top;m_FullScreenRect.right=WindowRect.right-ClientRect.right nFullWidth;m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bott
17、om nFullHeight;m_bFullScreen=TRUE; / 设置全屏显示标志为 TRUE/ 进入全屏显示状态WINDOWPLACEMENT wndpl; wndpl.length=sizeof(WINDOWPLACEMENT);wndpl.flags=0; wndpl.showCmd=SW_SHOWNORMAL;wndpl.rcNormalPosition=m_FullScreenRect;SetWindowPlacement(wndpl);4)重载 CMainFrame 类的 OnGetMinMaxInfo 函数,在全屏显示时提供全屏显示的位置信息。void CMainFram
18、e:OnGetMinMaxInfo(MINMAXINFO FAR lpMMI)if(m_bFullScreen)lpMMI-ptMaxSize.x=m_FullScreenRect.Width();lpMMI-ptMaxSize.y=m_FullScreenRect.Height(); lpMMI-ptMaxPosition.x=m_FullScreenRect.Width();lpMMI-ptMaxPosition.y=m_FullScreenRect.Height();/最大的 Track 尺寸也要改变 lpMMI-ptMaxTrackSize.x=m_FullScreenRect.Wid
19、th();lpMMI-ptMaxTrackSize.y=m_FullScreenRect.Height();CFrameWnd:OnGetMinMaxInfo(lpMMI) ;完成上面的编程后,可以联编执行 FullScreen.exe,选择菜单“ViewFull Screen 或点击与之关联的工具 栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全屏显示状态的操作接口,下面讲述如何 编程实现按“Esc 键退出全屏显示状态。1)在 ClassView 中选中 CMainFrame 并单击鼠标右键,选择“Add Member Function. ,添加 public 类 型的成员函数 End
20、FullScreen,该函数将完成退出全屏显示的操作。void CMainFrame:EndFullScreen()if(m_bFullScreen)/ 退出全屏显示 , 恢复原窗口显示ShowWindow(SW_HIDE);SetWindowPlacement( m_OldWndPlacement);2)函数 EndFullScreen 可以退出全屏显示状态,问题是如何在“Esc 键被按下之后调用执行此函数。 由于视图类可以处理键盘输入的有关消息 (如 WM_KEYDOWN 表示用户按下了某一个键) ,我们将在视图 类CFullScreenView 中添加处理按键消息 WM_KEYDOWN
21、的响应函数 OnKeyDown 。判断如果按的键为“ Esc 键,则调用 CMainFrame 类的函数 EndFullScreen,便可退出全屏显示状态。void CFullScreenView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)if(nChar=VK_ESCAPE)/ 如果按的键为 Esc 键/ 获取主框架窗口的指针CMainFrame pFrame=(CMainFrame)AfxGetApp()-m_pMainWnd;/ 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态pFrame-EndFullS
22、creen();CView:OnKeyDown(nChar, nRepCnt, nFlags);更改窗口图标并将其显示在任务栏 以下两个函数可以为应用程序中的各子窗口显示一个任务条到任务栏并更改它们的图标。对那些象QQ 一样隐藏主窗口的应用程序特别有用。/函数用途:更改一个窗口的图标并将其显示在任务栏、任务切换条、任务管理器里/ 参数说明 :/hWnd 要改变图标的窗口句柄/hLargeIcon 显示到任务切换条上的图标 32*32/hSmallIcon 显示到除任务切换条之外的图标 16*16/hIcon 显示的图标, 32*32,在显示到任务切换条之外的其余地方时会被自动 压缩成 16*1
23、6 的。/注释:/此函数对于模式对话框无能为力。/如果 HICON 为 NULL ,函数不改变窗口图标,但是将原有图标显示到任务栏、/ 任务切换条、任务管理器里。/此函数是通过将窗口的父窗口指针置空来实现将图标显示到任务栏、任务切换条、/ 任务管理器里的,所以调用完成后,其父窗口指针不再可用。BOOL SendWndIconToTaskbar(HWND hWnd,HICON hLargeIcon,HICON hSmallIcon);BOOL SendWndIconToTaskbar(HWND hWnd,HICON hIcon);BOOL CUIApp:SendWndIconToTaskbar(
24、HWND hWnd,HICON hLargeIcon,HICON hSmallIcon)BOOL ret = TRUE;ASSERT(hWnd); if(!:IsWindow(hWnd) return FALSE;/获取窗口指针CWnd* pWnd;pWnd = pWnd-FromHandle(hWnd); ASSERT(pWnd);if(!pWnd) return FALSE;/将父窗口设为 NULLif(pWnd-GetParent()if(:SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) = 0)return FALSE;if(!(pWnd-ModifyS
25、tyle(NULL,WS_OVERLAPPEDWINDOW) ret = FALSE;/设置窗口图标 if(hLargeIcon & hSmallIcon)pWnd-SetIcon(hSmallIcon,FALSE); pWnd-SetIcon(hLargeIcon,TRUE);return ret;BOOL CUIApp:SendWndIconToTaskbar(HWND hWnd,HICON hIcon)BOOL ret = TRUE;ASSERT(hWnd); if(!:IsWindow(hWnd) return FALSE;/获取窗口指针CWnd* pWnd;pWnd = pW
26、nd-FromHandle(hWnd);ASSERT(pWnd);if(!pWnd)return FALSE;/将父窗口设为 NULLif(pWnd-GetParent()if(:SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) = 0) return FALSE;if(!(pWnd-ModifyStyle(NULL,WS_OVERLAPPEDWINDOW) ret = FALSE;/设置窗口图标 pWnd-SetIcon(hIcon,TRUE); pWnd-SetIcon(hIcon,FALSE);return ret;如何隐藏应用程序在任务栏上的显示对 于CF
27、rameWnd可 以 在PreCreateWindow() 函 数 中 修 改 窗 口 的 风 格BOOLCMainFrame:PreCreateWindow(CREATESTRUCT& cs)cs.style |=WS_POPUP;/ 使主窗口不可见cs.dwExStyle |=WS_EX_TOOLWINDOW;/ 不显示任务按钮 return CFrameWnd:PreCreateWindow(cs);对于其他窗口, 可以在窗口被 Create 出来之后 ShowWindow 之前使用 ModifyStyle() 和 ModifyStyleEx() 来修改它的风格。如何控制窗口框架
28、的最大最小尺寸 ?要控制一个框架的的最大最小尺寸 ,你需要做两件事情。第一步:在 CFrameWnd 的继承类中处理消息 WM_GETMINMAXINFO, 结构 MINMAXINFO 设置了 整个窗口类的限制 ,因此记住要考虑工具条 ,滚动条等等的大小。/ 最大最小尺寸的象素点 - 示例#define MINX 200#define MINY 300#define MAXX 300#define MAXY 400void CMyFrameWnd:OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)CRect rectWindow;GetWindowRect(&
29、rectWindow);CRect rectClient;GetClientRect(&rectClient);/ get offset of toolbars, scrollbars, nWidthOffset = rectWindow.Width() - rectClient.Width();int nHeightOffset = rectWindow.Height() - rectClient.Height();lpMMI-ptMinTrackSize.x = MINX + nWidthOffset;lpMMI-ptMinTrackSize.y = MINY +
30、nHeightOffset;lpMMI-ptMaxTrackSize.x = MAXX + nWidthOffset;lpMMI-ptMaxTrackSize.y = MAXY + nHeightOffset;第二步:在 CFrameWnd 的继承类的 PreCreateWindow 函数中去掉 WS_MAXIMIZEBOX 消息 ,否则在最大化时你将得不到预料的结果BOOL CMyFrameWnd:PreCreateWindow(CREATESTRUCT& cs)cs.style &= WS_MAXIMIZEBOX;return CFrameWnd:PreCreateWind
31、ow(cs);如何修改 frame 窗口的背景颜色?MDI 窗口的客户区是由 frame 窗口拥有的另一个窗口覆盖的。为了改变 frame 窗口背景的颜色,只需 要这个客户区的背景颜色就可以了。你必须自己处理 WM_ERASEBKND 消息。下面是工作步骤:创建一个从 CWnd 类继承的类,就叫它 CMDIClient 吧;在 CMDIFrameWnd 中加入 CMDIClient 变量;(具体情况看下面的代码)#include MDIClient.hclass CMainFrame : public CMDIFrameWndprotected:CMDIClient m_wndMDIClien
32、t;重载 CMDIFrameWnd:OnCreateClient ,下面是这段代码,请注意其中的 SubclassWindow() ;BOOL CMainFrame:OnCreateClient(LPCREA TESTRUCT lpcs, CCreateContext* pContext)if ( CMDIFrameWnd:OnCreateClient(lpcs, pContext) )m_wndMDIClient.SubclassWindow(m_hWndMDIClient);return TRUE;elsereturn FALSE;最后要在 CMDIClient 中加入处理 WM_ERAS
33、EBKGND 的函数。如何改变 view 的背景颜色?若要改变 CView ,CFrameWnd 或 CWnd 对象的背景颜色需要处理 WM_ERASEBKGND 消息,下面就 是一个范例代码:BOOL CSampleView:OnEraseBkgnd(CDC* pDC)/设置 brush 为希望的背景颜色CBrush backBrush(RGB(255, 128, 128);/ 保存旧的 brushCBrush* pOldBrush = pDC-SelectObject(&backBrush); CRect rect;pDC-GetClipBox(&rect);/画需要的区域
34、pDC-PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PA TCOPY); pDC-SelectObject(pOldBrush);return TRUE;若要改变 CFromView 继承类的背景颜色,下面是一个范例代码:HBRUSH CMyFormView:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)switch (nCtlColor)case CTLCOLOR_BTN:case CTLCOLOR_STATIC:pDC-SetBkMode(TRANSPARENT); /不
35、加任何处理或设置背景为透明case CTLCOLOR_DLG:CBrush* back_brush;COLORREF color;color = (COLORREF) GetSysColor(COLOR_BTNFACE); back_brush = new CBrush(color);return (HBRUSH) (back_brush-m_hObject);return(CFormView:OnCtlColor(pDC, pWnd, nCtlColor);在任务栏状态区如何显示应用程序图标有关的数据由 NOTIFYICONDATA 结构描述:typedef struct _NOTIFYIC
36、ONDATADWORD cbSize; / 结构的大小,必须设置HWND hWnd; / 接受回调消息的窗口的句柄UINT uID; / 应用程序定义的图标标志UINT uFlags; / 标志,可以是 NIF_ICON 、NIF_MESSAGE 、 NIF_TIP 或其组合UINT uCallbackMessage;/ 应用程序定义的回调消息标志HICON hIcon; / 图标句柄 char szTip64; / 提示字串 NOTIFYICONDATA, *PNOTIFYICONDATA;函数说明由 Shell_NotifyIcon() 函数向系统发送添加、删除、更改图标的消息。WINSH
37、ELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid);DwMessage 为所发送消息的标志:NIM_ADD 添加图标到任务栏通知区;NIM_DELETE 删除任务栏通知区的图标;NIM_MODIFY 更改任务栏通知区的图标、回调消息标志、回调窗口句柄或提示字串;pnid 为 NOTIFYICONDATA 结构的指针。回调信息的获得及处理如果一个任务栏图标有应用程序定义的回调消息, 那么当这个图标有鼠标操作时, 系统将给 hWnd 所 标志的窗口发送下列的消息:messageID = uCallbac
38、kMessagewParam = uIDIParam = mouse event(例如 WM_LBUTTONDOWN)通过这种方式, 系统通知应用程序用户对图标的操作。 如果一个应用程序生成了两个以上的图标, 那 么你可以根据 wParam 来判断是哪个图标返回的鼠标操作。通常,标准的 Win95 任务栏图标有以下鼠标操 作响应:当鼠标停留在图标上时,系统应显示提示信息tooItip ;当使用鼠标右键单击图标时,应用程序应显示快捷菜单;当使用鼠标左键双击图标时,应用程序应执行快捷菜单的缺省菜单项。在 Microsoft Windows 环境中,0 x8000 到 OxBFFF 的消息是保留的,
39、应用程序可以定义自定义消息。关于消息处理的详细内容,请参考下一部分。源码及实现在本文中关于任务栏图标的类叫做 CTraylcon,这个类由 CCmdTarget(或 CObject)类派生,它有如下 的成员变量和成员函数:/ Traylcon.h/ CTraylcon command target cIass CTraylcon : pubIic CCmdTargetpubIic:NOTlFYlCONDATA m_nid;/NOTlFYlCONDATA 结构,你的图标要用的啊BOOL m_lconExist;/ 标志,看看图标是不是已经存在了CWnd* m_NotificationWnd;/
40、接受回调消息的窗口 ,有它就不必经常 AfxGetMainWnd 了 pubIic:CWnd* GetNotificationWnd() const;/ 得到 m_NotificationWndBOOL SetNotificationWnd(CWnd* pNotifyWnd);/ 设置(更改 )m_NotificationWndCTrayIcon();/ 构造函数virtual CTrayIcon();/ 析构函数BOOL CreateIcon(CWnd* pNotifyWnd, UINT uID, HICON hIcon,LPSTR lpszTip, UINT CallBackMessage
41、);/ 在任务栏上生成图标BOOL DeleteIcon();/ 删除任务栏上的图标virtual LRESULT OnNotify(WPARAM WParam, LPARAM LParam);/ 消息响应函数BOOL SetTipText(UINT nID);/ 设置(更改 )提示字串BOOL SetTipText(LPCTSTR lpszTip);/ 设置(更改 )提示字串BOOL ChangeIcon(HICON hIcon);/ 更改图标BOOL ChangeIcon(UINT nID);/ 更改图标BOOL ChangeIcon(LPCTSTR lpszIconName);/ 更改图
42、标BOOL ChangeStandardIcon(LPCTSTR lpszIconName);/ 更改为标准图标;下面是成员函数的定义:/ TrayIcon.cpp/ CTrayIcon CTrayIcon:CTrayIcon()/ 初始化参数 m_IconExist = FALSE;m_NotificationWnd = NULL;memset(&m_nid, 0, sizeof(m_nid);m_nid.cbSize = sizeof(m_nid);/ 这个参数不会改变CTrayIcon:CTrayIcon()if (m_IconExist)DeleteIcon();/ 删除图标B
43、OOL CTrayIcon:CreateIcon(CWnd* pNotifyWnd, UINT uID, HICON hIcon, LPSTR lpszTip, UINT CallBackMessage)/确定接受回调消息的窗口是有效的 ASSERT(pNotifyWnd & :IsWindow(pNotifyWnd-GetSafeHwnd();ASSERT(CallBackMessage = WM_USER);/ 确定回调消息不发生冲突ASSERT(_tcslen(lpszTip) GetSafeHwnd(); m_nid.uID = uID;m_nid.hIcon = hIcon;
44、 m_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; m_nid.uCallbackMessage =CallBackMessage;/设置 NOTIFYICONDATA 结构的提示字串if (lpszTip) lstrcpyn(m_nid.szTip, lpszTip, sizeof(m_nid.szTip); elsem_nid.szTip0 = ;/显示图标m_IconExist = Shell_NotifyIcon(NIM_ADD, &m_nid); return m_IconExist;BOOL CTrayIcon:DeleteI
45、con()/ 删除图标 if (!m_IconExist) return FALSE;m_IconExist = FALSE;return Shell_NotifyIcon(NIM_DELETE, &m_nid);LRESULT CTrayIcon:OnNotify(WPARAM WParam, LPARAM LParam)/ 处理图标返回的消息if (WParam != m_nid.uID)/ 如果不是该图标的消息则迅速返回 return 0L;/准备快捷菜单CMenu menu;if (!menu.LoadMenu(IDR_POPUP)/ 你必须确定资源中有 ID 为 IDR_PO
46、PUP 的菜单 return 0;CMenu* pSubMenu = menu.GetSubMenu(0);/ 获得 IDR_POPUP 的子菜单 if (!pSubMenu) return 0;if (LParam = WM_RBUTTONUP)/ 右键单击弹出快捷菜单/设置第一个菜单项为缺省 :SetMenuDefaultItem(pSubMenu-m_hMenu, 0, TRUE);CPoint pos;GetCursorPos(&pos);/显示并跟踪菜单 m_NotificationWnd-SetForegroundWindow();pSubMenu-TrackPopupMe
47、nu(TPM_RIGHTALIGN|TPM_LEFTBUTTON |TPM_RIGHTBUTTON, pos.x, pos.y,m_NotificationWnd, NULL);else if (LParam = WM_LBUTTONDOWN)/ 左键单击恢复窗口 m_NotificationWnd-ShowWindow(SW_SHOW);/ 恢复窗口m_NotificationWnd-SetForegroundWindow();/ 放置在前面else if (LParam = WM_LBUTTONDBLCLK)/ 左键双击执行缺省菜单项 m_NotificationWnd-SendMessa
48、ge(WM_COMMAND, pSubMenu-GetMenuItemID(0),0);return 1L;BOOL CTrayIcon:SetTipText(LPCTSTR lpszTip)/ 设置提示文字if (!m_IconExist)return FALSE;_tcscpy(m_nid.szTip, lpszTip); m_nid.uFlags |= NIF_TIP;return Shell_NotifyIcon(NIM_MODIFY , &m_nid);BOOL CTrayIcon:SetTipText(UINT nID)/ 设置提示文字CString szTip;VERIF
49、Y(szTip.LoadString(nID);return SetTipText(szTip);BOOL CTrayIcon:ChangeIcon(HICON hIcon) / 更改图标if (!m_IconExist)return FALSE;m_nid.hIcon = hIcon;m_nid.uFlags |= NIF_ICON;return Shell_NotifyIcon(NIM_MODIFY , &m_nid);BOOL CTrayIcon:ChangeIcon(UINT nID)/ 更改图标HICON hIcon = AfxGetApp()-LoadIcon(nID);
50、return ChangeIcon(hIcon);BOOL CTrayIcon:ChangeIcon(LPCTSTR lpszIconName) / 更改图标HICON hIcon = AfxGetApp()-LoadIcon(lpszIconName); return ChangeIcon(hIcon);BOOL CTrayIcon:ChangeStandardIcon(LPCTSTR lpszIconName)/ 更改为标准图标HICON hIcon = AfxGetApp()-LoadStandardIcon(lpszIconName); return ChangeIcon(hIcon)
51、;BOOL CTrayIcon:SetNotificationWnd(CWnd * pNotifyWnd)/ 设置接受回调消息的窗口 if (!m_IconExist) return FALSE;/确定窗口是有效的ASSERT(pNotifyWnd & :IsWindow(pNotifyWnd-GetSafeHwnd();m_NotificationWnd = pNotifyWnd; m_nid.hWnd = pNotifyWnd-GetSafeHwnd(); m_nid.uFlags |= NIF_MESSAGE;return Shell_NotifyIcon(NIM_MODIFY , &m_nid);CWnd* CTrayIcon:GetNotificationWnd() const / 返回接受回调消息的窗口return m_NotificationWnd;三点补充:关于使用回调消息的补充说明:首先,在 MainFrm.cpp 中加入自己的消息代码;/ MainFrm.cpp : implementation of the CMainFrame class/#define MYWM_ICONNOTIFY W
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业内部控制审计程序与控制指南
- 环境保护措施操作手册
- 2025 七年级道德与法治下册情绪调节的教师指导课件
- 2025 七年级道德与法治上册面对老师提醒的“改进计划表”制定课件
- 麻醉科心理护理干预方案
- 化工行业安全防护指南
- 2025年惠阳区法院事业编招聘考试及答案
- 2025年邵阳县招暑假工面试题库及答案
- 2025年光谷军创夏令营面试题库及答案
- 2025年陕西五月事业编考试及答案
- 2026年及未来5年市场数据中国金属铍行业市场竞争格局及发展趋势预测报告
- 2025-2030中国动物狂犬病疫苗行业发展现状及趋势前景分析研究报告
- 微生物菌剂培训课件
- 湖北省鄂东南教育联盟2025-2026学年高三上学期期中暨一模语文试卷及答案
- 第04讲 数与式综合提升卷(原卷版)-2025年中考数学一轮复习(全国版)
- 会议纪要标准化撰写模板
- 项目投资协议书范本合同
- 第二章拟投入施工机械设备
- 王庄矿5.0Mt-a新井设计 - 厚煤层回采巷道支护技术研究
- 心脏手术血糖管理
- 房地产企业总经理年度经营目标责任书模板
评论
0/150
提交评论