2012-07-13 123 views
6

我在Win32 C++中创建了一个透明复选框。我已经做到了,因为据我所知你不能在本机win32中有一个透明的复选框,我需要在NSIS安装程序中使用这个复选框。如何“清除”WinAPI透明窗口

我的问题:重新粉刷时,我不知道如何抹去透明背景,这样我就可以画出一个“清晰的画布”。当用户更改复选框内的文本时,这很重要,我需要重新绘制它。我想我已经遇到了每个人都必须用透明窗口得到的问题。

什么是我可以清除我的透明窗口的方法,注意我熟悉WinAPI,你不能真正清除窗口AFAIK,因为你只是在窗口上重新绘制。所以,我在找上我可以用什么方法来重绘窗口,如建议:

  • 发送重绘消息,希望这将重绘父(这是复选框下面的SIT)的父窗口withut发送一条消息传递给其子女(即复选框)。我试过这个,它使复选框有很多闪烁。
  • 也许这是一个透明的画笔/绘画功能我不知道,我可以使用绘画在整个复选框窗口,这将基本上清除窗口?我试过这个,它使复选框窗口黑色出于某种原因?

我的代码:

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; 
+3

一般来说,你再也不想发送绘制消息到另一个窗口,如果你想重新粉刷,废止它的矩形。 – 2012-07-13 03:15:35

+0

你在WM_ERASEBKGND消息处理程序中做什么? – 2012-07-13 03:16:35

+0

@LarryOsterman嗯以前从来没有与该消息的工作?所以现在没有,我该怎么办? – 2012-07-13 03:28:59

回答

0

您需要处理WM_ERASEBBKGND消息。像下面的东西应该工作!

case WM_ERASEBKGND: 
{ 
    RECT rcWin; 
    RECT rcWnd; 
    HWND parWnd = GetParent(hwnd); // Get the parent window. 
    HDC parDc = GetDC(parWnd); // Get its DC. 

    GetWindowRect(hwnd, &rcWnd); 
    ScreenToClient(parWnd, &rcWnd); // Convert to the parent's co-ordinates 

    GetClipBox(hdc, &rcWin); 
    // Copy from parent DC. 
    BitBlt(hdc, rcWin.left, rcWin.top, rcWin.right - rcWin.left, 
     rcWin.bottom - rcWin.top, parDC, rcWnd.left, rcWnd.top, SRC_COPY); 

    ReleaseDC(parWnd, parDC); 
} 
break; 
+0

这会绘制一个透明的“颜色”或标准按钮灰色吗?记住复选框有一个透明背景,其父HWWD可能没有标准的灰色背景,它可能是一个图像等。 – 2012-07-13 03:43:04

+0

@JakeM查看更新的答案。我假设你正在处理复选框的绘图部分。 – 2012-07-13 04:03:46

0

尝试删除窗口样式WS_CLIPCHILDREN

+0

你的意思是从复选框或复选框的父级删除样式吗? – 2012-07-13 03:57:48

+0

@JakeM from复选框 – 2012-07-13 03:59:46