應開發的需求,在這裏寫一篇關於豎着顯示字的問題。在你的控件裏讓他很有規律的顯示。
可以讓他一個字母一個字母的顯示,也可讓他一個詞一個詞的顯示。我現在有的是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);
加上他就行了。呵呵。寫完了,給大家加上幾圖片。來表示一下,明天就是元宵節,先祝大家元宵節快樂。呵呵。
爲他更方便大家理解,我給他加上邊框,給它加上顏色好讓大家來區分。
有圖了,顏色雖然調的不怎麼好看,讓大家看一下效果吧。
再來一經,換個顏色。呵呵換個位置。
好了再一張橫的。顯示的。
因爲我的按鈕設大了,所以才程現這一種效果。
好了因爲我是從基礎開始學的,所以寫的夠詳細了吧。
好。完成。
現來一張圖