首页 > 解决方案 > 使用 SS_OWNERDRAW 动态创建 CStatic 时程序在 UpdateWindow 上崩溃

问题描述

在初始化对话框中,我动态地创建了一些带有样式的CStatic控件。SS_OWNERDRAW当我使这些控件可见(WS_VISIBLEShowWindow(SW_SHOW))时,程序崩溃。调用堆栈显示方法崩溃的原因DrawItem

我不知道为什么,因为我在资源管理器中添加了图片控件并且它没有错误。问题是,我需要根据帧数创建一定数量的控件。

代码片段:

CStatic* frameWnd = new CStatic;
if(frameWnd->Create(_T("my static"), WS_VISIBLE|WS_CHILD | SS_OWNERDRAW, frameRect, this) != 1)
    MessageBox("Failed!");
m_oaFrames.Add(frameWnd);

所以,问题是:我应该覆盖DrawItem方法frameWnd还是有另一种解决方案?

标签: c++mfc

解决方案


为避免此问题,您应该创建自定义控件和覆盖DrawItem方法,如下所示:

class CPictureCtrl : public CStatic
{
public:
    CPictureCtrl() {}
    ~CPictureCtrl() {}
protected:
    virtual void PreSubclassWindow()
    {
        CStatic::PreSubclassWindow();
        ModifyStyle(0, SS_OWNERDRAW);
    }
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){}
private:
};

推荐阅读