先把你不希望透明的地方画成别的颜色
然后SetLayeredWindowAttributes
最后再还原颜色

解决方案 »

  1.   

    这样感觉挺复杂的,有更好的方法吗?我先前采用的方法是:把凡是白背景的地方,用画刷刷成RGB(254,254,254),这样看起来还基本上是白色(视觉上基本上没有差别),但是已经不是纯白色了。然后把位图copy过来的时候,用的是SRCAND模式,这样,即使位图中有纯白色的部分,到这里也不是纯白色了。可是又有一个问题来了,有时候,我的某些字需要“选定”,选定以后,显示就取反,白变成黑,黑变成白,这样一来,位图中原来纯黑色的部分(RGB(0,0,0)),就变成纯白色了。麻烦!
      

  2.   

    LONG i1 = ::GetWindowLong(this->m_hWnd, GWL_EXSTYLE);
    LONG i2 = ::GetWindowLong(this->m_hWnd, GWL_STYLE);
    i1 |= WS_EX_LAYERED;
    i1 |= WS_EX_TOPMOST;
    SetWindowLong(this->m_hWnd, GWL_EXSTYLE, i1);
    SetWindowLong(this->m_hWnd, GWL_STYLE, i2); ::SetWindowPos(this->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
    ::SetLayeredWindowAttributes(this->m_hWnd, 0, 200, LWA_ALPHA);
    ::SetTimer(this->m_hWnd, 1, 1000, NULL);
      

  3.   


    这一句不太懂,能稍加解释吗?::SetWindowPos(this->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);HWND_TOPMOST是什么?是窗口句柄还是窗口风格?
      

  4.   


    这一句不太懂,能稍加解释吗?::SetWindowPos(this->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);HWND_TOPMOST是什么?是窗口句柄还是窗口风格?在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或下列值之一:
    HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
    HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
    HWND_TOP:将窗口置于Z序的顶部。
    HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。