Visual studio CEdit适用于ComCtrl32版本5.82,但不适用于6.10

Visual studio CEdit适用于ComCtrl32版本5.82,但不适用于6.10,visual-studio,mfc,comctl32,Visual Studio,Mfc,Comctl32,我希望将MFC项目移植到当前可用的资源 我使用Microsoft Visual Studio社区进行开发 在较旧的项目中,Windows SDK版本为10.0.15063.0 在新项目中,Windows SDK版本为10.0.17763.0 较旧的项目使用ComCtrl32.dll版本5.82 新项目使用ComCtrl32.dll版本6.10 使用SetWindowTextW(textp)更新后,使用的CEdit控件显示一个黑色的控件矩形 如果我将光标移动到控件上,它看起来与预期的一样 ValE

我希望将MFC项目移植到当前可用的资源

我使用Microsoft Visual Studio社区进行开发

在较旧的项目中,Windows SDK版本为10.0.15063.0

在新项目中,Windows SDK版本为10.0.17763.0

较旧的项目使用ComCtrl32.dll版本5.82

新项目使用ComCtrl32.dll版本6.10

使用SetWindowTextW(textp)更新后,使用的CEdit控件显示一个黑色的控件矩形

如果我将光标移动到控件上,它看起来与预期的一样

ValEdit.h:

class-ValEdit:public-CEdit
{
公众:
ValEdit();
虚拟~ValEdit();
int零表示活动;
受保护的:
afx_msg BOOL OnEraseBkgnd(CDC*pDC);
afx_msg void OnUpdate();
声明消息映射()
私人:
COLORREF m_TextColor;
HBRUSH m_hBackgroundBrush;
HBRUSH m_HBackgrinActivibrush;
};
ValEdit.cpp:

ValEdit::ValEdit()
{
零均值活动=1;
m_TextColor=黑色;
m_hBackgroundBrush=CreateSolidBrush(RGB(255,255,255));
m_hBackgrInactivBrush=CreateSolidBrush(RGB(90,90,90));
}
ValEdit::~ValEdit()
{
}
开始消息映射(ValEdit、CEdit)
关于_WM_ERASEBKGND()
ON_控制_反映(EN_更新,OnUpdate)
结束消息映射()
BOOL ValEdit::OnEraseBkgnd(CDC*pDC)
{
RECT-rc;
此->GetClientRect(&rc);
SetMapMode(*pDC,MM_文本);
FillRect(*pDC,&rc,!!零均值激活?m_hBackgroundBrush:m_hBackgrInactivBrush);
返回TRUE;
}
void ValEdit::OnUpdate()
{
重画窗口();
}
谢谢你的建议


拜托,我需要解释

我一步一步地对应用程序进行编程,发现导致故障的代码是CEdit控制未正确更新

HBRUSH CStyleToolkitDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if (nCtlColor == CTLCOLOR_STATIC)
    {
        // We handle this message only if we have set the region
        BOOL bHandled = m_bIsRgnSet;
        if (bHandled)
        {
            HDC hDC = pDC->GetSafeHdc();
            SetBkMode(hDC, TRANSPARENT);
            return (HBRUSH)GetStockObject(HOLLOW_BRUSH); //causes the malfunction
        }
    }
    return hbr;
}
如果我把它和

if (!pWnd->IsKindOf(RUNTIME_CLASS(CEdit)))
            return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
CEdit控件按预期更新


谢谢您的讨论

请,我需要解释

我一步一步地对应用程序进行编程,发现导致故障的代码是CEdit控制未正确更新

HBRUSH CStyleToolkitDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if (nCtlColor == CTLCOLOR_STATIC)
    {
        // We handle this message only if we have set the region
        BOOL bHandled = m_bIsRgnSet;
        if (bHandled)
        {
            HDC hDC = pDC->GetSafeHdc();
            SetBkMode(hDC, TRANSPARENT);
            return (HBRUSH)GetStockObject(HOLLOW_BRUSH); //causes the malfunction
        }
    }
    return hbr;
}
如果我把它和

if (!pWnd->IsKindOf(RUNTIME_CLASS(CEdit)))
            return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
CEdit控件按预期更新


谢谢您的讨论

我有一个问题。。。您明确地说是SetWindowTextW()而不是SetWindowText()。也许这算不了什么,但您是否正在构建MBCS应用程序,并且需要调用SetWindowTextW(),因为SetWindowText()调用SetWindowTextA()?如果是,则不建议MBCS应用使用6.0版本的通用控件。否则,如果在OnEraseBkgnd中更改映射模式,则应将其还原。(本以为默认情况下是MM_文本,不需要设置)现在我更新为SetWindowText()。它也会运行,如果我单击“查看定义”,则会显示#define SetWindowText SetWindowText就我而言,您应该确保您的应用程序与ComCtl32.dll文件的不同目标版本兼容。如果未在项目中定义_WIN32_IE宏,则会自动将其定义为0x0500。我建议您可以参考链接:如果您希望应用程序使用版本6.10,我建议您尝试在我编码的应用程序INITCOMMONCONTROLSEX InitCtrls的InitInstance中使用;InitCtrls.dwSize=sizeof(InitCtrls);InitCtrls.dwICC=ICC_WIN95_类;InitCommonControlsEx(&InitCtrls);我有一个问题。。。您明确地说是SetWindowTextW()而不是SetWindowText()。也许这算不了什么,但您是否正在构建MBCS应用程序,并且需要调用SetWindowTextW(),因为SetWindowText()调用SetWindowTextA()?如果是,则不建议MBCS应用使用6.0版本的通用控件。否则,如果在OnEraseBkgnd中更改映射模式,则应将其还原。(本以为默认情况下是MM_文本,不需要设置)现在我更新为SetWindowText()。它也会运行,如果我单击“查看定义”,则会显示#define SetWindowText SetWindowText就我而言,您应该确保您的应用程序与ComCtl32.dll文件的不同目标版本兼容。如果未在项目中定义_WIN32_IE宏,则会自动将其定义为0x0500。我建议您可以参考链接:如果您希望应用程序使用版本6.10,我建议您尝试在我编码的应用程序INITCOMMONCONTROLSEX InitCtrls的InitInstance中使用;InitCtrls.dwSize=sizeof(InitCtrls);InitCtrls.dwICC=ICC_WIN95_类;InitCommonControlsEx(&InitCtrls);现在我删除了OnCtlColor事件例程,该应用程序也可以运行。很多年前,我在“代码项目”中寻找代码示例并采用了这个细节。现在我删除了OnCtlColor事件例程,应用程序也可以运行。很多年前,我在“代码项目”中寻找代码示例并采用了这个细节。