彩票应用与屏幕保护程序开发详解
1. 彩票应用概述
彩票应用以科罗拉多州彩票为模型,使用一个圆柱形篮子翻滚编号的乒乓球。该应用概念简单,42 个编号为 1 到 42 的乒乓球被放入篮子中打乱,然后随机依次选取 6 个球,这 6 个数字代表中奖号码。虽然奖金丰厚,但中全部 6 个号码的概率极低。
在应用中,每次点击“Next Ball”命令按钮,会选取一个球并显示在屏幕底部。完成 6 个球的选取后,还可模拟购买 1000 张彩票,以了解即使购买大量彩票,中头奖也非常困难。
2. 彩票应用项目结构
此项目包含主彩票表单(LOTTERY.FRM)、名为 RANDOM.CLS 的类模块和标准的 About 表单。
2.1 LOTTERY.FRM 表单
LOTTERY.FRM 是应用的主启动表单,其主要控件和功能如下:
| ID No. | 控件类型 | 属性 | 值 |
| ---- | ---- | ---- | ---- |
| | Form | Name | frmLottery |
| | | Caption | Lottery |
| 1 | PictureBox | Name | picTumble |
| | | AutoRedraw | True |
| | | BackColor | &H00FF0000& |
| | | Height | 3600 |
| | | Width | 3600 |
| 2 | Timer | Name | tmrPingPong |
| | | Interval | 50 |
| 3 | CommandButton | Name | cmdNextBall |
| | | Caption | &Next ball |
| 4 | CommandButton | Name | cmdSample |
| | | Caption | &Sample 1000 tickets |
以下是该表单的部分关键代码:
Option Explicit
Private Declare Function WinHelp _
Lib "user32" Alias "WinHelpA" ( _
ByVal hwnd As Long, _
ByVal lpHelpFile As String, _
ByVal wCommand As Long, _
ByVal dwData As Long _
) As Long
Const MAXNUM = 42
Dim intPPBall(6) As Integer
Dim randDemo As New Random
Private Sub cmdNextBall_Click()
Dim intI As Integer
Dim intJ As Integer
cmdNextBall.Caption = "&Next ball"
cmdSample.Visible = False
intI = intPPBall(0)
If intI = 6 Then
For intI = 0 To 6
intPPBall(intI) = 0
Next intI
Exit Sub
End If
GrabNext intPPBall()
If intPPBall(0) = 6 Then
cmdNextBall.Caption = "Start &over"
cmdSample.Visible = True
End If
End Sub
2.2 RANDOM.CLS 类模块
RANDOM.CLS 类模块用于创建 Random 类型的对象,其核心是一种扩展 Visual Basic 内置随机数生成器序列长度的技术。该模块定义了以下公共属性和方法:
-
公共属性
:
- MinInt:生成随机整数范围的最小值
- MaxInt:生成随机整数范围的最大值
- Random:0 到 1 范围内的随机数
- RandomInt:MinInt 和 MaxInt 范围内的随机整数
-
公共方法
:
- Shuffle:初始化随机数序列
以下是 RANDOM.CLS 的部分代码:
Option Explicit
Const ARYCNT = 17
Public MinInt As Long
Public MaxInt As Long
Private mdblSeed(ARYCNT - 1) As Double
Private mintP As Integer
Private mintQ As Integer
Public Sub Shuffle(dblX As Double)
Dim strN As String
Dim intI As Integer
Zap
strN = Str$(dblX)
For intI = 1 To Len(strN)
Stir 1 / Asc(Mid(strN, intI, 1))
Next intI
Randomize Rnd(mdblSeed(mintP) * Sgn(dblX))
For intI = 1 To ARYCNT * 2.7
Stir Rnd
Next intI
End Sub
Property Get Random() As Double
mintP = (mintP + 1) Mod ARYCNT
mintQ = (mintQ + 1) Mod ARYCNT
mdblSeed(mintP) = mdblSeed(mintP) + mdblSeed(mintQ) + Rnd
mdblSeed(mintP) = mdblSeed(mintP) - Int(mdblSeed(mintP))
Random = mdblSeed(mintP)
End Property
Property Get RandomInt() As Long
RandomInt = Int(Random() * (MaxInt - MinInt + 1)) + MinInt
End Property
3. 屏幕保护程序(MySaver 应用)概述
MySaver 应用在之前屏幕保护程序示例的基础上进行了扩展,提供了更多图形选项,用户无需添加大量代码即可设置各种效果。该应用的一个重要改进是能够自动在小预览窗口中显示屏幕保护程序。
4. MySaver 应用项目结构
此项目包含两个表单模块(MYSAVER.FRM 和 MYSETUP.FRM)和一个标准模块(MYSAVER.BAS)。
4.1 MYSAVER.BAS 模块
MYSAVER.BAS 包含 Sub Main 起始点和相关控制代码,主要用于解码系统传递给屏幕保护程序的命令行参数并采取相应操作。以下是该模块的部分代码:
`MySaver.bas
Option Explicit
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const WS_CHILD = &H40000000
Private Const GWL_HWNDPARENT = (-8)
Private Const GWL_STYLE = (-16)
Private Const HWND_TOP = 0&
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_SHOWWINDOW = &H40
Private Declare Function GetClientRect _
Lib "user32" ( _
ByVal hwnd As Long, _
lpRect As RECT _
) As Long
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 Declare Function SetWindowPos _
Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) As Long
Private Declare Function SetParent _
Lib "user32" ( _
ByVal hWndChild As Long, _
ByVal hWndNewParent As Long _
) As Long
Public gblnShow As Boolean
Private mlngDisplayHwnd As Long
Private recDisplay As RECT
Public Sub Main()
Dim strCmd As String
Dim strTwo As String
Dim lngStyle As Long
Dim lngPreviewHandle As Long
Dim lngParam As Long
strCmd = UCase(Trim(Command))
strTwo = Left(strCmd, 2)
Select Case strTwo
Case "/P"
mlngDisplayHwnd = Val(Mid(strCmd, 4))
GetClientRect mlngDisplayHwnd, recDisplay
gblnShow = False
Load frmMySaver
lngPreviewHandle = frmMySaver.hwnd
lngStyle = GetWindowLong(lngPreviewHandle, GWL_STYLE)
lngStyle = lngStyle Or WS_CHILD
SetWindowLong lngPreviewHandle, GWL_STYLE, lngStyle
SetParent lngPreviewHandle, mlngDisplayHwnd
SetWindowLong lngPreviewHandle, GWL_HWNDPARENT, _
mlngDisplayHwnd
SetWindowPos lngPreviewHandle, _
HWND_TOP, 0&, 0&, recDisplay.Right, recDisplay.Bottom, _
SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW
Exit Sub
Case "/C"
Load frmMySetup
Exit Sub
Case "/A"
MsgBox "No password is necessary for this Screen Saver", _
vbInformation, "Password Information"
Exit Sub
Case "/S"
gblnShow = True
Load frmMySaver
frmMySaver.Show
Exit Sub
Case Else
Exit Sub
End Select
End Sub
以下是彩票应用和屏幕保护程序的整体流程 mermaid 图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{应用类型}:::decision
B -->|彩票应用| C(初始化彩票表单):::process
C --> D(点击 Next Ball 选球):::process
D --> E{是否选完 6 个球}:::decision
E -->|否| D
E -->|是| F(模拟购买 1000 张彩票):::process
B -->|屏幕保护程序| G(解析命令行参数):::process
G --> H{参数类型}:::decision
H -->|/P| I(预览模式设置):::process
H -->|/C| J(打开设置表单):::process
H -->|/A| K(提示无密码):::process
H -->|/S| L(全屏显示):::process
H -->|其他| M(退出):::process
5. MYSAVER.FRM 表单
MYSAVER.FRM 是屏幕保护程序图形的主要显示表单,关闭了所有可见部分,提供一个覆盖整个屏幕的绘图表面。唯一的控件是一个 Timer 控件,图形更新在表单的 Paint 事件中持续循环进行。
以下是该表单的部分代码:
`MySaver.frm
Option Explicit
Private Declare Function ShowCursor _
Lib "user32" ( _
ByVal bShow As Long _
) As Long
Private Declare Function SystemParametersInfo _
Lib "user32" Alias "SystemParametersInfoA" ( _
ByVal uAction As Long, _
ByVal uParam As Long, _
ByRef lpvParam As Any, _
ByVal fuWinIni As Long _
) As Long
Private Const SPI_SETSCREENSAVEACTIVE = 17
Dim mlngXai As Long
Dim mlngYai As Long
Dim mlngXbi As Long
Dim mlngYbi As Long
Dim mlngLineCount As Long
Dim mlngLineWidth As Long
Dim mlngActionType As Long
Dim mlngXmax As Long
Dim mlngYmax As Long
Dim mlngInc As Long
Dim mlngColorNum() As Long
Dim mlngDx1() As Double
Dim mlngDx2() As Double
Dim mlngDy1() As Double
Dim mlngDy2() As Double
Dim mlngXa() As Long
Dim mlngXb() As Long
Dim mlngYa() As Long
Dim mlngYb() As Long
Dim mblnQuit As Boolean
Private Sub Form_Load()
Dim lngRet As Long
lngRet = SystemParametersInfo( _
SPI_SETSCREENSAVEACTIVE, 0, ByVal 0&, 0)
If gblnShow = True Then
Me.WindowState = vbMaximized
End If
End Sub
Private Sub Form_Paint()
Dim lngX As Long
If gblnShow = False Then
Me.AutoRedraw = True
End If
Randomize
mlngInc = 5
mlngXmax = 300
mlngYmax = 300
mlngActionType = Val(GetSetting("MySaver", "Options", _
"Action", "1"))
mlngLineCount = Val(GetSetting("MySaver", "Options", _
"LineCount", "1"))
mlngLineWidth = Val(GetSetting("MySaver", "Options", _
"LineWidth", "1"))
With Me
.BackColor = vbBlack
.DrawWidth = mlngLineWidth
End With
Scale (-mlngXmax, -mlngYmax)-(mlngXmax, mlngYmax)
ReDim mlngColorNum(0 To mlngLineCount)
ReDim mlngXa(1 To mlngLineCount), mlngXb(1 To mlngLineCount)
ReDim mlngYa(1 To mlngLineCount), mlngYb(1 To mlngLineCount)
If mlngActionType < 5 Then
ReDim mlngDx1(1 To mlngLineCount), _
mlngDx2(1 To mlngLineCount)
ReDim mlngDy1(1 To mlngLineCount), _
mlngDy2(1 To mlngLineCount)
Else
ReDim mlngDx1(0), mlngDx2(0)
ReDim mlngDy1(0), mlngDy2(0)
mlngDx1(0) = Rnd * mlngInc
mlngDx2(0) = Rnd * mlngInc
mlngDy1(0) = Rnd * mlngInc
mlngDy2(0) = Rnd * mlngInc
End If
If gblnShow = True Then
lngX = ShowCursor(False)
End If
Do
DoGraphics
DoEvents
Loop Until mblnQuit = True
If gblnShow = True Then
lngX = ShowCursor(True)
End If
tmrExitNotify.Enabled = True
End Sub
6. MYSETUP.FRM 表单
MYSETUP.FRM 是一个对话框表单,当用户在显示属性对话框的屏幕保护程序选项卡中点击“Settings”按钮时激活。用户可以选择六种图形显示类型之一,并通过选择线条数量和线条像素厚度来修改设置,这些设置通过 GetSetting 和 SaveSetting 语句读写系统注册表。
以下是该表单的部分代码:
`MySetup.frm
Option Explicit
Dim mstrAction As String
Private Sub Form_Load()
Me.Left = (Screen.Width - Me.Width) \ 2
Me.Top = (Screen.Height - Me.Height) \ 2
mstrAction = GetSetting("MySaver", "Options", "Action", "1")
optAction(Val(mstrAction) - 1).Value = True
txtLineCount.Text = GetSetting("MySaver", "Options", _
"LineCount", "5")
txtLineWidth.Text = GetSetting("MySaver", "Options", _
"LineWidth", "1")
Me.Show
End Sub
Private Sub cmdOK_Click()
Dim lngN As Long
lngN = Val(txtLineCount.Text)
If lngN < 1 Or lngN > 1000 Then
MsgBox "Line count should be a small positive integer", _
vbExclamation, "MySaver"
Exit Sub
End If
lngN = Val(txtLineWidth.Text)
If lngN < 1 Or lngN > 100 Then
MsgBox _
"Line thickness should be a small positive integer", _
vbExclamation, "MySaver"
Exit Sub
End If
SaveSetting "MySaver", "Options", "Action", mstrAction
SaveSetting "MySaver", "Options", "LineCount", _
txtLineCount.Text
SaveSetting "MySaver", "Options", "LineWidth", _
txtLineWidth.Text
Unload Me
End Sub
Private Sub optAction_Click(Index As Integer)
mstrAction = Format(Index + 1)
End Sub
通过以上内容,我们详细了解了彩票应用和屏幕保护程序的开发,包括项目结构、代码实现和功能流程。这些应用不仅展示了随机数生成和图形动画的技术,还涉及到系统命令行参数解析和注册表读写等操作。
彩票应用与屏幕保护程序开发详解(续)
7. 彩票应用功能深入分析
彩票应用的核心功能在于模拟彩票抽奖过程,下面对其关键功能进行详细分析。
7.1 选球逻辑
在点击“Next Ball”按钮时,程序会执行选球操作。具体步骤如下:
1. 获取当前已选球的数量。
2. 如果已选球数量达到 6 个,则重置选球数组,重新开始。
3. 调用
GrabNext
函数选取下一个唯一的乒乓球号码。
4. 如果已选满 6 个球,修改按钮标题为“Start &over”,并显示“Sample 1000 tickets”按钮。
以下是选球逻辑的代码:
Private Sub cmdNextBall_Click()
Dim intI As Integer
Dim intJ As Integer
cmdNextBall.Caption = "&Next ball"
cmdSample.Visible = False
intI = intPPBall(0)
If intI = 6 Then
For intI = 0 To 6
intPPBall(intI) = 0
Next intI
Exit Sub
End If
GrabNext intPPBall()
If intPPBall(0) = 6 Then
cmdNextBall.Caption = "Start &over"
cmdSample.Visible = True
End If
End Sub
7.2 模拟购买彩票
点击“Sample 1000 tickets”按钮,程序会模拟购买 1000 张彩票,并统计中奖情况。具体步骤如下:
1. 显示沙漏鼠标指针,表示程序正在处理。
2. 循环 1000 次,每次生成一张彩票号码。
3. 比较生成的彩票号码与中奖号码,统计命中个数。
4. 更新命中统计数组。
5. 显示默认鼠标指针,显示统计结果。
以下是模拟购买彩票的代码:
Private Sub cmdSample_Click()
Dim intI As Integer
Dim intJ As Integer
Dim intK As Integer
Dim intN As Integer
Dim intTicket(6) As Integer
Dim Hits(6) As Integer
Dim strMsg As String
MousePointer = vbHourglass
For intI = 1 To 1000
intTicket(0) = 0
For intJ = 1 To 6
GrabNext intTicket()
Next intJ
intN = 0
For intJ = 1 To 6
For intK = 1 To 6
If intTicket(intJ) = intPPBall(intK) Then
intN = intN + 1
End If
Next intK
Next intJ
Hits(intN) = Hits(intN) + 1
Next intI
MousePointer = vbDefault
strMsg = "Sample of 1000 tickets " & vbCrLf & vbCrLf
strMsg = strMsg & Space$(10) & "Hits Tally" & vbCrLf
For intI = 0 To 6
strMsg = strMsg & Space$(12) & Format$(intI) & Space$(6)
strMsg = strMsg & Format$(Hits(intI)) & vbCrLf
Next intI
MsgBox strMsg, , "Lottery"
End Sub
8. 屏幕保护程序功能深入分析
屏幕保护程序的主要功能是在屏幕闲置时显示动画效果,下面对其关键功能进行详细分析。
8.1 初始化与模式判断
在
Form_Load
事件中,程序会进行初始化操作,并根据是否处于预览模式进行不同的设置。具体步骤如下:
1. 通知系统屏幕保护程序已激活。
2. 如果不是预览模式,将窗口状态设置为最大化。
以下是初始化与模式判断的代码:
Private Sub Form_Load()
Dim lngRet As Long
lngRet = SystemParametersInfo( _
SPI_SETSCREENSAVEACTIVE, 0, ByVal 0&, 0)
If gblnShow = True Then
Me.WindowState = vbMaximized
End If
End Sub
8.2 图形绘制与更新
在
Form_Paint
事件中,程序会进行图形绘制和更新操作。具体步骤如下:
1. 如果处于预览模式,将
AutoRedraw
属性设置为
True
。
2. 随机化图形显示。
3. 获取用户设置的控制值。
4. 初始化图形设置,如背景颜色、线条宽度等。
5. 根据用户设置调整数组大小。
6. 隐藏鼠标指针(非预览模式)。
7. 进入循环,不断调用
DoGraphics
函数进行图形绘制,并处理系统事件。
8. 显示鼠标指针(非预览模式),启用退出通知定时器。
以下是图形绘制与更新的代码:
Private Sub Form_Paint()
Dim lngX As Long
If gblnShow = False Then
Me.AutoRedraw = True
End If
Randomize
mlngInc = 5
mlngXmax = 300
mlngYmax = 300
mlngActionType = Val(GetSetting("MySaver", "Options", _
"Action", "1"))
mlngLineCount = Val(GetSetting("MySaver", "Options", _
"LineCount", "1"))
mlngLineWidth = Val(GetSetting("MySaver", "Options", _
"LineWidth", "1"))
With Me
.BackColor = vbBlack
.DrawWidth = mlngLineWidth
End With
Scale (-mlngXmax, -mlngYmax)-(mlngXmax, mlngYmax)
ReDim mlngColorNum(0 To mlngLineCount)
ReDim mlngXa(1 To mlngLineCount), mlngXb(1 To mlngLineCount)
ReDim mlngYa(1 To mlngLineCount), mlngYb(1 To mlngLineCount)
If mlngActionType < 5 Then
ReDim mlngDx1(1 To mlngLineCount), _
mlngDx2(1 To mlngLineCount)
ReDim mlngDy1(1 To mlngLineCount), _
mlngDy2(1 To mlngLineCount)
Else
ReDim mlngDx1(0), mlngDx2(0)
ReDim mlngDy1(0), mlngDy2(0)
mlngDx1(0) = Rnd * mlngInc
mlngDx2(0) = Rnd * mlngInc
mlngDy1(0) = Rnd * mlngInc
mlngDy2(0) = Rnd * mlngInc
End If
If gblnShow = True Then
lngX = ShowCursor(False)
End If
Do
DoGraphics
DoEvents
Loop Until mblnQuit = True
If gblnShow = True Then
lngX = ShowCursor(True)
End If
tmrExitNotify.Enabled = True
End Sub
8.3 图形绘制函数
DoGraphics
函数是图形绘制的核心函数,根据不同的动作类型绘制不同的图形。具体步骤如下:
1. 每隔一段时间重置线条颜色。
2. 根据线条数量循环处理。
3. 根据动作类型进行不同的处理,如绘制线条、矩形、圆形等。
以下是图形绘制函数的代码:
Sub DoGraphics()
Dim intI
Static dblColorTime As Double
If Timer > dblColorTime Then
ColorReset
If mlngLineCount < 5 Then
dblColorTime = Timer + mlngLineCount * Rnd + 0.3
Else
dblColorTime = Timer + 5 * Rnd + 0.3
End If
End If
For intI = 1 To mlngLineCount
If mlngActionType < 5 Then
If mlngXa(intI) <= 0 Then
mlngDx1(intI) = mlngInc * Rnd
End If
If mlngXb(intI) <= 0 Then
mlngDx2(intI) = mlngInc * Rnd
End If
If mlngYa(intI) <= 0 Then
mlngDy1(intI) = mlngInc * Rnd
End If
If mlngYb(intI) <= 0 Then
mlngDy2(intI) = mlngInc * Rnd
End If
If mlngXa(intI) >= mlngXmax Then
mlngDx1(intI) = -mlngInc * Rnd
End If
If mlngXb(intI) >= mlngXmax Then
mlngDx2(intI) = -mlngInc * Rnd
End If
If mlngYa(intI) >= mlngYmax Then
mlngDy1(intI) = -mlngInc * Rnd
End If
If mlngYb(intI) >= mlngYmax Then
mlngDy2(intI) = -mlngInc * Rnd
End If
mlngXa(intI) = mlngXa(intI) + mlngDx1(intI)
mlngXb(intI) = mlngXb(intI) + mlngDx2(intI)
mlngYa(intI) = mlngYa(intI) + mlngDy1(intI)
mlngYb(intI) = mlngYb(intI) + mlngDy2(intI)
ForeColor = mlngColorNum(intI)
Else
ForeColor = mlngColorNum(0)
End If
Select Case mlngActionType
Case 1
Line (mlngXa(intI), mlngYa(intI))- _
(mlngXb(intI), mlngYb(intI))
Line (-mlngXa(intI), -mlngYa(intI))- _
(-mlngXb(intI), -mlngYb(intI))
Line (-mlngXa(intI), mlngYa(intI))- _
(-mlngXb(intI), mlngYb(intI))
Line (mlngXa(intI), -mlngYa(intI))- _
(mlngXb(intI), -mlngYb(intI))
Case 2
Line (mlngXa(intI), mlngYa(intI))- _
(mlngXb(intI), mlngYb(intI)), , B
Line (-mlngXa(intI), -mlngYa(intI))- _
(-mlngXb(intI), -mlngYb(intI)), , B
Line (-mlngXa(intI), mlngYa(intI))- _
(-mlngXb(intI), mlngYb(intI)), , B
Line (mlngXa(intI), -mlngYa(intI))- _
(mlngXb(intI), -mlngYb(intI)), , B
Case 3
Circle (mlngXa(intI), mlngYa(intI)), _
mlngXb(intI)
Circle (-mlngXa(intI), -mlngYa(intI)), _
mlngXb(intI)
Circle (-mlngXa(intI), mlngYa(intI)), _
mlngXb(intI)
Circle (mlngXa(intI), -mlngYa(intI)), _
mlngXb(intI)
Case 4
Line (mlngXa(intI), mlngYa(intI))- _
(mlngXb(intI), -mlngYb(intI))
Line -(-mlngXa(intI), -mlngYa(intI))
Line -(-mlngXb(intI), mlngYb(intI))
Line -(mlngXa(intI), mlngYa(intI))
Case 5, 6
If mlngActionType = 5 Then
Line (mlngXa(intI), mlngYa(intI))- _
(mlngXb(intI), mlngYb(intI)), _
BackColor
Else
Line (mlngXa(intI), mlngYa(intI))- _
(mlngXb(intI), mlngYb(intI)), _
BackColor, B
End If
If mlngXai <= -mlngXmax Then
mlngDx1(0) = mlngInc * Rnd + 1
End If
If mlngXbi <= -mlngXmax Then
mlngDx2(0) = mlngInc * Rnd + 1
End If
If mlngYai <= -mlngYmax Then
mlngDy1(0) = mlngInc * Rnd + 1
End If
If mlngYbi <= -mlngYmax Then
mlngDy2(0) = mlngInc * Rnd + 1
End If
If mlngXai >= mlngXmax Then
mlngDx1(0) = -mlngInc * Rnd + 1
End If
If mlngXbi >= mlngXmax Then
mlngDx2(0) = -mlngInc * Rnd + 1
End If
If mlngYai >= mlngYmax Then
mlngDy1(0) = -mlngInc * Rnd + 1
End If
If mlngYbi >= mlngYmax Then
mlngDy2(0) = -mlngInc * Rnd + 1
End If
mlngXai = mlngXai + mlngDx1(0)
mlngXbi = mlngXbi + mlngDx2(0)
mlngYai = mlngYai + mlngDy1(0)
mlngYbi = mlngYbi + mlngDy2(0)
mlngXa(intI) = mlngXai
mlngXb(intI) = mlngXbi
mlngYa(intI) = mlngYai
mlngYb(intI) = mlngYbi
If mlngActionType = 5 Then
Line (mlngXa(intI), mlngYa(intI))- _
(mlngXb(intI), mlngYb(intI))
Else
Line (mlngXa(intI), mlngYa(intI))- _
(mlngXb(intI), mlngYb(intI)), , B
End If
End Select
Next intI
End Sub
9. 总结
通过对彩票应用和屏幕保护程序的开发分析,我们可以看到以下关键技术点:
-
随机数生成
:使用自定义的
Random
类模块扩展了 Visual Basic 内置随机数生成器的序列长度,确保随机数的质量和可重复性。
-
图形动画
:利用
Form_Paint
事件和定时器实现了图形的连续绘制和更新,呈现出动态的效果。
-
系统交互
:解析系统命令行参数,处理不同的启动模式(如预览模式、全屏模式),并与系统注册表进行读写操作,实现用户设置的保存和读取。
以下是一个总结表格,对比彩票应用和屏幕保护程序的关键信息:
| 应用类型 | 核心功能 | 关键技术 | 主要代码模块 |
| ---- | ---- | ---- | ---- |
| 彩票应用 | 模拟彩票抽奖,统计中奖情况 | 随机数生成,选球逻辑,模拟购买 | LOTTERY.FRM,RANDOM.CLS |
| 屏幕保护程序 | 显示图形动画,支持预览和全屏模式 | 图形绘制,系统参数解析,注册表读写 | MYSAVER.BAS,MYSAVER.FRM,MYSETUP.FRM |
通过学习这些应用的开发,我们可以掌握随机数生成、图形动画、系统交互等多方面的技术,为开发更复杂的应用打下基础。
以下是彩票应用和屏幕保护程序的功能流程 mermaid 图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{应用类型}:::decision
B -->|彩票应用| C(初始化):::process
C --> D(点击 Next Ball 选球):::process
D --> E{是否选满 6 个球}:::decision
E -->|否| D
E -->|是| F(模拟购买 1000 张彩票):::process
F --> G(显示统计结果):::process
B -->|屏幕保护程序| H(解析命令行参数):::process
H --> I{参数类型}:::decision
I -->|/P| J(预览模式设置):::process
I -->|/C| K(打开设置表单):::process
I -->|/A| L(提示无密码):::process
I -->|/S| M(全屏显示):::process
I -->|其他| N(退出):::process
J --> O(绘制预览图形):::process
M --> P(绘制全屏图形):::process
O --> Q(处理用户交互):::process
P --> Q
Q --> R{是否退出}:::decision
R -->|是| N
R -->|否| O
通过以上的详细分析和总结,我们对彩票应用和屏幕保护程序的开发有了更深入的理解,希望这些内容能为开发者提供有价值的参考。
超级会员免费看
8万+

被折叠的 条评论
为什么被折叠?



