讓你的字在控件裏有規律的豎着顯示

應開發的需求,在這裏寫一篇關於豎着顯示字的問題。在你的控件裏讓他很有規律的顯示。

可以讓他一個字母一個字母的顯示,也可讓他一個詞一個詞的顯示。我現在有的是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);

加上他就行了。呵呵。寫完了,給大家加上幾圖片。來表示一下,明天就是元宵節,先祝大家元宵節快樂。呵呵。

爲他更方便大家理解,我給他加上邊框,給它加上顏色好讓大家來區分。

有圖了,顏色雖然調的不怎麼好看,讓大家看一下效果吧。


再來一經,換個顏色。呵呵換個位置。




好了再一張橫的。顯示的。


因爲我的按鈕設大了,所以才程現這一種效果。

好了因爲我是從基礎開始學的,所以寫的夠詳細了吧。

好。完成。

現來一張圖



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