Visual studio CEdit适用于ComCtrl32版本5.82,但不适用于6.10
我希望将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: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
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事件例程,应用程序也可以运行。很多年前,我在“代码项目”中寻找代码示例并采用了这个细节。