2011-11-28 37 views
10

Thực hành tốt nhất để đặt cửa sổ con (điều khiển chung) trong hộp thoại hoặc cửa sổ chính là gì? Tôi có nghĩa là có một cơ chế ràng buộc mà sẽ sửa chữa một vị trí tương đối của kiểm soát để biên giới cửa sổ cha mẹ như trong WPF. Và trong khi thay đổi kích thước cửa sổ, điều khiển con sẽ thay đổi kích thước cùng với cửa sổ chính. Hiện tại tôi có điều này: List view dialogLàm cách nào để gắn các cửa sổ con vào cửa sổ mẹ ở các vị trí tương đối?

Như bạn có thể thấy từ các đường màu đỏ, nó trông không đẹp khi tôi đổi kích thước cửa sổ mẹ của điều khiển chế độ xem danh sách. Tôi muốn liên kết ví dụ bên phải của ListView với đường biên phải của DialogBox và các điều khiển tương tự khác.

Tôi biết rằng tôi có thể chơi xung quanh với các chức năng GetWindowRect, GetClientRect và MoveWindow. Nhưng đây có phải là cách chính xác không?

Hiện tại tôi đang làm việc với Win32 Api thuần túy mà không cần MFC.

Trả lời

9

Nếu bạn chỉ sử dụng API Win32, bạn thường xử lý điều này bằng cách xử lý thư WM_SIZE và trả lời bằng cách gọi GetClientRect trên cửa sổ chính và MoveWindow trên các con để di chuyển/thay đổi kích cỡ các con để điền vào cha mẹ một cách thích hợp.

Nếu bạn muốn đủ tồi tệ, bạn có thể (tất nhiên) triển khai trình quản lý bố cục, vì vậy phần còn lại của chương trình không cần xử lý những thứ như vậy trực tiếp. Ít nhất IME, làm tốt điều này là đủ khó khăn mà nó hiếm khi đáng giá, trừ khi bạn có thể sử dụng khá nhiều mã bố cục đó.

+0

Tôi nghĩ bạn có nghĩa là WM_SIZE trong câu đầu tiên. –

+0

@AdrianMcCarthy: Rất tiếc, khá đúng. Cảm ơn bạn. Đã sửa. –

2

Thử chọn điều khiển và phát bằng thuộc tính "Dock" của thuộc tính. Với điều đó, bạn có thể gắn điều khiển vào một số mặt hoặc thậm chí tất cả các mặt của điều khiển chính.

+3

Không có "Dock" trong win32 thuần túy, nhưng tôi thấy điều này [thread] (http://stackoverflow.com/questions/7058564/dock-window-in -win32-c) mà về cơ bản trả lời câu hỏi của tôi, vì vậy cảm ơn cho từ khóa "Dock" :) – Robertas

+0

Ok, xin lỗi về điều đó, nhưng vui vì nó vẫn giúp. – Katu

9

Trong khi quá trình thủ công, tôi thấy hữu ích khi làm việc trong các tọa độ tương ứng với cửa sổ chính của mỗi điều khiển.

Tôi sử dụng chức năng sau để trả về vị trí hiện tại của điều khiển liên quan đến cha mẹ của nó, để có thể dễ dàng di chuyển/thay đổi kích thước bằng 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]); 
} 

này trả về một kích thước RECTtương để phụ huynh cửa sổ/kiểm soát. Ví dụ: nếu bạn muốn thay đổi kích thước của điều khiển con thành cạnh dưới "gần" của bố mẹ, chỉ cần vuốt một vài pixel khỏi chế độ rc.bottom trước khi gọi SetWindowPos (childHWND, ...)

Tôi cũng có một số chức năng "neo" giúp điều khiển vị trí liên quan đến các điểm tham chiếu khác. Tuy nhiên, nó vẫn là một quy trình thủ công-thời gian-mã-thời-gian-thủ-công, nhưng cho kết quả tinh chỉnh bằng tay tuyệt vời.

Một số tùy chọn khác mà tôi đã đánh dấu, tất cả đều có khả năng yêu cầu tinh chỉnh cho nhu cầu của bạn nhưng nó cung cấp cho bạn ý tưởng về một số công cụ mà người khác đã tạo để giải quyết vấn đề này.

Các vấn đề liên quan