ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 12713|回复: 21

用户窗体上随意画画

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-4-5 11:50 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:窗体
Option Explicit 创建笔刷的API函数 Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long API指针类型 Private Type POINTAPI X As Long Y As Long End Type 创建多边形区域的函数 Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Any, _ ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long 创建多边形 Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, _ lpPoint As Any, ByVal nCount As Long) As Long 填充多边形区域 Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, _ ByVal hRgn As Long, ByVal hBrush As Long) As Long 删除对象 Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long 查找窗口 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String _ ) As Long 获取窗口DC Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Const ALTERNATE = 1 ' ALTERNATE and WINDING are Const WINDING = 2 ' constants for FillMode. Const BLACKBRUSH = 1.6 Dim i As Long Dim NumCoords, bool, hBrush, hRgn, Trash Dim sX, sY Dim Poly() As POINTAPI 鼠标在窗体上移动,收集多边形边界点 Private Sub UserForm_MouseMove(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, _ ByVal Y As Single) If Button = 1 Then i = i + 1 ReDim Preserve Poly(1 To i) ‘这些是将来要绘制的点集合 Poly(i).X = X * 1.33 ‘1.33是象素和磅之间的换算,基于电脑设置为96DPI。 Poly(i).Y = Y * 1.33 End If End Sub 鼠标抬起时绘制多边形区域并填充 Private Sub UserForm_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, _ ByVal Y As Single) Dim hwnd As Long Dim hdc As Long On Error Resume Next If Button = 2 Then Me.Repaint ‘右键清除图画 hwnd = FindWindow(vbNullString, Me.Caption) ‘查找当前窗体窗口句柄 hdc = GetDC(hwnd) ‘获取当前窗口的DC bool = Polygon(hdc, Poly(1), i) ‘绘制多边形边界(如果没有本句,绘制的图画就没有边界) hBrush = CreateSolidBrush(vbGreen) ‘创建填充笔刷 hRgn = CreatePolygonRgn(Poly(1), i, ALTERNATE) ‘创建多边形区域 If hRgn Then bool = FillRgn(hdc, hRgn, hBrush) ‘填充多边形区域(如果没有本句,则只有多边形边界,而不会填充) Erase Poly: i = 0 ‘清除数组,并从头开始绘图 (去掉i=0试试看) Trash = DeleteObject(hRgn) ‘删除创建的对象,这是个编程的好习惯 End Sub NNnxzvPL.zip (11.03 KB, 下载次数: 322)

q2gJETto.zip

10.09 KB, 下载次数: 593

用户窗体上随意画画

TA的精华主题

TA的得分主题

发表于 2006-4-5 11:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-4-5 12:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-4-5 12:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

一级棒!

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-4-5 13:13 | 显示全部楼层

API的东西总是讳莫如深,特别是在VBA里使用API。上面的作品是我看了无数个VB和VBA作品才弄出来的,真是难啊!

希望大家能深入研究并且慷慨分享研究成果,毕竟我们是业余的,没有必要所谓的知识产权保护之类的。

另外,我正在翻译一点API在VBA中的应用方面的资料,完成后再贴上来。

TA的精华主题

TA的得分主题

发表于 2006-4-5 13:17 | 显示全部楼层
期待hxhgxy版主的东东啊。谢谢。[em25][em26][em27][em24][em23]

TA的精华主题

TA的得分主题

发表于 2006-4-5 13:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-4-5 17:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

太好了!谢谢!

就是画的全是绿的,要是有变化就好了!

TA的精华主题

TA的得分主题

发表于 2006-4-5 20:49 | 显示全部楼层
版主的东西不错,有时间的话可以试着做一个画图软件了

TA的精华主题

TA的得分主题

发表于 2006-4-5 20:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不知道这个东东有什么用?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 18:28 , Processed in 0.051821 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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