使用 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_VISIBLE
或ShowWindow(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 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
设计模式代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )