場合によっては、VB を使用してテスト データ描画処理プログラムを迅速に開発する必要があります。描画コントロールのマウス カーソルを AutoCAD ソフトウェアで使用される大きな十字カーソルの形に変更すると、通常の矢印カーソルよりも良い結果が得られます。では、このような大きな十字カーソルを実装するにはどうすればよいでしょうか?
----まず、達成したい効果を明確にしましょう。Picture コントロールに描画すると、マウスがこのコントロールに移動すると、マウス カーソルがすぐに大きな十字形に変わり、水平線が表示されます。カーソルがコントロールの左境界線から右境界線に変わり、垂直線がコントロールの上境界線から下境界線に進みます。つまり、大きな十字カーソルが描画コントロールを 4 つの象限に分割します。マウスがコントロールの外に移動すると、カーソルは元の形に戻ります。
----そのようなカーソルを実装するには、線を引いて自分で行う必要があります。マウスが描画コントロール内にある場合は、マウスの位置が移動すると、最初にカーソルの水平線と垂直線を描画し、最初にカーソルの元の水平線と垂直線を消去してから、水平線を描画します。新しい位置にカーソルの線と垂直線がある場合は、描画コントロールの MouseMove イベントに応答する必要があります。もちろん、描画コントロールの内容に関係なく、カーソル線を消去してカーソル線を再描画するときに元のコンテンツを破壊することはできません。そのため、描画コントロールの DrawMode を vbXorPen (XOR モード) に設定する必要があります。カーソルの水平線を描画します。 垂直線を追加する場合は、XOR を使用して水平線と垂直線を結合します。ピクセルの色は、カーソルの色と元のピクセルの色の XOR 値に設定され、XOR 法を使用して同じ位置に縦線と横線が描画され、横線と縦線上のピクセルが再度描画されます。カーソルの色と XOR 演算を行うと、カーソルの水平線と垂直線が消去され、描画コントロールの元の内容が復元されます。
----マウスが描画コントロール内に移動すると、通常のマウス カーソルが消え、描画された大きな十字カーソルのみが表示されるようにする必要もあります。そのため、描画コントロールの MousePointer プロパティも vbCuntom に設定する必要があります。ユーザー定義です。描画コントロールの MousePointer プロパティを vbCustom に設定した後、対応するユーザー定義グラフィックスを MouseIcon プロパティにロードする必要があります。描画コントロールには描画するカーソルのみが含まれ、他のカーソルは含まれないことが望ましいため、空の (透明) カーソル グラフィックス。カーソル ファイルを見つけて、リソース エディターで編集し、カーソル グラフィック全体を透明な方法で塗りつぶし、必要な NoIcon.cur として保存します。
----上記のキー設定と操作により、大きな十字カーソルを実現できます。 XOR メソッドを使用して描画すると、一般的な描画ソフトウェアでよく見られる「ラバー バンド」効果も実現できます。つまり、マウスを使用して点を定義した後、動的にマウスをドラッグして別の点を定義します。マウスをドラッグすると描画点が変化し、それに合わせてグラフィックスも動的に変化します。
---- 以下では、描画コントロールに大きな十字カーソルを完全に実装する例を使用し、「ゴムバンド」効果を使用して四角形を描画する方法も示します。
----VBで新しい標準EXEプロジェクトを作成し、Form1にPictureコントロールを追加し、その名前をPicDrawに設定します。PicDrawのサイズとその中の画像のサイズは、基本的にほとんどをカバーできます。 Form1 で十分です。実装コードは以下の通りです。このプログラムはVB5.0で動作します。
オプション明示的
PRivateOld_XAsSingle
プライベートOld_YAsSingle
PrivateisMouseDownAsBoolean
PrivateBox_X0AsSingle
PrivateBox_Y0AsSingle
PrivateBox_X1AsSingle
PrivateBox_Y1AsSingle
プライベートペン色長さ
プライベートクロスカラーアズロング
PrivateSubForm_Load()
クロスカラー=QBカラー(8)
ペンカラー=QBカラー(15)
picDraw.DrawMode=vbXorPen
picDraw.MouseIcon=LoadPicture
(App.Path&"/no.cur")
picDraw.MousePointer=vbCustom
isMouseDown=False
ボックス_X0=ボックス_X1=ボックス_Y0=ボックス_Y1=0
EndSub
PrivateSubpicDraw_MouseDown
(ButtonAsInteger,
ShiftAsInteger、XAsSingle、YAsSingle)
IfisMouseDown=TrueThen
'点はマウスで事前に定義されています
ボックス_X1=X
ボックス_Y1=Y
isMouseDown=False
picDraw.DrawMode=vbCopyPen
picDraw.Line(Box_X0,Box_Y0)-
(ボックス_X1,ボックス_Y1),
ペンカラー、B
picDraw.DrawMode=vbXorPen
'カーソルを描く
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
クロスカラー
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
クロスカラー
旧_X=X
旧_Y=Y
それ以外
'四角形の最初の頂点を定義し、カーソルを消去します
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
クロスカラー
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
クロスカラー
ボックス_X0=X
ボックス_Y0=Y
isMouseDown=True
EndIf
EndSub
PrivateSubpicDraw_MouseMove(ButtonAsInteger,
ShiftAsInteger、XAsSingle、YAsSingle)
IfisMouseDown=TrueThen
' マウスをドラッグして長方形の別の頂点を定義します。
この時点で、前の四角形を消去し、新しい四角形を描画します
picDraw.Line(Box_X0,Box_Y0)-(Old_X,Old_Y),
ペンカラー、B
picDraw.Line(Box_X0,Box_Y0)-(X,Y),PenColor,B
それ以外
'古いカーソル行を消去
picDraw.Line(0,Old_Y)-(picDraw.ScaleWidth,Old_Y),
クロスカラー
picDraw.Line(Old_X,0)-(Old_X,picDraw.ScaleHeight),
クロスカラー
'新しいカーソル線を描画します
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
クロスカラー
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
クロスカラー
EndIf
旧_X=X
旧_Y=Y
EndSub->