static控件改变字体后内容前后颠倒了

red-fly 2011-12-23 04:33:57
自己派生了CStatic类,最终写出来的内容,后面的一些字符跑到前面去了,比如原来的内容是“+35s”,结果显示成了“s+35”,目前发现的,就是最后一个字符会跑到前面去,如果在下面的设置字体后增加一行:
strText += TEXT("a");
则写出来的内容就是正常的,而如果添加一个空格
strText += TEXT(" ");
则一样没有任何效果,和添加之前是一样的,如果是下面这样子:
strText = TEXT("ab") + strText;
则最后一个字符还是会跑到前面,即 “sab+35”。
通过跟踪,可以确认这个位置的字符串是正常的,只是在显示时就反了,不知道各位有没有砬到过
另外,可以确认,这个框框足够大来容纳所有的字符
写内容的代码如下:


void CSuperStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
DrawStatic( &dc );
}
void CMyStatic::DrawStatic( CDC *pDC )
{
CString strText;

GetWindowText( strText );
if ( strText.GetLength() == 0 )
return;

CRect rect;
GetClientRect( &rect );
DWORD dwStyle = GetStyle();
dwStyle |= DT_SINGLELINE | DT_VCENTER;

CFont *pOldFont = NULL;

// 目的是使字段和控件的高度相匹配,占用高度的7/8
CFont *pFont = GetFont();
LOGFONT stuLogFont;
pFont->GetLogFont( &stuLogFont );
double f = rect.Height() * 7 / 8 * 1.0 / stuLogFont.lfHeight;
stuLogFont.lfHeight = long(stuLogFont.lfHeight * f);
CFont fnt;
fnt.CreateFontIndirect( &stuLogFont );
pOldFont = pDC->SelectObject( &fnt ); // 只要这里设置了,内容就会前后颠倒,否则就是正常的

pDC->SetBkMode( TRANSPARENT );
if ( (dwStyle & DT_CENTER) != DT_CENTER )
rect.left += 3;
pDC->DrawText( strText, &rect, dwStyle );

if ( pOldFont )
pDC->SelectObject( pOldFont );
}
...全文
138 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2012-01-16
  • 打赏
  • 举报
回复
按照以上的方法修改之后,发现有一个问题,就是原来设置的距中对齐的样式没有了,跟踪发现在设计时设置的样式,在
pDC->GetTextAlign();
时总是返回0,即没有样式了,这样就总是只有 DT_SINGLELINE | DT_VCENTER 了,所以达不到目的。继续跟踪,发现GetStyle();的返回值是 0x50020001,查看DT_CENTER 的定义是0x01,所以这里进行了修改(不知道是否正确)来达到目的,这里认为GetStyle();的返回值的低字节为DT_开头的一些属性,所以改为如下:
DWORD dwStyle = pDC->GetTextAlign();
DWORD dw1 = GetStyle()&0xFF;
dwStyle |= DT_SINGLELINE | DT_VCENTER | dw1;

这样就达到目的了
red-fly 2012-01-16
  • 打赏
  • 举报
回复
非常感谢楼上的各位兄弟,问题终于解决了,把

GetClientRect( &rect );
DWORD dwStyle = GetStyle();
dwStyle |= DT_SINGLELINE | DT_VCENTER;

改成

GetClientRect( &rect );
DWORD dwStyle = pDC->GetTextAlign();
dwStyle |= DT_SINGLELINE | DT_VCENTER;

竟然把WS_和DT_搞糊涂了
red-fly 2012-01-16
  • 打赏
  • 举报
回复
晕,今天先试试
schlafenhamster 2012-01-08
  • 打赏
  • 举报
回复
问题找到了:
//
#define SHOW_ERR // "BIUD ID:" becomes ":BUS ID"

void CMyStatic::DrawStatic(CDC *pDC)
{
CString strText;

GetWindowText( strText );
if ( strText.GetLength() == 0 ) return;

CRect rect;
GetClientRect( &rect );
#ifdef SHOW_ERR
DWORD dwStyle = GetStyle();//0x50020300
dwStyle |= DT_SINGLELINE | DT_VCENTER;//0x00000020 | 0x00000004
//WS_EX_TRANSPARENT; WS_EX_NOPARENTNOTIFY
#endif

CFont *pOldFont = NULL;

// 目的是使字段和控件的高度相匹配,占用高度的7/8
CFont *pFont = GetFont();
LOGFONT stuLogFont;
pFont->GetLogFont( &stuLogFont );
double f = rect.Height() * 7 / 8 * 1.0 / stuLogFont.lfHeight;
stuLogFont.lfHeight = long(stuLogFont.lfHeight * f);
CFont fnt;
fnt.CreateFontIndirect( &stuLogFont );
pOldFont = pDC->SelectObject( &fnt ); // 只要这里设置了,内容就会前后颠倒,否则就是正常的

pDC->SetBkMode( TRANSPARENT );
#ifdef SHOW_ERR
if ( (dwStyle & DT_CENTER) != DT_CENTER ) rect.left += 3;// DT_CENTER=1
pDC->DrawText( strText, &rect, dwStyle );// 0x50020300; DT_RTLREADING=0x00020000
#else
pDC->DrawText( strText, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
#endif

if ( pOldFont ) pDC->SelectObject( pOldFont );
}
//
主要是:
DWORD dwStyle = GetStyle();//0x50020300
dwStyle |= DT_SINGLELINE | DT_VCENTER;//0x00000020 | 0x00000004
混淆WS_和DT_ !
使DT多了:
DT_RTLREADING // 双向
schlafenhamster 2012-01-08
  • 打赏
  • 举报
回复
找到毛病了:
// DWORD dwStyle = GetStyle();// 得到的不是DrawText Style;而是 WS_
//...
// if ( (dwStyle & DT_CENTER) != DT_CENTER ) rect.left += 3;
pDC->DrawText( strText, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);// dwStyle );
// pDC->TextOut(0,0, strText, strlen(strText));
schlafenhamster 2012-01-08
  • 打赏
  • 举报
回复
先试试TextOut
red-fly 2012-01-07
  • 打赏
  • 举报
回复
还有人碰到过这种情况吗?
我把no wrap设置成为true后,还是一样
schlafenhamster 2011-12-30
  • 打赏
  • 举报
回复
像是wrap功能打开了。
red-fly 2011-12-29
  • 打赏
  • 举报
回复
图片地址(应该没错):
http://hi.csdn.net/space-8733-do-album-picid-1021912.html
它在我的相册里
red-fly 2011-12-29
  • 打赏
  • 举报
回复
1. CMyStatic这类名是笔误,应该还是CSuperStatic
2. 在执行pDC->DrawText()时,确认字符串的内容是正确的
3. 把dwStyle |= DT_SINGLELINE | DT_VCENTER;注释掉后还是一样
4. stuLogFont的值应该是没有问题的,我在获原来的之后,只是改变了它的大小。但实际上,即使我不改变大小,直接再创建然后设置字体,结果还是有问题的。这个结构中的很多值都是空的。另外不知道如何贴图哦

IDE我用的是vs2008
另外测试了一些情况,感觉和字符的ascii值有关,不过没有仔细验证。
我写入字符串“BUS ID:”,结果出来的是“:BUS ID”,如果设置成“BUS ID: ”(后面一个是空格),则效果是一样的,如果我设置为“BUS ID:a”,则就没有问题了,或者是“BUS ID: a”也是没有问题
schlafenhamster 2011-12-24
  • 打赏
  • 举报
回复
我这里vc60试了试DrawStatic(),没发现问题
shen_wei 2011-12-24
  • 打赏
  • 举报
回复
stuLogFont 这个的值是什么啊?方便截图不。。
战在春秋 2011-12-24
  • 打赏
  • 举报
回复
1、首先检查一下三楼指出的问题:二个函数类名不一致。
2、检查执行到pDC->DrawText( strText,&rect, dwStyle );时strText值是否正确。
3、检查dwStyle |= DT_SINGLELINE | DT_VCENTER;有无影响。




schlafenhamster 2011-12-24
  • 打赏
  • 举报
回复
fnt.CreateFontIndirect( &stuLogFont );
看看这个fnt对不对
Eleven 2011-12-23
  • 打赏
  • 举报
回复
void CSuperStatic::OnPaint()

void CMyStatic::DrawStatic( CDC *pDC )

这里怎么一个是CSuperStatic一个是CMyStatic类??
zhongguoren666 2011-12-23
  • 打赏
  • 举报
回复
好长呀
healer_kx 2011-12-23
  • 打赏
  • 举报
回复
肯定是你逻辑的问题。。。 。。。而且只是字符串处理的问题。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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