通过 WM_NCCALCSIZE 消息设置VC组合框或编辑框文本垂直居中

设置组合框的文本垂直居中显示,除了重绘之外,还可以直接在其父对话框中通过在 WM_NCCALCSIZE 消息的响应函数中来搞定它。首先可以通过SetItemHeight设置组合框高度,然后进行下面的操作:


void CComBoxTest1Dlg::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(bCalcValidRects)
	{
		// 获取组合框中的编辑框的指针
		::CWnd *pWnd = m_combox1.GetWindow(GW_CHILD);
		while(pWnd)
		{
			TCHAR classname[256];
			::GetClassName(pWnd->m_hWnd, classname, 256);
			if(lstrcmpi(classname, _T("Edit")) == 0)
				break;
			if(pWnd)
				pWnd = pWnd->GetNextWindow();
		}
		CEdit *pEdit = (CEdit*)pWnd;
		// 获取编辑框的客户区
		CRect rcCombEditClient;
		pEdit->GetClientRect(&rcCombEditClient);
		// 获取组合框客户区
		CRect rcCombClient;
		m_combox1.GetClientRect(&rcCombClient);

		// 根据组合框字体类计算字符的高度,更具该高度计算组合框中编辑框的相对坐标
		// 用来计算的样本数据
		CString csTest = _T("编辑框VCenterAlign");
		SIZE sz;
		// 创建DC,设置参照计算的字体
		CDC* pDC = GetDC();
		CFont* pOldFont = pDC->SelectObject(m_combox1.GetFont());
		GetTextExtentPoint32(pDC->GetSafeHdc(), csTest, csTest.GetLength(), &sz);
		pDC->SelectObject(pOldFont);

		int nHeight = sz.cy;
		int nTop = (rcCombClient.Height()-nHeight)/2;
		// 重设组合框中编辑框的坐标
		pEdit->MoveWindow(rcCombEditClient.left+3, nTop, rcCombEditClient.Width(), nHeight);
	}

	CDialogEx::OnNcCalcSize(bCalcValidRects, lpncsp);
}

需注意的是,这样设置后,文本已经可以垂直居中了,不过组合的其他部分背景颜色不一致,这时又可以通过在WM_CTLCOLOR消息的响应函数中设置返回的背景画刷来搞定。

可以肯定的是,编辑框也可以用相同方法解决文本垂直居中问题。同时,在组合框或编辑框的重绘中,也可通过响应它们自己的WM_NCCALCSIZE消息来让它们的文本垂直居中显示。



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值