CFileDialog dlg(TRUE,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"图像文件|*.bmp;*.jpg;*.jpeg||");
CPaintDC dc(this);
if (dlg.DoModal() == IDOK)
{
CString szFileName = dlg.GetPathName();
Bitmap *pBmp = Bitmap::FromFile(szFileName.AllocSysString());
if (pBmp != NULL)
{
//Graphics *gh =Graphics::FromImage(pBmp);
Graphics gh(dc.m_hDC);
gh.DrawImage(pBmp,0,0,pBmp->GetWidth(),pBmp->GetHeight());
}
}为什么这样不显示啊?

解决方案 »

  1.   

    你的代码放在哪里的?
    显示需要一个持续的pBmp,如果你这段代码在OnPaint中还说得过去(显然是不行的),要是在其他地方,窗体只要一个WM_PAINT刷新就把你的pBmp冲掉了。
    建议,将Bitmap *pBmp建立为全局指针,在OnPaint或OnDraw里面使用。
    赋值就用你的CFileDialog,通过按钮或菜单调用打开对话框给pBmp赋值。
      

  2.   

    谢谢啊,问题解决了!
    不过我还想问下,我原来的代码载入图片以后,我不进行别的操作,也会响应WM_PAINT消息吗?
    如果是的话,我在WM_MOUSEMOVE里面用LineTo画的线怎么不会被WM_PAINT冲掉?
      

  3.   

    原则上,你的打开对话框(遮挡住你的窗口)关闭后,你的窗口肯定要进行重绘的。
    你在鼠标事件中绘图的时候还是看你怎么绘制的,如果你仅仅写的鼠标移动事件中,也肯定是不行的。
    除非你鼠标移动和OnPaint是联合的,比如说,移动的时候采集点,添加到全局变量中。Onpait的时候用这些点绘制。不然,一旦触发窗体的WM_PAINT你鼠标移动时候绘制的东西也会没有的。简单的检查方法是,你用另外一个窗体遮挡住你的窗体(鼠标不能在你的窗体中),然后切换遮挡窗体遮挡或不遮挡,如果你的绘图还在,说明你的鼠标移动事件和OnPaint是联合的。
      

  4.   

    这个我知道,我直接绘制没有关联OnPaint,重绘以后是都没有了!
    窗体只要一个WM_PAINT刷新就把你的pBmp冲掉了。
    我现在这个段代码里面,我贴图之后也没有进行重绘啊,为什么会消失?
      

  5.   

    CPaintDC dc(this);这个东西好像只有在OnPaint里使用.
    在其它地方应该使用 CClientDC.
    并且在CPaintDC中使用CClientDC也是不行的.
      

  6.   

    上面说错了,是在OnPaint中使用CClientDC是不行的.
      

  7.   

    你说的方法的确可行,我将原来的CPaintDC 改为CClientDc就可以显示了。不过就是遮蔽之后,重绘就没有了。所以放OnPaint里面去绘制貌似要好一些!
    谢谢哈!
      

  8.   


    感谢你的回答,帮我的大忙!确实要建全局指针,然后在onpaint里面调用。但是赋值仍然不能在onpaint里面赋值,要在初始化的时候赋值才没有问题。我是在给窗体贴背景图的时候遇到这个问题的。