设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 5143|回复: 11
打印 上一主题 下一主题

[窗体] Access能使用GDI+API编程吗?

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2014-9-6 11:13:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在VB6里面可以正常看到GDI+编程的效果,如下图


以下是转换到ACCESS里后的代码,运行时没任何反应,也没有任何出错提示,不知道是何原因,有谁知道的吗?是否ACCESS的窗体不支持GDI+?
  1. Private TOKEN As Long
  2. Private Graphics As Long
  3. Dim pen As Long, brush As Long

  4. Private Sub Command0_Click()
  5.   Dim p1 As POINTF, p2 As POINTF
  6.    
  7.   InitGDIPlus

  8.   GdipCreateFromHWND Me.Hwnd, Graphics
  9.   GdipSetSmoothingMode Graphics, SmoothingModeAntiAlias
  10.    
  11.   GdipCreatePen1 &HFFFF0000, 500, UnitPixel, pen
  12.   GdipDrawLineI Graphics, pen, 10, 10, 4000, 2000
  13.    
  14.   GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen
  15.   GdipDrawRectangleI Graphics, pen, 30, 30, 2000, 2000
  16.    
  17.   GdipCreateSolidFill &HAA0000FF, brush
  18.   GdipFillRectangleI Graphics, brush, 30, 30, 2000, 2000
  19.   GdipDrawRectangleI Graphics, pen, 30, 30, 200, 2000
  20.    
  21.   p1.X = 10
  22.   p1.Y = 10
  23.   p2.X = 2000
  24.   p2.Y = 1000
  25.    
  26.   GdipCreateLineBrush p1, p2, &H8AFF00FF, &HFFFF0000, WrapModeTileFlipXY, brush
  27.   GdipFillEllipseI Graphics, brush, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.X

  28.   Me.Repaint
  29. End Sub

  30. Private Sub Form_Unload(Cancel As Integer)
  31.   GdipDeletePen pen
  32.   GdipDeleteBrush brush
  33.   TerminateGDIPlus
  34. End Sub

  35. Private Sub TerminateGDIPlus()
  36.   GdipDeleteGraphics Graphics
  37.   GdiplusShutdown TOKEN
  38. End Sub

  39. Private Sub InitGDIPlus()
  40.   Dim uInput As GdiplusStartupInput
  41.    
  42.   uInput.GdiplusVersion = 1
  43.   If GdiplusStartup(TOKEN, uInput) <> Ok Then
  44.     MsgBox "GDI+ 初始化错误。程序即将关闭。", vbCritical, "InitError"
  45.     End
  46.   End If
  47. End Sub
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

推荐
发表于 2014-9-14 19:14:57 | 只看该作者
首先,access窗体始终有3个节,页眉、主体、页脚,即使在设计视图中没有,用FindWindowEx也能找到3个。
所以如果是使用主体节作画,则要FindWindowEx两次得到主体节句柄,具体请百度FindWindowEx的用法。
另外不要使用 Me.Repaint ,刷新窗体后在上面画的东西就没有了。
回复 支持 1 反对 0

使用道具 举报

点击这里给我发消息

2#
发表于 2014-9-6 17:24:21 | 只看该作者
这个你要请教 t小宝,他是图片专家

点击这里给我发消息

3#
发表于 2014-9-7 05:12:52 来自手机 | 只看该作者
这个用了什么库,不是win Api直接写的吧

点击这里给我发消息

4#
发表于 2014-9-9 22:54:50 | 只看该作者
tmtony 发表于 2014-9-6 17:24
这个你要请教 t小宝,他是图片专家

王站过奖了,不敢当啊。。。
要在access窗体上画图,不能使用Me.Hwnd,因为access有个神密的东西叫节,节覆盖在窗体上,所有的控件都在节上面显示,所以要在节上作画,可通过FindWindowEx取得节句柄,节的类名是OFormSub

点击这里给我发消息

5#
发表于 2014-9-13 08:41:24 | 只看该作者
赞一下!
回复

使用道具 举报

点击这里给我发消息

6#
发表于 2014-9-14 06:42:56 来自手机 | 只看该作者
赞一个!
回复

使用道具 举报

点击这里给我发消息

7#
 楼主| 发表于 2014-9-14 11:32:36 | 只看该作者
我把按钮单击代码更换了下,但是还是没有效果,困惑!
  1. Private Sub Command0_Click()
  2.   Dim p1 As POINTF, p2 As POINTF
  3.   
  4.   InitGDIPlus

  5.   GdipCreateFromHWND FindWindowEx(Me.hwnd, 0&, "OFormSub", vbNullString), graphics
  6.   GdipSetSmoothingMode graphics, SmoothingModeAntiAlias
  7.   
  8.   GdipCreatePen1 &HFFFF0000, 500, UnitPixel, pen
  9.   GdipDrawLineI graphics, pen, 10, 10, 4000, 2000
  10.   
  11.   GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen
  12.   GdipDrawRectangleI graphics, pen, 30, 30, 2000, 2000
  13.   
  14.   GdipCreateSolidFill &HAA0000FF, brush
  15.   GdipFillRectangleI graphics, brush, 30, 30, 2000, 2000
  16.   GdipDrawRectangleI graphics, pen, 30, 30, 200, 2000
  17.   
  18.   p1.X = 10
  19.   p1.Y = 10
  20.   p2.X = 2000
  21.   p2.Y = 1000
  22.   
  23.   GdipCreateLineBrush p1, p2, &H8AFF00FF, &HFFFF0000, WrapModeTileFlipXY, brush
  24.   GdipFillEllipseI graphics, brush, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.X

  25.   Me.Repaint
  26. End Sub
复制代码

点击这里给我发消息

8#
 楼主| 发表于 2014-9-14 11:33:34 | 只看该作者
zpy2 发表于 2014-9-7 05:12
这个用了什么库,不是win Api直接写的吧

这个要引用gdiplus.dll

点击这里给我发消息

10#
 楼主| 发表于 2014-9-15 13:55:12 | 只看该作者
感谢小宝版主,修改后,测试成功~

修改后的按钮单击代码如下:
  1. Private Sub Command0_Click()
  2.   Dim p1 As POINTF, p2 As POINTF
  3.   Dim tempHwnd As Long
  4.   
  5.   InitGDIPlus
  6.   
  7.   tempHwnd = FindWindowEx(Me.hwnd, 0&, "OFormSub", vbNullString)
  8.   tempHwnd = FindWindowEx(Me.hwnd, tempHwnd, "OFormSub", vbNullString)

  9.   GdipCreateFromHWND tempHwnd, graphics
  10.   GdipSetSmoothingMode graphics, SmoothingModeAntiAlias
  11.   
  12.   GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen
  13.   GdipDrawLineI graphics, pen, 1, 1, 400, 200
  14.   
  15.   GdipCreatePen1 &HFFFF0000, 1, UnitPixel, pen
  16.   GdipDrawRectangleI graphics, pen, 30, 30, 200, 200
  17.   
  18.   GdipCreateSolidFill &HAA0000FF, brush
  19.   GdipFillRectangleI graphics, brush, 30, 30, 200, 200
  20.   GdipDrawRectangleI graphics, pen, 30, 30, 200, 200
  21.   
  22.   p1.X = 10
  23.   p1.Y = 10
  24.   p2.X = 200
  25.   p2.Y = 100
  26.   
  27.   GdipCreateLineBrush p1, p2, &H8AFF00FF, &HFFFF0000, WrapModeTileFlipXY, brush
  28.   GdipFillEllipseI graphics, brush, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.X

  29. End Sub
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-26 12:06 , Processed in 0.086254 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表