解説ページへ戻る


ベジェ曲線を使ったスクリーンセーバー

完成版の全コードと変更すべきプロパティなど


ここで掲載しているコードはほぼ解説どおりのコードですが、1部コードの順番などが変えてある部分もあります。これはコードを少しでも読みやすくしようとの配慮で、その動作や機能は解説しているものとまったく同じです。

なお、このコードは、リソースエディタが利用できる状況にある人を想定しています。もしリソースエディタが利用できない状況にある人は '▼マウスポインタを透明にする の直後の1行をコメントアウトして、さらにその下の1行のコメントをはずしてください。

 

標準モジュールの全コード

Option Explicit

Private Declare Function GetWindowRect 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 SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_CHILD = &H40000000
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type

Public PlayMode As String
Private Sub Main()

    Dim Opt As String           'コマンドラインを格納します。
    Dim ParentWnd As Long       'プレビュー時の親ウィンドウのハンドル
    Dim Style As Long
    Dim PreviewRect As RECT
    Dim Ret As Long
   
    '▼コマンドラインの取得
    Opt = Left(LTrim(Command), 2)

    Select Case Opt
        Case "/A", "/a"     '●パスワードチェックモード
           
        Case "/C", "/c"     '●設定モード
           
            MsgBox "自作スクリーンセーバー" & vbCrLf & vbCrLf & _
                    "提供 VISUAL BASIC中学校"
       
        Case "/P", "/p"     '●プレビューモード
           
            frmScreen.Caption = "SCREEN BY PREVIEW"
            PlayMode = "P"
           
            '▼プレビュー領域のハンドルを取得
            ParentWnd = Val(Mid(Command, 4))
           
            '▼プレビュー領域の座標を取得
            Call GetWindowRect(ParentWnd, PreviewRect)
   
            '▼フォームのサイズをプレビュー領域のサイズに合わせる。
            frmScreen.Left = 0
            frmScreen.Top = 0
            frmScreen.Width = (PreviewRect.Right - PreviewRect.Left) * Screen.TwipsPerPixelX
            frmScreen.Height = (PreviewRect.Bottom - PreviewRect.Top) * Screen.TwipsPerPixelY
       
            '▼フォームをプレビュー領域の子ウィンドウにする。
            Style = GetWindowLong(frmScreen.hwnd, GWL_STYLE)
            Ret = SetWindowLong(frmScreen.hwnd, GWL_STYLE, Style Or WS_CHILD)
            Ret = SetParent(frmScreen.hwnd, ParentWnd)
       
            '▼フォームを表示
            frmScreen.Show
           
        Case "/S", "/s"     '●通常モード
           
            '▼2重起動の防止
            If FindWindow(vbNullString, "SCREEN BY NORMAL") <> 0 Then End
            frmScreen.Caption = "SCREEN BY NORMAL"
            PlayMode = "S"
           
            '▼マウスポインタを透明にする
            frmScreen.MouseIcon = LoadResPicture(101, vbResCursor)
'frmScreen.MouseIcon = LoadPicture(App.Path & "\TransMs.Cur")
            frmScreen.MousePointer = 99
   
            '▼フォームを最大化して表示
            frmScreen.WindowState = 2
            frmScreen.Show
           
    End Select

End Sub
 

 

フォームの全コード

Option Explicit

Private Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As POINTAPI, ByVal cPoints As Long) As Long

Private Type POINTAPI
    X As Long
    Y As Long
End Type
'■BezierDance
'■機能  フォーム上にベジェ曲線を延々と描画する。

Private Sub BezierDance()

    Dim K As Integer
    Dim M As Integer
    Dim L As Integer
    Dim Pnt(3) As POINTAPI
    Dim Target As Integer
    Dim WaitTime As Single
    Dim RecTime As Single
    Dim XDistance As Long
    Dim YDistance As Long
   
    WaitTime = 0.01
  
    Do
   
    For M = 0 To 3
        Pnt(M).X = Randome(0, ScaleWidth \ 2)
        Pnt(M).Y = Randome(0, ScaleHeight \ 2)
    Next M
   
    Pnt(0).X = 0
    Pnt(0).Y = 0
    Pnt(3).X = ScaleWidth
    Pnt(3).Y = ScaleHeight
   
    For L = 1 To 100
   
        Me.ForeColor = RGB(255 - L, 255 * (L / 100), 255 * (L / 50))
       
        Target = Target + 1
        If Target = 3 Then Target = 1
        With Pnt(Target)
       
        '▼点の移動距離をランダムで決める
        XDistance = Randome(-20, 20)
        YDistance = Randome(-20, 20)
       
        For K = 1 To 40
           
            DoEvents   'これがないと描画中にイベントが発生しないので終了できない。
 
            '▼点の移動
            .X = .X + XDistance
            .Y = .Y + YDistance
       
            '▼画面から点がはみ出さないような配慮
            If .X > ScaleWidth Or .X < 0 Then XDistance = -XDistance
            If .Y > ScaleHeight Or .Y < 0 Then YDistance = -YDistance
       
            Call PolyBezier(Me.hdc, Pnt(0), 4)
           
            '▼時間をつぶす
            RecTime = Timer
            Do Until Timer - RecTime > WaitTime
                DoEvents
            Loop
   
        Next K
        End With
   
    Next L
   
    frmScreen.Cls
    Loop
   
End Sub
'■Randome
'■機能  指定された範囲でランダムな整数を生成する。
'■引数  Min     範囲の最小値
'■   Max     範囲の最大値
'■戻り値    生成されたランダムな整数

Private Function Randome(Min As Long, Max As Long) As Long

    Randomize
    Randome = Fix(Rnd() * (Max - Min + 1)) + Min

End Function
Private Sub Form_Click()

    If PlayMode = "S" Then End

End Sub
Private Sub Form_Paint()

    BezierDance
   
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

    If PlayMode = "S" Then End

End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Static IsSecond As Boolean  '初回は何もせず終了するためのフラグ
    Static LastX As Long        '前回のマウスのX座標を記録
    Static LastY As Long        '前回のマウスのY座標を記録
   
   
    If IsSecond = False Then        '初回は何もせずに終了
        LastX = X
        LastY = Y
        IsSecond = True
    Else
        If
PlayMode = "S" Then      '通常モードで一定距離以上動いていたら終了
            If Abs(X - LastX) > 10 And Abs(Y - LastY) > 10 Then
                End
            Else

                LastX = X
                LastY = Y
            End If
        End If
    End If

End Sub
Private Sub Form_Unload(Cancel As Integer)

    End

End Sub
 

 

変更すべきプロパティ

 

フォーム

オブジェクト名

frmScreen

BackColor

&H00000000&

BorderStyle

0 - なし

KeyPreview

True

ScaleMode

3 - ピクセル

 

その他変更すべき点

 

1.スタートアップの設定

内容:スタートアップを    Sub Main    にする。

その方法:

1.[プロジェクト]メニューをクリック

2.[Project1のプロパティ]をクリック

3.[全般]タブをクリック

4.「スタートアップの設定」欄で    Sub Main    を選択する

5.「OK」ボタンをクリック

2.透明なマウスアイコンの用意

内容:透明なマウスアイコンを用意する。

その方法:

@リソースエディタが利用できる場合の方法

1. TransMs.curをダウンロード

2.[アドイン]メニューをクリック

3.「リソースエディタ」を選択してロード

4.リソースエディタのアイコンをクリックして起動

5.マウスポインタを追加するアイコンをクリック

6.TransMs.curを選択

7.IDが 101 になっていることを確認。

Aリソースエディタが利用できない場合の方法

1. TransMs.curをダウンロードする

2.プロジェクトを保存する

3.プロジェクトの保存先と同じフォルダにTransMs.curを配置する

 

コンパイル後の注意点

 

・生成されるファイルの拡張子を scr にする。

・scrファイルをWindowsフォルダに配置する。