CorelDRAWでマクロを利用するためのドキュメント「6.3 - Providing user interaction for macros」の和訳です。
あなたのマクロ・ソリューションをより操作しやすくする1つの方法は、マウス入力のような、ユーザーとの対話処理を最適化することです。マウス動作を捕えるマクロは、そのマクロの結果で、ユーザーにリアルタイム影響を与えます。
CorelDRAWとCorel DESIGNERオブジェクト・モデルは、ユーザーからマウス入力を受け取るために、3つの主要な方法を提供します。次のトピックで説明されるように:
- マウス・クリックをキャプチャする
- マウス・ドラッグをキャプチャする
- 座標をキャプチャする
マウス・クリックをキャプチャする
Capturing mouse clicks
一つのマウス・クリックの位置を取得するために、あなたは、DocumentクラスのGetUserClickメソッドを使用することができます。このメソッドは、指定された時間が経過するまでマクロを一時停止します。あるいは、ユーザーが、文書内でクリックするまで、あるいは、Escキーを押します。Document.GetUserClickメソッドを使用するVBAの例を次に示します。:
Dim doc As Document, retval As Long
Dim x As Double, y As Double, shift As Long
Set doc = ActiveDocument
doc.Unit = cdrCentimeter
retval = doc.GetUserClick(x, y, shift, 10, True, cdrCursorPick)
前述の例には、Document.GetUserClickメソッドの次のパラメーターが、コード化されています。:
- 変数xは、マウス・クリックの水平位置を返します。
- 変数yは、マウス・クリックの垂直位置を返します。
- パラメーターshiftは、ユーザーが、マウスをクリックしたときに押される、Shift、CtrlとAltキーの組合せを返します。Shift、CtrlとAltキーには、それぞれ1、2、および4の値が割り当てられ、合計が戻り値です。
- 値10は、ユーザーが、文書をクリックする秒数を指定します。
- 値Trueは、SnapToObjectsパラメータが有効であることを示しています。
- 値cdrCursorPickは、選択ツールのアイコンが、カーソル・アイコンに使用されることを指定します。(あなたは、カスタム・アイコンを使用することができません。)
次の値のいずれかが、返されます。:
- 0 -ユーザーは、クリックを正常に完了しています。
- 1 -ユーザーは、Escキーを押してキャンセルします。
- 2 -操作が、タイムアウトしました。
返られた座標は、ページの開始点に対する相対値です。そして、明示的に指定されない限り、文書単位です。
返されたクリック点の下で形状を取得するために、以下のVBAの例のように、あなたは、(Pageのメンバーの)SelectShapesAtPointメソッドを使用することができます。:
doc.ActivePage.SelectShapesAtPoint x, y, True
値が、Trueの場合、塗りつぶされていないオブジェクトが選択し、Falseは、塗りつぶされていないオブジェクトを選択しません。
マウス・ドラッグをキャプチャする
Capturing mouse drags
マウス・ドラッグ(や領域や長方形)の位置を取得するために、あなたは、文書クラスのGetUserAreaメソッドを使用することができます。このメソッドは、指定された時間が経過する、あるいは、ユーザーが、文書をクリック、ドラッグ、離す、あるいは、Escキーを押すまで、マクロを一時停止します。Document.GetUserAreaメソッドを使用するVBAの例を次に示します。:
Dim doc As Document, retval As Long, shift As Long
Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
Set doc = ActiveDocument
doc.Unit = cdrCentimeter
retval = doc.GetUserArea(x1, y1, x2, y2, shift, 10, True, cdrCursorExtPick)
ActivePage.SelectShapesFromRectangle x1, y1, x2, y2, False
- 前述の例には、Document.GetUserAreaメソッドの次のパラメータが、コード化されています。:
- 変数x1とy1は、(それぞれ)領域の左上角の水平および垂直位置を返します。
- 変数x2とy2は、(それぞれ)領域の右下角の水平および垂直位置を返します。
- パラメーターshiftは、ユーザーが、マウスをドラッグするときに押したままにするShift、Ctrl、そして、Altキーの組合せを返します。Shift、CtrlとAltキーには、それぞれ1、2、および4の値が割り当てられ、合計が戻り値です。
- 値10は、ユーザーが、文書をクリックする秒数を指定します。
- 値Trueは、SnapToObjectsパラメータが有効であることを示しています。
- 値cdrCursorExtPickは、カーソルの使用するアイコンを指定します。
前述の例では、コードは、Page.SelectShapesFromRectangleメソッドを使用することで、領域内に完全に収まる形状を選択することで終了します。
次の値のいずれかが、返されます。:
- 0 -ユーザーは、選択を正常に完了しています。
- 1 -ユーザーは、Escキーを押してキャンセルします。
- 2 -操作が、タイムアウトしました。
このメソッドは、長方形の角として解釈される2つの点を返します。しかしながら、2つの点は、マウス・ドラッグの始点と終点としても使用することができます。
返される座標は、ページの原点に相対的であり、明示的に指定されない限り、ドキュメント単位です。
座標をキャプチャする
Capturing coordinates
マウス操作をキャプチャするとき、あるいは、複雑なマクロ・ソリューションを開発するとき、画面座標とドキュメント座標の間で変換したい場合があります。この変換は、WindowクラスのScreenToDocumentとDocumentToScreenメソッドを使用して行われます。
次のVBAの例は、アクティブ・ウィンドウに表示される画面座標の設定を文書の点に変換します。:
Dim docX As Double, docY As Double
ActiveDocument.Unit = cdrMillimeter
ActiveWindow.ScreenToDocument 440, 500, docX, docY
次のVBAの例は、画面に表示される文書内の点の画面座標を返します。:
Dim screenX As Long, screenY As Long
ActiveDocument.Unit = cdrMillimeter
ActiveWindow.DocumentToScreen 40, 60, screenX, screenY
両方の例では、変換された座標は、最後の2つのパラメータで返されます。
画面座標は、画面の左上隅から始まるため、正のy値は、画面の下にありますが、負のy値は、画面の上にあります。
Shape.IsOnShapeメソッドを使用することで、一組の座標(つまり、点)が、曲線の内側、外側、または輪郭上にあるかどうかをテストできます。一組の文書座標のために、このメソッドは、次のいずれかを返します。:
- cdrInsideShape - 座標が、形状の内側にある場合、
- cdrOutsideShape - 座標が、形状の外側にある場合、
- cdrOnMarginOfShape - 座標が、形状の輪郭上、あるいは、近くにある場合、
たとえば、次のVBAコードは、点(4、6)が、アクティブな形状に関連する場所をテストします。:
Dim onShape As Long
ActiveDocument.Unit = cdrInch
onShape = ActiveShape.IsOnShape(4, 6)