2011-11-28 47 views
10

在對話框或主窗口中佈置子窗口(常用控件)的最佳做法是什麼?我的意思是有一個綁定機制,可以修復控件相對於父窗口邊框的位置,就像在WPF中一樣。在調整窗口大小時,子控件將與主窗口一起調整大小。 目前我有這樣的: List view dialog如何將子窗口綁定到父窗口的相對位置?

你可以從紅色線條看起來不漂亮,當我調整列表視圖控件的父窗口中看到。我想將ListView的右邊綁定到DialogBox的右邊框和其他類似的控件。

我知道我可以玩GetWindowRect,GetClientRect和MoveWindow函數。但這是正確的方式嗎?

目前我正在使用純粹的Win32 API沒有MFC。

回答

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

雖然它是一個手動過程,但我發現在相對於每個控件的父窗口的座標系中工作很有幫助。

我使用下面的函數來返回一個控件的當前位置相對於它的父項,以便它可以很容易地移動/ 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的幾個像素即可。

我也有一些「錨定」功能有助於相對於其他參考點進行位置控制。它仍然是一個手動代碼時間處理過程,但是可以提供出色的手動調整結果。

我已添加書籤的一些其他選項都可能需要針對您的需求進行調整,但它會讓您瞭解其他人爲解決此問題而創建的一些工具。