hDCdc.DrawFrameControlamplpDrawItemStruct-gtrcItem DFC_BUTTON uStyle//输出文字dc.SelectObjectampm_Fontdc.SetTextColorRGB0 0 255dc.SetBkModeTRANSPARENTCString sTextm_HelloCFan.GetWindowTextsTextdc.TextOutlpDrawItemStruct-gtrcItem.left 20lpDrawItemStruct-gtrcItem.top 20 sText//是否得到焦点iflpDrawItemStruct-gtitemState amp ODS_FOCUS//画虚框CRect rtFocus lpDrawItemStruct-gtrcItemrtFocus.DeflateRect3 3dc.DrawFocusRectamprtFocusreturnCDialog::OnDrawItemnIDCtl lpDrawItemStruct此方法适用 EditStatic 等控件,不适用 Button 按钮,有大虾知道 Button 改变背景色的方法,还请在此留言,谢谢!概述:响应 WM_CTLCOLOR 消息。
HBRUSH CAhDlg::OnCtlColorCDC pDC CWnd pWnd UINT nCtlColorHBRUSH hbr CDialog::OnCtlColorpDC pWnd nCtlColorifpWnd-gtGetDlgCtrlID IDC_EDIT1// 对除了按钮外的其他控件有效 pDC-gtSetBkColorRGB02550 //设置文本背景 hbr ::CreateSolidBrushRGB02550 //设置控件背景 return hbr return hbr当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于 Visual C编程爱好者来说,使用 Visual CMFC 提供的树型控件(CTreeCtrl)本身就是一个难点,至于如何使该控件能够带有背景位图,那就更加是一个令人困惑的问题了。
本实例对 CTreeCtrl 类进行了增强,不仅使它带有背景位图,而且解决了在点击树型控件时背景位图闪动的问题,另外,通过在对话框中使用该控件来显示三级目录,演示了树型控件的基本使用方法。
下图为程序编译后的运行效果图: 图一、带背景图的树型控件效果图 一、实现方法 在实现树型控件的背景位图之前,我们首先介绍一下树型控件的基本使用方法。
树形控件在系统中大量被使用,例如 Windows 资源管理器就是一个典型的例子。
树形控件可以用于树形的结构,其中有一个根接点Root然后下面有许多子结点,而每个子结点上又允许有一个或多个或没有子结点。
MFC 中使用 CTreeCtrl 类来封装树形控件的各种操作,通过调用 BOOLCreate DWORD dwStyle const RECTamp rect CWnd pParentWnd UINT nID 创建一个窗口,dwStyle 中可以使用以下一些树形控件的专用风格:TVS_HASLINES 在父/子结点之间绘制连线;TVS_LINESATROOT 在根/子结点之间绘制连线;TVS_HASBUTTONS 在每一个结点前添加一个按钮,用于表示当前结点是否已被展开;TVS_EDITLABELS 结点的显示字符可以被编辑;TVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点;TVS_DISABLEDRAGDROP 不允许 Drag/Drop;TVS_NOTOOLTIPS 不使用 ToolTip 显示结点的显示字符。
在树形控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄(其中根 Root 结点只有一个,既不可以添加也不可以删除),利用 HTREEITEM InsertItem LPCTSTR lpszItem HTREEITEMhParent TVI_ROOT HTREEITEM hInsertAfter TVI_LAST 可以添加一个结点,pszItem 为显示的字符,hParent 代表父结点的句柄,当前添加的结点会排在 hInsertAfter 表示的结点的后面,返回值为当前创建的结点的句柄。
如果你希望在每个结点前添加一个小图标,就必需先调用 CTreeCtrl 类的成员函数 CImageList SetImageList CImageList pImageList intnImageListType ,指明当前控件所使用的图像列表(ImageList),nImageListType 为 TVSIL_NORMAL。
在调用完成后控件中使用图片以设置的ImageList 中图片为准。
然后调用 HTREEITEM InsertItem LPCTSTR lpszItemint nImage int nSelectedImage HTREEITEM hParent TVI_ROOT HTREEITEMhInsertAfter TVI_LAST添加结点,其中参数 nImage 为结点没被选中时所使用图片序号,nSelectedImage 为结点被选中时所使用图片序号。
此外 CTreeCtrl 还提供了一些函数用于得到/修改控件的状态: HTREEITEM GetSelectedItem 将返回当前选中的结点的句柄; BOOL SelectItem HTREEITEM hItem 将选中指明结点; BOOL GetItemImage HTREEITEM hItem intamp nImage intampnSelectedImage / BOOL SetItemImage HTREEITEM hItem int nImage intnSelectedImage 用于得到/修改某结点所使用图标索引; CString GetItemText HTREEITEM hItem /BOOL SetItemText HTREEITEMhItem LPCTSTR lpszItem 用于得到/修改某一结点的显示字符; BOOL DeleteItem HTREEITEM hItem 用于删除某一结点,BOOLDeleteAllItems 将删除所有结点。
此外如果想遍历树可以使用下面的函数: HTREEITEM GetRootItem 得到根结点; HTREEITEM GetChildItem HTREEITEM hItem 得到子结点; HTREEITEM GetPrevSiblingItem/GetNextSiblingItem HTREEITEM hItem 得到指明结点的上/下一个兄弟结点; HTREEITEM GetParentItem HTREEITEM hItem 得到父结点。
树形控件的消息映射使用 ON_NOTIFY 宏,形式如同:ON_NOTIFY wNotifyCodeid memberFxn ,wNotifyCode 为通知代码,id 为产生该消息的窗口 ID,memberFxn 为处理函数,函数的原型如同 void OnXXXTreeNMHDR pNMHDRLRESULT pResult,其中 pNMHDR 为一数据结构,在具体使用时需要转换成其他类型的结构。
对于树形控件可能取值和对应的数据结构为: TVN_SELCHANGED 在所选中的结点发生改变后发送,所用结构:NMTREEVIEW; TVN_ITEMEXPANDED 在某结点被展开后发送,所用结构:NMTREEVIEW; TVN_BEGINLABELEDIT 在开始编辑结点字符时发送,所用结构:NMTVDISPINFO; TVN_ENDLABELEDIT 在结束编辑结点字符时发送,所用结构:NMTVDISPINFO; TVN_GETDISPINFO 在需要得到某结点信息时发送,(如得到结点的显示字符)所用结构:NMTVDISPINFO; 对于 Visual C MFC 提供的标准树型控件 CTreeCtrl 来说,并不支持背景位图,所以如果需要实现背景位图就需要先让其在内存 CDC 对象上对 TREEVIEW缺省绘图,然后在选择背景位图,与缺省位图合成,即采用贴图的方式,把标准的 TREEVIEW 窗口贴在底图上。
这个操作在内存中完成。
同时为了避免闪烁,必须重载 OnItemexpanding()和 OnItemexpanded()这两个函数。
SetRedraw 函数主要保证其不要在子节点弹出时重画,而是在子节点已经扩展后重画。
为此,例程中定义了一个 CTreeCtrl 类的子类 CmyTreeCtrl,并重载了以下几个成员函数:BOOL CMyTreeCtrl::SetBKImageLPCTSTR LpszResourcevoid CMyTreeCtrl::OnPaintvoid CMyTreeCtrl::OnItemexpandingNMHDR pNMHDR LRESULT pResultvoid CMyTreeCtrl::OnItemexpandedNMHDR pNMHDR LRESULT pResultBOOL CMyTreeCtrl::OnEraseBkgndCDC pDC 二、编程步骤 1、 启动 Visual C6.0,生成一个基于对话框的项目 Tree,在框架上放置一个树形控制件,其 ID 标志符为:IDC_TREE1; 2、 创建 CmyTreeCtrl 类后,使用 CLASSWIZARD 为其添加消息映射:ON_NOTIFY_REFLECTTVN_ITEMEXPANDEDOnItemexpandedON_NOTIFY_REFLECTTVN_ITEMEXPANDING OnItemexpanding 消息响应函数:afx_msg void OnItemexpandedNMHDR pNMHDR LRESULT pResultafx_msg void OnItemexpandingNMHDR pNMHDR LRESULT pResult 3、 将树型控件与 CmyTreeCtrl 类建立关联,在对话框中添加变量CMyTreeCtrl m_CtrlTree; 4、 制作一个准备作为树形控件背景的位图; 5、 修改对话框的初始化函数 BOOL CTreeDlg::OnInitDialog(); 6、 添加
上一篇:
【精品论文】VC++科学计算器设计源代码及流程图
下一篇:
英语论文网([网学网]):英语专业本科生毕业论文写作