2011-10-06 20 views
18

Nếu bạn nhìn vào cửa sổ trình duyệt Firefox, Chrome hoặc Opera, bạn sẽ thấy cửa sổ của chúngWinAPI: Tạo cửa sổ thay đổi kích thước không có thanh tiêu đề, nhưng với các nút thu nhỏ/tối đa/đóng (như Firefox/Chrome/Opera)

  • có giảm thiểu/tối đa hóa/nút đóng
  • là thay đổi kích thước
  • nhưng không có thanh tiêu đề

tôi quan tâm: làm thế nào tôi có thể tạo ra một cửa sổ như vậy?

Những gì tôi đã cố gắng:

Tôi nhìn quanh trên StackOverflow (và googled, quá), và phát hiện này: opening a window that has no title bar with win32

Thật không may, điều này đã không giúp đỡ hoàn toàn:

Bước đầu tiên là mở rộng giải pháp được đề xuất trên opening a window that has no title bar with win32

hWnd = CreateWindow(szWindowClass, szTitle, WS_BORDER, 
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
    NULL, NULL, hInstance, NULL); 

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX); 
// See remarks on http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545.aspx 
SetWindowPos(hWnd, 0, 
    0, 0, 0, 0, // Position + Size 
    SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); 

Tất nhiên, điều này mang lại không giảm thiểu/tối đa hóa các nút, nhưng mặt khác, nếu tôi muốn giảm thiểu/tối đa hóa các nút, tôi phải làm:

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | 
    WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION); 

Tại sao sự kết hợp này dường như là cần thiết? Đầu tiên tôi có thể muốn WS_MAXIMIZEBOX | WS_MINIMIZEBOX vì tôi muốn các nút này.

Nhưng http://msdn.microsoft.com/en-us/library/ms632600.aspx nói rằng nếu tôi đặt một trong số WS_MAXIMIZEBOXWS_MINIMIZEBOX, tôi cũng phải đặt WS_SYSMENU. Và khi tôi đặt WS_SYSMENU, tôi cũng phải đặt WS_CAPTION nhưng đây không phải là điều tôi muốn, vì tôi muốn tránh thanh tiêu đề (thực sự: nếu chưa đặt WS_CAPTION, không có nút thu nhỏ/tối đa được hiển thị).

Vì vậy, phải làm gì?

+0

Phương pháp này không hoạt động trên các cửa sổ 10 –

Trả lời

13

Các chương trình loại bỏ khu vực không phải khách hàng (thanh tiêu đề) và có một loạt xử lý tùy chỉnh để tái tạo các nút cửa sổ, biểu tượng, menu hệ thống, vv Lợi ích của việc này là họ có thể vẽ tiêu đề mới bar ", thực sự là một phần của khu vực khách hàng chuẩn, thêm các tab hoặc các điều khiển tùy chỉnh khác.

Sau đây hai bài báo sẽ cho bạn thấy làm thế nào để làm điều này trên Vista trở lên (bằng cách sử dụng DWM):

Điều này rất phức tạp để thực hiện và làm đúng, vì vậy hai bài viết trên là vô giá. Tác giả phải đặt rất nhiều công việc vào họ! Cả hai liên kết đều có mã ví dụ được viết bằng Delphi, nhưng phải dễ dàng dịch nó sang C++ - các khái niệm giống hệt nhau, nó chỉ là cú pháp.

Bạn cũng có thể quan tâm general resources on Glass and DWM vì tất cả đều liên quan chặt chẽ. Bạn sẽ phát hiện ra hai liên kết trên được bao gồm trong danh sách đó :)

+0

Rất hữu ích. Tôi tin rằng, bạn và Roman R. * cả hai * sẽ giành được lá cờ "Đã trả lời". Thật không may tôi chỉ có thể tặng nó cho một trong các bạn. :-( – Nubok

0

Tôi tin rằng họ tạo một cửa sổ bình thường và sau đó tô lên thanh tiêu đề bằng các tiện ích/tab tùy chỉnh của họ. Điều này là hiển nhiên trong Firefox, như khi nó treo, bạn có thể thấy thanh tiêu đề Windows bình thường xuất hiện trên các tab.

+1

Hmm, tôi thực sự không nghĩ điều này là đúng. –

+0

Bình thường, cửa sổ được vẽ chủ sở hữu sử dụng bản vẽ tùy chỉnh để vẽ trên thanh tiêu đề thông thường. Nếu nghi ngờ, hãy kiểm tra mã nguồn, nó là nguồn mở sau khi tất cả. – Daemin

6

Bạn có thể tạo cửa sổ có hoặc không có chú thích - bất kỳ điều gì thích hợp hơn từ quan điểm của tùy chỉnh mong muốn (có nghĩa là "không có" là bạn muốn làm điều đó "không có thanh tiêu đề" như bạn nói), và mụn cóc quan trọng là bạn tiếp quản bức tranh khu vực không phải khách hàng - đây là điều quan trọng.

Tại thời điểm này, không có ai để vẽ các nút bắt chước/tối đa hóa của bạn rồi. Tuy nhiên, điều đó không có nghĩa là bạn phải vẽ ngay từ đầu và bắt chước giao diện người dùng chuẩn. Có DrawFrameControl và API bạn bè nơi bạn có thể sử dụng đối số DFCS_CAPTIONMIN và có nút thu nhỏ được vẽ cho bạn. Bạn cũng sẽ muốn trả lời các tin nhắn khác của khu vực không phải khách hàng, ví dụ: xử lý WM_NCHITTEST để cho Windows biết các nút cửa sổ mới của bạn ở đâu.

Bạn cũng có thể muốn kiểm tra Visual Styles Reference để tận dụng API vẽ chủ đề hỗ trợ như DrawThemeBackground.

Một ví dụ đơn giản về hoạt động này là đặt thêm nút vào phụ đề, chẳng hạn như được mô tả chi tiết tại đây: CCaptionButton (buttons for the titlebar).

+1

API chủ đề là cách để làm điều này nhưng thật dễ dàng để nói và darned khó để đặt tất cả lại với nhau. –

+4

Đúng. Miễn là bạn không có nó vẽ cho bạn nữa, bạn phải đặt một số nỗ lực vào làm cho nó trông phù hợp với giao diện người dùng chuẩn. –

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