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

下载本文档

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

文档简介

让你的软件界面更漂亮让你的软件界面更漂亮 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 x y 为绘图位置 必要时此语句要有 For 控制 pDC BitBlt x y BmpInfo bmWidth BmpInfo bmHeight pDisplayMemDC 0 0 SR CCOPY 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 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 关闭 else if m rtButtMin PtInRect point pBitmap LoadBitmap IDB MIN FOCUS StrTemp T 最小化窗口 else if m rtButtMax PtInRect point pBitmap LoadBitmap IDB MAX FOCUS if IsZoomed StrTemp T 还原窗口 else StrTemp T 最化大窗口 else pBitmap LoadBitmap IDB NORMAL rtButton m rtButtMin BITMAP BmpInfo pBitmap GetBitmap 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 m ToolTip AddToolTip IDD TITLEBAR DIALOG 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 CRect rtWnd rtTitle rtButtons GetWindowRect 取得标题栏的位置 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 计算最小化按钮的位置 位图大小为 15X15 rtButtons left rtTitle right 60 rtButtons top rtTitle top 2 rtButtons right rtTitle right 42 rtButtons bottom rtTitle top 20 m rtButtMin rtButtons 计算最大化按钮的位置 位图大小为 15X15 m 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 重画 Caption POINT DrawPonit DrawPonit x rtTitle left 4 DrawPonit y rtTitle top 4 pBitmap LoadBitmap IDB TITLE LEFT pOldBitmap CBitmap pDisplayMemDC SelectObject pBitmap pBitmap GetBitmap 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 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 pDC BitBlt DrawPonit x DrawPonit y BmpInfo bmWidth BmpInfo bmHeight pDisplayMemDC 0 0 SRCCOPY pDisplayMemDC SelectObject pOldBitmap pBitmap DeleteObject 重画最小化 button rtButtons m rtButtMin pBitmap LoadBitmap IDB NORMAL pBitmap GetBitmap 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 nHeight 8 nWidth 0 nEscapement 文本行逆时针旋转角度 0 nOrientation 字体角度 FW BOLD nWeight 字体粗细程度 FALSE bItalic FALSE bUnderline 0 cStrikeOut 删除线 ANSI CHARSET nCharSet OUT DEFAULT PRECIS nOutPrecision CLIP DEFAULT PRECIS nClipPrecision DEFAULT QUALITY nQuality DEFAULT PITCH FF SWISS nPitchAndFamily T 隶书 lpszFac pDC SelectStockObject SYSTEM FIXED FONT CFont OldFont OldFont pDC SelectObject CString m StrTitle GetWindowText m StrTitle pDC SetTextColor RGB 80 255 25 if m ShowTitle pDC TextOut 65 10 m StrTitle else m 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 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 pOldBitmap CBitmap pDisplayMemDC SelectObject pBitmap GetClientRect 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 pOldBitmap CBitmap pDisplayMemDC SelectObject pBitmap GetClientRect 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 mouse 坐标转化为本窗口坐标 重要 point x point x rtWnd left point y point y rtWnd top 检测各按钮是否按到 if m rtIcon PtInRect point AfxMessageBox 界面软件设计者 朱一松 EMail Song 0962 else if m rtButtHelp PtInRect point SendMessage WM HELP else if m rtButtExit PtInRect point SendMessage WM CLOSE else if m rtButtMin PtInRect point m ShowTitle FALSE SendMessage WM SYSCOMMAND SC MINIMIZE MAKELPARAM point x point y else if m rtButtMax PtInRect point m ShowTitle TRUE if IsZoomed SendMessage WM SYSCOMMAND SC RESTORE MAKELPARAM point x point y else SendMessage WM SYSCOMMAND SC MAXIMIZE MAKELPARAM point x point y Invalidate else if IsZoomed Default LRESULT CTitleBarDlg DefWindowProc UINT message WPARAM wParam LPARAM lPar am 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 Bar s 其它不要 消息函数要手动添加 只本程序是在 VC 6 0 WinXP 环境下完成的 经过实践证明 仅仅画一个窗口很容易 多窗口程序软件实现统一风格很难 如若有 机会的话 我会和大家继续探讨如何将设计好的漂亮窗口子类化 让程序所有的窗口有统 一风格 美化窗口的其它控件并可自动随窗口改变而调整大小 我想那才是我们大家关心 的 对不 本人的联系 QQ 34544052 Email Song 0962 让你的软件界面更漂亮让你的软件界面更漂亮 2 一 统一风格漂亮界面设计的理论与实现 a 窗口和对话框 Windows 操作系中窗口和对话框在我们看来是一样的 就是一个四边形 有标题栏 系统按钮 边框等 可移动和可变大小 实际上窗口和对话框是有的区别的 在创建对话 框窗口时的工作中要发生两个主要过程 对话框的过程和其窗口过程 Win32 SDK 对话 框使用了系统提供的对话框窗口的窗口过程和对话框过程 对话框过程将被窗口过程调用 在 MFC 下 所有的窗口类都使用了同一个窗口过程 对话框类也一样 MFC 对话框过 程只处理 WM INITDIALOG 消息 其余都让窗口过程处理 我们只能在函数 OnInitDialog 中有唯一机会处理我们的对话框的初始化工作 因而我们设计界面时要在窗口过程处理 中相关消息实现我们的界面 b 几个有关对话框窗口消息的处理 1 WM NCPAINT 重画非客户区消息 重载此消函数 可以标题栏上为所欲为 2 WM NCLBUTTONDOWN 在非客户区上按下鼠标左键消息 要想在标题栏相应鼠标左键 可重载此消函数 3 WM NCMOUSEMOVE 在非客户区上移动鼠标会产生此消息 4 WM 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 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 FileDia log 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 lo ng 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 CString FileName MyFileDlg GetPathName FileName 是反回的结果 c CMyFileDialog 有一个超值的功能 不知有没有从上图看出来 它能够用来代替 S HBrowseForFoler 作为目录选择对话框 这也是我写 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 菜单 ID IDI 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 bSh owHead int nModeIcon 参数 pParent 父窗口指针 rcClient 显示位置 nID 窗口 ID bShowHead 是否显示菜单头 nModeIcon 菜单项图标大小 1 16x16 2 32x32 3 48x48 此菜单类可应还可用于其它场合 如主菜单 托盘菜单 右鍵快捷菜单等 欢迎批评 指正并提出意见 作者 朱一松 责编 豆豆技术应用 让你的软件界面更漂亮让你的软件界面更漂亮 5 内容摘要 类 WindowXp 开始菜单到现在基本上是完美实现 在功能上基本和 WindowXp 与 Vista 操作系统的开始菜单一样 界面当然漂亮 通过编程能实现风格多样 具有个性化的功 能菜单 为了方便使用 本人对其进行了封装 库名曰 完美类 WindowXp 开始菜单 本文示例源代码或素材下载 类 WindowXp 开始菜单到现在基本上是完美实现 在功能上基本和 WindowXp 与 Vi sta 操作系统的开始菜单一样 界面当然漂亮 通过编程能实现风格多样 具有个性化的 功能菜单 为了方便使用 本人对其进行了封装 库名曰 完美类 WindowXp 开始菜单 1 完美类 WindowXp 开始菜单 CYisongStartMenu 有如下主要特点 a 在 C 环境实现 界面风格可实现自定义 b 不仅适用 Mouse 操作 还支持响应方向按键 快捷键功能 c 可增加和删除菜单中的子项 d 可显示 Left Bar 并定义其风格 e 可自定义焦点亮条的风格 f 可设置菜单子项为 Check Option 风格 2 完美类 WindowXp 开始菜单的用途 a 可实现 WindwXp 的两种菜单 经典菜单和分组菜单 非常适在大型应软件 象 QQ 的 主菜单就是其中之一的分组菜单 b 托盘菜单 右键快捷菜单等应用 一 编程指南 1 文件说明 类文件 YisongStartMenu dll YisongStartMenu lib 开始菜单库 其它文件 MyStartMenuLib h MyStartMenu h CmyToolTipCtrl h 2 CYisongStartMenu 用法 a 先把上述文件拷贝到工程目录下 b include MyStartMenuLib h 只要把 MyStartMenuLib h 文件包括到工程文件中 就 OK c 定义一变量 CYisongStartMenu m StartMenu d 在 cpp 文件中现实代码 主菜单初始化过程 TextInfo textInfo 定义主菜顶部文本信息结构 m StartMenu GetUserPaneTextInfo textInfo 获取文本信息的初始属性 textInfo clrShadow GetSysColor COLOR BTNSHADOW 设文本信息的主要属性 textInfo nOffsetX 1 textInfo nOffsetY 1 textInfo logFontUserText lfItalic TRUE m StartMenu SetUserPaneTextInfo textInfo 使设置有效 m StartMenu SetUserPaneText T WindowXp Menu 设置主菜顶部标题 m StartMenu SetUserPaneIcon IDI ICON QQ CSize 48 48 设置主菜顶部显示图 标 设置主菜顶部显示图形 m StartMenu GetUserBitmap 0 skin1 bmp m StartMenu GetUserBitmap 1 skin2 bmp m StartMenu GetUserBitmap 2 skin3 bmp 实现菜单菜项的添加 左边主程序项的添加 m StartMenu AppendProgItem T Internet nInternet Explorer ID PROGLIST I E 0 MENU DEFAULT IDI ICON IE NULL T 联接国际互际联网页 m StartMenu AppendProgItem m StartMenu AppendProgItem T 所有程序 IDR MENU TEST 0 MENU BOTTOM MENU POPUP 0 NULL NULL m wndSubMenu 为 所有程序 菜单项的下拉子菜单 实现菜单项的添加 分组菜单右边的菜单子项的添加 和上面方法一样 只不过是用函数 AppendProgItem m StartMenu AppendPlaceItem T My Documents ID PLACELIST MYDOCUMENT 0 MENU DEFAULT IDI ICON MYDOCUMENT m StartMenu AppendPlaceItem 设置菜单子项文本颜色 PLACELIST TYPE 指 Place List 子项颜色 PROGLIST TYPE 指 Prog List 左边列表 子项颜色 m StartMenu SetItemTextColor PLACELIST TYPE RGB 0 255 0 设置子项有焦点时 其显示的亮条图形 不设置亮条为蓝色 m StartMenu SetItemFoucsBitmap PLACELIST TYPE skinOverFoucs bmp 设置菜单底部属性 CImageList lst lst Create IDB STARTPANE BUTTONS 24 3 RGB 192 192 192 HICON hIconTurnOff lst ExtractIcon 2 m StartMenu AppendBottomItem T Turn Off Computer ID BOTTOMBAR TURNOFFCOMPUTER 0 MENU NORMAL 0 hIconTurnOff HICON hIconLogOff lst ExtractIcon 1 m StartMenu AppendBottomItem T Log Off ID BOTTOMBAR LOGOFF 0 MENU NORMAL 0 hIconLogOff 设置菜单底部显的背景图形 m StartMenu GetBottomBarBitmap 0 skin1 bmp m StartMenu GetBottomBarBitmap 1 skin2 bmp m StartMenu GetBottomBarBitmap 2 skin3 bmp e 显示菜单方法 空口中在某点 x y 处显示 作为 m hWnd 的子窗口 m StartMenu TrackPopPane point x point y m hWnd 0 f 响应菜单菜单命令 在用 AppendPlaceItem 或 AppendProgItem AppendBottomItem 添加菜单子项时 它们第二个参数为菜单项的 ID 在响应每个子项 mouse 单击事件时 会向菜单其父窗口 发送 WM COMMAND 消息 SendMessage m hWndParent WM COMMAND m pCurrentItem uID 0 所以只要在 主窗口为每个菜单项映谢消息 ON COMMAND 的函数函行了 方法是在 cpp 文件中找到 消息息映射处 在 BEGIN MESSAGE MAP CWindowsXPMenuDlg CDialog 和 END MESSAGE MAP 之间 添加如下代码 ON COMMAND ID MENUITEM OnFunc 在 h 头文件对 OnFunc 函数声明为消息函数 afx msg void OnFunc 在 OnFunc 函数中实现菜单项的命令的功能 二 主要功能接口函数的说明 1 函数名 AppendProgItem 功能 添加主程序功能菜单项 原型及参数说明 void AppendProgItem LPCTSTR szItemName UINT uID ULONG ulData UINT uFlags UINT uIconResID HICON hIcon NULL LPCSTR szTooltip T CYisongStartMenu pSubMenu NULL szItemName 菜单项文本标 题 uID 菜单项 ID 标识 ulData 保留 uFlags 菜单风格定义 其值可为下列值或组合 AppendProgItem T 0 0 MENU SEPARATOR 0 或AppendPlaceItem T 0 0 M ENU SEPARATOR 0 与本功能相同用的函数还有 AppendPlaceItem 用法上完全一样 2 函数名 SetProgItemBackColor 功 能 设置菜单列表背景颜色 原型及参数说明 void SetProgItemBackColor COLORREF clrLeftTop COLORREF clrRightBottom bool bValid clrLeftTop 左上角的颜色 clrRightBottom 右下角结束处 颜色 bValid 布尔型变量 TRUE 表示立即设置生效 说明 SetProgItemBackColor 函数的用法及功能与本函是一样的 请参照此用法 3 函数名 SetItemTextColor ITEM TYPE nType COLORREF clrText 功 能 设置菜单文本颜色 原型及参数说明 void SetItemTextColor ITEM TYPE nType COLORREF clrText nType ITEM TYPE 枚举类型的数参 enum ITEM TYPE PROGLIST TYPE 指 Program 列表菜单 PLACELIST TYPE 指 Place 列表菜单 BOTTOMBAR TYPE 菜单底部 clrText 本文的颜色 设置 Program 列表菜单项的文本颜色为 红色的方法如下 Exp SetItemTextColor PROGLIST TYPE RGB 255 0 0 注意 一般在菜单初始完成后调用该函数来设置菜单项的文本颜色 4 函数名 GetBottomBarBitmap 功 能 设置菜单底部背景图象 原型及参数说明 void GetBottomBarBitmap int nMode LPTSTR szFile nMode 指出显示方式 szFile 图像文件及路径 与些函数功能相同的还有 GetUserBitmap int nMode LPTSTR szFile 5 函数名 SetAsSubMenu 功 能 设置菜单为弹出 子 菜单 原型及参数说明 void SetAsSubMenu BOOL bSubmenu bSubmenu TRUE 时 表示为弹出 子 菜单

温馨提示

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

评论

0/150

提交评论