マルチディスプレイでよく遭遇する問題。
負の座標の位置に開いたアプリケーションが正しく動作しない。。
具体的にいうとプライマリモニタの左側(又は上)にセカンダリ以降のモニタを配置した場合。
例えばクリックしてもメニューが開かないとか、画面外に出てるっぽいとか。
どういうコーディングになっているか想像してみる。
まぁ、符号の扱いの問題なんだろうなぁ。
例えばマウスの左ボタンを押した事をあらわすWM_LBUTTONDOWNメッセージ。(これ以前にも書いた気がしますが)
VC6付属のMSDNライブラリにはこう書いてある。
WM_LBUTTONDOWN
fwKeys = wParam; // key flags
xPos = LOWORD(lParam); // horizontal position of cursor
yPos = HIWORD(lParam); // vertical position of cursor
これを見て、なんとなく
int xPos=LOWORD(lParam);
とやると負の値が来た時におかしくなる。
たとえば-10の場合、lParam = -10 = FFFFFFF6h で、LOWORDマクロによりFFF6h。
これがintにキャストされると65526になる。
正しい修正例としては、
int xPos=(int)(short)LOWORD(lParam);
でもこれ、WM_MOVEの方はて間違えないように親切に書いてある。
WM_MOVE
xPos = (int)(short) LOWORD(lParam); // horizontal position
yPos = (int)(short) HIWORD(lParam); // vertical position
よくわからんな。
ちなみに最新のMSDNをを見るとちゃんとGET_X_LPARAMマクロを使って書いてある。
#ifndef GET_X_LPARAM
#define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam))
#endif
#ifndef GET_Y_LPARAM
#define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam))
#endif
他にはデスクトップのサイズ求めようとしてプライマリモニタのサイズだけみちゃったり、矩形の右下座標だけ使ったりとかですかね。
なんとなく右画面がメインで、左をサブ画面に・・って使い方に慣れているのです。
あ、俺とは逆だねw<br>俺は左メインで見る使い方w<br>デフォルトのままって言うのはナイショ。
実はボクも最初に置いた位置でそう決まったw