Edited at

Inside Wine; MDI Child Window のタイトルバーのドラッグ

More than 1 year has passed since last update.

目次


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

あああ


end