使用 SS_OWNERDRAW 动态创建 CStatic 时程序在 UpdateWindow 上崩溃

Program crashes on UpdateWindow when dynamically creating CStatic with SS_OWNERDRAW

在初始化对话框中,我动态创建了一些具有 SS_OWNERDRAW 样式的 CStatic 控件。当我使这些控件可见(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);

所以,问题是:我应该为 frameWnd 覆盖 DrawItem 方法,还是有其他解决方案?

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

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