Excel VBA 窗体之放大镜窗体 实现代码
发布时间:2022-04-03 11:01:34
在 Windows 的附件中有一个工具叫放大镜,看着不错有意思。有时候自己动手做一个也很有感觉。那我们就用 VBA 来做一个简陋版的放大镜,看着简陋其实也不错的。
附件下载:
操作如下:
◾ 在Excel 的VBE窗口中插入一个用户窗体,将其命名为 frmMagnifyingGlass。然后再添加一个模块。在窗体和模块中添加后面所列代码。
◾ 在工作薄中的任意工作表中添加一窗体按钮控件,将指定其设置宏为 btnShowMagnifyingGlass_Click。其供示范之用
具体代码:
"mdMagnifyingGlass" 模块代码
Option Explicit
'********************************************
'---此模块为回调函数和工作表中按钮调用程序---
'********************************************
#If Win64 Then '64位
'获取设备数据
Public Declare PtrSafe Function GetDeviceCaps _
Lib "gdi32"( _
ByVal hdc As LongPtr, _
ByVal nIndex As Long) _
As Long
'释放设备场景
Public Declare PtrSafe Function ReleaseDC _
Lib "user32" ( _
ByVal Hwnd As LongPtr, _
ByVal hdc As LongPtr) _
As Long
'获取鼠标指针的当前位置
Public Declare PtrSafe Function GetCursorPos _
Lib "user32" ( _
lpPoint As POINTAPI) _
As Long
'取得设备场景
Public Declare PtrSafe Function GetDC _
Lib "user32" ( _
ByVal Hwnd As LongPtr) _
As LongPtr
'将一幅位图从一个设备场景复制到另一个
Public Declare PtrSafe Function StretchBlt _
Lib "gdi32" ( _
ByVal hdc As LongPtr, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As LongPtr, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal nSrcWidth As Long, _
ByVal nSrcHeight As Long, _
ByVal dwRop As Long) _
As Long
'查找窗口
Public Declare PtrSafe Function FindWindow _
Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) _
As LongPtr
Public FHwnd As LongPtr
Public FHdc As LongPtr
#Else
'获取设备数据
Public Declare Function GetDeviceCaps _
Lib "gdi32" ( _
ByVal hdc As Long, _
ByVal nIndex As Long) _
As Long
'释放设备场景
Public Declare Function ReleaseDC _
Lib "user32" ( _
ByVal Hwnd As Long, _
ByVal hdc As Long) _
As Long
'获取鼠标指针的当前位置
Public Declare Function GetCursorPos _
Lib "user32" ( _
lpPoint As POINTAPI) _
As Long
'取得设备场景
Public Declare Function GetDC _
Lib "user32" ( _
ByVal Hwnd As Long) _
As Long
'将一幅位图从一个设备场景复制到另一个
Public Declare Function StretchBlt _
Lib "gdi32" ( _
ByVal hdc As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal nSrcWidth As Long, _
ByVal nSrcHeight As Long, _
ByVal dwRop As Long) _
As Long
'查找窗口
Public Declare Function FindWindow _
Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) _
As Long
Public FHwnd As Long
Public FHdc As Long
#End If
'以下定义类型
Private Type POINTAPI
x As Long
y As Long
End Type
'以下声明常数和变量
Public Const SRCCOPY = &HCC0020
Public Const LOGPIXELSX = &H58
Public FLogPixelsx As Long
Private FPoint As POINTAPI
Private dx As Long
Private dy As Long
'***************************
'---Settimer函数的回调函数---
'***************************
Public Function TimeOutProc(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal SysTime As Long) As Long
'获得当前鼠标位置
Call GetCursorPos(FPoint)
dx = FPoint.x: dy = FPoint.y
'将位图复制到窗体设备场景
Call StretchBlt(FHdc, 0, 0, frmMagnifyingGlass.InsideWidth * FLogPixelsx / 72, frmMagnifyingGlass.InsideHeight * FLogPixelsx / 72, _
GetDC(0), dx, dy, 150, 150 * frmMagnifyingGlass.InsideHeight / frmMagnifyingGlass.InsideWidth, SRCCOPY)
End Function
'此程序为工作表中按钮调用
Sub btnShowMagnifyingGlass_Click()
'显示窗体(无模式)
frmMagnifyingGlass.Show 0
End Sub
"frmMagnifyingGlass" 窗体代码
Option Explicit
'***********************
'------窗体过程代码------
'***********************
'以下声明API函数
#If Win64 Then '64位
'用来设置Settimer过程。
Private Declare PtrSafe Function SetTimer _
Lib "user32" ( _
ByVal Hwnd As LongPtr, _
ByVal nIDEvent As LongPtr, _
ByVal uElapse As Long, _
ByVal lpTimerfunc As LongPtr) _
As LongPtr
'结束Settimer过程
Private Declare PtrSafe Function KillTimer _
Lib "user32" ( _
ByVal Hwnd As LongPtr, _
ByVal nIDEvent As LongPtr) _
As Long
'以下定义变量
Private FTID As LongPtr
#Else
'用来设置Settimer过程。
Private Declare Function SetTimer _
Lib "user32" ( _
ByVal Hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerfunc As Long) _
As Long
'结束Settimer过程
Private Declare Function KillTimer _
Lib "user32" ( _
ByVal Hwnd As Long, _
ByVal nIDEvent As Long) _
As Long
'以下定义变量
Private FTID As Long
#End If
Private Sub UserForm_Initialize()
'取得窗口句柄
FHwnd = FindWindow(vbNullString, Me.Caption)
'取得窗体设备场景
FHdc = GetDC(FHwnd)
'取得每英寸所包含的像素
FLogPixelsx = GetDeviceCaps(GetDC(0), LOGPIXELSX)
'设置Settimer 过程
FTID = SetTimer(FHwnd, 0, 100, AddressOf TimeOutProc)
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'结束Settimer过程
If FTID <> 0 Then Call KillTimer(FHwnd, FTID)
'释放设备场景,记住一定要释放
Call ReleaseDC(FHwnd, FHdc)
End Sub
Excel VBA 窗体之放大镜窗体 实现代码的下载地址:


猜你喜欢
- 现在网上很多信息都是通过图片或者PDF文件的格式进行发布的,这样要想获取文件中的文字信息只能使用OCR技术才可以。但是通常包括这项技术的软件
- 在Excel的日常使用中,我们有时候需要对表示条件的参数的逻辑值求反,但是很多朋友都不是很清楚在Excel中逻辑值指的是什么?怎么表示?所以
- 最近有很多用户在重装win7系统后都遇到了重装系统后没有声音的问题。一般导致这个问题的多数驱动等故障造成,下文就给大家展示下win7系统重装
- 最近有Win7用户反映,因为很少用到IE浏览器,所以想把桌面上的IE图标给删掉,但却发现IE图标无法删除,不管删除多少次结果都一样,这让用户
- 可以在控制面板中打开“区域与语言”设置窗口,添加语言时选择“英语(美国)”,再将“中文(中国)”下移至第二位,然后将其删除,之后重新安装需要
- 自从微软取消对win7的维护后,大量的win7用户被迫无奈之下只能选择升级到BUG层出不穷的Win10系统。然而最让人头疼的就是Win10自
- 在Word2010文档中,用户可以启用“放弃编辑数据”功能,从而删除用于将已编辑的图片还原到其原始状态的数据,以减小包含图片的Word文件的
- 有时我们在使用wps文字编辑文档的过程中会发现无法使用复制粘贴的功能,这时什么原因造成的呢?又该如何解决呢?下面就让小编告诉你解决wps无法
- iOS 11.2.5 beat3都有哪些新功能?iOS 11.2.5 beat3费电吗?据说,iOS 11.2.5第三个测试版本可以查看电池
- 最近有windows8.1系统用户反映,win8.1系统不能玩使命召唤游戏,这该怎么办呢?使命召唤ol不能运行有没有有效的方法进行解决呢?本
- Win10系统是大家经常使用的系统,随着使用时间的增加,电脑里我们存放的文件就越多。这么多的文件,偶像想起来要找某个文件,已经忘记了文件的存
- 遇到公司做大型活动有开奖现场的时候,常常会找广告公司的人来承接这些活动,因为很多小伙伴不知道该怎么实现现场抽奖这个环节,老觉得现场抽奖的各种
- 有时候把图片上传到网络系统,系统经常提示你文件太大,上传不了。怎么办?方法有很多种,其中有一种简单快捷的方法,这种方法就是裁剪。步骤:1.在
- 有时候我们在使用谷歌浏览器打开一些网页的时候经常会出现不跳出的情况,这种可能是因为这些新网页是带有弹窗被拦截的,那么遇到这种情况要如何去解决
- 让Word 2007跨页表格自动在各页顶端重复显示标题对于Word2007中一些内容跨越数页的表格,由于下一页的内容缺少标题行,查看起来很不
- iOS16发布之后不少iPhone用户表示升级之后续航表现不行,而且手机存在多个bug,于是苹果火速发布了iOS16.0.2。根据苹果的说法
- 在运行一些文件、应用程序及大型游戏的时候出现系统闪退、卡顿的现象,相信不少Win7用户都曾遇到过。而上述情况出现的原因,大部分都是内存占用率
- 最近!Win10 UWP通用版VLC更新修复了几个显著的Bug;在UI方面,UWP版VLC更加流畅顺手;下面小编就为大家带来UWP版VLC更
- 如何在Excel 2019中使用快捷键快速制作表格?使用快捷键,目的是便于您在使用Excel时,提升您使用Excel的办公效率,节约使用Ex
- 在我们工作时,有时需要把WPS表格的表格设置成横向,但是一旦设置了横向,打印时就会打印不全,这该怎么办?不用担心,下面小编来告诉你WPS表格