MFC 静态文本的自绘 空心字的实现
想在对话框里,显示几个字是很简单的,只要用静态文本的输出就可以了。然而有时候我们需要显示特效的字,我们希望显示的文字就像Word里的艺术字一样,看起来美观。这时我们可以重写CStatic类。用DrawItem方法重绘。
首先,我们想要激活CStatic控件的自绘属性,这样DrawItem才能有效。我们发现用激活CButton自绘属性的方法那样来激活 CStatic控件的自绘属性是不行的。他们的激活方式是不一样的。
不用说先新建一个MFC类叫CCustomStatic类并继承于CStatic父类。覆写PreSubclassWindow方法,在PreSubclassWindow激活CStatic的自绘属性。
代码如下:
void CCustomStatic::PreSubclassWindow()
{
DWORD dwstyle = GetStyle();
SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwstyle | SS_OWNERDRAW );
CStatic::PreSubclassWindow();
}
现在我们可以覆写DrawItem方法了。
代码如下:
void CCustomStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CString strText;
GetWindowText(strText);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
UINT state = lpDrawItemStruct->itemState;
CRect rect;
GetClientRect(rect); CFont font;
CFont *pOldFont;
font.CreateFont(
0.9*rect.Height(), // nHeight
, // nWidth
, // nEscapement
, // nOrientation
FW_BOLD, // nWeight
TRUE, // bItalic
FALSE, // bUnderline
, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体")); // lpszFacename pOldFont = dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT); CPen pen(PS_SOLID, , RGB(, , ));
CPen *pOldPen;
pOldPen = dc.SelectObject(&pen);
dc.BeginPath();
dc.TextOut(rect.top-, rect.left +, strText);
dc.EndPath();
int num = dc.GetPath(NULL, NULL, );
CPoint *pt = new CPoint[num];
BYTE *type = new BYTE[num];
num = dc.GetPath(pt, type, num);
CPoint pstart;
for (int j = ; j < num; j++)
{
switch (type[j])
{
case PT_MOVETO:
dc.MoveTo(pt[j]);
pstart = pt[j];
break;
case PT_LINETO:
dc.LineTo(pt[j]);
break;
case PT_BEZIERTO:
dc.PolyBezierTo(pt + j, );
j += ;
break;
case PT_BEZIERTO|PT_CLOSEFIGURE:
pt[j+] = pstart;
dc.PolyBezierTo(pt + j, );
j += ;
break;
case PT_LINETO| PT_CLOSEFIGURE :
dc.LineTo(pstart);
break;
}
dc.CloseFigure();
}
font.DeleteObject();
pen.DeleteObject();
delete pt;
delete type; dc.Detach();
}
头文件里不要忘记了声明
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
运行效果如下:空心字 效果

MFC 静态文本的自绘 空心字的实现的更多相关文章
- vs mfc 静态文本 改变字体大小
VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体.对于你的问题,需要首先用CreateFont来建立一个字体对象,然后调用控件的SetFont,就可以了. 例子: 1.改静态文 ...
- MFC 静态文本框
窗体上操作控件内容,需要句柄,在控件处使用鼠标右键——添加变量. DoDataExchange()函数会自动生成代码,把ID与变量绑定(即DDX_Control(pDX, IDC_TEXT, objT ...
- MFC编程入门之二十(常用控件:静态文本框)
上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...
- MFC中修改静态文本框中文字的字体、颜色
假设有一个静态文本框控件,其ID为:IDC_STATIC_XSDJ,且关联一个control类的CStatic类型的变量m_static_xsdj. 设置字体时自然要用到CFont类,下面介绍两种方法 ...
- MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.
MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...
- VS2010/MFC编程入门之二十(常用控件:静态文本框)
上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组 ...
- 【MFC】MFC改变对话框中静态文本的字体大小
MFC改变对话框中静态文本的字体大小 2010/08/09 11:30 VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体.对于你的问题,需要首先用CreateFont来建立一个 ...
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- MFC中如何给静态文本框添加消息响应
需要两个步骤: 第一个: 是改变它的ID(默认情况下所有的静态文本框的ID都为IDC_STATIC,你需要改变他的ID为其他的值). 第二个: 是在它的属性对话框中选中Notify选项,VS是将该属性 ...
随机推荐
- UOJ79 一般图最大匹配
题目描述 从前一个和谐的班级,所有人都是搞OI的.有 nn 个是男生,有 00 个是女生.男生编号分别为 1,-,n1,-,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人 ...
- javaweb查看后台session和request所有的值
遍历session @RequestMapping(value ="/test2") public String upload2( HttpSession session) { E ...
- 《Javascript高级程序设计》读书笔记(1-3章)
第一章 JavaScript简介 1.1 JavaScript简史 略 1.2 JavaScript实现 虽然 JavaScript 和 ECMAScript 通常都被人们用来表达相同的含义,但 Ja ...
- Chrome 开发工具之Timeline
之前有说到Element,Console,Sources大多运用于debug,Network可用于debug和查看性能,今天的主角Timeline更多的是用在性能优化方面,它的作用就是记录与分析应用程 ...
- 【总结】使用WebBrowser遇到的陷阱
一.前言 一直想用WebBrowser做一些好玩的东西,比如抓取分析感兴趣的网站页面.自动点击提交页面等,所以最近在研究WebBrowser.WebBrowser的功能十分强大,就是一个微型的Brow ...
- Windows bat脚本学习(1)
基础 首先所有命令在cmd命令行中都能找到说明: 例如 想知道type用法 输入type /? 其他命令都一样 type [drive:][path] filename 显示文本文件内容 虽然有点鸡肋 ...
- 汇编实现点亮Led灯(2440)
1.gboot.lds OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS { . = 0x30008000; . = ALIGN(4); .text ...
- sql server中对xml进行操作
一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...
- PHP基础之PDO
简介 PDO(PHP Data Object)是指PHP数据对象,它定义了一个轻量级的一致接口来统一操作各种数据库.PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方 ...
- 第一个spring、springmvc、mybatis、freemarker项目小知识(一)
1.持久层开发(Mybatis) 1.1 添加,非空字段必须给值,不是非空加判断,有值添加无值不添 1.2 删除,注意外键关系的级联删除.(事务传播行为) 1.3 更新,每个字段单独 ...