让你的字在控件里有规律的竖着显示

应开发的需求,在这里写一篇关于竖着显示字的问题。在你的控件里让他很有规律的显示。

可以让他一个字母一个字母的显示,也可让他一个词一个词的显示。我现在有的是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

指定按钮控件的文本。

dwStyle

指定按钮控件的样式。 适用于 按钮样式 的任意组合按钮。

rect

指定按钮控件的大小和位置。 它可以是 CRect 对象或 RECT 结构。

pParentWnd

指定按钮控件的父窗口,通常 CDialog。 不能为 NULL

nID

指定按钮控件的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);

加上他就行了。呵呵。写完了,给大家加上几图片。来表示一下,明天就是元宵节,先祝大家元宵节快乐。呵呵。

为他更方便大家理解,我给他加上边框,给它加上颜色好让大家来区分。

有图了,颜色虽然调的不怎么好看,让大家看一下效果吧。


再来一经,换个颜色。呵呵换个位置。




好了再一张横的。显示的。


因为我的按钮设大了,所以才程现这一种效果。

好了因为我是从基础开始学的,所以写的够详细了吧。

好。完成。

现来一张图



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章