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

Form.AutoRedraw=True的情况下,如何用API获取其hDC,并且得到的值和Form.hDc属性一样,我用GetDC,GetDCEx获取的值都和Form.h... Form.AutoRedraw=True的情况下,如何用API获取其hDC,并且得到的值和Form.hDc属性一样,我用GetDC,GetDCEx获取的值都和Form.hDC不同,不能得到窗体上被控件遮盖部位的图像 展开
 我来答
懂事且健壮灬小喵e
2013-02-02 · TA获得超过756个赞
知道小有建树答主
回答量:575
采纳率:52%
帮助的人:408万
展开全部
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一久之不5270
2013-02-02 · TA获得超过121个赞
知道答主
回答量:197
采纳率:0%
帮助的人:129万
展开全部
不知道微软是怎么封装hDC的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式