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());
}
}
为什么这样不显示啊?
9 个解决方案
#1
你的代码放在哪里的?
显示需要一个持续的pBmp,如果你这段代码在OnPaint中还说得过去(显然是不行的),要是在其他地方,窗体只要一个WM_PAINT刷新就把你的pBmp冲掉了。
建议,将Bitmap *pBmp建立为全局指针,在OnPaint或OnDraw里面使用。
赋值就用你的CFileDialog,通过按钮或菜单调用打开对话框给pBmp赋值。
显示需要一个持续的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是联合的。
#5
求解释啊
#6
CPaintDC dc(this);这个东西好像只有在OnPaint里使用.
在其它地方应该使用 CClientDC.
并且在CPaintDC中使用CClientDC也是不行的.
在其它地方应该使用 CClientDC.
并且在CPaintDC中使用CClientDC也是不行的.
#7
上面说错了,是在OnPaint中使用CClientDC是不行的.
#8
你说的方法的确可行,我将原来的CPaintDC 改为CClientDc就可以显示了。不过就是遮蔽之后,重绘就没有了。所以放OnPaint里面去绘制貌似要好一些!
谢谢哈!
#9
感谢你的回答,帮我的大忙!确实要建全局指针,然后在onpaint里面调用。但是赋值仍然不能在onpaint里面赋值,要在初始化的时候赋值才没有问题。
我是在给窗体贴背景图的时候遇到这个问题的。
#1
你的代码放在哪里的?
显示需要一个持续的pBmp,如果你这段代码在OnPaint中还说得过去(显然是不行的),要是在其他地方,窗体只要一个WM_PAINT刷新就把你的pBmp冲掉了。
建议,将Bitmap *pBmp建立为全局指针,在OnPaint或OnDraw里面使用。
赋值就用你的CFileDialog,通过按钮或菜单调用打开对话框给pBmp赋值。
显示需要一个持续的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
#5
求解释啊
#6
CPaintDC dc(this);这个东西好像只有在OnPaint里使用.
在其它地方应该使用 CClientDC.
并且在CPaintDC中使用CClientDC也是不行的.
在其它地方应该使用 CClientDC.
并且在CPaintDC中使用CClientDC也是不行的.
#7
上面说错了,是在OnPaint中使用CClientDC是不行的.
#8
你说的方法的确可行,我将原来的CPaintDC 改为CClientDc就可以显示了。不过就是遮蔽之后,重绘就没有了。所以放OnPaint里面去绘制貌似要好一些!
谢谢哈!
#9
感谢你的回答,帮我的大忙!确实要建全局指针,然后在onpaint里面调用。但是赋值仍然不能在onpaint里面赋值,要在初始化的时候赋值才没有问题。
我是在给窗体贴背景图的时候遇到这个问题的。