mrのなでしこ学習帳 RSSフィード

2009-05-31

マニュアル探査艦

はてなブックマーク - マニュアル探査艦 - mrのなでしこ学習帳

http://www.undefin.net/diaroid/2009/0530.html

改良が進められているようで、楽しみです。

パネルと格闘 ラウンド4

はてなブックマーク - パネルと格闘 ラウンド4 - mrのなでしこ学習帳

なでおやじさんから、いいことを教えてもらいました!

下記のようにすれば、うまく位置が取得できるようです。

P1とはパネルの幅は200
のマウス入った時は~P1のテキストは「in」
のマウス出た時は~P1のテキストは「out」

BP1とはボタンの親部品はP1。のXは10。のYは10

P2とはパネルの幅は200

BP2とはボタンの親部品はP2。のXは10。のYは10

パネルチェックタイマーとはタイマー隔は0.1
の時満ちた時は
  もし、(MX≠机上マウスX)OR(MY≠机上マウスY)ならば
    MX=机上マウスX。MY=机上マウスY
    KBS=P2の机上部品サイズ取得
    母艦=KBS\0「,」KBS\1「,」KBS\2「,」KBS\3
    もし、(MX>KBS\0)AND(MX<KBS\2)AND(MY>KBS\1)AND(MY<KBS\3)ならば
      P2のテキストは「in」
    違えば
      P2のテキストは「out」

パネルチェックタイマーを開始

#~以下なでおやじさんに教えてもらった関数~

#机上部品サイズ取得#
#机上の部品のサイズを配列(X1{~}Y1{~}X2{~}Y2)で取得します
●机上部品サイズ取得({グループ}OBJの)
 OBJ_SIZE=(OBJ→サイズ)を","で区切る
 BC_SIZE=机上母艦クライアントサイズ取得
 OBJ_SIZE[0]=OBJ_SIZE[0]+BC_SIZE[0]
 OBJ_SIZE[1]=OBJ_SIZE[1]+BC_SIZE[1]
 OBJ_SIZE[2]=OBJ_SIZE[2]+BC_SIZE[0]
 OBJ_SIZE[3]=OBJ_SIZE[3]+BC_SIZE[1]
 OBJ_SIZEで戻る

#机上母艦クライアントサイズ取得#
#机上の母艦クライアントサイズを配列(X1{~}Y1{~}X2{~}Y2)で取得します
●机上母艦クライアントサイズ取得
 BCS=母艦のサイズを","で区切る
 BWW=(母艦のW-母艦のクライアントW)/2
 BCS[0]=BCS[0]+BWW
 BCS[1]=BCS[3]-BWW-母艦のクライアントH
 BCS[2]=BCS[2]-BWW
 BCS[3]=BCS[3]-BWW
 BCSで戻る

#~以上なでおやじさんに教えてもらった関数

どうやって、ウィンドウの幅とかタイトルバーの部分のサイズを取得したらいいのかがわからなかったのですが、この関数では、まず、

(幅-内部の幅)÷2=ウィンドウの幅

いう形で、ウィンドウの幅を取得しています。さらに、このウィンドウの横部分の幅は、ウィンドウの下部分の幅と同じだということを利用して、

下部分のY座標-(ウィンドウの幅+内部の高さ)=内部の上部分のY座標

いうように計算していくことで、タイトルバーのサイズに頼ることなく、見事に机上の位置を特定することができるというわけです。すばらしい。

こうやって数値を求めていくのって、数学の問題っぽくて楽しいですね。

(まあ、もっと簡単にできた方がうれしいけど(^^;))

なでおやじなでおやじ2009/05/31 11:07こんにちわ!
確かにもっと簡単に出来るといいですね
APIを使ってみました参考にどうぞ

●机上部品サイズ取得({グループ}OBJの)
  B_SIZEとは配列
  POINT→X=0
  POINT→Y=0
  H=OBJ→ハンドル
  PACK(POINT,temp,"long,long")
  ClientToScreen(H,temp)
  UNPACK(temp,POINT,"long,long")
  B_SIZE[0]=POINT→X
  B_SIZE[1]=POINT→Y
  B_SIZE[2]=POINT→X+OBJ→W
  B_SIZE[3]=POINT→Y+OBJ→H
  B_SIZEを戻す
●ClientToScreen(h,{参照渡し}r) =DLL("user32.dll", "BOOL ClientToScreen(HWND hwnd,PPOINT ppt);")
■POINT
  ・X
  ・Y

ではでは。。。