让你的软件界面更漂亮_第1页
让你的软件界面更漂亮_第2页
让你的软件界面更漂亮_第3页
让你的软件界面更漂亮_第4页
让你的软件界面更漂亮_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/result.php?key=让你的软件界面更漂亮让你的软件界面更漂亮(1)本文示例源代码或素材下载我们使用过很多的软件, 给我们留下印象很深的是那些界面漂亮且迷人的软件, 国外的软件象QuickTime,国产的象金山词霸等,它们的软件界面设计风格都有独特之处。本人跟据自已的经验和大家探讨一下软件的漂亮界面实现的原理并提供DEMO程序。本人经验不多,经常从VCKBASE.COM吸取知识,共同学习,如有不足之处,请指正!也欢迎和我联系。下面就开始吧!一、漂亮界面实现的原理用图象元素自绘窗口标题样栏,边框,系统按钮(最大化、最小化、关闭按钮)还有按窗口中的控件。图象当然是美工画的,但要你教美工怎么去画,是不是不能理解? ,呆会我会告诉你你如何去教美工画.请先仔细看下图。明白了吧,被红线包括的部分都是要画的图象。画得好不好会直接影响你的软件界面。二、原理说玩了,来说一下实现的基本知识1、VC软件绘图技术:CBitmap* pBitmap = new CBitmap;BITMAP BmpInfo;CBitmap* pOldBitmap;CDC* pDisplayMemDC=new CDC;pDisplayMemDC-CreateCompatibleDC(pDC);pBitmap-LoadBitmap(IDB_TITLE_LEFT);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);pBitmap-GetBitmap(&BmpInfo);/ x,y为绘图位置 ,必要时此语句要有For(.;.;.)控制pDC-BitBlt(x,y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();ReleaseDC(pDisplayMemDC);/记得执行以下的语句delete pDisplayMemDC;delete pBitmap; 2、坐标的概念:点、窗口坐标和屏幕坐标及转换,很重要!如不清楚请先复习相关知识。下图是我写在一个界面,就是基于上述原理实现的:下面介绍软件如何实现的:、重载对话框的消息函数:void OnNcLButtonDown(UINT nHitTest, CPoint point); /单击标题栏时是响应void OnNcMouseMove(UINT nHitTest, CPoint point); /Mous 在标题移动时响应LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 、添加关键成员函数为:BOOL DrawTitleBar(CDC *pDC)、添加完消息涵数后,在.cpp中实现它们的代码:void CTitleBarDlg:OnNcMouseMove(UINT nHitTest, CPoint point)CDC* pDC = GetWindowDC();CDC* pDisplayMemDC=new CDC;pDisplayMemDC-CreateCompatibleDC(pDC);CBitmap* pBitmap = new CBitmap;CBitmap* pOldBitmap;CRect rtWnd, rtButton;if (pDC)CString StrTemp = ;GetWindowRect(&rtWnd);/mouse坐标转化为本窗口坐标 重要point.x = point.x - rtWnd.left;point.y = point.y - rtWnd.top;/判断mouse是否移到系统按钮上if (m_rtButtExit.PtInRect(point)pBitmap-LoadBitmap(IDB_EXIT_FOCUS);StrTemp = _T(关闭);elseif(m_rtButtMin.PtInRect(point)pBitmap-LoadBitmap(IDB_MIN_FOCUS);StrTemp = _T(最小化窗口);elseif(m_rtButtMax.PtInRect(point)pBitmap-LoadBitmap(IDB_MAX_FOCUS);if(IsZoomed()StrTemp = _T(还原窗口);elseStrTemp = _T(最化大窗口);elsepBitmap-LoadBitmap(IDB_NORMAL);rtButton = m_rtButtMin;BITMAP BmpInfo;pBitmap-GetBitmap(&BmpInfo);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);pDC-BitBlt(rtButton.left-6,rtButton.top-2,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();CRect ShowTipRec;ShowTipRec = m_rtButtMin;if(!StrTemp.IsEmpty()/ScreenToClient(&ShowTipRec);/m_ToolTip.AddToolTip(IDD_TITLEBAR_DIALOG,&ShowTipRec,StrTemp);/m_ToolTip.SetDelayTime(200);ReleaseDC(pDisplayMemDC);ReleaseDC(pDC);delete pDisplayMemDC;delete pBitmap;CDialog:OnNcMouseMove(nHitTest, point);/此为关键函数void CTitleBarDlg:DrawTitleBar(CDC *pDC)if (m_hWnd)CBrush Brush(RGB(0,100,255);CBrush* pOldBrush = pDC-SelectObject(&Brush);CRect rtWnd, rtTitle, rtButtons;GetWindowRect(&rtWnd);/取得标题栏的位置rtTitle.left = GetSystemMetrics(SM_CXFRAME);rtTitle.top = GetSystemMetrics(SM_CYFRAME);rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);/计算最小化按钮的位置,位图大小为15X15rtButtons.left = rtTitle.right-60;rtButtons.top= rtTitle.top+2;rtButtons.right = rtTitle.right-42;rtButtons.bottom = rtTitle.top+20;m_rtButtMin = rtButtons;/计算最大化按钮的位置,位图大小为15X15m_rtButtMax.left = m_rtButtMin.left + 18;m_rtButtMax.top = m_rtButtMin.top;m_rtButtMax.right = m_rtButtMin.right + 16;m_rtButtMax.bottom = m_rtButtMin.bottom;m_rtButtExit.left = m_rtButtMax.left + 18;m_rtButtExit.top =m_rtButtMax.top;m_rtButtExit.right = m_rtButtMax.right + 16;m_rtButtExit.bottom = m_rtButtMax.bottom;/准备CBitmap* pBitmap = new CBitmap;BITMAP BmpInfo;CBitmap* pOldBitmap;CDC* pDisplayMemDC=new CDC;pDisplayMemDC-CreateCompatibleDC(pDC);/重画CaptionPOINTDrawPonit;DrawPonit.x =rtTitle.left-4;DrawPonit.y =rtTitle.top-4;pBitmap-LoadBitmap(IDB_TITLE_LEFT);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);pBitmap-GetBitmap(&BmpInfo);pDC-BitBlt(rtTitle.left-4,rtTitle.top-4,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();pBitmap-LoadBitmap(IDB_TOP);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);pBitmap-GetBitmap(&BmpInfo);while(DrawPonit.xBitBlt(DrawPonit.x,DrawPonit.y,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();pBitmap-LoadBitmap(IDB_TITLE_RIGHT);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);pBitmap-GetBitmap(&BmpInfo);pDC-BitBlt(DrawPonit.x,DrawPonit.y,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();/重画最小化buttonrtButtons = m_rtButtMin;pBitmap-LoadBitmap(IDB_NORMAL);pBitmap-GetBitmap(&BmpInfo);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);pDC-BitBlt(rtButtons.left-6,rtButtons.top-2,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();int nOldMode = pDC-SetBkMode(TRANSPARENT);COLORREF clOldText=pDC-GetTextColor();CFont titleFont;titleFont.CreateFont( 12, / nHeight8, / nWidth0, / nEscapement文本行逆时针旋转角度0, / nOrientation字体角度FW_BOLD, / nWeight字体粗细程度FALSE, / bItalicFALSE, / bUnderline0, / cStrikeOut 删除线ANSI_CHARSET, / nCharSetOUT_DEFAULT_PRECIS, / nOutPrecisionCLIP_DEFAULT_PRECIS, / nClipPrecisionDEFAULT_QUALITY, / nQualityDEFAULT_PITCH | FF_SWISS, / nPitchAndFamily_T(隶书);/ lpszFac pDC-SelectStockObject(SYSTEM_FIXED_FONT);CFont *OldFont;OldFont = pDC-SelectObject(&titleFont);CString m_StrTitle;GetWindowText(m_StrTitle);pDC-SetTextColor(RGB(80,255,25);if(m_ShowTitle)pDC-TextOut(65,10,m_StrTitle);elsem_StrTitle = m_StrTitle.Left(6);m_StrTitle += .;pDC-TextOut(30,10,m_StrTitle);pDC-SetBkMode(nOldMode);pDC-SetTextColor(clOldText);pDC-SelectObject(OldFont);/pDC-TextOut(60,60,m_StrTitle);/重画左边框pBitmap-LoadBitmap(IDB_LEFTDOWN);pBitmap-GetBitmap(&BmpInfo);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);int i ;for (i= 20;iBitBlt(0, rtButtons.top+i,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();/重画右边框pBitmap-LoadBitmap(IDB_RIGHTDOWN);pBitmap-GetBitmap(&BmpInfo);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);GetClientRect(&rtWnd);for (i= 25;iBitBlt(rtWnd.right, i,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();/重画底边框pBitmap-LoadBitmap(IDB_DOWN);pBitmap-GetBitmap(&BmpInfo);pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap);GetClientRect(&rtWnd);for (i= 9; iBitBlt(i,rtWnd.bottom+26,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);pDisplayMemDC-SelectObject(pOldBitmap);pBitmap-DeleteObject();ReleaseDC(pDisplayMemDC);delete pDisplayMemDC;delete pBitmap;void CTitleBarDlg:OnNcLButtonDown(UINT nHitTest, CPoint point)CRect rtWnd;GetWindowRect(&rtWnd);/mouse坐标转化为本窗口坐标 重要point.x = point.x - rtWnd.left;point.y = point.y - rtWnd.top;/检测各按钮是否按到if (m_rtIcon.PtInRect(point)AfxMessageBox(界面软件设计者:朱一松 EMail:Song_0962);elseif (m_rtButtHelp.PtInRect(point)SendMessage(WM_HELP);elseif (m_rtButtExit.PtInRect(point)SendMessage(WM_CLOSE);elseif (m_rtButtMin.PtInRect(point)m_ShowTitle = FALSE;SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,MAKELPARAM(point.x, point.y);elseif (m_rtButtMax.PtInRect(point)m_ShowTitle = TRUE;if (IsZoomed()SendMessage(WM_SYSCOMMAND,SC_RESTORE,MAKELPARAM(point.x, point.y);elseSendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,MAKELPARAM(point.x, point.y);Invalidate();elseif (!IsZoomed()Default();/*LRESULT CTitleBarDlg:DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)LRESULT lrst=CDialog:DefWindowProc(message, wParam, lParam);if (!:IsWindow(m_hWnd)return lrst;if (message=WM_MOVE| message=WM_PAINT| message=WM_NCPAINT| message=WM_NCACTIVATE| message = WM_NOTIFY)CDC* pWinDC = GetWindowDC();if (pWinDC)DrawTitleBar(pWinDC);ReleaseDC(pWinDC);return lrst; 好了运行你的程序,即可出现漂亮的界面。说明在设计对话框时最好只选上Title Bars,其它不要.消息函数要手动添加。只本程序是在VC+6.0 +WinXP环境下完成的。经过实践证明,仅仅画一个窗口很容易,多窗口程序软件实现统一风格很难。如若有机会的话,我会和大家继续探讨如何将设计好的漂亮窗口子类化,让程序所有的窗口有统一风格,美化窗口的其它控件并可自动随窗口改变而调整大小。我想那才是我们大家关心的。对不?本人的联系QQ:34544052 Email:Song_0962让你的软件界面更漂亮(2)一、统一风格漂亮界面设计的理论与实现a窗口和对话框Windows操作系中窗口和对话框在我们看来是一样的,就是一个四边形,有标题栏、系统按钮,边框等,可移动和可变大小。实际上窗口和对话框是有的区别的。在创建对话框窗口时的工作中要发生两个主要过程:对话框的过程和其窗口过程。Win32 SDK对话框使用了系统提供的对话框窗口的窗口过程和对话框过程,对话框过程将被窗口过程调用。在MFC下,所有的窗口类都使用了同一个窗口过程,对话框类也一样。MFC对话框过程只处理WM_INITDIALOG消息,其余都让窗口过程处理,我们只能在函数OnInitDialog()中有唯一机会处理我们的对话框的初始化工作。因而我们设计界面时要在窗口过程处理中相关消息实现我们的界面。b. 几个有关对话框窗口消息的处理1WM_NCPAINT:重画非客户区消息重载此消函数,可以标题栏上为所欲为。2. WM_NCLBUTTONDOWN:在非客户区上按下鼠标左键消息要想在标题栏相应鼠标左键,可重载此消函数3WM_NCMOUSEMOVE:在非客户区上移动鼠标会产生此消息4WM_SIZE:在窗口改变大小后产生此消息。为了使软件更专业,调整对放框大小时,里面的各控件也应合理调整位置和大小,重载此消函数可实现目的。还有很几个,其它的不介绍了。c. 统一的界面风格实现如何运用上述知识请参考我的前一文让你的软件界面更漂亮(一)中有介绍并有源程序。漂亮界面的统一风格是如何实现的将是本文要讨论主要内容。我们知道Windows操作系统窗口风格基本上是一致的,微软的应用软件程序也和操作系统风格基本是统一的。所以使我们的CDialog 也跟其一样,要改变它的界面风格很困难。除非你对MFC了如指掌,甚至要了解操作系统内核。本人在摸索过程中经过无数次碰壁后,终于找到了希望。请看下面两幅图:图一图二看了上面两图你是不是对VC有信心了?Visual C+ 可实现你想要的统一风格界面。请看如何实现:1首先要建立漂亮界面主窗口。它也是一个对话框,方法前文有介绍。2处理漂亮界面主窗口的OnInitDialog()函数。很重要!BOOL CTitleBarDlg:OnInitDialog()/此处 不能修改和添加代码!因为其它对话框的OnInitDialog()要用到m_ToolTip.Create(this,TTS_ALWAYSTIP);/Create提示m_ReSizeFlag= TRUE;CRect rtWnd;GetClientRect(&rtWnd);m_OldWidth = rtWnd.Width();m_OldHeight = rtWnd.Height();OldPoint.x = rtWnd.Width();OldPoint.y = rtWnd.Height();if(!m_BaseFlag) m_BaseFlag = TRUE; CDialog:OnInitDialog(); /*你只能在处修改和添加你所需主窗口初始化的代码 /*return TRUE; 3建立你的对话框和对话框类。用对话框资源编辑器完成对话框模板。用ClassWizard生成CyourDlg类此时基类只能为CDialog。4.修改基类CDialog为漂亮界面类(CtitleBarDlg)yourDlg.h yourDlg.cpp 内的CDialog都要改,用Edit/Replace功能快些且安全。在yourDlg.h还要包括TitleBarDlg.h注意:对话框构造函数第一个参数CtitleBarDlg nID 要删除。否则通Build通不过。5. 显示你的窗口/显示代码CyouDlg *pMyDlg;pMyDlg = new CyouDlg;pMyDlg-Create(IDD_YOUR_DLG);pMyDlg-ShowWindow(SW_SHOW); 这种代码要在适当的时候delete pMyDlg,防内存泄露。由于 pMyDlg没有定义为全局,处理它有一定难度。如果是用DoModal()显示就好了,大家可以去试一下。解决了告诉我!6. 完成编译运行。你的对话框的风格是不是和主窗口一样,有没显示出来?二说明统一风格的漂亮界面基本达到了目的。但同样也存在几个问题:1漂亮界面界必须是主窗口。我还没有想出方法能让它独立出来。2显示其它子窗口只能是非模式对话框窗口方式。我尝试DoModal显示但没有成功。但我分析MFC后找到了笨方法,MFC也是这么做。3基于述原因,我建立了统一的界面风格的开发模板,只有在此模板上开发就能实现软件漂亮统一的界面风格。需要可和我联系! 若有机会我会和大家继续探讨漂亮界面的实现的其它难点。让你的软件界面更漂亮(3)本文示例源代码或素材下载实现令人满意的风格统一的软件界面确实很难,象网友提到的MessageBox、FileDialog、FontDialog、目录选择对话框等MFC内部甚至系统DLL内的对话框,要想让它变脸可不容易。有人说HOOK技术可以,HOOK技术确实可以,HOOK可以说是无孔不入,但HOOK的使用效率却是令人难以满意的,从目前大多数采HOOK技术的换肤软件使用情况来看,完全可以证明这一点。今天我们将讨论另外一技术来实现FileDialog的变脸,这种技术叫替换窗口过程法(注:本人杜撰)。窗口过程函数是大多窗口都有的,它处理窗口中(包括子窗口)的每一个事件,替换窗口过程法与HOOK技术比起来孰强誰弱是很显然的,因为同一个HOOK只能拦截一个事件,处理起来相当费时,HOOK也有它的优势,但不是本文要讨论的。这里先让大家眼见为实,请看下图:一、原理说明:替换对话框的窗口过程要用到这个函数SetWindowLong()其原型如下:LONG SetWindowLong(HWND hWnd, int nIndex ,long dwLongNewProc)hWnd为指定窗口的句柄,nIndex为 GWL_WNDPROC时才可设定新的窗口过程dwLongNewProc为指定新的窗口过程函数地址 反回值为一个long的数值,此值为旧的窗口过程函数地址。如果要替换某个窗口的窗口过程函数,首先要想法弄到它的窗口的句柄,当然还得有窗口过程。二、CFileDialog文件对话框界面设计a. 从CFileDialog派生类CMyFileDialog;b. 添加Protected 型虚成员函数:OnInitDone();此函是实际上是CFileDialog一个虚函数,它在文件对话框创后建后被调用,它给我们留下了一个入口,因些重载现实替换其窗口过程函数;c. 添加成员函数MyWindowProcNew()static LRESULT CALLBACK WindowProcNew(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); 在这函数实现的时候你可大显身手,处理得好不好决定你是否能变脸成功。 d. 实现代码及说明如下:WNDPROC m_MyWndProc; /定义全局变量保存旧的窗口过程函数地址void CMyFileDialog:OnInitDone()CWnd* pDialog = GetParent();m_MyWndProc=(WNDPROC)SetWindowLong(pDialog-m_hWnd,GWL_WNDPROC,(long)MyWindowProcNew);LRESULT CALLBACK CMyFileDialog:MyWindowProcNew(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)switch (message)case WM_NOTIFY:case WM_MOUSEMOVE:case WM_MOVE:break;case WM_NCACTIVATE:break;case WM_NCPAINT:break;case WM_NCMOUSEMOVE:break;case WM_PAINT:break;case WM_COMMAND:break;case WM_SIZE:break;case WM_XX:default:break;/这时要恢复调用旧的窗口函数,当然必时可要忽略它return CallWindowProc(m_MyWndProc, hwnd, message, wParam, lParam); 这个函数CallWindowProc()用来恢调用复旧窗口过程函数,当然这并不意味取消了新的窗口过程。你也可跳过它不去执行,那为什要恢复旧的窗口过程函数?因为旧的窗口过程函数它处理了太多的事件,而新窗口过程函数只处理我们关心的事件,如果你乐意的话你完全可不要调用旧的窗口过程函数,那可是要付出大的代价的。具体细节请大家去实现,可参“让你的软件界面更漂亮(一)”。三、CMyFileDialog的用法我把CMyFileDialog写成一个DLL,有Debug和Release两个版,请用时分别选择 a.先把.lib .dll .h 文件持拷到工程目录。在要使用处加如代码:#include MyFileDialg.h#pragam comment(lib,user.lib) b.显示文件对话框:CMyFileDialog MyFileDlg(TRUE, 1, _T(对话框标题); MyFileDlg.DoModal(); CStringFileName = MyFileDlg.GetPathName() FileName是反回的结果 c. CMyFileDialog有一个超值的功能,不知有没有从上图看出来?它能够用来代替 SHBrowseForFoler 作为目录选择对话框。这也是我写CMyFileDialog的初终。构造函数第一个参数和CfileDialg 一样,第二个参数为TRUE时可作为目录选择 对话框, 此时第一个参数可BOOL的任意值建议设为TRUE,第三个参数为对话框标题,如为NULL则显示默认标题,其它参数和CFileDialog一样。作者:朱一松 责编:豆豆技术应用让你的软件界面更漂亮(4)本文示例源代码或素材下载漂亮界面的软件应该有漂亮的菜单,大家对 Windows XP 的开始菜单肯定不陌生吧,那种菜单独具风格。于是去研究了一下,发现其实它并不是真CMenu也不是其派生类,分析其结构发现其主要是两个 ListView、一个ToolBar、一个 Button 组成的。于是也写了个菜单类,但我并没有用 ListView 去实现,虽然不敢和 Windows XP相比,但我认为其是一种有个性的菜单,拿出和大家分享! 希望大家能写出有创新和自主产权的菜单。哈哈。当然要先眼见为实如下图。一、 实现原理用 CWnd 和 CButton 来实现。主要的类文件为 Cyisong Menu.cpp CyisongMenu.h。二、菜单使用方法说明类 public 变量定义:CYisongMenu m_GroupMenu;CYisongMenu m_SubGroupMenu;/子菜单 设置头像和添加菜单项:m_GroupMenu.SetMenuHeader(我的主菜单,IDI_QQ, TRUE );m_GroupMenu.AppendMenuItem(退出系统,IDC_SUBITEM, /菜单IDIDI_ICON1, / 图标NULL, /子菜单指针MENU_NORMAL|MENU_FONTBOLD/风格参数);m_GroupMenu.AppendMenuItem(功能菜单2,IDC_SUBITEM+1,IDI_ICON2,NULL,MENU_NORMAL ); 继续用 AppendMenuItem 添加菜单项,完成创建m_GroupMenu.CreateGroupMenu(this,CRect(0,0,150,300),IDC_MENU,1,1); 至此基本完成创建工作,如果还要创建创子菜单用,请回到a处。显示菜单项在点(x,y)处显示菜单m_GroupMenu. ShowMenuPos(x,y, LEFTBOTTOM); 第三个 数指定(x,y)为菜单的四个角点中的一个。如LEFTBOTTOM即为菜单左下角处在(x,y)的位置。响映菜单项命令在.cpp 中添加:ON_COMMAND_RANGE(IDC_SUBITEM,IDC_SUBITEMMAX,OnMenuCommand) /消息映射函数 并在.h 中声明为:void OnMenuCommand(UINT nID) 在 cpp 中的函数实现代码为:CString StrSelect;StrSelect.Format(你选择了第%I功能,nID-IDC_SUBITEM + 1);MessageBox(StrSelect,执行结果); 三、主要函数说明原型:void SetMenuHeader(CString StrTitle ,UINT nID , BOOL bShowHead)参数:StrTitle :头标题 ,nID :图标ID, bShowHead:如要显菜单头则为TRUE原型:AppendMenuItem(CString StrTitle, int nID, int nIconID, CWnd* pSubMenu,DWORD dwStyles, CString strTip)参数:StrTitle:头标题,nID:菜单项ID,nIconID:图标ID,pSubMenu:如有子菜单/ pSubMenu为其指针,否则为NULL;dwStyles:MENU_NORMAL / 一般菜单项;MENU_FONTBOLD / 菜单项字体为粗体;MENU_BORDLINE / 为分界线;MENU_SUBITEM/ 菜单项有子菜单;MENU_CHECKBOX / 菜单有CHECK标志;原型:CreateGroupMenu(CWnd *pParent, CRect rcClient, UINT nID, BOOL bShowHead,int nModeIcon)参数:pPare

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论