2011-11-28 11 views
10

ダイアログボックスまたはメインウィンドウに子ウィンドウ(共通コントロール)をレイアウトするベストプラクティスは何ですか? WPFのように親ウィンドウの境界にコントロールの相対的な位置を固定するバインドメカニズムがあるのです。ウィンドウのサイズ変更中に、子コントロールはメインウィンドウと共にサイズ変更されます。 は現在、私はこれを持っている: List view dialog子ウィンドウを親ウィンドウに相対位置でバインドする方法はありますか?

あなたは私がリストビューコントロールの親ウィンドウのサイズを変更していたときに、それはかなり見ていない赤い線から見ることができるように。 ListViewの右側をDialogBoxの右の枠線や同様の他のコントロールにバインドしたいと思います。

私はGetWindowRect、GetClientRectとMoveWindow関数で遊ぶことができることを知っています。しかし、これは正しい方法ですか?

現在、私はMFCなしで​​、純粋なWin32 APIので働いています。

答えて

9

通常、Win32 APIを使用している場合は、WM_SIZEメッセージを処理し、親ウインドウでGetClientRectを呼び出し、子ウインドウでMoveWindowを呼び出して、親を適切に満たすように子を移動/サイズ変更します。

あなたはひどく十分にしたい場合は、(当然ながら)レイアウトマネージャを実装することができますので、プログラムの残りの部分は、直接このようなものを処理する必要はありません。少なくともIMEでは、これをうまくやっていると、レイアウトコードをかなり使用することができない限り、問題になることはめったにありません。

+0

最初の文でWM_SIZEを意味すると思います。 –

+0

@AdrianMcCarthy:まあまあ。ありがとうございました。一定。 –

2

コントロールを選択し、そのプロパティ「Dock」で再生してみてください。これで、コントロールを親コントロールのいくつかの側面に、またはすべての側面にドッキングすることができます。

+3

は、純粋なWin32のには、 "ドック" 機能はありませんが、私はこの[スレッド](http://stackoverflow.com/questions/7058564/dock-window-inを見つけました-win32-c)は基本的に私の質問に答えるので、 "Dock"キーワードに感謝しています:) – Robertas

+0

これは申し訳ありませんが、まだ助けてくれてありがとうございます。 – Katu

9

その手動のプロセスが、私はそれが参考に動作するように見つけている間は、各コントロールの親ウィンドウに対する相対座標。

I)は、容易にSetWindowPos(とサイズ変更/移動することができるように、その親にコントロールの現在位置を返すために、次の関数を使用します。

void GetRelativeCtrlRect(HWND hWnd, RECT *rc) { 
    // Get the position of the window relative to the entire screen 
    GetWindowRect(hWnd, rc); 

    // Now convert those with regards to the control's parent 
    ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[0]); 
    ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[1]); 
} 

これは/制御親ウィンドウのサイズRECT相対を返します。例として、子コントロールを親の「近く」の下端にリサイズしたい場合は、SetWindowPos(childHWND、...)を呼び出す前にrc.bottomから数ピクセル離れたところをバンプしてください。

私も持っています他の参照点に対する位置制御を支援するいくつかの「アンカリング」機能。しかし、それはまだ手作業でコード時のプロセスですが、優れた手で調整された結果が得られます。私がブックマークしている

いくつかの他のオプション、すべてはあなたのニーズに合わせて微調整する必要する可能性があるが、それはあなたが他の人がこの問題を解決するために作成したツールのいくつかのアイデアを提供します。

関連する問題