MFC TabControl绘制横向文本

guoqiang5277 2017-01-20 02:38:01
MFC TabControl绘制横向文本(麻烦给个详细代码,百度的结果都是基于c#的,好伤感)

...全文
902 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34327617 2019-04-19
  • 打赏
  • 举报
回复
382995953@qq.com 楼主求那个例子
schlafenhamster 2017-02-07
  • 打赏
  • 举报
回复
CTabCtrl::OnPaint();// let tab draw the frame! 调用它在 画框 的 同时 又 画了 text ;所以 要 擦除 client 后 再 画 text。 如果你愿意 可以 自己 画 框, 这样 就 不需要 再 画 text 了。
schlafenhamster 2017-02-07
  • 打赏
  • 举报
回复

...
	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));
	}
...
guoqiang5277 2017-02-07
  • 打赏
  • 举报
回复
引用 21 楼 schlafenhamster 的回复:
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));
}
}




这个图片中蓝色方框部分,有一点字体没有被刷新掉。

schlafenhamster 2017-01-25
  • 打赏
  • 举报
回复
就是派生 class CTabSheet : public CTabCtrl 加 :OnPaint() 和 void CTabSheet::TabInit() 初始化 tab 后 调 m_Tab.TabInit() 复制 OnPaint tab 属性: alignmemt = fixed width bottom vertical
schlafenhamster 2017-01-25
  • 打赏
  • 举报
回复
已发送 “TabSheet.rar”
guoqiang5277 2017-01-24
  • 打赏
  • 举报
回复
引用 18 楼 schlafenhamster 的回复:
1、这种方法紧紧针对汉字,字母的话则还是歪的。
字母也可以 用 汉字。
2、但是还是竖排显示,不是横向显示。
你不是要 竖排 ?
默认 就是 横向 即没有 TCS_RIGHT,什么都不用改




弄之后的效果是这样子的。

而我想要弄成的效果是

guoqiang5277 2017-01-24
  • 打赏
  • 举报
回复
引用 21 楼 schlafenhamster 的回复:
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));
	}
}

这个测试项目能不能打包发一下给我,嘿嘿397925937@qq.com
schlafenhamster 2017-01-24
  • 打赏
  • 举报
回复
1、这种方法紧紧针对汉字,字母的话则还是歪的。 字母也可以 用 汉字。 2、但是还是竖排显示,不是横向显示。 你不是要 竖排 ? 默认 就是 横向 即没有 TCS_RIGHT,什么都不用改
guoqiang5277 2017-01-24
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
1、这种方法紧紧针对汉字,字母的话则还是歪的。 2、字体显示的看起来是正了。但是还是竖排显示,不是横向显示。
schlafenhamster 2017-01-24
  • 打赏
  • 举报
回复
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));
}
}



schlafenhamster 2017-01-24
  • 打赏
  • 举报
回复
CSize sz(26,100);// 26 row height 100 = title lenght SetItemSize(sz); 可以改变 label 大小。
  • 打赏
  • 举报
回复
DC不是可以用SelectObject设置字体吗?哪里不明白了
guoqiang5277 2017-01-21
  • 打赏
  • 举报
回复
引用 5 楼 accessysq 的回复:
[quote=引用 3 楼 guoqiang5277 的回复:] [quote=引用 2 楼 accessysq 的回复:] 比较简单是设置固定宽度,然后直接调用函数设置标签大小,这样自绘起来简单,我就这样弄。
有没有具体的实现代码[/quote] 在onpaint里面SelectObject一下,字体直接提取父窗体的字体就行了。标签大小用Ctabctrl的接口函数SetItemSize搞定。 直接设置字体不知道windows有没有效果,我当初是在wince里面弄的,不行。所以自绘。[/quote] 刚接触mfc没有多久,还是看的不是很明白。。。。
guoqiang5277 2017-01-21
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
//设置字体格式 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函数里面还是添加到哪里?
  • 打赏
  • 举报
回复
引用 3 楼 guoqiang5277 的回复:
[quote=引用 2 楼 accessysq 的回复:] 比较简单是设置固定宽度,然后直接调用函数设置标签大小,这样自绘起来简单,我就这样弄。
有没有具体的实现代码[/quote] 在onpaint里面SelectObject一下,字体直接提取父窗体的字体就行了。标签大小用Ctabctrl的接口函数SetItemSize搞定。 直接设置字体不知道windows有没有效果,我当初是在wince里面弄的,不行。所以自绘。
schlafenhamster 2017-01-21
  • 打赏
  • 举报
回复
schlafenhamster 2017-01-21
  • 打赏
  • 举报
回复
1 label 在 右边
CONTROL "Tab1",IDC_TAB1,"SysTabControl32",TCS_RIGHT | TCS_VERTICAL | TCS_FIXEDWIDTH,7,26,306,144,WS_EX_RIGHT | 2 字体 加 @ (90度旋转的 字体) CFont m_font; LOGFONT stFont; //字体定义结构 //设置字体格式 // CDC *pDC=GetDC(); memset(&stFont, 0, sizeof(LOGFONT)); // int hei=MulDiv(10, -pDC->GetDeviceCaps(LOGPIXELSY), 72); stFont.lfHeight=-20; stFont.lfWeight=FW_NORMAL; stFont.lfClipPrecision=CLIP_DEFAULT_PRECIS; strcpy (stFont.lfFaceName, "@宋体"); //创建字体并选进设备场景 m_font.CreateFontIndirect(&stFont); m_Tab.SetFont(&m_font); CSize sz(110,30);//110 height ! m_Tab.SetItemSize(sz);
guoqiang5277 2017-01-21
  • 打赏
  • 举报
回复
引用 13 楼 accessysq 的回复:
老实自绘吧,自绘时直接修改dc的字体就行了。
怎么自绘呢,能不能提供一个参考代码,以前没有弄过这个东西
  • 打赏
  • 举报
回复
老实自绘吧,自绘时直接修改dc的字体就行了。
加载更多回复(8)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧