有定时使form透明的控件吗目前的没有time起作用无法进行移动操作

解决方案 »

  1.   

    目前使form透明的控件,没有time起作用,用户把form透明后看到的只是刚刚设为透明时的场景,如果把time控件加入,在ontime里加入随时透明那么目前用户无法对透明form进行移动操作的问题可以解决吗?
      

  2.   

    我是因为目前一边看用户要求书的form,一边把敲代码的form打开,两者来回切换麻烦,打算写一个把一边看用户要求书的form设为透明在最前面,也可以看到正在后面敲代码的form的软件,可是被覆盖的只是刚刚设为透明时的场景,没有重新绘制,是不是如果把time控件加入,在ontime里加入随时透明,也就是不断重新绘制被覆盖的地方,就可以不被遮住敲代码的form了,不然透明也就没有意义了
      

  3.   

    type
      PtsType = array [0..15, 0..1] of Integer;const
      Pts: PtsType = ((0, 0), (800, 0), (800, 600),
       (200, 600), (200, 220), (300, 280),
       (265, 205), (350, 117), (205, 170),
       (120, 90), (130, 200), (60, 350), (200, 220),
       (200, 600), (0, 600), (0, 0));procedure THoleForm.Button1Click(Sender: TObject);
    var
      HRegion1: THandle;
    begin
      HRegion1 := CreatePolygonRgn (Pts,
        sizeof (Pts) div 8, alternate);
       SetWindowRgn (Handle, HRegion1, True);
    end;
      

  4.   

    不是不规格窗体,是半透明的,在time控件ontime里加入定时透明,不影响工作,一个程序窗体是半透明,另外一个窗体被覆盖但是因为半透明,不影响用户对普通窗体工作和半透明窗体的监视
      

  5.   

    为什么用timer控件呢?你需要重画的时候无非是窗体的状态发生了变化么?比如:移动、最大化、最小化,你只需要在窗体的WM_Paint消息中添加使窗体透明的代码。
      

  6.   

    我想你实现透明窗体的思路大概是拷贝桌面的图片在自己的Canvas上吧。
    把你的代码写在上面我说的WM_Paint消息中。写一个伪代码给你。procedure WMPaint(var Msg: TWMPaint); Message WM_Paint;
    begin
      1:取得窗体矩形的大小。
      2:复制桌面相应区域、相应大小的图片
      3:拷贝在自己的矩形中。
    end;
      

  7.   

    和office助手差不多,但是自己整个是半透明的,可以监视其他被覆盖的程序情况,
      

  8.   

    设置按钮事件,使当前窗体透明
    Form1.AlphaBlend:=True;
    Form1.AlphaBlendValue:=100;
      

  9.   

    滚动条设定 Form1.AlphaBlendValue:=滚动条的百分比。
      

  10.   

    设为透明的画面是一跳跳的不平滑如果播放vcd,不过如果把当前任意运行的指定程序窗体设为透明呢,是要得到句柄吗?
      

  11.   

    ---------------------------------------回复人: readersm68(地主) ( ) 信誉:100  2003-05-26 15:56:00  得分:0 
     
     
      设置按钮事件,使当前窗体透明
    Form1.AlphaBlend:=True;
    Form1.AlphaBlendValue:=100;
      
     
    -------------------------------------前提是WIN20000
      

  12.   

    Form1.AlphaBlend:=True;
    Form1.AlphaBlendValue:=100;
      
     
    -------------------------------------前提是WIN2000那没有98的阿,如果把这个属性作为变量赋予当前任意form呢
      

  13.   

    unit WinLayer;interfaceuses
      Windows;const
      WS_EX_LAYERED = $80000;  LWA_COLORKEY = 1;
      LWA_ALPHA = 2;var
      SetLayeredWindowAttributes: function (Handle: HWnd; crKey: TCOLORREF; bAlpha: Byte; dwFlags: DWord): Boolean; stdcall;function IsFeatureEnabled: Boolean;
    function SetWindowTransparency(Handle: HWnd; Percent: Byte): Boolean;implementationvar
      FeatureEnabled: Boolean;
      Initialized: Boolean;function InitLayeredWindows: Boolean;
    var Module: THandle;
    begin
      Result:=True;
      Module:=LoadLibrary('user32.dll');
      if (Module=0) then
      begin
        Result:=False;
        Exit;
      end;
      SetLayeredWindowAttributes:=GetProcAddress(Module, 'SetLayeredWindowAttributes');
      if (Assigned(SetLayeredWindowAttributes)) then FeatureEnabled:=True;
      Initialized:=True;
    end;function IsFeatureEnabled: Boolean;
    begin
      Result:=True;
      if (not Initialized) then Result:=InitLayeredWindows;
      Result:=Result and FeatureEnabled;
    end;function SetWindowTransparency(Handle: HWnd; Percent: Byte): Boolean;
    begin
      Result:=True;
      if (not Initialized) then Result:=InitLayeredWindows;
      if ((Result) and (FeatureEnabled)) then
      begin
        if (Percent<>0) then
        begin
          SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
          SetLayeredWindowAttributes(Handle, 0, (255 * Percent) div 100, LWA_ALPHA);
        end else
         begin
           SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) xor WS_EX_LAYERED);
         end;
      end;
    end;initialization
      FeatureEnabled:=False;
      Initialized:=False;
    end.
    这里有一个,到底那里是设为半透明的代码阿
      

  14.   

    创建单元文件Unit2
    把上面的单元复制到Unit2中,unit WinLayer改为unit Unit2
    你要设置透明的窗体包含unit2单元
    设置按钮事件
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetWindowTransparency(Form1.Handle,40);
    end;
      

  15.   

    用以下方法在win2000server下窗体不会闪烁
    我试过啊
    Form1.AlphaBlend:=True;
    Form1.AlphaBlendValue:=100;
      

  16.   

    win2000server下窗体不会闪烁,如果播放vcd运算量大的任务就不是了,delphi7听说有直接设置的透明属性,可能适应性更全,98那些平台应该也可以一次性解决,为了可以帮助其他有相同问题的兄弟一次性解决,现在就把问题以delphi7为平台,把这个属性作为变量赋予当前任意form为题
    Form1.AlphaBlend:=True;
    Form1.AlphaBlendValue:=100;
    我的思路是用api的findwindows找到当前任意在顶部的form,马上用postmessage或sendmessage把AlphaBlend属性赋予这个form,和东方快译的翻译网页功能差不多,不知要不要时间控件来不断激活,解决就给分
      

  17.   

    WinLayer;是俄国人写的,他表示他那个时候的操作系统不直接支持半透明的,自己尝试写的,可能不稳定最好小心或者用delphi7了
      

  18.   

    win2000提供了一个API函数,可以设置窗体的透明度(0-100)。名字我忘记了,如果在win2000下,这是最好的方案了
      

  19.   

    如何制作透明窗体 
      使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。
      SetLayeredWindowAttributes的函数原型如下: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
    ); 
    Windows NT/2000/XP: Included in Windows 2000 and later.
    Windows 95/98/Me: Unsupported.(注意了,在win9x里没法使用的)
    Header: Declared in Winuser.h; include Windows.h.
    Library: Use User32.lib. 
       一些常量:
    WS_EX_LAYERED = 0x80000;
    LWA_ALPHA = 0x2;
    LWA_COLORKEY=0x1;   其中dwFlags有LWA_ALPHA和LWA_COLORKEY  LWA_ALPHA被设置的话,通过bAlpha决定透明度.  LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.  要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧的sdk没有定义这个属性,所以可以直接指定为0x80000).   例子代码:  在OnInitDialog()加入: //加入WS_EX_LAYERED扩展属性
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
    GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    HINSTANCE hInst = LoadLibrary("User32.DLL"); 
    if(hInst) 

     typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
     MYFUNC fun = NULL;
     //取得SetLayeredWindowAttributes函数指针 
     fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
     if(fun)fun(this->GetSafeHwnd(),0,128,2); 
     FreeLibrary(hInst); 
    }   稍加修改还可以作出淡出淡入的效果. 注意第三个参数(128)不要取得太小了,为0的话就完全透明,看不到了。
    函数SetLayeredWindowAttributes   使用这个函数,可以轻松的实现半透明窗体。按照微软的要求,透明窗体窗体在创建时应使用WS_EX_LAYERED参数(用CreateWindowEx),或者在创建后设置该参数(用SetWindowLong),我选用后者。全部函数、常量声明如下: Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long    其中hwnd是透明窗体的句柄,crKey为颜色值,bAlpha是透明度,取值范围是[0,255],dwFlags是透明方式,可以取两个值:当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明--这个功能很有用:我们不必再为建立不规则形状的窗体而调用一大堆区域分析、创建、合并函数了,只需指定透明处的颜色值即可,哈哈哈哈!请看具体代码。 Private Const WS_EX_LAYERED = &H80000 Private Const GWL_EXSTYLE = (-20) Private Const LWA_ALPHA = &H2 Private Const LWA_COLORKEY = &H1 代码一:一个半透明窗体 Private Sub Form_Load()   Dim rtn As Long   rtn = GetWindowLong(hwnd, GWL_EXSTYLE)   rtn = rtn Or WS_EX_LAYERED   SetWindowLong hwnd, GWL_EXSTYLE, rtn   SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA End Sub 
    代码二:形状不规则的窗体 Private Sub Form_Load()   Dim rtn As Long   BorderStyler=0   rtn = GetWindowLong(hwnd, GWL_EXSTYLE)   rtn = rtn Or WS_EX_LAYERED   SetWindowLong hwnd, GWL_EXSTYLE, rtn   SetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY ’将扣去窗口中的蓝色 End Sub 
    半透明窗体的又一种想法 
    作者: 张泰立  评价:  上站日期: 2001-06-29  
    内容说明:  
    来源:  --------------------------------------------------------------------------------其实很简单,现有任一种方法制作一个透明窗体,我试过捕获屏幕、设置窗体brush属性、以及通过windows api函数改变三种制作透明窗体的方法都行。然后在窗体上添加一个shape,将其扩展至全屏幕,将shape的pen属性的mode设为pmmask,pen的style属性该为psclean,然后改变brush的color属性,即可进行透明的调节,不仅可以改变透明度,而且可以改变覆盖的颜色。就享用directx生成的效果。
        其实巧用delphi的canvas类,可以是按许多图形效果。毕竟是用windows2000的还是少数。 
     
      

  20.   

    半透明窗体(win2000特有API)  
     
    2001-11-24· · ··yesky   Windows2000已经出了一年多了,就先介绍一下Windows2000特有的API吧!! AnimateWindow是一个窗口打开和关闭时产生动画效果的新函数,因为是一个新的函数, 所以在 API Viewer中是找不到的,必需自己定义:   Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long  '具体可以使用的常量及其用法  Const LWA_ALPHA=&H2     '表示把窗体设置成半透明样式
      Const LWA_COLORKEY=&H1     '表示不显示窗体中的透明色 
     
        
      具体例子  程序代码  Module1Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    Public Const WS_EX_LAYERED = &H80000
    Public Const GWL_EXSTYLE = (-20)
    Public Const LWA_ALPHA = &H2
    Public Const LWA_COLORKEY = &H1
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
      Form1 Private Sub Form_Load()
    Dim rtn As Long  rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE)    '取的窗口原先的样式
    rtn = rtn Or WS_EX_LAYERED     '使窗体添加上新的样式WS_EX_LAYERED
    SetWindowLong Me.hWnd, GWL_EXSTYLE, rtn    '把新的样式赋给窗体  SetLayeredWindowAttributes me.hwnd, 0, 192, LWA_ALPHA    '把窗体设置成半透明样式,第二个参数表示透明程度
        '取值范围0--255,为0时就是一个全透明的窗体了  End Sub
      第二种使用方法   SetLayeredWindowAttributes Me.hWnd, &H0, 0, LWA_COLORKEY
        '表明不显示窗体中的透明色
        '而第二个参数表示透明色为黑色,并且你可以用RGB函数来指定颜色值 
     
    98XXXX98那些平台应该也一次性解决
      

  21.   

    procedure TForm1.Button1Click(Sender: TObject);
    var 
      HWndCalculator : HWnd;
    begin 
      // 查找计算器句柄
      HWndCalculator := FindWindow(nil, '计算器');
       if HWndCalculator <> 0 then
        SendMessage(HWndCalculator, WM_CLOSE, 0, 0);
        //关闭计算器
    end;
    这是控制计算器的例子,我不知道如何修改为寻找当前激活的其他任意窗体再SendMessage(HWndCalculator, WM_CLOSE, 0, 0);把其设为半透明,此外,半透明的进度条也可以用此方法吗设置吗?编程实现窗体的半透明效果
        如果你不是使用Windows2000+Delphi编程的话,我不想浪费你的时间。如果是,请继续。
      大家都知道Windows 2000支持淡入淡出的窗体显示效果。如何让自己的应用程序也具备这种效果呢?前两天研究FormContainer的Form显示效果时(注:FormContainer是一个强大的Delphi特效处理控件,有兴趣的朋友可以访问http://www.billeniumsoft.com/),得高人告知,核心API函数就是SetLayeredWindowAttributes。
      要实现淡入淡出效果,就需要实现窗口的可调整的透明效果。传统的Windows应用程序想实现透明效果,一般来说需要处理自己的窗口的WM_Paint消息,程序员需要GetDC获取屏幕的HDC,调用BitBlt函数将屏幕将要被覆盖的区域拷贝到内存的TBitmap对象中,然后对该Tbitmap的ScanLine二维数组逐象素的修改rgbtRed、rgbtGreen和rgbtBlue值。天哪,实在是太麻烦了。
      Windows2000的API库中终于提供了半透明的窗体显示效果支持(虽然不是很完善)。要实现半透明的窗口效果,首先需要给创建的窗口添加WS_EX_LAYERED 扩展属性,这是一个新的窗口扩展属性,Delphi5并没有定义相应的常量和SetLayeredWindowAttributes函数,我们需要手工声明。function SetLayeredWindowAttributes(Handle: HWND; 
      COLORKEY: COLORREF; Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';Const
      WS_EX_LAYERED = $80000;
      LWA_ALPHA = 2;   我们调用GetWindowLong函数获取当前窗口的扩展属性,并调用SetWindowLong函数将新的WS_EX_LAYERED窗口扩展属性添加进去。procedure TForm1.FormCreate(Sender: TObject);
    begin
      SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_LAYERED);
    end;  现在我们的窗口已经可以调用SetLayeredWindowAttributes函数,通过设置该函数的Alpha参数,我们就可以看到窗口的效果的变化。procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetLayeredWindowAttributes(Form1.Handle, 0, 180, LWA_ALPHA);
    end;  以下的VCL控件代码封装了SetLayeredWindowAttributes函数,编程时动态改变AlphaValue值,您就可以看到窗口的透明效果了。控件屏蔽了设计期的显示效果,如果读者愿意可以改为设计期效果可见,不过那样的话,一不小心,您可能就会找不着你要设计的窗体了 8-) unit TranForm; {DragonPC 2001.2.21 }interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms ;type
      TTranForm = class(TComponent)
      private
       FAlphaValue : integer ;
       FParentFormHandle : HWND ;
      procedure SetFAlphaValue(Alpha:integer) ;
       protected
       procedure UpdateDisplay ;
    public
      constructor Create(AOwner: TComponent); override;
    published
      property AlphaValue : integer read FAlphaValue write SetFAlphaValue ;
    end;procedure Register;function SetLayeredWindowAttributes(Handle: HWND; COLORKEY: COLORREF;
      Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';implementationprocedure Register;
    begin
      RegisterComponents('Standard', [TTranForm]);
    end;procedure TTranForm.SetFAlphaValue(Alpha: integer);
      begin
       if (Alpha >= 0) and (Alpha < 256) then begin
       FAlphaValue := Alpha ;
       UpdateDisplay() ;
      end;
    end;procedure TTranForm.UpdateDisplay;
    begin
     if (csDesigning in ComponentState) then Exit ;
     SetLayeredWindowAttributes(FParentFormHandle, 0, FAlphaValue, 2);
    end;constructor TTranForm.Create(AOwner: TComponent);
    begin
      inherited;
      if (csDesigning in ComponentState) then Exit;
      FAlphaValue := 255 ;
      FParentFormHandle := TForm(AOwner).Handle ;
      SetWindowLong(FParentFormHandle,
             GWL_EXSTYLE, 
             GetWindowLong(FParentFormHandle, GWL_EXSTYLE) or WS_EX_LAYERED);
    end;end.  谢谢您的莫大耐心得以看完此文,此文纯粹本着赚取china-pub"假币"目的所写,万一各位看官有任何的疑问,欢迎信至[email protected],谢谢。这个例子好复杂,我希望可以用SendMessage控制半透明属性可以帮忙吗?只是不知道可以在98下用吗?