gdi+-GDI+中一个窗体的CDC* pDC实例化两个Graphics对象问题

问题描述

GDI+中一个窗体的CDC* pDC实例化两个Graphics对象问题
代码如下:
void CMyCtrl::Draw(CDC* pDC CRect rc)
{
Pen pen(Color(255 255 255 255)(float)1.5);
SolidBrush solidbrush(Color(255 213 213 213));
pen.SetDashStyle((DashStyle)DashStyleSolid);

Graphics Test(pDC->m_hDC); Test.SetSmoothingMode(SmoothingModeAntiAlias);Test.FillPath(&solidbrush pPathTab);Test.DrawPath(&pen pPathTab);Test.ReleaseHDC(pDC->m_hDC);Graphics graphics(pDC->m_hDC); graphics.SetSmoothingMode(SmoothingModeAntiAlias);graphics.DrawPath(&pen pPathEdge);graphics.ReleaseHDC(pDC->m_hDC);return;

}
为什么只有第一个Graphics对象Test能画出图形,要是把页面最小化再最大化就能看到完整的图形。如果把代码修改如下就能正常显示完整图形,哪位大神帮帮忙解解惑!!
void CMyCtrl::Draw(CDC* pDC CRect rc)
{
Pen pen(Color(255 255 255 255)(float)1.5);
SolidBrush solidbrush(Color(255 213 213 213));
pen.SetDashStyle((DashStyle)DashStyleSolid);

Graphics Test(pDC->m_hDC);  Graphics graphics(pDC->m_hDC); Test.SetSmoothingMode(SmoothingModeAntiAlias);Test.FillPath(&solidbrush pPathTab);Test.DrawPath(&pen pPathTab);Test.ReleaseHDC(pDC->m_hDC);graphics.SetSmoothingMode(SmoothingModeAntiAlias);graphics.DrawPath(&pen pPathEdge);graphics.ReleaseHDC(pDC->m_hDC);return;

}

解决方案

好像Graphics绘图会对hdc进行“锁定”,必须释放Graphics后才能正常使用hdc,参考使用Gdiplus::Graphics时要注意一个问题。所以通常一个方法内只有一个Graphics对象,会随方法结束而自动释放。
第二个例子正常估计是创建 graphics 的时候还没有被“锁定”吧。
如果你非要用两个 Graphics 可以用参考帖子中的方法。

解决方案二:
是的,如果把第一个Graphics对象绘图的代码单独放到一个函数中被Draw函数调用是可以完整的绘制出图形的,释放Graphics后才能继续使用hdc,多谢Tiger_Zhao

时间: 2024-12-01 23:54:42

gdi+-GDI+中一个窗体的CDC* pDC实例化两个Graphics对象问题的相关文章

编程-java中在类定义里能实例化本类的对象吗?

问题描述 java中在类定义里能实例化本类的对象吗? 我在一本书上看到这个,这里的内容试讲java的构造方法私有化的 class Singleton { Singleton instance=new Singleton(); private Singleton() {} public void print() { System.out.println("Hello World"); } } 这个我想请教一下,为什么这里能在类定义里实例化本类的对象? 这里还列出了另一种方式: class

C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?

(1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型.  MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功能特别有用.例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义.    (2).C#语法中两个问号(??)的运算符是指null 合并运算符,合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null. MSDN上面的解释: ?? 运算符称为 null 合

java swing中如何为一个窗体添加背景图片

问题描述 java swing中如何为一个窗体添加背景图片 java swing中如何为一个窗体添加背景图片,java swing中如何为一个窗体添加背景图片 解决方案 http://blog.csdn.net/caixiexin/article/details/6608919 解决方案二: 在JFrame中添加JPanel面板,然后就可以设置了.

在线等~vb.net中有没方法可以使MDI中打开一个窗体时关闭其他窗体

问题描述 不是手动一个个窗体Close方法而是打开一个窗体时``其他不活动的窗体全部关闭 解决方案 解决方案二:vb.net中一个CLOSE就关闭所有对象了,好像是foreachmdiinmdismdi.disposenext哈哈,自己去查下方法吧解决方案三:1.如果在打开一个窗口前关闭的话ForEachformAsFormInMdiChildrenform.Close()Next2.如果打开一个窗口后关闭其他不活动的DimactiveMdiAsForm=ActiveMdiChildForEac

怎样在一个类中调用另一个窗体中的控件?

问题描述 一个串口接收类recvClass,有个线程recvThread接收数据,一个窗体FORM2,怎样在FORM2的listbox1中添加recvThread到的数据?有什么好方法吗? 解决方案 解决方案二:是否可以考虑在你接收数据的线程中访问Form2的listbox1控件注:若采用上述方法,则需要考虑采用Invoke方法来实现在线程recvThread中调用listbox1控件具体示例可参考网络上的那些在多线程程序中访问并更新主线程进度条处理解决方案三:recvClass类里:publi

C#中 怎么判断一个窗体是否打开

问题描述 [b]怎么判断一个窗体是否打开,看书上它直接上了个this.checkchildfrm("xxxx")然后之前它给的代码根本没编有这个checkchildfrm方法,怎么解?求大神指教!!!!!!!![/b] 解决方案 解决方案二: 解决方案三: 解决方案四:假设要打开的窗口是Form41)在Form类中添加一个publicstatic变量.publicstaticForm4f4=null;2)打开Form4的代码这样写:if(Form4.f4==null){Form4.f4

vb.net的datagridview中,如何点击指定列的任意单元格之后,弹出一个窗体来修改本行数据

问题描述 vb.net的datagridview中,如何点击指定列的任意单元格之后,弹出一个窗体来修改本行数据 大神们,求救啊!!我在VB.NET 中的datagridview中显示了数据库中部分信息,怎么通过点击更多字样来弹出另一个窗体 并在这个新窗体中修改那一行里的信息,并传回数据可库?大概就是实现这样的功能 解决方案 http://www.cnblogs.com/milo_yu/archive/2010/04/19/1715291.html

C#中,怎么将一个窗体中已经改变的全局变量同步到另一个窗体中,将其赋值给局部变量

问题描述 C#中,怎么将一个窗体中已经改变的全局变量同步到另一个窗体中,将其赋值给局部变量 在全局变量定义的窗体中我定义了GlobalVariable.dianshu2和GlobalVariable.chishu2变量,然后在A窗体中给这两个全局变量都赋了值,在B窗体的一开始写了 static int dianshu= GlobalVariable.dianshu2; static int chishu= GlobalVariable.chishu2; double[,] m_X_ChiXian

vb.net-VB.net中在窗体设置一个标签,让他沿窗体八字形滚动,如何让他一接触边框便折返

问题描述 VB.net中在窗体设置一个标签,让他沿窗体八字形滚动,如何让他一接触边框便折返 RT,现在是沉下去老久才会上来 Public Class Form1 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Timer1.Enabled = False Label1.Top = 0 Label1.Left = 0 End Sub Private Sub Button1_Click