最近在做一个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
好的,希望对大家有用,最后,要是有什么问题,欢迎留言讨论或者邮箱沟通。邮箱:wei.miao@cn.sharp-world.com
正文
MFC下自绘ListBox或者ListCtrl中的内容2008-11-06 17:03:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/miaowei/39271.html
阅读(14397) | 评论(2)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论