GDI+ 显示的问题

时间:2021-07-30 17:38:55

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赋值。

#2


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

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

#3


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

简单的检查方法是,你用另外一个窗体遮挡住你的窗体(鼠标不能在你的窗体中),然后切换遮挡窗体遮挡或不遮挡,如果你的绘图还在,说明你的鼠标移动事件和OnPaint是联合的。

#4


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

#5


求解释啊

#6


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

#7


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

#8


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

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

#9


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


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

我是在给窗体贴背景图的时候遇到这个问题的。

#1


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

#2


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

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

#3


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

简单的检查方法是,你用另外一个窗体遮挡住你的窗体(鼠标不能在你的窗体中),然后切换遮挡窗体遮挡或不遮挡,如果你的绘图还在,说明你的鼠标移动事件和OnPaint是联合的。

#4


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

#5


求解释啊

#6


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

#7


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

#8


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

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

#9


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


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

我是在给窗体贴背景图的时候遇到这个问题的。