1

CButtonがアタッチされたMFCC++のダイアログがあります。ボタンが左下に固定されるようにOnSize()を変更したいと思います。

if (btn.m_hWnd) {
        CRect winRect;
        GetWindowRect(&winRect);

        int width = winRect.right - winRect.left;
        int height = winRect.bottom - winRect.top;

        int x = width - wndWidth;
        int y = height - wndHeight;


        CRect rect;
        btn.GetWindowRect(&rect);
        rect.left += x;
        rect.top += y;
        btn.MoveWindow(&rect);
        ScreenToClient(&rect);
        btn.ShowWindow(SW_SHOW);
    }

xとyは、ウィンドウが変更された量の差であり、ボタンの開始座標に追加されます。

最後の2つのコマンドについてはわかりませんが(削除した方がいいかもしれません)、プログラムを実行するとボタンが消えます。

ボタンをxとyだけ動かす方法を知る必要があります。

4

2 に答える 2

2

元のコードは、親ダイアログとボタンの両方に間違った座標系を使用していました。

左下にドッキングする正しい方法は次のようになります。

if (btn.m_hWnd) { 
    CRect winRect; 
    GetClientRect(&winRect); 

    CRect rect; 
    btn.GetWindowRect(&rect); 
    ScreenToClient(&rect); 

    int btnWidth = rect.Width();
    int btnHeight = rect.Width();
    rect.left = winRect.right-btnWidth; 
    rect.top  = winRect.bottom-btnHeight;
    rect.right = winRect.right;
    rect.bottom = winRect.bottom; 
    btn.MoveWindow(&rect); 
}

また

if (btn.m_hWnd) { 
    CRect winRect; 
    GetClientRect(&winRect); 

    CRect rect; 
    btn.GetWindowRect(&rect); 
    ScreenToClient(&rect); 

    int btnWidth = rect.Width();
    int btnHeight = rect.Width();
    btn.SetWindowPos(NULL,winRect.right-btnWidth,winRect.bottom-btnHeight,0,0,SWP_NOSIZE|SWP_NOZORDER);
}
于 2012-09-12T00:56:58.457 に答える
1

基本的に、答えはMoveWindowの前にScreenToClientを実行することです!

詳細:どの関数がクライアント座標を返すか使用するか(およびこれらのクライアント座標が何であるかを基準にして)、どの画面座標を使用するかを理解する必要があります。これは、MFCの一部であり、非常に混乱する可能性があります。あなたの質問に関して:

CWnd::GetWindowRectは画面座標を返します。CWnd :: MoveWindowは、親CWnd(またはトップレベルウィンドウの場合は画面)を基準にした座標を想定しています。したがって、MoveWindowを呼び出す前に、GetWindowRectによって返されるrectを親ウィンドウのクライアント座標に変換する必要があります。pParentがCWnd *の親ウィンドウであるとするとbtn、移動するコードは次のようになります。

CRect rect;
btn.GetWindowRect(&rect);
pParent->ScreenToClient(&rect);  // this line and it's position is important
rect.left += x;
rect.top += y;
btn.MoveWindow(&rect);

親ウィンドウのメソッドを使用している場合(ダイアログのOnSizeについて言及しているので、私が思うに)、を省略しますpParent->。現時点でScreenToClientを実行する方法では、MoveWindowの後に実行されるため、MoveWindowには影響しません。

于 2012-09-11T12:23:41.293 に答える