|
こんにちは
フォームの形を変えるのはやったこと無いので、残りを。
PSETや、LINEは、APIを使います。
ユーザーフォームを1つ作って、ユーザーフォームのモジュールに下記コードを
コピペして下さい。
Option Explicit
Private Declare Function GetDC Lib "user32.dll" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" _
(ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetActiveWindow Lib "user32.dll" () As Long
Private Declare Function SetPixelV Lib "gdi32.dll" _
(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Private Declare Function CreatePen Lib "gdi32.dll" _
(ByVal fnPenStyle As Long, ByVal nWidth As Long, _
ByVal crColor As Long) As Long
Private Const PS_solid = 0 '実線
Private Const PS_DASH = 1 '破線
Private Const PS_DOT = 2 '点線
Private Const PS_DASHDOT = 3 '一点鎖線
Private Const PS_DASHDOTDOT = 4 '二点鎖線
Private Const PS_NULL = 5 '非表示
Private Const PS_INSIDEFRAME = 6 '塗りつぶし
Private Declare Function DeleteObject Lib "gdi32.dll" _
(ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" _
(ByVal hdc As Long, ByVal hgdiobj As Long) As Long
Private Declare Function MoveToEx Lib "gdi32.dll" _
(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, _
ByVal lpPoint As Long) As Long
Private Declare Function LineTo Lib "gdi32.dll" _
(ByVal hdc As Long, ByVal nXEnd As Long, ByVal nYEnd As Long) As Long
Private hwnd As Long
Private Sub UserForm_Activate()
hwnd = GetActiveWindow 'ウインドウハンドル取得
If hwnd = 0 Then
MsgBox "エラーです"
Unload Me
End If
End Sub
Private Sub UserForm_Click()
Dim hdc As Long
Dim hpen As Long
Dim hpenSave As Long
Dim col As Long
col = RGB(255, 0, 0) '色コード
hdc = GetDC(hwnd) 'デバイスコンテキストを取得
hpen = CreatePen(PS_solid, 5, col) 'ペンを作成 5は太さ
hpenSave = SelectObject(hdc, hpen) 'デバイスコンテキストに作成したペンを選択と共に、元のペンを記憶しておく
MoveToEx hdc, 0, 0, 0 '書き始めに移動
LineTo hdc, Me.Width / 0.75, Me.Height / 0.75 '線を引く
SelectObject hdc, hpenSave 'デバイスコンテキストのペンを元に戻す
DeleteObject hpen '作成したペンを削除
ReleaseDC hwnd, hdc 'デバイスコンテキストを開放(削除してはダメ)
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim hdc As Long
Dim col As Long
If Button = 2 Then
hdc = GetDC(hwnd) 'デバイスコンテキストを取得
col = RGB(0, 0, 255) '色コード
SetPixelV hdc, X / 0.75, Y / 0.75, col '指定位置に点を書く
ReleaseDC hwnd, hdc 'デバイスコンテキストを開放
End If
End Sub
ユーザーフォームを表示して、ユーザーフォームをクリックすると
赤い斜めの線が引かれます。(芸がない^^;)
MovoToExとLineToのサンプルです。
ユーザーフォームを右ボタン押してドラッグすると、なぞったところに
青い点が引かれます。(SetPixcelVのサンプル)
座標系はピクセルなので、フォームのポイント座標の0.75倍だそうです。
Windowsのオブジェクトを操作することになるので、
作成したオブジェクトをDeleteしなかったり、
オブジェクトをSelectObjectしたままで、元のオブジェクトに戻さなかったり、
Getしたデバイスコンテキストを開放すべきところを削除してしまったり、
してしまうと、Windowsが不安定になる恐れがありますので、
各関数の使い方をしっかり勉強して、
クラッシュしてもよい環境で実験して下さい。
API関数のリファレンスは、こちらが参考になります。
http://www.geocities.jp/winapi_database/
また、関数名でweb検索すると、使用例などがたくさんでてきます。
|
|