- サマリ: マウスクリックハンドラに関して
- 環境: Basic
- 状態: 解決
- 投稿者: YON?
- 投稿日: 2011-09-12 (月) 14:58:22
質問 
いつもお世話になっています。
OOobbs3/65と重複しているのですがよろしくお願いします。
現在CALCのシートに複数のプッシュボタンを配置して、マクロの処理を行っているのですが、
マウスを左クリックした際に、プッシュボタンの上であれば、マクロを実行するみたいなことは可能でしょうか?
例えば、マウスクリックハンドラでクリックした座標を取得し、その座標位置がプッシュボタンの配置している座標内であれば、ボタンに該当するマクロを実行…といった感じです。
プッシュボタンにイベントを割り当てれば早いのですが、上記の方法で実現できればと思い質問しました。
わかる方がいらっしゃればお願いします。
回答 
- ハンドラを register するためにはイベントまたは手動でのマクロの実行が必要です。その機会があるのであればボタンにマクロをコードで割り当てることも出来ます。マクロを割り当てたボタンのあるドキュメントを頻繁に作成する必要があるならテンプレートを利用するべきです。
ハンドラからのコールバックの位置からドキュメント上位置に変換するには、ドキュメントのフレームから ComponentWindow を取得、getWindows メソッドでコンポーネント内に含まれるウィンドウを取得します。そのうちのシートのセルが表示されている部分探し出し、そのウィンドウ内に表示されているセル範囲アドレスと比較することでウィンドウ上の座標とドキュメント内の座標の相関が決まります。
- 回答ありがとうございます。ちょっと難しそうですが試してみます。 -- YON
- ちょっと気が向いたのでマウスのクリックハンドラでクリックされた位置をドキュメントの座標に無理やり変換してみました。pixel 単位で正しく変換できているようです。まぁ、accessibility API でドキュメント部分のウィンドウのサイズを取得していますが・・・。 -- はにゃ?
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| | # python
def _find_ac_child(self, ac, role):
""" find specific accessible child by its role. """
a = None
for i in range(ac.getAccessibleChildCount()):
if ac.getAccessibleChild(i).\
getAccessibleContext().getAccessibleRole() == role:
a = ac.getAccessibleChild(i)
break
return a
def _get_document_area_size(self, comp_win):
""" get document area, role 40. """
wins = comp_win.getWindows()
for win in wins:
if win.getAccessibleContext().getAccessibleRole() == 40: # panel
ac = win.getAccessibleContext()
ac2 = ac.getAccessibleChild(0).getAccessibleContext()
doc_ac = self._find_ac_child(ac2, 13) # document
if doc_ac:
return doc_ac.getSize()
break
def mouseReleased(self, ev):
try:
controller = self.doc.getCurrentController()
comp_win = controller.getFrame().getComponentWindow()
# size of the document area
doc_size = self._get_document_area_size(comp_win)
# maybe error
if doc_size is None:
return False
comp_width = doc_size.Width
comp_height = doc_size.Height
# visible area size in document coordinate
vis_rect = controller.VisibleArea # shown size of area
view_width = vis_rect.Width
view_height = vis_rect.Height
fw = view_width / float(comp_width)
fh = view_height / float(comp_height)
print(ev.X, 2259, ev.X * fw)
except Exception as e:
print(e)
#if ev.Buttons == MB_LEFT:
# threading.Thread(target=self._show_popup).start()
return False
|
感想,コメント,メモ 