Form.AutoRedraw=True的情况下,如何用API获取其hDC,并且得到的值和Form.hDc属性一样

发布网友

我来回答

2个回答

热心网友

Form.AutoRedraw=True的情况下

这是一个特殊的情况,首先 你必须知道 只有和窗口 相关联的设备场景,系统才会把该设备场景中的图像显示到屏幕上面,getdc 是获取的和该窗口关联的设备场景句柄,
现在这种情况,当 AutoRedraw=True 时,Form会单独创建一个设备场景,然后把要画的图像保存到该设备场景中,等窗口有刷屏消息的时候,这时会把这个设备场景中的图像复制到 与 Form相关联的设备场景中,然后又会执行 Form_Paint方法(为False这个方法无效),最后才显示到屏幕上面。
所以无法用api 获取到那个Form创建设备场景的Hdc,如果有面向对象内存结构基础,倒是可以通过访问对象内存地址读取Hdc

-------------------------------------------几个实例,自己体会下
1、用以下代码来向窗体画一个圆时,什么也看不到。
Private Declare Function Ellipse& Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long)
Private Sub Form_Click()
Form1.AutoRedraw = True
Ellipse Form1.hdc, 0, 0, 100, 100
End Sub
但如果用其他窗体掩盖程序窗体后,让程序窗体再次显示时,图形出现了,这时有窗口有刷屏消息。

2.下面代码尽管图形出现了,但这次的情况正好相反。也就是说,如果用其他窗体掩盖程序窗体后,让程序窗体再次显示时,图形消失了。原因就是没有修改过的那个设备场景中的图像,下面只是只修改了窗口的相关联的场景图像(所有是立即显示),当有刷屏消息后会把的场景中图像复制 到 关联的场景中
Private Declare Function GetDC& Lib "user32" (ByVal hwnd As Long)
Private Declare Function Ellipse& Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long)
Private Sub Form_Click()
Dim MyDC As Long
Form1.AutoRedraw = True
MyDC = GetDC(Form1.hwnd)
Ellipse MyDC, 0, 0, 100, 100
End Sub

热心网友

不知道微软是怎么封装hDC的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com