LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-27

目次

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0