dephi中怎样把单个控件的透明度改变,有相应的代码更好。

解决方案 »

  1.   

    SetLayeredWindowAttributes可以对具有WS_EX_LAYERED属性的窗口设置透明度,具体用法可以百度。
    像Edit、Button等控件一般是子窗口,不能有WS_EX_LAYERED属性,所以不能设置透明度;但是强制使他们变成非子窗口是可以的,所以可以这样:
      h:=Edit1.Handle;
      Windows.SetParent(h, GetDesktopWindow);//变成非子窗口
      SetWindowLong(h, GWL_EXSTYLE, GetWindowLong(h, GWL_EXSTYLE) or WS_EX_LAYERED);//加上WS_EX_LAYERED属性
      SetLayeredWindowAttributes(h, 0, 100, LWA_ALPHA);//设置透明度然而这样改变了控件的父窗口,使得程序难以控制它(想通过先设置透明度然后恢复到原来的父窗口是徒劳的)。
    ps:问题如果解决就请及时结贴!
      

  2.   

    按实话实说WS_EX_LAYERED   这个属性还真不知道,,百度哥俺也没有搜到,希望这位大侠可以在帮忙搞一下啊
      

  3.   

      Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long   函数的原型为   BOOL SetLayeredWindowAttributes(   HWND hwnd, // handle to the layered window   COLORREF crKey, // specifies the color key   BYTE bAlpha, // value for the blend function   DWORD dwFlags // action   );   其中   hWnd是透明窗体的句柄,   crKey为掩码的颜色,可以用RGB(r,g,b)来指定。   bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。   dwFlags是透明方式,可以取两个值:   当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;   当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。   LWA_ALPHA = 0x2   LWA_COLORKEY=0x1   也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。   要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性,方法:   先声明GetWindowLong和SetWindowLong   Dim rtn As Long  rtn = GetWindowLong(Me.hWnd, -20)  rtn = rtn Or WS_EX_LAYERED  SetWindowLong (Me.hWnd, -20, rtn)     (旧的sdk没有定义WS_EX_LAYERED,所以可以直接指定为&H80000). (VC6.0 中主函数开头加#define WS_EX_LAYERED 0x00080000即可)   WS_EX_LAYERED = &H80000   比如用C语言编windows SDK程序,实现透明窗口,在VC6.0中,开头加一句#define WS_EX_LAYERED 0x00080000
      

  4.   

    WS_EX_LAYERED对于控件肯定是行不通的,实现透明控件的主流做法一般是基于TCustomControl重绘,学会Canvas的用法,要想画出透明控件也不算太难。