免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC技巧五 - 工具条和状态条VC+ 5.0式样的工具条 类似VC+ 5.0的工具条具有平面外观,左边带有一个“把手”,你可以通过鼠标拖动这个“把手”来移动工具条。工具条各组间带有分隔线(如图所示)。当鼠标在工具条上面移动时,工具条上的相应按钮会突出显示。本文所讨论的增强型工具条CEnhanceToolBar类由CToolBar类所派生,是CToolBar类的补充和扩展。如果你并不在乎工具条有没有“把手”的话,要生成平面工具条是十分简单的。你只需要在CMainFrame的OnCreate()函数中添加一句话就可以(必须加在工具条生成函数之后,因为MFC在生成工具条时要清除其式样):/MainFrm.cppint CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . if (!m_wndToolBar.Create(this) | !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) TRACE0(Failed to create toolbarn); return -1; / fail to create m_wndToolBar.ModifyStyle(0,TBSTYLE_FLAT);/设置工具条为平面格式 .如果你的计算机安装了版本为4.71.1712.3的COMCTL32.DLL(该动态库随IE 4一同发行),那就更好了,你的工具条会自动绘制分隔线的。你可以通过鼠标拖动工具条的非按钮区域来移动这种工具条。如果你要得到更好看(更“专业”)的工具条,那么你还得跟着我一步步的做下去:添加一个新类,本文中叫做CEnhanceToolBar类,由CToolBar类派生。为CEnhanceToolBar类添加成员变量和函数的声明,并且根据你的需要设置其属性为public/protected/private。/EnhanceToolBar.h/ Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CEnhanceToolBar) /按钮状态变化时调用此函数 virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler); /AFX_VIRTUAL/ Implementationpublic: void DrawGrip(CWindowDC *pDC, CRect& rectWindow);/“把手”绘制函数 void EraseNonClient();/擦除非客户区 void DrawSpace();/分隔线绘制函数 void RedrawBackground();/背景重绘函数private: int ButtonNumber;/工具条的按钮数(包括分隔线) COLORREF HiLight, Shadow;/3D控件的加亮色和阴影色添加成员函数的定义:/EnhanceToolBar.cppvoid CEnhanceToolBar:OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)/按钮状态变化时调用此函数 static CUIntArray Styles; int Index; UINT dwStyle; for (Index = 0; Index dwStyle = GetButtonStyle(Index); Styles.SetAtGrow(Index,dwStyle);/保存按钮的式样 CToolBar:OnUpdateCmdUI(pTarget,bDisableIfNoHndler);/调用基类的处理函数 for (Index = 0; Index /设置选中的按钮(checked button)为按下的状态 dwStyle = GetButtonStyle(Index); if (dwStyle & TBBS_DISABLED) return;/如果按钮为禁用状态,则返回(避免闪烁) if (dwStyle & TBBS_CHECKBOX) if (dwStyle & TBBS_CHECKED) dwStyle |= TBBS_PRESSED; else dwStyle &= TBBS_PRESSED; SetButtonStyle(Index,dwStyle);/设置按钮的式样 /检查按钮的式样是否改变(按下或释放) for (Index = 0; Index dwStyle = GetButtonStyle(Index); if (StylesIndex != dwStyle) RedrawBackground();/重新绘制背景 Invalidate();/重新绘制整个工具条 break;/已更新整个工具条,因此没必要继续循环 void CEnhanceToolBar:DrawGrip(CWindowDC *pDC, CRect& rectWindow)/绘制把手 if (IsFloating()/如果工具条是浮动状态,则不绘制“把手” return; CRect GripRect = rectWindow;/得到把手的矩形区域 GripRect.DeflateRect(1,1);/矩形区域的各边向中心靠近一个像素 if (m_dwStyle & CBRS_ORIENT_HORZ)/如果工具条为水平状态,“把手”在左边 GripRect.right = GripRect.left + 3;/绘制第一条隆起的棱 pDC-Draw3dRect(GripRect, HiLight, Shadow); GripRect.OffsetRect(4,0);/绘制第二条隆起的棱 pDC-Draw3dRect(GripRect, HiLight, Shadow); else/如果工具条为垂直状态,“把手”在顶部 GripRect.bottom = GripRect.top + 3;/绘制第一条隆起的棱 pDC-Draw3dRect(GripRect, HiLight, Shadow); GripRect.OffsetRect(0,4);/绘制第二条隆起的棱 pDC-Draw3dRect(GripRect, HiLight, Shadow); void CEnhanceToolBar:DrawSpace()/绘制分隔线 CClientDC dc(this); for (int Index = 0; Index UINT dwStyle = GetButtonStyle(Index);/获得按钮的类型 if (dwStyle & TBBS_SEPARATOR)/如果是分隔线 CRect rect; GetItemRect(Index,rect);/获得矩形区域 if (m_dwStyle & CBRS_ORIENT_HORZ)/工具条为水平时分隔线为垂直 int w = rect.Width(); rect.DeflateRect(w-2)/2,0);/将矩形缩减为23个像素宽 dc.Draw3dRect(rect, Shadow, HiLight);/绘制分隔线 else/分隔线为水平 rect.left = rect.left - m_sizeButton.cx; rect.right = rect.left + m_sizeButton.cx; rect.top = rect.bottom+1; rect.bottom = rect.top+3; int h = rect.Height(); rect.DeflateRect(0,(h-2)/2);/将矩形缩减为23个像素高 dc.Draw3dRect(rect, Shadow, HiLight);/绘制分隔线 void CEnhanceToolBar:EraseNonClient()/擦除非用户区 CWindowDC dc(this); CRect rectClient; GetClientRect(rectClient); CRect rectWindow; GetWindowRect(rectWindow); ScreenToClient(rectWindow); rectClient.OffsetRect(-rectWindow.left, -rectWindow.top); dc.ExcludeClipRect(rectClient); / 绘制非用户区的边界 rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top); DrawBorders(&dc, rectWindow); / 擦除非绘制部分 dc.IntersectClipRect(rectWindow); SendMessage(WM_ERASEBKGND, (WPARAM)dc.m_hDC); DrawGrip(&dc, rectWindow); /绘制“把手”由于平面工具条是透明的,所以当改变尺寸和移动时(例如当拖动工具条时)就需要重绘背景。同样,当按钮状态改变时(按下或释放)也需要进行这种操作。void CEnhanceToolBar:RedrawBackground()/重新绘制背景 CWnd* pParent = GetParent();/获得父窗口指针 if (pParent) CRect drawrect,rect; GetWindowRect(&rect);/获得工具条矩形区域 drawrect = rect; pParent-ScreenToClient(&drawrect);/转换为父窗口坐标 pParent-InvalidateRect(&drawrect);/重绘矩形区域 /绘制父窗口的其他工具条 for (CWnd* pSibling = pParent-GetWindow(GW_CHILD);pSibling; pSibling = pSibling-GetNextWindow(GW_HWNDNEXT) if (pSibling = this) continue; drawrect = rect; pSibling-ScreenToClient(&drawrect);/兄弟窗口的坐标 pSibling-InvalidateRect(&drawrect);/重绘矩形区域 利用ClassWizard给为CEnhanceToolBar类添加消息映射:/EnhanceToolBar.h /AFX_MSG(CEnhanceToolBar) afx_msg void OnPaint(); afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp); afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos); /AFX_MSG/EnhanceToolBar.cpp BEGIN_MESSAGE_MAP(CEnhanceToolBar, CToolBar) /AFX_MSG_MAP(CEnhanceToolBar) ON_WM_PAINT() ON_WM_NCCALCSIZE() ON_WM_WINDOWPOSCHANGING() /AFX_MSG_MAP END_MESSAGE_MAP()为消息映射函数添代码:void CEnhanceToolBar:OnPaint() CToolBar:OnPaint();/绘制标准工具条 EraseNonClient();/擦除背景 DrawSpace();/绘制立体分隔线void CEnhanceToolBar:OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)/ 计算非用户区域,用于调整“把手” CToolBar:OnNcCalcSize(bCalcValidRects,lpncsp); if (IsFloating()/如果工具条是浮动状态,则不绘制“把手” return; if (m_dwStyle & CBRS_ORIENT_HORZ)/如果工具条为水平状态,“把手”在左边 lpncsp-rgrc0.left += 2; lpncsp-rgrc0.right += 2; else/如果工具条为垂直状态,“把手”在顶部 lpncsp-rgrc0.top += 4; lpncsp-rg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川雅安市名山区人民法院招聘劳务派遣人员2人考试笔试模拟试题及答案解析
- 2025福建漳州市芗江人力资源服务有限公司招聘1人考试笔试备考试题及答案解析
- 2025漳州市长泰区林业局招聘乡镇林业工作站专职护林员5人笔试考试备考试题及答案解析
- 2026广东“百万英才汇南粤”-广州市从化区教育局第一次招聘事业单位编制教师229人考试笔试模拟试题及答案解析
- 2025年云南省大数据有限公司第二批招聘(30人)考试笔试参考题库附答案解析
- 2026格力电器秋招笔试考试备考试题及答案解析
- 2025内蒙古工程项目管理有限公司招聘6人考试笔试备考题库及答案解析
- 2025年河北石家庄市经济技术开发区警务辅助人员公开招聘4名笔试考试参考题库及答案解析
- 2025四川广安区人民医院招聘药师3人笔试考试备考题库及答案解析
- 2025年甘肃省酒泉卫星发射中心东风学校公益性岗位招聘笔试考试参考题库及答案解析
- 成品出货检验报告模板
- (无序号)工贸行业小微企业安全风险分级管控和隐患排查治理双重预防机制建设指导手册 - 副本
- 国家体质健康标准评分表自动评分表
- 民办幼儿园承包经营合同的效力认定
- 工程信息编码规则-0205平台名称命名-副本
- GB/T 602-2002化学试剂杂质测定用标准溶液的制备
- GB/T 5677-2018铸件射线照相检测
- 列车运行图课件
- 水生植物种植检验批质量验收记录
- 西湖七月半张岱课件
- 矿井热害及其治理(简单版)
评论
0/150
提交评论