c++ - 使用 SS_OWNERDRAW 动态创建 CStatic 时程序在 UpdateWindow 上崩溃
问题描述
在初始化对话框中,我动态地创建了一些带有样式的CStatic
控件。SS_OWNERDRAW
当我使这些控件可见(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);
所以,问题是:我应该覆盖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:
};
推荐阅读
- excel - 从已关闭的工作簿中复制多个范围的数据
- delphi - 将 Delphi 的消息关键字处理程序语法与变量常量一起使用?
- makefile - Makefile:有没有办法包含动态生成的文件?
- ios - Mat-Autocomplete 选项位于 iOS 屏幕下方
- excel - 在一大堆 XLSB 文档中编辑连接字符串
- sql - pg_restore:[目录归档程序] 无法打开输入文件。尝试还原数据库时出错
- python - 多行正则表达式与迭代器兼容吗?
- python - 将方阵转换为二进制数组
- database - 如何将多个值放在一列中,我应该吗?
- python - Python CSV:AttributeError:“列表”对象没有属性“分区”