高度な技

目次


[目次] [はじめに] [入門] [基本] [高度] [画面] [困った] [おわりに]

マウスの使用

マウスからの入力待ち

      integer*4 events
      integer*4 keystate
      integer*4 x, y
      integer*4 result
c
c     ***** 左右ボタンのダブルクリック待ち *****
      events = MOUSE$RBUTTONDBLCLK .or. MOUSE$LBUTTONDBLCLK
      result = WAITONMOUSEEVENT(events, keystate, x, y)
c
c     ***** 結果のチェック *****
      if (result .eq. MOUSE$RBUTTONDBLCLK) then
        write(*,*) '右ボタンがダブルクリックされました'
      else if (result .eq. MOUSE$LBUTTONDBLCLK) then
        write(*,*) '左ボタンがダブルクリックされました'
      else
        write(*,*) 'Bad event'
      endif
c
c     ***** 同時に押されているボタン・キーのチェック *****
      if ((keystate .and. MOUSE$KS_RBUTTON) .eq. MOUSE$KS_RBUTTON) then
        write(*,*) '右ボタンが押されています'
      endif
      if ((keystate .and. MOUSE$KS_SHIFT) .eq. MOUSE$KS_SHIFT) then
        write(*,*) 'SHIFT キーが押されています'
      endif
c
c     ***** マウスポインタの座標 *****
      write(*,*) 'ポインタの位置は (', x, ',', y, ') です'

マウスからの特定のイベント(入力)を取得します。 上の例では、右ボタンまたは左ボタンがダブルクリックされるまで プログラムが中断します。 そして指定したイベントのうち、 どれが発生したかが result に返されます。 イベントの指定方法と結果の確認方法は上のサンプルを見てください。 指定できるイベントは以下の通りです。

keystate にはイベント発生時に同時に押されていた ボタンまたはキーが記録されます。 確認方法は上のサンプルを見てください。 対象となるものは以下の通りです。

x, y にはイベント発生時のマウスポインタの座標が記録されます。

マウスのイベントは画面毎に別個に扱われます。 WAITONMOUSEEVENT はその時点で アクティブだった画面からの イベントのみを待ち、他の画面からのイベントは無視します。 したがって、複数の画面からの入力を同時に待つことはできません。 どの画面からの入力にも対応できるプログラムを作成したい場合は、 次節で述べる手法を使用する必要があります。

マウスからの入力に応答する関数の登録

疲れたのでやめます。 [Programmer's Guide → Using QuickWin → Customize QuickWin Applications → Using a Mouse → Event-Based Functions] を参照してください。

パレットの変更

      integer*4 index
      integer*4 color
      integer*4 result
      index = 120
      color = #00FFFF
      result = REMAPPALETTERGB(index, color)

上記の例は、 色番号 120 に対し黄色を割り当て、 結果を result に返しています。 result は成功のとき 0、失敗のとき -1 となります。

色番号は 0 から 255 まで使用できます。 0 から 15 まではあらかじめ標準的な色が設定されていますが、 自分で変更することも可能です (でもおすすめはしません)。

ここで問題となるのは、 割り当てるべき色を数値で与えなければならない点でしょう (たとえば黄色なら #00FFFF など)。 説明するのも面倒なので、よくわからないという人は 次の関数を使用してください。

      function iRGB2INT(red, green, blue)
      integer*4 iRGB2INT
      integer red      ! 赤の輝度(0 から 100)
      integer green    ! 緑の輝度(0 から 100)
      integer blue     ! 青の輝度(0 から 100)
      integer R, G, B
      R = (red   * 255) / 100
      G = (green * 255) / 100
      B = (blue  * 255) / 100
      iRGB2INT = R + G * 256 + B * 256**2
      return
      end

黄色を加色法の三原色で表現すると、 赤と緑が最大輝度、青が最低輝度となるので、 上記関数を使用すると次のように書けます。

      color = iRGB2INT(100, 100, 0)
      result = REMAPPALETTERGB(index, color)

さて、 皆さんは赤・緑・青の三原色の組み合わせで好きな色を 表現することができるでしょうか。 えっ、できない? それは困りましたね。 そこまでは面倒見きれません。

256色以上の同時使用

パレットカラーでは 同時に使用できる色は 256 色までとなります。 同時にそれ以上の色を表示したい場合は SETCOLOR の代わりに SETCOLORRGB を使用します。

      integer*4 color
      integer*4 result
      color = #00FFFF
      result = SETCOLORRGB(color)

同様に、 SETTEXTCOLOR の代わりに SETTEXTCOLORRGB、 SETBKCOLOR の代わりに SETBKCOLORRGB を使用します。 詳しくは、 [Programmer's Guide → Drawing Graphics Elements → Adding Color] を参照してください。


[目次] [はじめに] [入門] [基本] [高度] [画面] [困った] [おわりに]

[作者ホームへ] [水工学研究室へ] [防衛大学校へ]

多田 毅 / 防衛大学校土木工学教室
tada@cc.nda.ac.jp