Edit垂直居中显示

cbzjzsb123 2017-10-30 05:05:26

m_Edit.SetWindowText("1234567890");
m_Edit2.SetWindowText("1234567890");
m_Edit3.SetWindowText("1234567890");
m_Edit4.SetWindowText("1234567890");

m_Edit.SetFont(&m_font);
m_Edit2.SetFont(&m_font);
m_Edit3.SetFont(&m_font);
m_Edit4.SetFont(&m_font);

SetEdtTextCenter2(&m_Edit);
SetEdtTextCenter2(&m_Edit2);
SetEdtTextCenter2(&m_Edit3);
SetEdtTextCenter2(&m_Edit4);

void CEdtDlg::SetEdtTextCenter2(CEdit* pEdit)
{
CRect rc;
pEdit->GetClientRect(&rc);
CDC* pDC=pEdit->GetDC();
TEXTMETRIC _tm;
pDC->GetTextMetrics(&_tm);
int _nFontHeight =_tm.tmHeight +_tm.tmExternalLeading;
int _nMargin = (rc.Height() -_nFontHeight)/2;
rc.DeflateRect(0,_nMargin);
pEdit->SetRectNP(&rc);
}


在网上找的一些资料,把Edit改成multline,使用上面的代码,可以居中了。但是现在的问题是:
1.设置一下字体的大小,就不居中了。
2.改变一下Edit的高度,就不居中了。
MFC怎么这么垃圾,最基本的居中的问题都要搞这么久,找了资料也搞这么久,太垃圾了,直接搞一个垂直居中属性不好吗?
上面这张图是调整了字体后,不同长度的Edit居中效果,正常情况下我要用的是第一种,就相当于是没居中,搞了半天白搞。
...全文
546 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbzjzsb123 2017-10-31
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
MFC本身就只是对一些API和控件的浅封装,一些特定的功能需要自己实现 你试下在改变大小后Invalidate并更新窗口是否可以
字体居中这个需求应该很广吧,应该有现成的代码,找不到相关的资料确实很奇怪。
cbzjzsb123 2017-10-31
  • 打赏
  • 举报
回复
cbzjzsb123 2017-10-31
  • 打赏
  • 举报
回复
@gz_qmc
引用 3 楼 schlafenhamster 的回复:

void CVertCenterEdit::SetEditVertCenter() 
{ 
    CRect rc; 
    GetClientRect(&rc); 
    CDC* pDC=GetDC();
	HGDIOBJ hOld = pDC->SelectObject(&m_FontVertEdit);
//
//	TEXTMETRIC _tm; 
//	pDC->GetTextMetrics(&_tm); 
//	int _nFontHeight =_tm.tmHeight +_tm.tmExternalLeading; 
//
	SIZE size;
    GetTextExtentPoint32W (pDC->m_hDC, L"f", 1, &size) ;
    int nFontHeight =size.cy; 
	pDC->SelectObject(hOld);
//
    int nMargin = (rc.Height() - nFontHeight)/2; 
    rc.DeflateRect(0, nMargin); 
	SetRect(&rc);
}

void CVertCenterEdit::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	m_FontVertEdit.CreateFont(32, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE
        , ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, PROOF_QUALITY
        , VARIABLE_PITCH | FF_SWISS, TEXT("SANS SERIF"));
	SetFont(&m_FontVertEdit);
	SetEditVertCenter();	
	CEdit::PreSubclassWindow();
}
大神,好了,要的就是这种效果。就是计算字体高度那点代码换一下就可以了。我当时就调试出字体高度有问题了,主要还是没弄清楚这些API的具体含义。GetTextExtentPoint32W这个API也用过,不过没去试。
paschen 2017-10-30
  • 打赏
  • 举报
回复
MFC本身就只是对一些API和控件的浅封装,一些特定的功能需要自己实现 你试下在改变大小后Invalidate并更新窗口是否可以
schlafenhamster 2017-10-30
  • 打赏
  • 举报
回复

void CVertCenterEdit::SetEditVertCenter() 
{ 
    CRect rc; 
    GetClientRect(&rc); 
    CDC* pDC=GetDC();
	HGDIOBJ hOld = pDC->SelectObject(&m_FontVertEdit);
//
//	TEXTMETRIC _tm; 
//	pDC->GetTextMetrics(&_tm); 
//	int _nFontHeight =_tm.tmHeight +_tm.tmExternalLeading; 
//
	SIZE size;
    GetTextExtentPoint32W (pDC->m_hDC, L"f", 1, &size) ;
    int nFontHeight =size.cy; 
	pDC->SelectObject(hOld);
//
    int nMargin = (rc.Height() - nFontHeight)/2; 
    rc.DeflateRect(0, nMargin); 
	SetRect(&rc);
}

void CVertCenterEdit::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	m_FontVertEdit.CreateFont(32, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE
        , ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, PROOF_QUALITY
        , VARIABLE_PITCH | FF_SWISS, TEXT("SANS SERIF"));
	SetFont(&m_FontVertEdit);
	SetEditVertCenter();	
	CEdit::PreSubclassWindow();
}
cbzjzsb123 2017-10-30
  • 打赏
  • 举报
回复
我发现把DeflateRect改成OffsetRect就会有居中效果。以第一个为例,计算所得_nMargin为8,而实际设置成5才是正中心,所以看起来偏下了。这样不用自动计算,每次手动指定偏移,就可以字体移动中间了。这样写代码太蠢了,如果一个界面很复杂,启动又慢,还要改一下,在运行一下看下效果,在去上下调整。如果解决不了,就只能这样搞了。
cbzjzsb123 2017-10-30
  • 打赏
  • 举报
回复
@VisualEleven ,@Win32FanEx ,@zgl7903 @paschen @smwhotjay @worldy @schlafenhamster 大神来看看,不行就只有用笨办法了

15,980

社区成员

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

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