画面中心座標についてですが、
拡大画面と元の画面との関係で元の画面のどの位置が拡大画面のどの位置に一致するか
と言う部分が問題になります。
なのでそのPCの画面の中心を基準にして良いのかが今の書き込まれた情報からでは
判断出来ません。拡大画面はPCの画面上の中心位置に固定なのですか?
自由に動かせるのであれば、PCの画面の中心を求めても意味がない事になりますが。
これはこの辺の処理を書いているご本人にしか分からない部分になりますので
よく確認してみてください。
絵で書くとわかりやすいんですが、こういう掲示板では無理なので。
PATIOさん、お返事ありがとうございます。
>送付先のウインドウハンドルが必要なのでは?
そうですよね…^^;
でもそのウィンドウハンドルというのは、拡大画面の直下にあるウィンドウに
メッセージを伝える場合は、直下にあるウィンドウハンドルを調べて指定するというこ
とですか?
それとも透明ウィンドウのハンドルを指定して、メッセージを送りつつ
α値を0にしてしまえば、そのメッセージがそのまま通り抜けて下へいくということはな
いですか…ね?
見当違いなこと言ってたらすみません。
あと、画面の中心座標についてですが
今現在は拡大画面は全画面表示の固定してある状態で、元の画面をクリックした際に
そのクリックした座標を中心として、拡大画面を表示するようにしています。
つまり元の画面のクリック位置が、拡大画面の中心座標となって表示されている状態で
す。
> でもそのウィンドウハンドルというのは、拡大画面の直下にあるウィンドウに
> メッセージを伝える場合は、直下にあるウィンドウハンドルを調べて指定する
> ということですか?
そうなりますね。基本的に送付先のウインドウハンドルが必要になると思います。
透過の時に云々と言う部分はOS内部の話ではないかと思うのでプログラムから
ウインドウメッセージを送信する場合は多分関係無いのではないかと思います。
> 今現在は拡大画面は全画面表示の固定してある状態で、元の画面をクリックした際に
> そのクリックした座標を中心として、拡大画面を表示するようにしています。
>
> つまり元の画面のクリック位置が、拡大画面の中心座標となって表示されている状態です。
拡大画面が全画面表示になっていても拡大画面自身にウインドウサイズを問合せるように
した方が良いと思います。拡大画面のサイズを可変にした場合でもサイズ取得の部分の
処理を変更しなくて良いようになりますから。
あと、クリックする度に元の画面上の位置が更新されるのであれば、
クリック後はクリックした所が中心位置に来ているはずなので
画面の移動処理を行ってからその時の中心位置に向かって投げると言う手もあるかなと
思います。
PATIOさん、ありがとうございます。
送付先のウィンドウハンドルは、WindowFromPoint(point)で
座標(point.x,point.y)にあるウィンドウを取得してメッセージを送るようにしました。
>拡大画面が全画面表示になっていても拡大画面自身にウインドウサイズを問合せるよう
>にした方が良いと思います。拡大画面のサイズを可変にした場合でもサイズ取得の部分
>の処理を変更しなくて良いようになりますから。
というのは
#define WND_W GetSystemMetrics(SM_CXMAXTRACK)
#define WND_H GetSystemMetrics(SM_CYMAXTRACK)
でサイズを定義してあるので、これでも大丈夫でしょうか?
>あと、クリックする度に元の画面上の位置が更新されるのであれば、
>クリック後はクリックした所が中心位置に来ているはずなので
>画面の移動処理を行ってからその時の中心位置に向かって投げると言う手もあるかなと
>思います。
そうですね!そういう手もありますね!
でも1回目のクリックで画面を拡大表示後は、クリックしても画面の中心位置は変わら
ないようになっています。
今は、計算があっていないのかうまくその座標へメッセージを飛ばせてないんですが、
ちゃんと反映するように頑張ってみます。
>> 拡大画面が全画面表示になっていても拡大画面自身にウインドウサイズを問合せるよう
>> にした方が良いと思います。拡大画面のサイズを可変にした場合でもサイズ取得の部分
>> の処理を変更しなくて良いようになりますから。
>
> というのは
> #define WND_W GetSystemMetrics(SM_CXMAXTRACK)
> #define WND_H GetSystemMetrics(SM_CYMAXTRACK)
> でサイズを定義してあるので、これでも大丈夫でしょうか?
いえ、これだとシステムの値を取得していますよね。
これだと拡大画面のサイズをユーザーが調整できるようにした時に
実際の拡大画面のサイズと上記の値は違っているはずなので拡大画面のサイズを
取得したいと言う目的を達成できません。
拡大画面に対しての問い合わせになりますから
拡大画面のウインドウハンドルを使ってGetWindowRectで問合せてはどうですか
と言う話です。拡大画面は最大化された状態で固定なら今能状態でも良いと思いますが、
拡大画面のサイズを可変にしたりするのであれば、拡大画面自身に問い合わせた方が
柔軟になるかなと考えただけです。
これに関しては現状、拡大画面が最大化サイズで固定なら現状でも結果は同じになるので
その辺はどうしたいかで判断してもらって良いと思います。
誤字(^^;
誤)
>と言う話です。拡大画面は最大化された状態で固定なら今能状態でも良いと思いますが、
正)
と言う話です。拡大画面は最大化された状態で固定なら今の状態でも良いと思いますが、
PATIOさん、ご丁寧にありがとうございます。
今のところは拡大画面を最大化した状態で固定しておこうと思っていたので
まだ考えていませんが、余裕ができたらやってみようと思います^^
あと、メッセージも無理やりのような気がしますが、直下のウィンドウに送ることがで
きました。
拡大ウィンドウ上でクリック等のメッセージを受け取り、
元の画面に対応する座標(fact.x, fact.y)を計算後↓
SetLayeredWindowAttributes(hwnd,0,0,LWA_ALPHA);
LPARAM dwExtraInfo = GetMessageExtraInfo();
SetCursorPos(fact.x, fact.y);
mouse_event(MOUSEEVENTF_LEFTDOWN, fact.x, fact.y, 0, dwExtraInfo);
mouse_event(MOUSEEVENTF_LEFTUP, fact.x, fact.y, 0, dwExtraInfo);
SetCursorPos(p.x, p.y);
のような感じで、ポインタを移動させて…。
mouse_event()でも座標を指定しているはずなのですがSetCursorPosをやらないと
うまくいかず、反応も少し遅いです。
MOUSEEVENTF_ABSOLUTEではという前スレもありましたが、そうするとクリック動作は指
定できないんですよね?
何かいい方法等ありましたらご教授お願いします。
多分ですが、mouse_eventだとそのウインドウにフォーカスが無いと
メッセージが行かないと思います。
なのでそのウインドウにフォーカスを当てると送れるとは思いますけれど、
遅いのはなぜだろう?
あと、MOUSEEVENTF_ABSOLUTEを指定しないなら直前の位置からの移動量を
指定する事になっているようなのでうまくいっているのかなぁと。
今提示されている範囲では分からないです。
何処の処理で滞っているのかが見えないので。
ちなみにですが、PostMessageで送っても駄目でした?
WM_LBUTTONDOWNとWM_LBUTTONUPで同じような事は出来ませんか?
これだとウインドウを狙い撃ちに出来ると思うのですけれど。
非同期でメッセージを送るならPostMessageでも良いと思います。
SendMessageは同期になるので。
この辺はmouse_eventの仕様もあわせて確認した方が良いですね。
遅くなるのはもしかしたら、拡大画面を表示するときに
ミリ秒単位で描画表示し続けているせいかもしれないです。
>ちなみにですが、PostMessageで送っても駄目でした?
>WM_LBUTTONDOWNとWM_LBUTTONUPで同じような事は出来ませんか?
>これだとウインドウを狙い撃ちに出来ると思うのですけれど。
>非同期でメッセージを送るならPostMessageでも良いと思います。
>SendMessageは同期になるので。
PostMessage(WindowFromPoint(fact), WM_LBUTTONDOWN, 0, MAKELPARAM(fact.x,
fact.y));
PostMessage(WindowFromPoint(fact), WM_LBUTTONUP, 0, MAKELPARAM(fact.x,
fact.y));
こんな風にしてもダメでした。
というか、なぜか対応するはずの座標がずれてしまい…座標は合ってると思うのです
が。
でも自分でも、もう少し調べてみます。
mouse_eventの場合、MOUSEEVENTF_ABSOLUTEが無いと直前のマウスの位置からの
移動量になると思います。同じ値をmouse_eventに使ってうまく行っているのであれば、
値的には間違っている可能性があると思います。
WM_LBUTTONDOWN等の場合、クライアント座標で見た時の位置になるはずなので
下のウインドウのクライアント座標を計算する必要が有ります。
クライアント座標の基準はクライアント領域の左上を(0,0)としますから
それに合っているかですね。
>WM_LBUTTONDOWN等の場合、クライアント座標で見た時の位置になるはずなので
>下のウインドウのクライアント座標を計算する必要が有ります。
>クライアント座標の基準はクライアント領域の左上を(0,0)としますから
>それに合っているかですね。
PATIOさん、その通りにやったらできました!
Q.x = fact.x;
Q.y = fact.y;
//スクリーン⇒クライアント座標へと変換
ScreenToClient(WindowFromPoint(fact), &Q);//クライアント座標へと変換
PostMessage(WindowFromPoint(fact), WM_LBUTTONDOWN, 0, MAKELPARAM(Q.x, Q.y));
PostMessage(WindowFromPoint(fact), WM_LBUTTONUP, 0, MAKELPARAM(Q.x, Q.y));
と、このような感じでちゃんと対応する座標にもメッセージ転送することもできまして
^^
これからクリック以外のメッセージも場合分けして送れるようやってみるつもりです。
rinさん、PATIOさん、金魚ちゃんさん、コメント頂きありがとうございました!
そして長々と最後までお付き合い頂いたPATIOさんには本当に感謝しておりま
す!!
また何かご質問させていただくこともあるかと思いますが、その時はよろしくお願い致
しますm(__)m