2009-02-22 22 views
14

Tôi không nói về tính năng kính vista, tôi đã biết cách thực hiện điều đó. Tính năng mà tôi đang nói đến là thêm các điều khiển vào thanh tiêu đề, như văn phòng 2007 với logo và thanh công cụ.Ứng dụng C# của Chrome Style?

Trả lời

22

Bạn cần thực hiện một số tương tác Win32 để đạt được hiệu ứng đó. Tùy thuộc vào việc bạn đang sử dụng Winforms hay WPF, cách bạn móc để xử lý thông điệp khác nhau (Tôi không nhớ Winforms, vì vậy tôi sẽ cung cấp tất cả các ví dụ cho WPF). Nhưng trong cả hai trường hợp, bạn cần phải:

  1. Ngăn chặn việc tạo cửa sổ và sửa đổi kiểu cửa sổ và kiểu mở rộng. Trong WPF, bạn cần kế thừa từ HwndSource và sửa đổi HwndSourceParameters để đạt được điều này. Bạn cần WS_OVERLAPPEDWINDOW, WS_CLIPSIBLINGS và WS_VISIBLE cho kiểu dáng thông thường và WS_EX_WINDOWEDGE và WS_EX_APPWINDOW kiểu mở rộng.

  2. Thêm trình xử lý tin nhắn thông qua các thông số HwndSource HwndSourceHook.

  3. Trong proc nhắn thêm thông qua việc móc trong bước hai, bạn cần phải xử lý nhiều tin nhắn:

    • WM_NCACTIVATE - để thay đổi bức tranh của danh hiệu khi ứng dụng được kích hoạt hay không
    • WM_NCCALCSIZE - để quay lại hệ điều hành mà bạn không có khu vực không phải khách hàng
    • WM_NCPAINT - nói chung bạn cần phải khai báo cửa sổ trực tiếp ở đây, WPF sẽ chăm sóc bức tranh thực tế)
    • WM_NCHITTEST - để xử lý việc di chuyển cửa sổ, thu nhỏ và tối đa hóa.
  4. Khi bạn thực hiện ở trên, khu vực khách hàng của bạn, nơi WPF sẽ vẽ cây hình ảnh của bạn sẽ kéo dài toàn bộ khu vực của cửa sổ. Bạn sẽ cần phải thêm hình ảnh "không liên quan" để ứng dụng của bạn trông giống như một ứng dụng thông thường cho người dùng.

  5. Bạn có thể cần nhiều thông điệp hơn:

    • WM_THEMECHANGED nếu bạn muốn thay đổi "không-client" bức tranh khu vực của bạn để phù hợp với chủ đề OS
    • WM_DWMCOMPOSITIONCHANGED nếu bạn muốn mở rộng kính và có được tiêu chuẩn sơn NC-thủy tinh khi kính được kích hoạt và chuyển sang logic tùy chỉnh của bạn khi thủy tinh không được.
  6. Bạn có thể muốn nhìn vào các API Theme Win32 nếu bạn muốn đi lấy tài sản Win32 tiêu chuẩn cho biên giới, chú thích, đóng, mininmize và phát huy tối đa các nút để sử dụng trong khu vực 'phi khách hàng" của mình.

  7. Nếu bạn muốn mở rộng Glass vào cửa sổ, bạn có thể xem xét:

    • DwmExtendFrameIntoClientArea - để có được kính tiêu chuẩn NC-khu vực
    • DwmDefWindowProc - để có được người quản lý máy tính để bàn để vẽ Glass và các điều khiển NC tiêu chuẩn
    • DwmIsCompositionEnabled - để xác định xem Glass có được bật hay không; bạn chỉ có thể sử dụng hai API trên khi Glass được bật. Nếu Glass không được kích hoạt, bạn cần tự vẽ bản vẽ của khu vực NC.

Bạn có thể tìm đúng C# định nghĩa của tất cả các bài viết, phong cách và tương ứng với Win32 API bạn cần trên P/Invoke.

Bạn cũng có thể đạt được hiệu ứng tương tự bằng cách sử dụng cửa sổ WPF chuẩn với WindowStyle=none. Tuy nhiên, sẽ có một số khác biệt giữa hành vi của máy tính để bàn đối với ứng dụng của bạn và các ứng dụng khác; rõ ràng nhất trong số họ là bạn sẽ không thể xếp chồng hoặc lát cửa sổ của mình bằng cách nhấp chuột phải vào thanh tác vụ.

Bạn cũng có thể xem xét một số thành phần của bên thứ ba cho phép một số chức năng này. Tôi đã không sử dụng bất kỳ (như bạn có thể thấy, tôi không sợ Win32 interop :-)), vì vậy tôi không thể khuyên bạn nên bất kỳ cụ thể.

+0

Không thực sự. Tôi đã lên kế hoạch viết một cuốn sách, nhưng tôi chưa bao giờ hiểu, điều gì xảy ra với đứa bé 5 tháng tuổi trong nhà và không biết ... :-) –

2

Tôi đã sử dụng bộ điều khiển DotNetBar với thành công tốt.

8

Như Franci đề cập, những gì bạn muốn là DwmExtendFrameIntoClientArea. Dưới đây là một ví dụ từ Codeproject cho thấy làm thế nào để làm điều đó.

http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx

+1

Lưu ý rằng khi Glass bị tắt, ví dụ dưới TS hoặc khi người dùng chuyển sang Vista cơ bản, DwmExtendFrameIntoClientAre sẽ không hoạt động. –

8

Joe Castro, một nhà phát triển nhóm sản phẩm WPF, có một dự án gallery đang MSDN gọi là "WPF Chrome" có thể được dùng để tạo ra một văn phòng 2007-như giao diện người dùng (ví dụ: điều khiển span cả khách hàng và các khu vực không phải của khách hàng của cửa sổ).

Tìm tại đây: http://code.msdn.microsoft.com/chrome

+0

tuyệt vời ~~~~~~~~~~~~~~! –

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