Với sự cải tiến của các công nghệ hiển thị đồ họa, API của các hệ điều hành cũng được cải thiện, cung cấp cho các lập trình viên ngày càng nhiều cơ hội để phát triển các phần tử giao diện phi tiêu chuẩn. Vì vậy, một trong những đổi mới của hệ điều hành Windows 2000 là các cửa sổ nhiều lớp, các phần của chúng có thể được làm mờ. Ngay sau đó, mô tả về API để làm việc với các cửa sổ phân lớp đã có sẵn trên MSDN. Tuy nhiên, trên các diễn đàn của các lập trình viên, những câu hỏi về cách tạo một cửa sổ nửa trong suốt vẫn đang được đặt ra.
Cần thiết
- - trình biên dịch;
- - windows sdk hoặc khuôn khổ để lập trình windows.
Hướng dẫn
Bước 1
Lấy tay cầm cửa sổ bạn muốn đặt nửa trong suốt. Tìm hoặc tạo một cửa sổ. Để tạo nó, hãy sử dụng các hàm CreateWindow, CreateWindowEx API hoặc các phương thức trình bao bọc xung quanh các hàm này thuộc các lớp của khuôn khổ đã sử dụng. Nguyên mẫu cho hàm CreateWindow trông như sau:
HWND CreateWindow (LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance,
LPVOID lpParam);
Như bạn có thể thấy, hàm trả về một chốt cho cửa sổ đã tạo do kết quả của quá trình thực thi. Nếu bất kỳ lớp trình bao bọc nào được sử dụng, hãy sử dụng các phương thức của nó trên đối tượng tương ứng với cửa sổ đã tạo để nhận xử lý.
Bước 2
Việc tìm kiếm một cửa sổ có thể được thực hiện bằng cách sử dụng các lệnh gọi API FindWindow, FindWindowEx, EnumWindows, EnumChildWindows, EnumThreadWindows và sự kết hợp của chúng. Bạn có thể điều khiển một cửa sổ trong một khu vực cụ thể bằng cách sử dụng các chức năng WindowFromPoint và ChildWindowFromPoint.
Bước 3
Đặt cửa sổ thành kiểu mở rộng WS_EX_LAYERED. Sử dụng API SetWindowLong hoặc các phương thức tương ứng của các đối tượng trình bao bọc. Hàm SetWindowLong thay thế hoàn toàn thông tin tham số cửa sổ có thể sửa đổi, vì vậy hãy sử dụng nó kết hợp với hàm GetWindowLong để truy xuất giá trị trước đó cho tập hợp các cờ kiểu. Ví dụ: kiểu có thể được thay đổi như sau:
:: SetWindowLong (hWnd, GWL_EXSTYLE,:: GetWindowLong (hWnd, GWL_EXSTYLE));
Ở đây hWnd là cửa sổ xử lý được tìm thấy do thực hiện các hành động được mô tả trong bước trước.
Bước 4
Làm cho cửa sổ bán trong suốt. Sử dụng API SetLayeredWindowAttributes hoặc các phương thức của các lớp trình bao bọc. Nguyên mẫu hàm SetLayeredWindowAttributes trông giống như sau:
BOOL SetLayeredWindowAttributes (HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
Bước 5
Tham số hwnd của hàm phải là một cửa sổ xử lý hợp lệ thu được trong bước đầu tiên. Tham số crKey là một khóa màu được sử dụng để xác định các vùng bán trong suốt. Tham số bAlpha chỉ định giá trị trong suốt. Với giá trị tham số bAlpha bằng 0, các vùng "bán trong suốt" sẽ hoàn toàn trong suốt. Nếu tham số bAlpha là 255, chúng sẽ hoàn toàn không rõ ràng. Tham số dwFlags xác định chế độ hiển thị thêm nội dung cửa sổ. Khi cờ LWA_COLORKEY được bao gồm trong giá trị dwFlags, các vùng bán trong suốt của cửa sổ sẽ được xác định dựa trên khóa màu. Khi cờ LWA_ALPHA được bật, tham số bAlpha sẽ được sử dụng để xác định giá trị trong suốt.
Bước 6
Để làm cho toàn bộ cửa sổ nửa trong suốt, hãy gọi SetLayeredWindowAttributes với giá trị tham số bAlpha được ưu tiên, cờ LWA_ALPHA, nhưng không có cờ LWA_COLORKEY. Sử dụng tay cầm cửa sổ tìm thấy làm tham số đầu tiên cho hàm. Ví dụ: để làm cho một cửa sổ trong suốt một nửa, hãy sử dụng lệnh gọi:
:: SetLayeredWindowAttributes (hWnd, RGB (0, 0, 0), 128, LWA_ALPHA);