2013-09-26 209 views
10

Tôi đã tìm thấy một số câu hỏi khác về StackOverflow về chủ đề của mình. Một trong số đó là here.Kích thước cửa sổ tối đa và tối thiểu trong WINAPI

Tôi cũng đã đọc Tài liệu của Microsoft về MINMAXINFO và thông báo được liên kết với cấu trúc này. Tôi chỉ đơn giản là không thể làm cho nó hoạt động ... Đây là những gì tôi đã cố gắng cho đến nay:

case WM_PAINT: 
{ 
    MINMAXINFO mmi = { 0 }; 
    SendMessage(hWnd, WM_GETMINMAXINFO, NULL, (LPARAM)&mmi); 
    POINT sz = { 640, 480 }; 
    mmi.ptMaxSize = sz; 
} 
break; 

Tôi nghĩ rằng đây là hoàn toàn sai, vì nó không được có bất kỳ tác dụng trên cửa sổ ...

Làm cách nào để làm việc này, với kích thước tối thiểu là W: 450, H: 250 và tối đa là W:800, H: 600?

Giải thích thêm về hiệu ứng tôi cần: khi người dùng kéo một góc hoặc đường viền cửa sổ và cửa sổ có kích thước tối đa/tối thiểu, người dùng không thể làm cửa sổ lớn hơn hoặc nhỏ hơn minimum_size/maximum_size

Trả lời

15

WM_GETMINMAXINFO là thông báo mà hệ thống gửi đến cửa sổ. Nó sẽ gửi thông điệp đó khi nó muốn biết kích thước tối thiểu và tối đa cho phép là cho cửa sổ. Bạn không bao giờ gửi tin nhắn đó. Tuy nhiên, bạn có thể trả lời tin nhắn đó khi nó được gửi cho bạn.

Vì vậy, bạn cần phải thêm một trường hợp cho WM_GETMINMAXINFO trong thủ tục cửa sổ của bạn:

case WM_GETMINMAXINFO: 
{ 
    MINMAXINFO* mmi = (MINMAXINFO*)lParam; 
    mmi->ptMaxSize.x = 800; 
    mmi->ptMaxSize.y = 600; 
    return 0; 
} 

Nó chỉ ra rằng bạn muốn kiểm soát kích thước theo dõi. Làm như vậy:

case WM_GETMINMAXINFO: 
{ 
    MINMAXINFO* mmi = (MINMAXINFO*)lParam; 
    mmi->ptMinTrackSize.x = 450; 
    mmi->ptMinTrackSize.y = 250; 
    mmi->ptMaxTrackSize.x = 640; 
    mmi->ptMaxTrackSize.y = 480; 
    return 0; 
} 
+0

Cảm ơn bạn rất nhiều! Điều này tạo ra chính xác hiệu ứng tôi muốn nhận được! – Victor