gpt4 book ai didi

c++ - 在子类 CStatic 控件中处理 WM_PAINT

转载 作者:太空宇宙 更新时间:2023-11-04 15:51:43 27 4
gpt4 key购买 nike

我创建了一个自定义控件,其类以 CStatic 作为基类。目前我使用 WM_PAINT 事件处理绘图。但是有一个奇怪的行为。当我使用 CWnd::EnableWindow 函数禁用窗口后重新启用它时,它拒绝绘制我在 OnPaint 函数中编写的内容。它绘制静态控件。

我同意存在覆盖 DrawItem 并使用 SS_OWNERDRAW 样式的标准方法。但是 WM_PAINT 有什么问题呢?

void XXControl::OnPaint()
{
CPaintDC PaintDC( this );
// ** draw the control to PaintDC**
}

最佳答案

这正是我写的:

class CMyStatic : public CStatic
{
DECLARE_MESSAGE_MAP()
public:
void OnPaint(void);
};

BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()

void CMyStatic::OnPaint(void)
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);

dc.FillSolidRect(&rect, RGB(120,255,0));
}

和子类:

class CMyDlg : public CDialog
{
// Construction
CMyStatic my_static;
...
};


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

my_static.SubclassDlgItem(IDC_DRAW, this);

return true;
}

IDC_DRAW 是这个对话框资源的静态控制。我写了两个按钮处理程序:

void CMyDlg::OnBnClickedOk()
{
my_static.EnableWindow(FALSE);
my_static.Invalidate();
}

void CMyDlg::OnBnClickedOk2()
{
my_static.EnableWindow();
my_static.Invalidate();
}

而且它完美运行!删除 Invalidate 调用,它将失败。

关于c++ - 在子类 CStatic 控件中处理 WM_PAINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7187072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com