如果使用Form的透明色属性来实现Form透明的话,那这个透明的Form根本就不能响应鼠标(鼠标被此透明的Form下层的Form响应了),更不必说在上面画线了。或者说是实现一个最简单的屏幕作图的小应用程序,这里有一个MFC写的(带有完整的源代码):
http://www.xiaozhou.net/ReadNews.asp?NewsID=867但是使用delphi怎样实现?

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
    procedure CreateWindowHandle(const Params: TCreateParams); override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
    var
    NewParams: TCreateParams;
    begin
    NewParams:=Params;
    NewParams.ExStyle := NewParams.ExStyle or WS_EX_TRANSPARENT;
    inherited CreateWindowHandle(NewParams);
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      canvas.LineTo(x,y);
    end;end.
      

  2.   

    非常感谢您的回帖。    非常抱歉我没有把问题叙述清楚,如果因此浪费的您的宝贵时间,请原谅。    我想要一个“玻璃窗”的效果。即,透明层后的内容刷新后这个透明窗体依然透明,事实上,我要在这个透明窗体下播放一段视频。使用“Params”方案实现透明的方法我曾经试过,无法在视频上实现透明和画图。
        我想使用透明层的方法实现“在视频上画图”,目前的透明层制作遇到障碍。这里有一段MFC实现的透明层画图代码,怎样在delphi中实现?(delphi中不可以用MFC吧?)
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CMyWnd::CMyWnd()
    {

    }CMyWnd::~CMyWnd()
    {

    }
    BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
    //{{AFX_MSG_MAP(CTransparentWnd)
    ON_WM_RBUTTONDOWN()
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEMOVE()
    ON_COMMAND(IDC_EXIT,OnExit)
    ON_COMMAND(IDC_SET,OnSet)
    ON_COMMAND(IDC_REFRESH,OnRefresh)
    ON_COMMAND(IDC_EXIT_ALL,OnExitAll)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP() void CMyWnd::CreateMyWnd(LPCTSTR pTitle,RECT &rect)
    {   
    //建立窗口
    CreateEx(WS_EX_TRANSPARENT,  //透明
    AfxRegisterWndClass(0,AfxGetApp()->LoadCursor(IDC_PEN)),
    pTitle,
    WS_POPUP,
    rect,
    NULL,
    NULL,
    NULL ); 
    }void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point)
    {  
    CMenu m_menu;
    m_menu.LoadMenu(IDR_MENU1);

    ClientToScreen(&point);
    CMenu *psub = (CMenu *)m_menu.GetSubMenu(1); 
    psub->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
    m_menu.DestroyMenu(); CWnd::OnRButtonDown(nFlags, point);
    }void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)
    {
    m_pt=point;
    CWnd::OnLButtonDown(nFlags, point);
    }
    void CMyWnd::OnMouseMove(UINT nFlags, CPoint point) 
    {
    if(nFlags & MK_LBUTTON)
    {
    CClientDC dc(this);

    CPen pen(
    ((CPageDlg*)AfxGetMainWnd())->m_page1.m_nPenStyle,
    ((CPageDlg*)AfxGetMainWnd())->m_page1.m_nPenWidth,
    ((CPageDlg*)AfxGetMainWnd())->m_page1.m_PenColor
    );
    CPen* pOldPen=dc.SelectObject (&pen); dc.MoveTo (m_pt.x,m_pt.y);
    dc.LineTo (point.x,point.y); m_pt=point;
    dc.SelectObject (pOldPen);
    }

    CWnd::OnMouseMove(nFlags, point);
    }
      

  3.   

    用鼠标hook试试。我没有VC,不知道你给的这个程序是否能实现这样的功能。
      

  4.   

    应该类似于学校里面用到的教鞭软件吧..网上有类似的资源.呵呵...你之前没有说清楚.害我专门做了个例子出来,可能不是你想要的效果,不过还是放上来吧.
    制作背景透明窗体,然后实现可以自由绘画
    步骤:
    1.新建一个应用程序,设置Form1的WindowState为最大化wsMaximized
    2.在窗体上放置两个ColorDialog 控件(该控件位于控件栏:Dialogs下),  分别命名Name为:LCD和RCP
      再放置两个Panel控件(该控件位于控件栏:Standard下), 分别命名Name为:LCP和RCP.并将这两个panel
    控件的Color属性设置为:ClRed和ClLime
    3.再放置一个SpeedButton按钮
    说明:
      ColorDialog控件和Panel控件主要用于绘画时,选择颜色用.
      SpeedButton 主要用于程序运行退出代码如下:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        LCP: TPanel;
        RCP: TPanel;
        SpeedButton1: TSpeedButton;
        RCD: TColorDialog;
        LCD: TColorDialog;
        Button1: TButton;
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure SpeedButton1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure LCPClick(Sender: TObject);
        procedure RCPClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      x0,y0:integer;
    implementation{$R *.dfm}procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,  //窗体上鼠标移动时
      Y: Integer);
    begin
    if ssleft in shift then
       begin  //从按鼠标左键画曲线
        canvas.Pen.Width:=3;
        canvas.Pen.Color:=lcp.Color;
        canvas.Pen.Mode:=pmcopy;
        canvas.moveto(x0,y0);
        canvas.lineto(x,y);
        end
        else
         if ssright in shift then
          begin  //从按鼠标右键画曲线
           canvas.Pen.Width:=3;
           canvas.Pen.Color:=rcp.Color;
           canvas.Pen.Mode:=pmcopy;
           canvas.moveto(x0,y0);
           canvas.lineto(x,y);
          end;
      x0:=x;
      y0:=y;
    end;procedure TForm1.SpeedButton1Click(Sender: TObject);  //单击退出时
    begin
    application.Terminate ;
    end;procedure TForm1.FormCreate(Sender: TObject);  //窗体创建时
    begin
    Brush.Style:=bsclear;with Form1 do
          SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //将窗体置在最上面
    end;procedure TForm1.LCPClick(Sender: TObject);  //单击颜色选框时,弹出颜色面板(单击鼠标左键绘画时颜色选择)
    begin
    if lcd.Execute then
      LCP.Color:=LCD.Color;
    end;procedure TForm1.RCPClick(Sender: TObject); //单击颜色选框时,弹出颜色面板(单击鼠标右键绘画时颜色选择)
    begin
    if rcd.Execute then
      rCP.Color:=rCD.Color;
    end;end.买手机,找搜鸡网.品种多,价格便,质量好!
    http://shop.paipai.com/77181269