我已经在Win32 C++中创建了一个透明的复选框。我这样做是因为据我所知,你不能在本机win32中拥有透明的复选框,而我需要在NSIS安装程序中使用此复选框。
我的问题: 当重新绘制时,我不知道如何擦除我的透明背景,以便我可以在“清空画布”上绘制。当用户更改复选框内的文本并且我需要重新绘制它时,这很重要。我想我遇到了每个人都必须遇到的透明窗口问题。
有什么方法可以清除我的透明窗口,请注意,我熟悉WinAPI,据我所知,你实际上无法清除窗口,因为你只是在窗口上重绘。因此,我正在寻求关于我可以使用哪些技术重新绘制窗口的建议,例如:
- 向父窗口发送重绘消息,希望它会重绘父窗口(即位于复选框下方的窗口),而不向其子窗口(即复选框)发送消息。我尝试过这样做,但会使复选框闪烁很多。
- 也许有一个我不知道的透明画刷/绘图函数,我可以用它来绘制整个复选框窗口,从而清除窗口?我尝试过这样做,但会使复选框窗口变为黑色。
我的代码:
case WM_SET_TEXT:
{
// set checkbox text
// Technique 1: update parent window to clear this window
RECT thisRect = {thisX, thisY, thisW, thisH};
InvalidateRect(parentHwnd, &thisRect, TRUE);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// Technique 2:
SetBkMode(hdc, TRANSPARENT);
Rectangle(hdc, thisX, thisY, thisW, thisH); // doesn't work just makes the window a big black rectangle?
EndPaint(hwnd, &ps);
}
break;