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

Posted

技术标签:

【中文标题】使用 SS_OWNERDRAW 动态创建 CStatic 时程序在 UpdateWindow 上崩溃【英文标题】:Program crashes on UpdateWindow when dynamically creating CStatic with SS_OWNERDRAW 【发布时间】:2019-06-18 15:50:41 【问题描述】:

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

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

代码sn-p:

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 方法还是有其他解决方案?

【问题讨论】:

感谢匿名无用的负面评价。 它没有崩溃。调试器提醒您必须覆盖CStatic::DrawItem,如答案所示。 【参考方案1】:

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

class CPictureCtrl : public CStatic

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

【讨论】:

以上是关于使用 SS_OWNERDRAW 动态创建 CStatic 时程序在 UpdateWindow 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

界面美化.CStatic控件的美化(好多系列文章)

呼叫(电话)中都有哪些不同类型的状态

设计模式代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

我动态创建了一个canvas,上面动态创建了一些控件,我现在想使用这些控件,该怎么弄

使用动态键和值动态创建 JSON

如何使用动态模型创建动态表