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());
}
}为什么这样不显示啊?
显示需要一个持续的pBmp,如果你这段代码在OnPaint中还说得过去(显然是不行的),要是在其他地方,窗体只要一个WM_PAINT刷新就把你的pBmp冲掉了。
建议,将Bitmap *pBmp建立为全局指针,在OnPaint或OnDraw里面使用。
赋值就用你的CFileDialog,通过按钮或菜单调用打开对话框给pBmp赋值。
不过我还想问下,我原来的代码载入图片以后,我不进行别的操作,也会响应WM_PAINT消息吗?
如果是的话,我在WM_MOUSEMOVE里面用LineTo画的线怎么不会被WM_PAINT冲掉?
你在鼠标事件中绘图的时候还是看你怎么绘制的,如果你仅仅写的鼠标移动事件中,也肯定是不行的。
除非你鼠标移动和OnPaint是联合的,比如说,移动的时候采集点,添加到全局变量中。Onpait的时候用这些点绘制。不然,一旦触发窗体的WM_PAINT你鼠标移动时候绘制的东西也会没有的。简单的检查方法是,你用另外一个窗体遮挡住你的窗体(鼠标不能在你的窗体中),然后切换遮挡窗体遮挡或不遮挡,如果你的绘图还在,说明你的鼠标移动事件和OnPaint是联合的。
窗体只要一个WM_PAINT刷新就把你的pBmp冲掉了。
我现在这个段代码里面,我贴图之后也没有进行重绘啊,为什么会消失?
在其它地方应该使用 CClientDC.
并且在CPaintDC中使用CClientDC也是不行的.
谢谢哈!
感谢你的回答,帮我的大忙!确实要建全局指针,然后在onpaint里面调用。但是赋值仍然不能在onpaint里面赋值,要在初始化的时候赋值才没有问题。我是在给窗体贴背景图的时候遇到这个问题的。