[目次] (https://qiita.com/Yutaka_Aoki/items/9d38ea98406f4096435b)
Inside Wine; MDI Child Window のタイトルバーのドラッグ
Wine で、MDI Child Wnd の TITLE BAR をドラッグしたときの処理
DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
-->case WM_NCLBUTTONDOWN
-->NC_HandleNCLButtonDown()
-->case HTCAPTION
-->SendMessageW( hwnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam )
-->DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
-->case WM_SYSCOMMAND
-->NC_HandleSysCommand()
-->WINPOS_SysCommandSizeMove()
マウスをクリックしてドラッグを開始してから、マウスを離すまで、最後の関数の中のメッセージループの中を回り続けて戻ってこない。
void WINPOS_SysCommandSizeMove( HWND hwnd, WPARAM wParam )
内部には、GetMessageW() のループがあり、次のようなコードがある :
~/wine/dlls\user32\winpos.c"
if (!iconic)
{
if(!DragFullWindows)
draw_moving_frame( parent, hdc, &sizingRect, thickframe );
else
{
RECT rect = sizingRect;
MapWindowPoints( 0, parent, (POINT *)&rect, 2 );
SetWindowPos( hwnd, 0, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
}
}
ここで、draw_moving_frame() は、XOR 反転枠を書く関数らしい。上記を見ると、実際に動かす前に「枠」を書くか、実際の Window の位置を即座に動かしてしまうかは、変数 DragFullWindows の値によって変更するようになっている事が分かる。
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ