致新手:用VB6解决一些有趣的问题(六)

本文介绍了一个使用VB编程语言创建的半透明桌面时钟项目。该时钟具备时针、分针和秒针,并通过数学变换调整指针位置,同时实现了不干扰其他应用程序窗口焦点的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

画好你自己的三角形了吗?

估计有人想给定点标上字母 什么的了,哎,人的欲望是无限的

三角也给人无限的遐想,这世界总是那么多圆圆角角!

下面我们来个更高级一点的,我们要设计一个时钟,可不是数字哦

有时针分针秒针,这个资源也可以在我的下载那里下载到的

为了新手,为了更有经济实力的人进入程序开发的世界,分是不要的

我们的时钟挂在桌面,要不影响其他程序,不能让他们失去焦点

时钟的来历还很特别,前段时间想起了5年前高二的时候研究相对论,很喜欢

洛伦茨变换,想想能做什么呢?对了时针的旋转不也是变换了坐标吗?

可以后来的时间告诉我,洛伦茨用代码设计麻烦很多

至于怎么实现这个过程,文字很有限了,打字也痛苦

如果你能理解前面五篇<致新手> 那么下面的代码就不用我解释了:

用到一个背景图片

起初把蓝色部分设为透明,然而VB转为位图后跟背景的融合度实在恶心

后来就这样,其实无论怎么样都可以的,我们要的是时钟的界面

窗体frmMain

背景 图片,图标

BorderStyle 为0

一个Timer:tmrTime InterVal = 1000

一个Label:lblTime BackStyle = 0,ForeColor=RGB(255,0,255)

三条Line :lnHour,lnMinute,lnSecond 颜色自定

Option Explicit Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Type POINT X As Integer Y As Integer End Type Const LWA_COLORKEY = &H1 Const LWA_ALPHA = &H2 Const GWL_EXSTYLE = (-20) Const WS_EX_LAYERED = &H80000 Const WS_EX_TRANSPARENT As Long = &H20& Const PI = 3.14159265358979 Private pSecond As POINT Private pMinute As POINT Private pHour As POINT Private Sub Form_Load() If App.PrevInstance Then End 'msgbox "重复运行!" Dim i As Integer, j As Integer App.TaskVisible = False Me.Left = Screen.Width - Me.Width - Screen.TwipsPerPixelX * 10 Me.Top = Screen.TwipsPerPixelY * 10 Me.Refresh '用在最前 'SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, 3 'If Dir(App.Path & "/Init.ini") = "" Then Dim Ret As Long Ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE) Ret = Ret Or WS_EX_LAYERED Or WS_EX_TRANSPARENT '透明(度)和不接受焦点 SetWindowLong Me.hwnd, GWL_EXSTYLE, Ret 'SetLayeredWindowAttributes Me.hwnd, 0, 255, LWA_ALPHA SetLayeredWindowAttributes Me.hwnd, vbBlue, 210, LWA_COLORKEY Or LWA_ALPHA 'Shape1.BorderColor = RGB(25, 67, 65) lblTime.Caption = CStr(Time) Ticket Time End Sub Private Sub tmrTime_Timer() Static t As Variant t = Time lblTime.Caption = CStr(t) '(68,68):(0,0) '秒针 (68,72) -> (68,16):(0,-4) -> (0,52) '分针 (68,72) -> (68,32):(0,-4) -> (0,36) '秒针 (68,72) -> (68,48):(0,-4) -> (0,20) Ticket t End Sub Private Sub Ticket(ByVal t As Variant) Static h As Long, m As Long, s As Long Static d(1 To 3) As Double s = Second(t) m = Minute(t) * 60 + s h = (Hour(t) Mod 12) * 3600 + m 'd(1) = (43200 - h) * PI / 21600 'd(2) = (3600 - m) * PI / 1800 'd(3) = (60 - s) * PI / 30 d(1) = (21600 - h) * PI / 21600 d(2) = (1800 - m) * PI / 1800 d(3) = (30 - s) * PI / 30 '洛伦茨变换,转过某一角度后的坐标 '... '圆周旋转变换:X=X0+Rsina;Y=Rcosa pHour.X = CInt(20 * Sin(d(1))) pHour.Y = CInt(20 * Cos(d(1))) With lnHour .X1 = 68 .X2 = 68 + pHour.X .Y1 = 68 .Y2 = 68 + pHour.Y End With pMinute.X = CInt(36 * Sin(d(2))) pMinute.Y = CInt(36 * Cos(d(2))) With lnMinute .X1 = 68 .X2 = 68 + pMinute.X .Y1 = 68 .Y2 = 68 + pMinute.Y End With pSecond.X = CInt(52 * Sin(d(3))) pSecond.Y = CInt(52 * Cos(d(3))) With lnSecond .X1 = 68 .X2 = 68 + pSecond.X .Y1 = 68 .Y2 = 68 + pSecond.Y End With End Sub

为了不给边沿出现齿状的东西,我们把时钟外围全部涂成蓝色再删去

'Form_Load中放在Me.Refresh之前 For i = 0 To 139 For j = 0 To 139 If (i - 70) ^ 2 + (j - 70) ^ 2 >= 67 ^ 2 Then Me.PSet (j, i), vbBlue End If Next j Next i

为了不跟其他程序的按键冲突

我们设定 同时按 Ctrl+Alt+Shift+Esc 退出程序

'放在tmrTime的Timer事件中 Ticket t之后 'If GetAsyncKeyState(vbKeyEscape) Then End If GetAsyncKeyState(vbKeyControl) And &H8000 Then If GetAsyncKeyState(vbKeyMenu) And &H8000 Then If GetAsyncKeyState(vbKeyShift) And &H8000 Then If GetAsyncKeyState(vbKeyEscape) And &H8000 Then End End If End If End If

看看我们的半透明和不规则边框效果,是不是很出色

功能描述 clsWindow是VB6环境下使用的一个操作外部程序窗口的类,比如得到窗口句柄,得到窗口里某个文本框的内容。非常方便,使用它可以让您脱身于一堆api函数,功能强大使用简单! 这个类楼主很早就开始封装了,原本打算做成类似DOM对象那样,通过一堆getElmentByXXX等方法实现对桌面程序下各个窗口以及里面各个控件对象的自由访问,但是具体要做的工作太多,目前只实现了一部分,期待大家一起加入更新维护。 目前该类封装了绝大部分对windows窗口的常用操作,例如:获取窗口句柄,设置窗口为活动窗口,设置窗口内文本框内容,点击窗口内的某些按钮等。 这个类现在还在一直不断地扩充,功能已经很强大很广泛,使用它可以轻而易举地设置窗口标题栏文字,移动窗体等等。以前要实现这些操作常常需要一大堆api函数,现在只需要一点点代码就可以了,完全让您脱身于api函数的海洋。当然您需要研究每个方法实现原理的话可以看一看源代码。 使用范例(请在v1.9以上测试): 1)关闭腾讯新闻窗口“腾讯网迷你版”。 Dim window As New clsWindow If window.GetWindowByTitle("腾讯网迷你版").hWnd > 0 Then window.CloseWindow '关闭窗口 End If 以上是不是很简洁呢? 20150715更新追加: 最新1.9版本更简洁,一句话解决: w.GetWindowByTitle("腾讯网迷你版").CloseWindow 小伙伴,是不是简洁爆了呢?:) 为了防止程序找不到窗口而一直等待可以改成: w.GetWindowByTitle("腾讯网迷你版",1).CloseWindow (意思为超时等待1秒。默认会耐心等60秒,除非你确定窗口一定有,然后就用上面的。) 2)获取某个打开的记事本里面的内容。假设记事本标题为“测试要求.txt - 记事本”,通过SPY等工具查看得知记事本的文本框类名为:Edit,那么我们编写程序如下: Dim window As New clsWindow If window.GetWindowByTitle("测试要求.txt - 记事本").hWnd > 0 Then MsgBox window.GetElementTextByClassName("Edit") End If 这个看起来也很简单,方法自由还可以使用正则匹配,可以写成下面这样: Dim window As New clsWindow If window.GetWindowByTitleEx("工作任务\.txt.*?", , , True).hWnd > 0 Then MsgBox window.GetElementTextByClassName("Edi", , True) '第三个参数表示是否使用正则,默认为false End If 获取标题那边如果觉得要把标题写完整太麻烦,可以将GetWindowByTitle该车GetWindowByTitleEx然后后面只要写关键字就行啦。看招: Dim window As New clsWindow If window.GetWindowByTitleEx("工作任务").hWnd > 0 Then MsgBox window.GetElementTextByClassName("Edit") End If clsWindow类最新版下载请关注博客: http://blog.youkuaiyun.com/sysdzw/article/details/9083313 '============================================================================================== '名 称:windows窗体控制类v2.0 '描 述:一个操作windows窗口的类,可对窗口进行很多常用的操作(类名为clsWindow) '使用范例:Dim window As New clsWindow ' window.GetWindowByTitle "计算器" ' window.closeWindow '编 程:sysdzw 原创开发,如果有需要对模块扩充或更新的话请邮箱发我一份,共同维护 '发布日期:2013/06/01 '博 客:http://blog.163.com/sysdzw ' http://blog.youkuaiyun.com/sysdzw 'Email :sysdzw@163.com 'QQ :171977759 '版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值