在对话框的控件上显示图片的问题

尘中远 2012-02-08 05:57:22
我想做一个类似于向导的对话框,就是点“下一步”,“上一步”,“确定”,“取消”那种。
我的想法是这样的:
有一个主对话框就叫CDlg_Main,这个是个非模态对话框,在这个对话框上就只有三个区域,顶端用来显示图片,中间用来显示模态的子对话框,最底下四个按钮(“下一步”,“上一步”,“确定”,“取消”)。
然后有n个子对话框,例如有CDlg_Child1、CDlg_Child2、CDlg_Child3、CDlg_Child4、CDlg_Child5
一开始在CDlg_Main上显示CDlg_Child1,点下一步后隐藏其他的显示CDlg_Child2,以此类推。

现在我的问题是在我想把这个软件美化一下,加个图片啊神马的,结果问题就出来了。

首先在CDlg_Main最顶上加一张图片,做修饰用,我是在OnPaint里如下:
在CDlg_Main上有个图片控件,ID为IDC_STATIC_top,用GDI+把一张PNG图片显示在这个图片控件里
m_pImage是定义的成员变量Image *m_pImage;,已经加载了图片资源
 void CDlg_Main::OnPaint()
{
CPaintDC dc(this);
CDC *pDC;
pDC = ((CStatic*)GetDlgItem(IDC_STATIC_top))->GetDC();
CRect rect;
GetDlgItem(IDC_STATIC_top)->GetWindowRect(&rect);
Graphics graphics(pDC->m_hDC); // Create a GDI+ graphics object
graphics.DrawImage(m_pImage, 0, 0, rect.Width(), rect.Height());
}

好了,这个能顺利显示
然后在一个子对话框里也想显示一个图片,子对话框是模态对话框,一开始全部隐藏,只有CDlg_Child1是显示的(ShowWindow),CDlg_Child1里有个静态文本控件,ID为IDC_STATIC_PIC,同样在OnPaint里如下:
void CDlg_Child1::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC *pDC;
pDC = ((CStatic*)GetDlgItem(IDC_STATIC_PIC))->GetDC();
CRect rect;
GetDlgItem(IDC_STATIC_PIC)->GetWindowRect(&rect);
Graphics graphics(pDC->m_hDC); // Create a GDI+ graphics object
graphics.DrawImage(m_pImage, 0, 0, rect.Width(), rect.Height());
}

=====================分割线=1=============================================
问题来了
显示这个对话框,主对话框的图片能显示,就是CDlg_Main上的能显示,但是子对话框却不能显示,我点下一步显示其他的子对话框后,再点上一步回到这个子对话框,那个图片就显示出来了,这是为什么呢??????
ps:
“上一步”和“下一步”按钮调用如下:
bool CDlg_Main::ShowDlgPage(int nPage)
{
HideAllDlg();//这个是先把所以对话框隐藏掉
switch (nPage)
{
case 0:
m_pDlg_Child1->ShowWindow(SW_NORMAL);
break;
case 1://显示第一页
m_pDlg_Child2->ShowWindow(SW_NORMAL);
break;
case 2:……//同上
default://默认显示第一页
m_pDlg_Child1->ShowWindow(SW_NORMAL);
break;
}
UpdateWindow();
return true;
}

通过nPage来进行索引显示页面。

难道是因为没有UpdateWindow();所以CDlg_Child1的Static控件不显示图片?
=====================分割线=2=============================================

另外为什么不能在OnInitDialog里进行图片显示的设置,如:
BOOL CDlg_Wizard::OnInitDialog()
{
CDC *pDC;
pDC = ((CStatic*)GetDlgItem(IDC_STATIC_top))->GetDC();
CRect rect;
GetDlgItem(IDC_STATIC_top)->GetWindowRect(&rect);
Graphics graphics(pDC->m_hDC); // Create a GDI+ graphics object
graphics.DrawImage(m_pImage, 0, 0, rect.Width(), rect.Height());
}

在OnInitDialog里不行,必须在OnPaint里进行设置
...全文
192 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-03-17
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
尘中远 2012-02-08
  • 打赏
  • 举报
回复
我把CDlg_Child1上用来显示图片的静态文本控件(CStatic)换成图像控件就没问题了。这是为啥呢?
尘中远 2012-02-08
  • 打赏
  • 举报
回复
第一次出现时其实是闪了一下就没了~
罗平 2012-02-08
  • 打赏
  • 举报
回复
OnEraseBkgnd 直接 return TRUE; 去掉背景擦除
shn521 2012-02-08
  • 打赏
  • 举报
回复
m_pDlg_Child1->Invalidate();试试
Lindsay 2012-02-08
  • 打赏
  • 举报
回复
不是很清楚,我对GDI不熟,帮楼主顶顶

15,979

社区成员

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

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