发布网友
共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的