MFC TabControl繪制橫向文本(麻煩給個詳細代碼,百度的結果都是基于c#的,好傷感)
uj5u.com熱心網友回復:
這個dc設定一下字體就行,不過自繪你修改了字體的方向,需要控制沒一個標簽Rect的大小。uj5u.com熱心網友回復:
比較簡單是設定固定寬度,然后直接呼叫函式設定標簽大小,這樣自繪起來簡單,我就這樣弄。uj5u.com熱心網友回復:
有沒有具體的實作代碼
uj5u.com熱心網友回復:
//設定字體格式memset(&stFont, 0, sizeof(LOGFONT));
stFont.lfHeight=MulDiv(14, -pDC->GetDeviceCaps(LOGPIXELSY), 72);
stFont.lfWeight=FW_NORMAL;
stFont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
strcpy (stFont.lfFaceName, "@宋體");
uj5u.com熱心網友回復:
在onpaint里面SelectObject一下,字體直接提取父表單的字體就行了。標簽大小用Ctabctrl的介面函式SetItemSize搞定。
直接設定字體不知道windows有沒有效果,我當初是在wince里面弄的,不行。所以自繪。
uj5u.com熱心網友回復:
//設定字體格式
memset(&stFont, 0, sizeof(LOGFONT));
stFont.lfHeight=MulDiv(14, -pDC->GetDeviceCaps(LOGPIXELSY), 72);
stFont.lfWeight=FW_NORMAL;
stFont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
strcpy (stFont.lfFaceName, "@宋體");
這段代碼是加到OnPaint函式里面還是添加到哪里?
uj5u.com熱心網友回復:
比較簡單是設定固定寬度,然后直接呼叫函式設定標簽大小,這樣自繪起來簡單,我就這樣弄。
有沒有具體的實作代碼
在onpaint里面SelectObject一下,字體直接提取父表單的字體就行了。標簽大小用Ctabctrl的介面函式SetItemSize搞定。
直接設定字體不知道windows有沒有效果,我當初是在wince里面弄的,不行。所以自繪。
剛接觸mfc沒有多久,還是看的不是很明白。。。。
uj5u.com熱心網友回復:
DC不是可以用SelectObject設定字體嗎?哪里不明白了uj5u.com熱心網友回復:
DC不是可以用SelectObject設定字體嗎?哪里不明白了
是可以設定字體,但是怎么設定tabCtrl的字體呢?這個貌似實作不了
uj5u.com熱心網友回復:
DC不是可以用SelectObject設定字體嗎?哪里不明白了
是可以設定字體,但是怎么設定tabCtrl的字體呢?這個貌似實作不了
tabctrl字體不是可以用setfont設定嗎?問題是這個好像必須設定dc才有用,不是設定控制元件字體就能改過來的。
uj5u.com熱心網友回復:
DC不是可以用SelectObject設定字體嗎?哪里不明白了
是可以設定字體,但是怎么設定tabCtrl的字體呢?這個貌似實作不了
tabctrl字體不是可以用setfont設定嗎?問題是這個好像必須設定dc才有用,不是設定控制元件字體就能改過來的。
我用的代碼是

實作的效果是
uj5u.com熱心網友回復:
DC不是可以用SelectObject設定字體嗎?哪里不明白了
是可以設定字體,但是怎么設定tabCtrl的字體呢?這個貌似實作不了
tabctrl字體不是可以用setfont設定嗎?問題是這個好像必須設定dc才有用,不是設定控制元件字體就能改過來的。
字體大小可以控制,但是字體方向貌似控制不了。
LogFont.lfEscapement = 120; //文本行與X軸的的夾角
LogFont.lfOrientation = 190; //字符于X軸的夾角
設定了這些引數后,字體還是豎著顯示,一點變化也沒有
uj5u.com熱心網友回復:
老實自繪吧,自繪時直接修改dc的字體就行了。uj5u.com熱心網友回復:
老實自繪吧,自繪時直接修改dc的字體就行了。
怎么自繪呢,能不能提供一個參考代碼,以前沒有弄過這個東西
uj5u.com熱心網友回復:
1 label 在 右邊uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
1、這種方法緊緊針對漢字,字母的話則還是歪的。
2、字體顯示的看起來是正了。但是還是豎排顯示,不是橫向顯示。
uj5u.com熱心網友回復:
1、這種方法緊緊針對漢字,字母的話則還是歪的。字母也可以 用 漢字。
2、但是還是豎排顯示,不是橫向顯示。
你不是要 豎排 ?
默認 就是 橫向 即沒有 TCS_RIGHT,什么都不用改
uj5u.com熱心網友回復:
1、這種方法緊緊針對漢字,字母的話則還是歪的。
字母也可以 用 漢字。
2、但是還是豎排顯示,不是橫向顯示。
你不是要 豎排 ?
默認 就是 橫向 即沒有 TCS_RIGHT,什么都不用改

弄之后的效果是這樣子的。
uj5u.com熱心網友回復:
CSize sz(26,100);// 26 row height 100 = title lenghtSetItemSize(sz);
可以改變 label 大小。
uj5u.com熱心網友回復:
void CTabSheet::TabInit(){
CSize sz(30,100);// 26 row height 100 = title lenght
SetItemSize(sz);
}
void CTabSheet::OnPaint()
{
CTabCtrl::OnPaint();// let tab draw the frame!
// redraw the text !
CClientDC dc(this);
char szTabText[40];
memset(szTabText, '\0', sizeof(szTabText));
//
TC_ITEM tci;
memset(&tci,0,sizeof(tci));
tci.mask = TCIF_TEXT | TCIF_STATE;
tci.dwStateMask = TCIS_BUTTONPRESSED;
tci.pszText = szTabText;
tci.cchTextMax = sizeof(szTabText)-1;
// get item
CRect rcItem;
for(int jj=0;jj<m_nNumOfPages;jj++)
{// 0->3
GetItem(jj, &tci);
GetItemRect(jj,&rcItem);
afxDump << rcItem.Height() << "= Hei Item \n";
afxDump << rcItem.Width() << "= Wid Item \n";
rcItem.DeflateRect(1,2);
dc.FillSolidRect(&rcItem,RGB(220,220,220));
dc.SetBkMode(TRANSPARENT);
if(tci.dwState & TCIS_BUTTONPRESSED) dc.SetTextColor(RGB(255,0,0));
else dc.SetTextColor(RGB(0,0,0));
//
dc.TextOut(rcItem.left,rcItem.top, tci.pszText, lstrlen(tci.pszText));
}
}
uj5u.com熱心網友回復:
void CTabSheet::TabInit()
{
CSize sz(30,100);// 26 row height 100 = title lenght
SetItemSize(sz);
}
void CTabSheet::OnPaint()
{
CTabCtrl::OnPaint();// let tab draw the frame!
// redraw the text !
CClientDC dc(this);
char szTabText[40];
memset(szTabText, '\0', sizeof(szTabText));
//
TC_ITEM tci;
memset(&tci,0,sizeof(tci));
tci.mask = TCIF_TEXT | TCIF_STATE;
tci.dwStateMask = TCIS_BUTTONPRESSED;
tci.pszText = szTabText;
tci.cchTextMax = sizeof(szTabText)-1;
// get item
CRect rcItem;
for(int jj=0;jj<m_nNumOfPages;jj++)
{// 0->3
GetItem(jj, &tci);
GetItemRect(jj,&rcItem);
afxDump << rcItem.Height() << "= Hei Item \n";
afxDump << rcItem.Width() << "= Wid Item \n";
rcItem.DeflateRect(1,2);
dc.FillSolidRect(&rcItem,RGB(220,220,220));
dc.SetBkMode(TRANSPARENT);
if(tci.dwState & TCIS_BUTTONPRESSED) dc.SetTextColor(RGB(255,0,0));
else dc.SetTextColor(RGB(0,0,0));
//
dc.TextOut(rcItem.left,rcItem.top, tci.pszText, lstrlen(tci.pszText));
}
}
這個測驗專案能不能打包發一下給我,嘿嘿[email protected]
uj5u.com熱心網友回復:
已發送 “TabSheet.rar”uj5u.com熱心網友回復:
就是派生 class CTabSheet : public CTabCtrl加 :OnPaint() 和 void CTabSheet::TabInit()
初始化 tab 后 調 m_Tab.TabInit()
復制 OnPaint
tab 屬性:
alignmemt = fixed width
bottom
vertical
uj5u.com熱心網友回復:
void CTabSheet::TabInit()
{
CSize sz(30,100);// 26 row height 100 = title lenght
SetItemSize(sz);
}
void CTabSheet::OnPaint()
{
CTabCtrl::OnPaint();// let tab draw the frame!
// redraw the text !
CClientDC dc(this);
char szTabText[40];
memset(szTabText, '\0', sizeof(szTabText));
//
TC_ITEM tci;
memset(&tci,0,sizeof(tci));
tci.mask = TCIF_TEXT | TCIF_STATE;
tci.dwStateMask = TCIS_BUTTONPRESSED;
tci.pszText = szTabText;
tci.cchTextMax = sizeof(szTabText)-1;
// get item
CRect rcItem;
for(int jj=0;jj<m_nNumOfPages;jj++)
{// 0->3
GetItem(jj, &tci);
GetItemRect(jj,&rcItem);
afxDump << rcItem.Height() << "= Hei Item \n";
afxDump << rcItem.Width() << "= Wid Item \n";
rcItem.DeflateRect(1,2);
dc.FillSolidRect(&rcItem,RGB(220,220,220));
dc.SetBkMode(TRANSPARENT);
if(tci.dwState & TCIS_BUTTONPRESSED) dc.SetTextColor(RGB(255,0,0));
else dc.SetTextColor(RGB(0,0,0));
//
dc.TextOut(rcItem.left,rcItem.top, tci.pszText, lstrlen(tci.pszText));
}
}
這個圖片中藍色方框部分,有一點字體沒有被重繪掉。

uj5u.com熱心網友回復:
...
for(int jj=0;jj<m_nNumOfPages;jj++)
{// 0->3
GetItem(jj, &tci);
GetItemRect(jj,&rcItem);
dc.SetBkMode(TRANSPARENT);
if(tci.dwState & TCIS_BUTTONPRESSED)
{
dc.SetTextColor(RGB(255,0,0));
}
else
{
rcItem.DeflateRect(1,2);
dc.SetTextColor(RGB(0,0,0));
}
dc.FillSolidRect(&rcItem,RGB(220,220,220));
//
dc.TextOut(rcItem.left,rcItem.top, tci.pszText, lstrlen(tci.pszText));
}
...
uj5u.com熱心網友回復:
CTabCtrl::OnPaint();// let tab draw the frame!呼叫它在 畫框 的 同時 又 畫了 text ;所以 要 擦除 client 后 再 畫 text。
如果你愿意 可以 自己 畫 框, 這樣 就 不需要 再 畫 text 了。
uj5u.com熱心網友回復:
[email protected] 樓主求那個例子轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/50108.html
標籤:基礎類
