应开发的需求,在这里写一篇关于竖着显示字的问题。在你的控件里让他很有规律的显示。
可以让他一个字母一个字母的显示,也可让他一个词一个词的显示。我现在有的是vc6。也为了让你能随时地,去改变它上面显示的字,我们来做一下。
首先说明一下,我做的是按钮的字让它竖着显示,多个字让他在你按钮里的任意位置来显示。
我们先来创建一个类,叫CtextMuilt这个类。继承CButton类。
要想让按钮重绘生效,最重要的一点就是他的属性一定要设置成BS_OWNERDRAW,这个玩意,你可以在这个函数里加
PreSubclassWindow() ,他应该是个虚函数。右键点击CtextMuilt类,添加virtual function这里边能找到它,还可以在创建里时候加上它(Create)下来我们就可以做东西了。
我现在作的这个项目超变态的,什么都得自己写,没有办法。本人零基础,奋斗了三个月,还是感觉什么都做不了。
首先我们先来双击CtextMuilt类在里面加一个create函数。
public:
void Create(LPCTSTR lpszCaption,CWnd* pr,CRect rc,UINT id)
看一下CButton类原来的create
lpszCaption指定按钮控件的文本。
指定按钮控件的样式。 适用于 按钮样式 的任意组合按钮。
指定按钮控件的大小和位置。 它可以是 CRect 对象或 RECT 结构。
指定按钮控件的父窗口,通常 CDialog。 不能为 NULL。
指定按钮控件的ID.
好了,最重要的来了。
下来我们来添加一个drawitem函数。
这个不用说怎么添加了吧。
void TextMiult::DrawItem(LPDRAWITEMSTRUCT lp)
{
//获得按钮的句柄
CDC *pDC=CDC::FromHandle(lp->hDC);
CRect rc;
//得到当前的客户区域
GetClientRect(&rc);
CBrush brushs(RGB(100,100,255));
pDC->SelectObject(&brushs);
pDC->Rectangle(&rc);
//创建字体
CFont font;
font.CreatePointFont(90,_T("Arial Unicode MS"));
//将字体先择到设备器中
pDC->SelectObject(font);
CString str;
//得到字体
GetWindowText(str);
//设置文字背景transparent是使用透明的输出,也就是文字的背景是不改变的
pDC->SetBkMode(TRANSPARENT);
//将文本设置成红色
pDC->SetTextColor(RGB(255,0,0));
//设置文本的显示矩形区域
CRect boundary(30,29,80,70);
//设置蓝色区域
CBrush brush(RGB(0,0,255));
pDC->SelectObject(&brush);
pDC->Rectangle(&boundary);
//设置紫色边框
CPen pen(PS_DOT,2,RGB(128,0,128));
pDC->SelectObject(&pen);
pDC->Rectangle(&boundary);
//设置文字显示临时区域
CRect rect(0,0,boundary.Width(),boundary.Height());
//int height=pDC->DrawText(str,&rc,DT_CALCRECT|DT_CENTER|DT_EDITCONTROL|DT_WORDBREAK);
//使用DT_CALCRECT,DT_CENTER,DT_EDITCONTROL,DT_WORDBREAK参数计算需要的文本高度
int height=pDC->DrawText(str,rect,DT_WORDBREAK|DT_NOCLIP|DT_WORDBREAK|DT_CALCRECT);
//计算完成后将原来的区域赋回rect
rect=boundary;
//避免高度是否超出范围,以免出现负数情况
if (boundary.Height()>height)
{
rc.top+=(boundary.Height()-height)/2;//计算空白高度的一半,这里要用+=
}
//输出垂直居中+左右居中+自动换行的文本结果
pDC->DrawText(str,rect,DT_CENTER|DT_WORDBREAK|DT_EDITCONTROL);
}
CRect boundary(70,29,100,70);---------------------这个地方你可以让你的字在你的控件里任意位置来显示
好了,再来看一下,最关键的地主。create函数里应该怎么写呢。
有两种写法。第一种。把自绘加在这里BS_MULTILINE--这个就是多行显示
void CTextMiult:: Create(LPCTSTR lpszCaption,CWnd* pr,CRect rc,UINT id)
{
CButton::Create(lpszCaption, WS_CHILD|WS_VISIBLE|BS_MULTILINE|BS_OWNERDRAW |BS_PUSHBUTTON,rc,pr,id);
}
void CTextMiult:: Create(LPCTSTR lpszCaption,CWnd* pr,CRect rc,UINT id)
{
CButton::Create(lpszCaption, WS_CHILD|WS_VISIBLE|BS_MULTILINE,rc,pr,id);
}
在这个函数里加上PreSubclassWindow()
ModifyStyle(0, BS_OWNERDRAW | BS_PUSHBUTTON);
加上他就行了。呵呵。写完了,给大家加上几图片。来表示一下,明天就是元宵节,先祝大家元宵节快乐。呵呵。
为他更方便大家理解,我给他加上边框,给它加上颜色好让大家来区分。
有图了,颜色虽然调的不怎么好看,让大家看一下效果吧。
再来一经,换个颜色。呵呵换个位置。
好了再一张横的。显示的。
因为我的按钮设大了,所以才程现这一种效果。
好了因为我是从基础开始学的,所以写的够详细了吧。
好。完成。
现来一张图