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

Program crashes on UpdateWindow when dynamically creating CStatic with SS_OWNERDRAW

本文关键字:SS OWNERDRAW 动态 CStatic 创建 使用 UpdateWindow 崩溃 程序      更新时间:2023-10-16

在初始化对话框中,我动态地创建一些具有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);

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

若要避免此问题,应创建自定义控件并重写DrawItem方法,如下所示:

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