【发布时间】:2020-03-21 17:01:46
【问题描述】:
我想将 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
{
public:
ValEdit();
virtual ~ValEdit();
int ZeroMeansInactiv;
protected:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnUpdate();
DECLARE_MESSAGE_MAP()
private:
COLORREF m_TextColor;
HBRUSH m_hBackgroundBrush;
HBRUSH m_hBackgrInactivBrush;
};
ValEdit.cpp:
ValEdit::ValEdit()
{
ZeroMeansInactiv = 1;
m_TextColor = Black;
m_hBackgroundBrush = CreateSolidBrush(RGB(255, 255, 255));
m_hBackgrInactivBrush = CreateSolidBrush(RGB(90, 90, 90));
}
ValEdit::~ValEdit()
{
}
BEGIN_MESSAGE_MAP(ValEdit, CEdit)
ON_WM_ERASEBKGND()
ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
END_MESSAGE_MAP()
BOOL ValEdit::OnEraseBkgnd(CDC* pDC)
{
RECT rc;
this->GetClientRect(&rc);
SetMapMode(*pDC, MM_TEXT);
FillRect(*pDC, &rc, !!ZeroMeansInactiv ? m_hBackgroundBrush : m_hBackgrInactivBrush );
return TRUE;
}
void ValEdit::OnUpdate()
{
RedrawWindow();
}
谢谢你的建议
艾莉
【问题讨论】:
-
有一个问题...您特别说 SetWindowTextW() 而不是 SetWindowText()。也许没什么,但是您是否正在构建 MBCS 应用程序并且需要调用 SetWindowTextW(),因为 SetWindowText() 调用了 SetWindowTextA()?如果是这样,则不建议将 6.0 版本的常用控件用于 MBCS 应用程序。如果没有,如果您在 OnEraseBkgnd 中更改 Map Mode,您应该恢复它。 (本来以为是 MM_TEXT 默认不需要设置)
-
现在我更新为 SetWindowText()。它也运行,如果我单击“查看定义”,则会显示#define SetWindowText SetWindowTextW
-
就我而言,您应该确保您的应用程序与 ComCtl32.dll 文件的不同目标版本兼容。如果您的项目中没有定义 _WIN32_IE 宏,它会自动定义为 0x0500。我建议你可以参考链接:docs.microsoft.com/zh-cn/windows/win32/controls/…如果你想让应用程序使用6.10版本,我建议你尝试enable visual style
-
在应用程序的 InitInstance 中,我编写了 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls);
标签: visual-studio mfc comctl32