类似于PHOTOSHOP里面的画直线或者其他什么的操作,
比如当选定了一项画方框功能后,就能用鼠标在画布上画出一个方框我想先设置一个鼠标的钩子,然后拦截鼠标的消息来进行这样的操作不知道大家有没有好的方法了?

解决方案 »

  1.   

    在一个TImage上实现橡皮筋功能
    var
    a:TREct;
    b:TREct;
    dra:integer;
    procedure TPICW.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    if (shift=[ssShift,ssleft]) then
    begin
    dra:=1;
    a.Left:=x;
    a.Top:=y;
    end;
    end;procedure TPICW.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    dra:=0;
    end
    procedure TPICW.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    if dra=1 then
    begin
    a.Right:=x;
    a.Bottom:=y;
    image1.Picture.Bitmap.Canvas.Pen.Mode:=pmnotXor;
    image1.Picture.Bitmap.Canvas.Rectangle(b);//这里是方型框
    image1.Picture.Bitmap.Canvas.Rectangle(a);
    b:=a;
    end;
    end
    按住Shift键开始画框。
      

  2.   

    为什么要用鼠标钩子?不时在你自己的程序中画方框吗?自己在MouseDown,MouseMove事件中写代码就可以了呀。。
      

  3.   

    就用Timage啊.//其中一些未定义的变量为全局的.procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
    var
        i: Integer;
    begin
        selRect := TShape.Create(nil);
        selRect.Parent := Panel1;
        selRect.Left := X;
        selRect.Top := Y;
        selRect.Width := 0;
        selRect.Height := 0;
        selRect.Pen.Style := psDash;
        selRect.Brush.Style := bsClear;
        selRect.Pen.Color := clBlack;    SelCurrentX := X;
        SelCurrentY := Y;
        SelIsDown := true;
        Screen.Cursor := crCross;
    end;procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
        Y: Integer);
    begin
        if (SelIsDown) then
        begin
            selRect.Width := X - SelCurrentX;
            selRect.Height := Y - SelCurrentY;
        end;
    end;procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
    begin
        ScanSelected(selRect);
        FreeAndNil(selRect);
        SelIsDown := false;
        Screen.Cursor := crDefault;
    end;
      

  4.   

    因为我是动态的创建一个IMAGE,包含在一个对象里面的,不希望鼠标的每次移动都触发检查是不是要进行这个操作,所以觉得用钩子,想进行操作的时候就把钩子打开,结束的时候就关掉钩子。
    用IMAGE的事件也可以,但觉得对于不同的操作判断起来太麻烦
      

  5.   

    Delphi目录下有一个例子程序
    C:\Program Files\Borland\Delphi6\Demos\Doc\Graphex
    看一下就明白了