前の関連記事:Calc(67)AccessibleWindowの位置と大きさを取得するマクロ
コントローラに追加したXEnhancedMouseClickHandlerでXYを取得するマクロ
EnhancedMouseClickHandlerPosition.ods
このCalcドキュメントのシートをダブルクリックするとピクセル単位で値を出力したダイアログが出現します。
point = componentwindow.convertPointToLogic(Point(X=enhancedmouseevent.X, Y=enhancedmouseevent.Y), MeasureUnit.APPFONT) # EnhancedMouseClickHandlerの座標をmaに変換。 # コントロールダイアログの左上の座標を設定。 dialogX = point.X dialogY = point.Yダイアログの左上角がXEnhancedMouseClickHandlerの引数のEnhancedMouseEvent StructのXとYになるようにしています。
このマクロではコントロールダイアログをma単位で作成しているので、ピクセルをMap AppFontに変換しています(LibreOffice5(136)Map AppFont (ma)とピクセルと1/100mmの変換参照)。
コントロールダイアログの位置の原点はドキュメントウィンドウの左上角、つまりCalc(65)フレームとコントローラの位置でいうところのフレームの左上角です。
なのでシート上でクリックした点にダイアログを出現させようと思うと、 EnhancedMouseEvent StructのXYをフレームの左上角が原点の座標に変換しないといけません。
しかしシートを分割した時はそれは困難であることがわかりました。
EnhancedMouseEvent StructのXYの原点は見えている左上セルの左上角
A1セルをダブルクリックするとドキュメントのウィンドウの左隅の位置にダイアログが出現します。
EnhancedMouseEvent StructのXYはA1セルの左上角が原点になっていることがわかります。
シートをスクロールしてB19セルが左上に来るようにして、ダブルクリックするとEnhancedMouseEvent StructのXYは今度はB19セルの左角が原点になっていました。
EnhancedMouseEvent Structから取得できるXYは表示されているシート上の左上セルの左上角が原点になっていることがわかりました。
ウィンドウの分割をするとクリックした枠に見えている左上セルの左上角が原点になる
ウィンドウを4分割して右下の枠内をダブルクリックするとEnhancedMouseEvent StructはのXYはクリックした枠の左上セルの左上角が原点になっていました。
行と列を固定したときも同様に各枠の左上角からの相対位置が返ってきました。
クリックした位置にダイアログを表示させようと思うとクリックした点のドキュメントウィンドウに対するXYを取得しないといけません。
しかし、EnhancedMouseEvent StructのSourceにはNoneしか返ってこないので(Calc(27)ドキュメント内のすべてのシートでクリックを補足する )、クリックした点がどの枠に存在するのかを知るには情報不足です。
そのためシートを分割した時はフレームの左上角を原点とする座標への変換は困難であることがわかりました。
セルのPositionプロパティでのXYの原点はA1セルの左上角
このマクロで表示するダイアログの2行目のTargetのXとYはダブルクリックしたセルのPositionプロパティの値のPoint StructのXYです。
セルのPositionプロパティはセルの左上角の位置を示していますが、単位は1/100mmですので、ピクセルに変換してダイアログに表示しています。
EnhancedMouseEvent StructのXYが見えている左上セルの左上角が原点になっているのに対して、セルのPositionプロパティのXYは見えていなくても常にA1セルの左上角が原点になっていました。
この1/100mm単位とピクセル単位の変換は誤差が大きいので座標として使うのは難しいです(Calc(65)フレームとコントローラの位置)。
0 件のコメント:
コメントを投稿