使用 SS_OWNERDRAW 动态创建 CStatic 时程序在 UpdateWindow 上崩溃
Program crashes on UpdateWindow when dynamically creating CStatic with SS_OWNERDRAW
在初始化对话框中,我动态创建了一些具有 SS_OWNERDRAW
样式的 CStatic
控件。当我使这些控件可见(WS_VISIBLE
或 ShowWindow(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:
};
在初始化对话框中,我动态创建了一些具有 SS_OWNERDRAW
样式的 CStatic
控件。当我使这些控件可见(WS_VISIBLE
或 ShowWindow(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:
};