在 Windows 平台上使用 Window API 确保控件保留原生外观,你需要注意以下要点:
为了保持控件的原生外观,尽量使用透明度而非遮罩。通过 WS_EX_LAYERED
样式声明,可以将应用程序中的控件设置为透明。这种透明效果对部分系统UI组件和视觉效果的影响非常小。
使用 WS_EX_TRANSPARENT
和 WS_EX_LAYERED
样式可以让控件呈现出透明且保留原生外观的效果。首先设置非透明属性(如背景色、边框等),然后调用 SetLayeredWindowAttributes
函数将控件指定为透明:
#include<Windows.h>
#include <tchar.h>
HWND hwnd = CreateWindowEx(WS_EX_TRANSPARENT | WS_EX_LAYERED, _T("Your Control Class Name Here"), _T("Your Title Here"),...);
// ...
// 关闭后设置控件为非透明
SetLayeredWindowAttributes(hwnd, RGB(255, 255, 255), 0, LWA_COLORKEY);
除了透明度设置,还可以通过绘图API(如 GDI 或 Direct2D)保留控件的原生外观。创建一个单独的画布窗口并调用 SetWindowExs
获取对它的绘图权限:
#include <cstdlib>
#include <cstdio>
#include<Windows.h>
#include <d2d1.h>
#include<windowsx.h>
int main() {
HWND main_hwnd = NULL, canvas_hwnd = NULL;
HWND canvas_parent = FindWindow(_T("ParentWindowClassName"), NULL);
HDC canvas_hdc = GetDC(canvas_hwnd), main_hdc = CreateCompatibleDC(0);
HBITMAP bmp_bitmap = CreateCompatibleBitmap(0, 500, 500);
HBITMAP old_bitmap = (HBITMAP)SelectObject(main_hdc, bmp_bitmap), old_bitmap_mask = (HBITMAP)SelectObject(main_hdc, CreatePatternBitmap(bmp_bitmap));
HBRUSH parent_brush, canvas_pen, canvas_brush;
RECT main_rect, canvas_rect;
// 设置画布
GetClientRect(canvas_hwnd, &canvas_rect);
parent_brush = GetClassLong(canvas_parent, CS_HREDRAW);
parent_brush = (HBRUSH)SelectObject(
领取专属 10元无门槛券
手把手带您无忧上云