MFC下自绘ListBox或者ListCtrl中的内容

 最近在做一个UI时,需要将一些笔画非常多的字显示在一个ListBox列表中,供别人参考,高高兴兴做完了以后,运行一看,糟糕,由于笔画太多,字太小,眼睛根本看不清楚,不过当时并不在意,不就是用SetFont就搞定的事吗!!然后在获得该ListBox的DC后,用SetFont一把,结果出乎所料,里面的字体居然没变化。后来查阅相关资料,才发现微软居然将这些控件的字体和颜色等属性都是设置为默认的,普通的属性设置函数根本没用。真是气死人呀,哪有这么不人性化的软件,所以人家说VC难学,特别是MFC,我看微软负有不可推卸的责任。好了,不扯远了,继续主题。要想在ListBox或者ListCtrl等控件中绘制你想要的图形或者设置你想要的属性,那么必须采用自绘的方式。大致步骤如下:  
    1、添加一个LISTBOX控件,将其Owner Draw属性改为“FIXED”或者“VARIABLE”,前者是指每个Item的高度一样,后者可以单独对每一个Item的高度设置,并可以为不同的 Item设置不同的属性。此外,还需要将Has Strings的属性设置为TRUE。      2、建立一个断承CListBox的类COwnerListBox,重载(Override)它的几个函数。主要是DrawItem和 MeasureItem两个函数。其他的函数可以参见MSDN。  
    3、MeasureItem中主要是设置这个ListBox的属性。而DrawItem主要是自己画每一个Item.   
    4、如果LISTBOX控件选择了“FIXED”属性后不做任何修改,那么用AddString等函数添加的子项将不会被系统自动显示,原因是用户选择了自绘属性。这个属性由COwnerListBox里的DrawItem和MesureItem函数完成。DrawItem用来绘制子项目,MesureItem用来修改项目的一些属性(一般不用更改)。  

  完成上述步骤后,即可看见更改后的LISTBOX,另外按钮等其他控件步骤与思想是大同小异的。下面是我做的一个类,用来自绘ListBox的每一项。其中主要功能就是将每一项的字体显示的大写,并用红色显示出。界面可以参见附图。
代码:
OwnerListBox.h:

#pragma once
// COwnerListBox
class COwnerListBox : public CListBox { DECLARE_DYNAMIC(COwnerListBox)
public: COwnerListBox();
        virtual ~COwnerListBox();
        struct DataItem{
             CString m_string;
        };
        void Add(CString m_str);
protected:
         DECLARE_MESSAGE_MAP()
public:
         virtual void  DrawItem(LPDRAWITEMSTRUCT/*lpDrawItemStruct*/);
         virtual void
MeasureItem(LPMEASUREITEMSTRUCT /*lpMeasureItemStruct*/); protected:
        virtual void PreSubclassWindow();
 };

// 这段代码希望大家拷到自己电脑用其他文字编辑程序打开看,这里显示有点问题。

OwnerListBox.cpp: OwnerListBox.cpp : 实现文件 // #include "stdafx.h" #include "CompStroke.h" #include "OwnerListBox.h" #include ".\ownerlistbox.h" #include // COwnerListBox IMPLEMENT_DYNAMIC(COwnerListBox, CListBox) COwnerListBox::COwnerListBox() { } COwnerListBox::~COwnerListBox() { } BEGIN_MESSAGE_MAP(COwnerListBox, CListBox) END_MESSAGE_MAP() // COwnerListBox 消息处理程序 void COwnerListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 COLORREF clrItemText; LPDRAWITEMSTRUCT lpDIS = lpDrawItemStruct; switch ( lpDIS->itemAction ) //lpDIS为一个LPMEASUREITEMSTRUCT(记录控件信息) { case ODA_SELECT: case ODA_DRAWENTIRE: // Is the item selected? if ( lpDIS->itemState & ODS_SELECTED ) { clrItemText = GetSysColor( COLOR_HIGHLIGHTTEXT ); // Clear the rectangle FillRect( lpDIS->hDC, &lpDIS->rcItem, (HBRUSH)(COLOR_ACTIVECAPTION+1) ); } else { clrItemText = GetSysColor( COLOR_WINDOWTEXT ); // Clear the rectangle FillRect( lpDIS->hDC, &lpDIS->rcItem, (HBRUSH)(COLOR_WINDOW+1) ); } } CDC dc; dc.Attach(lpDIS->hDC); CRect rectFull = lpDIS->rcItem; CRect rect2 = rectFull; rect2.right = rectFull.Width() - 1; UINT nIndex = lpDIS->itemID; if (nIndex != (UINT) -1) { LOGFONT lf; dc.GetCurrentFont()->GetLogFont(&lf); CFont font, *pOldFont; lf.lfCharSet = SHIFTJIS_CHARSET; lstrcpy(lf.lfFaceName,_T("MS Mincho")); lf.lfHeight=50; // lf.lfWidth=0; font.CreateFontIndirect(&lf); pOldFont=dc.SelectObject(&font); CString sss; this->GetText(nIndex,sss); dc.SetBkMode(TRANSPARENT); dc.SetTextColor(RGB(255,0,0)); dc.DrawText(sss,CRect(rect2.left+3,rect2.top+3, rect2.right-3,rect2.bottom+3), DT_LEFT | DT_SINGLELINE); dc.SelectObject(pOldFont); } dc.Detach(); } void COwnerListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) { // TODO: 添加您的代码以确定指定项的大小 lpMeasureItemStruct->itemHeight = 60; lpMeasureItemStruct->itemWidth = 100; } void COwnerListBox::PreSubclassWindow() { // TODO: 在此添加专用代码和/或调用基类 CListBox::PreSubclassWindow(); } void COwnerListBox::Add(CString m_str) { DataItem *prtData = new DataItem; prtData->m_string = m_str; int index = AddString(m_str); SetItemDataPtr(index, prtData); delete prtData; }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值