VB6中使用GDI的API函数时窗口的hDC无效?

arrowcy 2007-12-24 12:53:27
在VB6中,通过API调用任何GDI函数,都无法正常操作,使用Err.LastDllError获得错误代码为6(无效句柄)
不知道怎么才能得到有效的句柄呢?
下面是我再VB中的API函数声明
Private Declare Function Rectangle Lib "gdi32.dll" (hdc As Long, x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer) As Integer

下面是绘图代码,当用户按下某命令按钮时执行如下语句
a = Rectangle(Form1.hdc, 0, 0, 100, 100)
MsgBox Err.LastDllError
最终得到错误代码6(通过MSDN得知该错误为无效句柄,也就是form1.hdc无效),图形当然也没有在窗口中显示出来

类似的代码在VC6中能正常执行得到一个矩形框:
HDC hdc=GetDC()->m_hDC;
Rectangle(hdc,10,10,100,100);

请问如何才能获得有效句柄,如何才能正确使用GDI函数?
谢谢
...全文
277 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2007-12-28
  • 打赏
  • 举报
回复
因为你设了AutoRedraw=True,这样用hdc作图是向缓冲区进行输出,所以需要用Refresh从缓冲区刷新到可视区。
东方之珠 2007-12-28
  • 打赏
  • 举报
回复
VB参数传递默认是:ByRef
arrowcy 2007-12-26
  • 打赏
  • 举报
回复
谢谢大家的回复,终于明白怎么回事了,

1.在声明api函数是要加上byval(难道默认是byref?我以前一直记得是byval的)
2.使用API绘制完成图形之后要Refresh才生效(在VC中都不需要的,难道是VB在中间加了一层什么函数之类的?)

明天或者后天结贴,希望大家能继续帮我解释一下上面两个括号中的问题,谢谢
东方之珠 2007-12-25
  • 打赏
  • 举报
回复
正确的应该是这样:
Option Explicit
Private Declare Function Rectangle Lib "gdi32" (ByVal hDc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Sub Form_Load()
AutoRedraw = True
Form1.ScaleMode = 3
Rectangle Form1.hDc, 0, 0, 100, 100
Form1.Refresh
End Sub
  • 打赏
  • 举报
回复
确认你的窗体名称是不是form1?
debug.print me.name
arrowcy 2007-12-25
  • 打赏
  • 举报
回复
谢谢楼上两位的回答,不过问题还是没有解决
1。 2楼的方法我试过了,还是不行
2。 我在问题中提到了很重要的一点,错误代码为6,而该错误对应的含义是无效句柄,这就让人觉得很奇怪了

希望大家继续帮忙啊
arrowcy 2007-12-25
  • 打赏
  • 举报
回复
谢谢楼上两位的回答,不过问题还是没有解决
1。 2楼的方法我试过了,还是不行
2。 我在问题中提到了很重要的一点,错误代码为6,而该错误对应的含义是无效句柄,这就让人觉得很奇怪了

希望大家继续帮忙啊
Sandrer 2007-12-24
  • 打赏
  • 举报
回复
首先要说的是,API声明除非使用自定义类型或者系统自带类型,否则一律使用Long类型~

Private Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hWnd As Long, ByVal hDc As Long) As Long
Private Declare Function Rectangle Lib "gdi32" Alias "Rectangle" (ByVal hDc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Sub Form_Load()
Dim hDc As Long
AutoRedraw = True '可能问题是出在这里,你的窗体没有设置自动重画属性
Cls
hDc = GetDC(hWnd)
Rectangle hDc, 0, 0, 100, 100
ReleaseDC hWnd, hDc
End Sub
'试试这样行不行~
  • 打赏
  • 举报
回复

Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long


这100分接的这么简单:)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧