关于picture control 初始化显示图片问题 谢谢

HerofH_ 2018-05-07 12:11:48
我想在界面一运行的时候picture control就载入指定路径的图片,但是发现将载入图片的代码放在OnInitDialog()初始化函数下运行时,对应的picture control并不能显示图片,而如果将同样的一段代码放在某一按钮的消息响应函数中,当按下这个按钮时,picture control就能显示图片了,请问为什么OnInitDialog()初始化函数在这里出现了问题?如果我想界面一打开的时候picture control中就载入了指定路径的图片,请问应该怎么做呢?谢谢。以下附上载入图片相关代码:
CImage image;
CRect rect1;
image.Load("res//map.bmp");
CWnd *pWnd = GetDlgItem(IDC_AGVIMG);
CDC *pDC = pWnd->GetDC();
pWnd->GetClientRect(&rect1);
pDC->SetStretchBltMode(STRETCH_HALFTONE);
image.Draw(pDC->m_hDC, rect1);
ReleaseDC(pDC);
image.Destroy();
...全文
581 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
HerofH_ 2018-05-07
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
"但是下一步我就不太清楚该怎么在原来的对话框中去调用它了" 不必 调用 如 我所说: OnPaint() 的 过程 是 先 把 子窗口 Invalidate ! 然后 对话框 绘制 自己,OnPaint() 退出 后 ,因为 各 控件 窗口 以被 Invalidate 所以 控件 重绘 !
你好!感谢你的回答!根据你的回答我对OnPaint()有了更直观的认识!问题也得到了解决!非常感谢你的回答!
schlafenhamster 2018-05-07
  • 打赏
  • 举报
回复
"但是下一步我就不太清楚该怎么在原来的对话框中去调用它了" 不必 调用 如 我所说: OnPaint() 的 过程 是 先 把 子窗口 Invalidate ! 然后 对话框 绘制 自己,OnPaint() 退出 后 ,因为 各 控件 窗口 以被 Invalidate 所以 控件 重绘 !
HerofH_ 2018-05-07
  • 打赏
  • 举报
回复
引用 3 楼 jszj 的回复:
确实如楼上所说的,在初始化中画一次,则在后序的消息中,很有可能会导致各控件重画,这样就会把你原本画好的内容给刷掉了。 要么是放在对话框的OnPaint()中画,要么是放在picture control的子类中画,建议是放在picture control的子类中画,这样就会更好。 首先从picture control对应的类派生个子类出来,在这个子类的OnPaint() 中画图,这个类提供一个设置图片文件的接口,在对话框的初始化函数中调用它
你好!感谢你的回答!根据你的回答,我在picture control对应的CStatic类下创建了一个CMyPic子类,然后将画图的代码放在了CMyPic.cpp的OnPaint()中,但是下一步我就不太清楚该怎么在原来的对话框中去调用它了,可以再请教一下你吗?谢谢
schlafenhamster 2018-05-07
  • 打赏
  • 举报
回复
你这叫 “在对话框中 绘制 控件” OnPaint() 的 过程 是 先 把 子窗口 Invalidate ! 然后 对话框 绘制 自己,OnPaint() 退出 后 ,因为 各 控件 窗口 以被 Invalidate 所以 控件 重绘 ! 你把 子窗口 绘制 放 对话框 OnPaint() 中 后 ,窗口重绘时 你的 绘制 就 被覆盖了 ! 所以 在对话框中 绘制 控件, 必须 使 控件 窗口 有效 即 使用 UpdateWindow CWnd *pWnd = GetDlgItem(IDC_AGVIMG); pWnd->UpdateWindow();// 使窗口 有效 CDC *pDC = pWnd->GetDC(); ........
sumos 2018-05-07
  • 打赏
  • 举报
回复
有更简单的方式,针对bmp格式。 首先,将bmp导入到资源中,假设id为IDR_BMP。 添加成员变量,CBitmap p;在OnInitDialog中加载,p.LoadBitmap(IDR_BMP); 假设按钮控件变量为btn,则btn.SetBitmap(p); 原题问题在于,和绘制相关的代码必须放在OnPaint中,当窗口大小变化时,OnPaint会多次调用,才保证了绘制有效。
HerofH_ 2018-05-07
  • 打赏
  • 举报
回复
引用 1 楼 zhangli00 的回复:
通常情况下,会把加载图片的动作放在OnPaint()方法中实现,你放在其他地方,一旦把对话框最小化,或者移动到显示器边框之外,再还原或拉回桌面时,你的图片也会消失
你好!感谢你的回答!我将画图部分的代码都放在了OnPaint()中,但是运行后发现图片只是一闪而过,并不能一直显示,请问这是什么原因呢?
red-fly 2018-05-07
  • 打赏
  • 举报
回复
确实如楼上所说的,在初始化中画一次,则在后序的消息中,很有可能会导致各控件重画,这样就会把你原本画好的内容给刷掉了。 要么是放在对话框的OnPaint()中画,要么是放在picture control的子类中画,建议是放在picture control的子类中画,这样就会更好。 首先从picture control对应的类派生个子类出来,在这个子类的OnPaint() 中画图,这个类提供一个设置图片文件的接口,在对话框的初始化函数中调用它
待续_1006 2018-05-07
  • 打赏
  • 举报
回复
OnInitDialog()应该已经正确加载所有资源,但是在显示的一瞬间会调用OnPaint()。你可以调试一下便知
csulizhang 2018-05-07
  • 打赏
  • 举报
回复
通常情况下,会把加载图片的动作放在OnPaint()方法中实现,你放在其他地方,一旦把对话框最小化,或者移动到显示器边框之外,再还原或拉回桌面时,你的图片也会消失
red-fly 2018-05-07
  • 打赏
  • 举报
回复
也可以对设置函数添加一个即时重绘的函数调用: void CMyPic::setPictureFile(CString strFile) { m_pictureFile = strFile; Invalidate(); } 这样在设置图片后,整个图片框会无效,会自动进入重绘过程
red-fly 2018-05-07
  • 打赏
  • 举报
回复
总体上的逻辑代码大致如下: class CMyPic: public CStatic { ... void setPictureFile(CString strFile); CString m_pictureFile; ... }; void CMyPic::setPictureFile(CString strFile) { m_pictureFile = strFile; } void CMyPic::OnPaint(CDC *pDC) { if (m_pictureFile == TEXT("")) return; CImage image; CRect rect1; image.Load(m_pictureFile); pWnd->GetClientRect(&rect1); pDC->SetStretchBltMode(STRETCH_HALFTONE); image.Draw(pDC->m_hDC, rect1); image.Destroy(); } 在对话框的OnInitDialog()中调用: m_mypictureControl.setPictureFile(TEXT("res//map.bmp")); 其中 m_mypictureControl 是控件IDC_AGVIMG绑定的变量,其类型改为CMyPic

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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