设置组合框的文本垂直居中显示,除了重绘之外,还可以直接在其父对话框中通过在 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消息来让它们的文本垂直居中显示。