Mfc Ownerdraw组合框文本垂直居中对齐

Mfc Ownerdraw组合框文本垂直居中对齐,mfc,Mfc,我在基于MFC对话框的应用程序中使用owner draw ComboBox 我可以绘制Combobox的列表框项目,但我无法在Combobox的编辑控件中设置垂直居中对齐的Combobox文本,它始终呈现在编辑控件的左上角 我需要在编辑控件的垂直中心渲染文本 如何实现? 组合框样式:-CBS_下拉列表| CBS_OWNERDRAWFIXED | CBS_排序| CBS_Hastrings | CBS_大写| WS_VSCROLL | WS|u TABSTOP BOOL CTestComboDlg

我在基于MFC对话框的应用程序中使用owner draw ComboBox

我可以绘制Combobox的列表框项目,但我无法在Combobox的编辑控件中设置垂直居中对齐的Combobox文本,它始终呈现在编辑控件的左上角

我需要在编辑控件的垂直中心渲染文本

如何实现? 组合框样式:-CBS_下拉列表| CBS_OWNERDRAWFIXED | CBS_排序| CBS_Hastrings | CBS_大写| WS_VSCROLL | WS|u TABSTOP

BOOL CTestComboDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    COMBOBOXINFO cbi = { sizeof cbi};
    m_ctrlCombo.GetComboBoxInfo(&cbi);
    CRect r;
    CWnd* p = CWnd::FromHandle(cbi.hwndItem);
    ((CEdit*)p)->GetRect(&r);

    r.DeflateRect(10,10);
    ((CEdit*)p)->SetRect(r);
    m_ctrlCombo.AddString("GHKL");
    m_ctrlCombo.AddString("FGHJKL");
    m_ctrlCombo.AddString("ASDFGH");
    m_ctrlCombo.AddString("QWERTY");
    m_ctrlCombo.SetCurSel(0);
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMyComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);

    LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData;
    ASSERT(lpszText != NULL);

    if (lpDrawItemStruct->itemID != -1)
        dc.DrawText(lpszText, strlen(lpszText),
        &lpDrawItemStruct->rcItem,
        DT_LEFT|DT_SINGLELINE|DT_VCENTER);
    dc.Detach();

}

感谢

所有者绘制的组合框控件的显示高度将高于在“资源”对话框中设置的高度:在“资源编辑器”中,组合框的默认高度为12像素,但在正在运行的应用程序中,它的显示高度将高出2像素。 因此,我使用下面的代码来调整combobox编辑控件的高度,并使文本垂直居中对齐

TEXTMETRIC tm;
HDC hDC = ::GetDC(NULL);
CFont* pFont = GetFont();
HFONT hFontOld = (HFONT)SelectObject(hDC, pFont->GetSafeHandle());
GetTextMetrics(hDC, &tm);
SetItemHeight(-1,tm.tmHeight + tm.tmExternalLeading + 1);
SelectObject(hDC, hFontOld);
::ReleaseDC(NULL, hDC);

请在问题中显示相关代码。此外,当您单击此处的链接时,无法访问直接链接。@xMRi,我已将我的示例上载到一个驱动器中,并共享了Onedrive提供的链接。URL仅有效,但在stackoverflow.com网站中复制链接时无效。我认为没有问题。文本应垂直居中。但是您的文本(高度)有多大?矩形有多大?@xMRi问题只发生在ownerdraw组合框中,而不是普通组合框中;)对你的代码显示了ownerdraw的内容。。。但无论如何,我看这里没有问题。检查CT的大小和字体大小。请记住,您没有选择任何字体。。。