MFC中Picture控件的问题

wlfryqwlfryq 2018-10-10 08:13:59
在一个对话框窗体上放置一个Picture控件, type若为Frame, 则一切正常(包括添加控件变量, 显示图片等), 当type选择为Owner draw , 为其添加控件变量, 类型为CStatic, 什么也不做, 则能通过编译,但是一运行就报错 为什么会这样?
...全文
246 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlfryqwlfryq 2018-10-12
  • 打赏
  • 举报
回复
引用 15 楼 schlafenhamster 的回复:
在 CStatic 位置 ,填上 “CStatic” 行不行?

-------------------------------
写上"CStatic", 编译通过, 运行报错
昨晚改为"CWnd", 正常.
schlafenhamster 2018-10-12
  • 打赏
  • 举报
回复
在 CStatic 位置 ,填上 “CStatic” 行不行?
wlfryqwlfryq 2018-10-11
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
也可以 在 对话框OnPaint 中 绘制 picture

----------------------------------------
如果去掉控件变量定义,在OnPaint中:
CDialogEx::OnPaint();

m_img1.Draw(GetDlgItem(IDC_STATIC1)->GetDC()->m_hDC,0,0,m_img1.GetWidth(),m_img1.GetHeight());

则一切正常
wlfryqwlfryq 2018-10-11
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
也可以 在 对话框OnPaint 中 绘制 picture

------------------------------
谢谢回复!
我在OnPaint中用CImage绘制图片, 运行报错, 但是图片已经绘制成功
CDialogEx::OnPaint();
m_img1.Draw(m_pic.GetDC()->m_hDC, 0, 0, m_img1.GetWidth(), m_img1.GetHeight());[/code]
如果注释掉CDialogEx::OnPaint(); 能成功,不报错, 但是整个界面无反应
schlafenhamster 2018-10-11
  • 打赏
  • 举报
回复
也可以 在 对话框OnPaint 中 绘制 picture
zgl7903 2018-10-11
  • 打赏
  • 举报
回复
从CStatic 派生新类, 自己处理 WM_PAINT 消息
schlafenhamster 2018-10-11
  • 打赏
  • 举报
回复
Owner draw 你必须 draw!
wlfryqwlfryq 2018-10-11
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
从CStatic 派生新类, 自己处理 WM_PAINT 消息

--------------------------------
是的, 但是我只是奇怪为什么type为Owner Draw时不能定义为控件变量, 用GetDlgItem(IDC_STATIC1)-> 的方式引用, 一切正常
wlfryqwlfryq 2018-10-11
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
定义控件 时, 种类是 control 不能 是 value (value 时 为 CString 类型)

-----------------------------
是control

schlafenhamster 2018-10-11
  • 打赏
  • 举报
回复
定义控件 时, 种类是 control 不能 是 value (value 时 为 CString 类型)
wlfryqwlfryq 2018-10-11
  • 打赏
  • 举报
回复
引用 8 楼 mlqxj35674 的回复:
自绘,是在picture的OnDraw DrawItem里自绘,不是在父窗体的OnDraw中绘制pictrue,


-------------------------
谢谢回复!

如果picture控件的type设为owner draw, 则不能定义为控件变量, 定义后什么也不做, 运行就报错, 如果不定义控件变量, 用GetDlgItem(IDC_STATIC1)-> 的方式引用, 则一切正常, 包括在父窗体的OnPaint中绘图, 消息响应等等
wlfryqwlfryq 2018-10-11
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
在对话框中绘控件 注意
1 。先 UpdateWindow()
2。 取 控件 DC (getDC)

/* InvalidateRect 的作用是无效窗口客户区,
发送低优先级的WM_PAINT消息 UpdateWindow的作用是马上重绘同时使客户区有效。
注意下面的PaintWindow 函数,函数用GetDC得到设备环境句柄,这里就是关键 。
GetDC和BeginPaint不同,从GetDC返回句柄之后 你可以用此句柄在客户区任何地方绘图,
不管是有效区还是无效区,同时GetDC不会使无效区有效化。所以 你把 UpdateWindow去掉了,
下面的PaintWindow仍然执行,只不过画完图之后你的子窗口控件客户区已然是无效的,
这就导致系统发送一条WM_PAINT消息到子窗口的窗口过程,默认的窗口过程会用画刷填充,
这里应该是和背景色相同的画刷 所以什么都显示不了。
*/
void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
InvalidateRect (hCtrl, NULL, FALSE);//TRUE) ;
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure) ;
}

---------------
谢谢, 学习了
关键问题是, 如果picture控件的type设为owner draw, 则不能定义为控件变量, 定义后什么也不做, 运行就报错, 如果不定义控件变量, 用GetDlgItem(IDC_STATIC1)-> 的方式引用, 则一切正常, 包括绘图, 消息响应等等
schlafenhamster 2018-10-11
  • 打赏
  • 举报
回复
在对话框中绘控件 注意
1 。先 UpdateWindow()
2。 取 控件 DC (getDC)

/* InvalidateRect 的作用是无效窗口客户区,
发送低优先级的WM_PAINT消息 UpdateWindow的作用是马上重绘同时使客户区有效。
注意下面的PaintWindow 函数,函数用GetDC得到设备环境句柄,这里就是关键 。
GetDC和BeginPaint不同,从GetDC返回句柄之后 你可以用此句柄在客户区任何地方绘图,
不管是有效区还是无效区,同时GetDC不会使无效区有效化。所以 你把 UpdateWindow去掉了,
下面的PaintWindow仍然执行,只不过画完图之后你的子窗口控件客户区已然是无效的,
这就导致系统发送一条WM_PAINT消息到子窗口的窗口过程,默认的窗口过程会用画刷填充,
这里应该是和背景色相同的画刷 所以什么都显示不了。
*/
void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
InvalidateRect (hCtrl, NULL, FALSE);//TRUE) ;
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure) ;
}
mlqxj35674 2018-10-11
  • 打赏
  • 举报
回复
自绘,是在picture的OnDraw DrawItem里自绘,不是在父窗体的OnDraw中绘制pictrue,
wlfryqwlfryq 2018-10-10
  • 打赏
  • 举报
回复
不好意思, 没说清楚, 是能通过编译, 一运行就报错

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧