抓屏技巧二三例_Delphi 编程

本文介绍了抓取屏幕的不同方法,包括全屏、局部区域、当前活动窗口及鼠标指向窗口的抓取技巧,并提供了Delphi代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里有一些抓屏的技巧汇总,是本人平时编程积累下来的。在这里写出来,希望对大家有用。其实其技巧也不难,只要知道几个API函数,再加一些设备描述表的操作,你几乎可以做出非常好的抓屏软件。废话少说,现在开始介绍吧:
一,抓取全屏:
这个几乎可以说是抓屏中最简单的一个了,相信很多人都会,但为了讲述完整,这里也列举出来。思想很简单,取得屏幕的设备描述表,赋值给一个Canvas的句柄,这时该Canvas就相当于有了屏幕的画布了。再将这个画布复制给一个位图对象即可,代码如下:
procedure GetDesktopBim(FScreen:TBitmap);
var
    FCanvas:TCanvas;
    dc:HDC;
begin
     FCanvas:=TCanvas.Create();
     try
       Fscreen.Width := screen.width;
       Fscreen.Height := screen.Height;
//取得屏幕设备描述表,0指屏幕
       dc:=GetDC(0);
//将屏幕设备描述表赋给画布的句柄,此时画布就代表整个屏幕了
       FCanvas.Handle:=dc;
//把整个屏幕复制到BITMAP中,之后就可以将画布对象和设备描述表释放,
       Fscreen.Canvas.CopyRect(Rect (0, 0, screen.Width, screen.Height),
                                fCanvas,
                                Rect (0, 0, Screen.Width, Screen.Height));
     finally
       FCanvas.Free;
       ReleaseDC (0, dc);
     end;
end;
二,局部抓屏:
有时候并不需要抓取整个屏幕,只需要其中一部分,那么应该怎么做到呢。仔细看看那些抓屏软件,当抓取局部屏幕时,你看你的屏幕全部静止了,连QQ好友来信息,头像也不动了应该想到了吧,其实它是先将整个屏幕抓下来,放在真正的屏幕上面,让你在这个抓下来的屏幕上面操作。
一般来说,抓局部的屏幕有几种类型,这里只说明三种:
第一种是矩形,这个当然是最简单的啦,因一整个静止的位图都摆在你的面前了,你只处理鼠标的点下,移动,弹起消息,整个过程就像我们做一个小画图程序画一个矩形一样。最后将这个区域的位图拷贝到你抓屏窗口就行了。代码有些凌乱,这里就不列出来了。应该也不是很难吧。
第二种情况是画椭圆,在屏幕画布画出一个椭圆,然后将这个椭圆拷贝到抓屏窗口上。但问题是如何拷贝椭圆形的图呢。其实这里它拷贝的还是一个矩 形,但拷到抓屏窗口上时,作了一些改变以下是关键代码,是我以前作的程序中的一些代码,这里不好作出一般性的代码,所以只好将以前的代码拉下来,应该可以 看得懂的:
{这是实现位图蒙板的代码,先在抓屏窗体中画布全画为白,白色为0,而用屏幕位图窗体画的椭圆形为大小,给抓屏窗体的画布画一个黑色的 椭圆,黑色为1。之后调用API函数BitBlt将屏幕位图窗体中选取的椭圆外框(矩形)全部复制给抓屏窗体,但其复制模式为SRCPAINT,即椭圆外 框的位图与抓屏窗体画布进行and运算,结果椭圆外框的位图只有在抓屏窗体中黑色区域即椭圆部分的图像得到显示,而其他部分都被与掉了,所以看到的就只有 椭圆部分位图,而其余的以白色代替了。这就是椭圆抓屏的实现技术}
      Form1.ScrImage.Canvas.Pen.Color:=clWhite;
      Form1.ScrImage.Canvas.Brush.Style:=bsSolid;
      Form1.ScrImage.Canvas.Brush.Color:=clWhite;
      Form1.ScrImage.Canvas.Rectangle(0,0,width,Height);
      Form1.ScrImage.Canvas.Pen.Color:=clBlack;
      Form1.ScrImage.Canvas.Brush.Color:=clBlack;
      Form1.ScrImage.Canvas.Ellipse(0,0,width,Height);
      image1.Canvas.Ellipse(orgPoint.X,orgPoint.Y,X,Y);
      BitBlt (Form1.ScrImage.Canvas.Handle, 0, 0,width ,Height,
      Image1.Canvas.Handle, orgPoint.X, orgPoint.Y, SRCPAINT);
第三种是任意形状的抓屏,其实所谓的任意形状并非真的是任意的。它是一个多边形,只不过它的边很多所以你看起来,就像是任意的一样。当你的鼠标 在屏幕位图窗体上画线时,边些线的点就组成了一个多边形,然后要计算出这个多边形的外框,即与这个多边形相切的矩形。接着再用上面讲到的技术就可以实现一 个任意形状的抓屏了。有了上面椭圆的讲解,我想,任意形的大概也能自己做出来了吧。其实是由于代码有些乱,不好放上来。
等一下我会做一个代码简单,但却很有意思的抓屏例子。请接着往下看吧。
三。当前工作窗口的抓屏:
当你想抓取当前正激活的窗口,你会怎么做呢,你可以按Ctrl+PrintScreenSysRp.即可以抓 下这个口了。但我们要用程序来实现,怎么做呢,其实非常简单,就是获得这个活动窗口的句柄,再根据这个句柄到该窗口的设备描述表,这样就可以画出这个窗口 了。那么要获得当前工作的窗口是要用到什么函数呢,主要是用到这样一个API:GetForegroundWindow(),它返回当前正在工作的窗口的 句柄。好了,现在给出代码吧:
procedure TForm1.GetActiveWndImg(b:TBitmap);
var C:TCanvas; H:HDC; R:TRect; hand:THandle;
begin
   C:=TCanvas.Create;
   Hand:= GetForegroundWindow();
   if hand=0 then exit;
   H:=GetWindowDC(Hand);//取得这个窗口的句柄
   try
    GetWindowRect(hand,R);//取得这个窗口的大小,将其赋给位图对象
    B.Width:=R.Right-R.Left;
    B.Height:=R.Bottom-R.Top;
    C.Handle:=H;
    B.Canvas.CopyRect(Rect(0,0,B.Width,B.Height),C
    ,Rect(0,0,B.Width,B.Height));
   finally
    C.Free;
    ReleaseDC(Hand, H);
   end;
end;
上面已经讲解了抓屏的几种方式,只是一个引玉的作用,虽然没有详细的代码,我想思路应该是有了吧,再加上一本帮助你应该可以做出很不错的抓屏软件。
----------------------------------------------------
作为最后,我想出一个更有意思的抓屏方式,就是当你的鼠标指针指向屏幕的某一个地方,再按设定好的热键。就可以抓到鼠标指向的窗口(这个窗口也包括控件如按钮等)。这真的是不错,现实也并不是很难。主要有两个问题,这里一一作答吧,找到相应的API就行了:
一,热键问题,用到的API是RegisterHotKey和UnRegisterHotKey。这里不打算详细解说,可以自己看API帮助,当热键被按下时,会触发WM_HOTKEY消息,我们就在这个消息处理函数中抓鼠标位置的窗口位图。
二。光标位置的窗口,先用GetCurSorPos取得光标的位置,再用WindowFromPoint取得该位置的窗口句柄。
有了句柄,真是什么都好办呀。以下是程序代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
      hotkey:Integer;   
    procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;
    procedure GetActiveWndImg;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.GetActiveWndImg;
var C:TCanvas; b:TBitmap; H:HDC; R:TRect; hand:THandle;
   p:TPoint;
begin
   B:=TBitmap.Create;
   C:=TCanvas.Create;
   GetCurSorPos(P);
   Hand:= WindowFromPoint(P);
   if hand=0 then exit;
   H:=GetWindowDC(Hand);
   try
    GetWindowRect(hand,R);
    B.Width:=R.Right-R.Left;
    B.Height:=R.Bottom-R.Top;
    C.Handle:=H;
    B.Canvas.CopyRect(Rect(0,0,B.Width,B.Height),C
    ,Rect(0,0,B.Width,B.Height));
    Image1.Picture.Bitmap.Assign(B);
   finally
    C.Free;
    B.Free;
    ReleaseDC(Hand, H);
   end;
end;
procedure TForm1.HotKeyDown(var Msg: Tmessage);
begin
   if (Msg.LParamHi = VK_SPACE)and (Msg.LParamLo=MOD_CONTROL) then
       GetActiveWndImg;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   hotkey:=0;
if not RegisterHotKey(Handle,hotkey,MOD_CONTROL ,VK_Space) then
    showmessage('can not register the hotkey');
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   UnRegisterHotKey(handle, HotKey);
end;
end.
上面没有什么解释,真是抱歉,但如果看了上面的文字,我想也不难看得懂吧。把你的光标放在任何一个窗口上,按Ctrl+Space,看是不是把 这个窗口抓下来了呢如果你将光标指在一个窗口内部的控件上,再按Ctrl+Space,这时候抓到的就是这个控件了。是不是很有意思呢。
其实,有了句柄,真的是好办,可以做好多的事情。

转载于:https://www.cnblogs.com/baoguo/archive/2008/12/11/1352404.html

Borland 公 司 的 天 才 设 计 师 们 用 画 布(Tcanvas) 对 象 封 装 了Windows 的 大 部 分 图 形 输 出 功 能, 这 使 得 我 们 可 以 通 过 他 以 更 直 观 的 方 式 和Windows 的 幕 打 交 道, 而 不 必 关 心 令 人 头 疼 的Windows API 函 数。 下 面 的 一 小 段 程 序 就 可 以 实 现 整 个 幕 的 图 象 拷 贝 了。 var //变量声明 Fullscreen:Tbitmap; FullscreenCanvas:TCanvas; dc:HDC; //------------------------------------------------------------ DC := GetDC (0); //取得幕的 DC,参数0指的是幕 FullscreenCanvas := TCanvas.Create; //创建一个CANVAS对象 FullscreenCanvas.Handle := DC; //将幕的DC赋给HANDLE Fullscreen.Canvas.CopyRect (Rect (0, 0, screen.Width,screen.Height), fullscreenCanvas, Rect (0, 0, Screen.Width, Screen.Height)); //把整个幕复制到BITMAP中 FullscreenCanvas.Free; //释放CANVAS对象 ReleaseDC (0, DC); //释放DC //SCREEN对象是DELPHI预先定义的幕对象,直接使用就行了。 ---- 看 了 以 上 代 码, 你 就 会 发 现 用DELPHI 幕 拷 贝 程 序 的 确 很 简 单。 ---- 当 然 要 写 一 个 实 用 的 幕 拷 贝 程 序, 光 靠 上 述 代 码 是 不 够 的, 下 面 讲 一 下 主 要 的 编 程 思 路: ---- 1. 全 幕 拷 贝 的 实 现 ---- 首 先 隐 藏 拷 程 序, 延 长 一 定 时 间 后, 利 用 上 述 的 程 序 即 可 实 现 幕 的 拷 贝。 ---- 2. 区 域 拷 贝 的 实 现 ---- 要 实 现 区 域 拷 贝 要 用 个 小 技 巧, 首 先 调 用 全 幕 拷 贝 程 序 把 整 个 幕 拷 贝 下 来, 然 后 把 拷 贝 下 来 的 图 象 显 示 在 幕 上, 之 后 就 可 以 让 用 户 在 上 面 选 择 需 要 的 区 域, 最 后 才 将 用 户 选 定 的 区 域 复 制 下 来。 ---- 编 程 实 现: ---- 1. 首 先 用DELPHI3 开 一 个 工 程。 ---- 2. 在FORM 上 放 置 一 个TPANEL 元 件, 设 置ALIGN=ALTOP, 再 选 部 件 条ADDITIONAL 上 的TSCROLLBOX, 放 到FORM 上, 设 置ALIGN=ALCLIENT, 然 后 在SCROLLBOX 上 放 置 一 个 TIMAGE 对 象。 ---- 3. 在PANEL 上 放 置4 个 按 钮, 分 别 为FULL SCREEN,REGIN,SAVE,EXIT。 ---- 4. 容 易 干 的 先 干, 在EXIT 按 钮 的CLICK 事 件 里 写 下 代 码 procedure TForm1.ExitClick(Sender: TObject); begin close; end; ---- 5. 接 着 是 实 现 全 幕 拷 贝 了, 在FROM 上 放 置 一 个 记 时 器TTIMER,ENABLED 设 为 FALSE,INTERVAL 设 为500, 也 就 是 半 秒 钟 激 活 一 次。 双 击TIMER 部 件, 写 上 如 下 的 代 码。 procedure TForm1.Timer1Timer(Sender: TObject); var Fullscreen:Tbitmap; FullscreenCanvas:TCanvas; dc:HDC; begin timer1.Enabled:=false; //取消时钟 Fullscreen := TBitmap.Create; //创建一个BITMAP来存放图象 Fullscreen.Width := screen.width; Fullscreen.Height := screen.Height; DC := GetDC (0); //取得幕的 DC,参数0指的是幕 FullscreenCanvas := TCanvas.Create; //创建一个CANVAS对象 FullscreenCanvas.Handle := DC; Fullscreen.Canvas.CopyRect (Rect (0, 0, screen.Width, screen.Height), fullscreenCanvas, Rect (0, 0, Screen.Width, Screen.Height)); //把整个幕复制到BITMAP中 FullscreenCanvas.Free; //释放CANVAS对象 ReleaseDC (0, DC); //释放DC //******************************* image1.picture.Bitmap:=fullscreen;//拷贝下的图象赋给IMAGE对象 image1.Width:=fullscreen.Width; image1.Height:=fullscreen.Height; fullscreen.free; //释放bitmap form1.WindowState:=wsNormal; //复原窗口状态 form1.show; //显示窗口 messagebeep(1); //BEEP叫一声,报告图象已经截取好了。 end; ---- 6. 接 下 去FULLSCREEN 按 钮 上 的 代 码 就 很 简 单 了。 procedure TForm1.FullscreenClick(Sender: TObject); begin form1.WindowState:=wsMinimized; //最小化程序窗口 form1.hide; //把程序藏起来 timer1.enabled:=true; //打开记时器 end; ---- 7. 拷 贝 到 了 图 象 当 然 要 存 起 来 了,SAVE 按 钮 就 有 了 用 武 之 地, 我 们 写 下 如 下 代 码。 procedure TForm1.Save1Click(Sender: TObject); begin if savedialog1.Execute then begin form1.Image1.Picture.SaveToFile(savedialog1.filename) end; end; ---- 8. 下 面 是 区 域 拷 贝 的 实 现。 再New 一 个FORM,BorderStype 设 为 bsNone, 这 样 能 够 显 示 为 全 幕, 上 面 放 置 一 个TIMAGE 部 件,ALIGN 设 为ALCLIENT, 另 外 放 置 一 个TTIMER 部 件,TIMER 部 件 的 程 序 跟 上 面 的 很 象, 因 为 它 首 先 要 实 现 的 是 全 幕 的 拷 贝。 procedure TForm2.Timer1Timer(Sender: TObject); var Fullscreen:Tbitmap; FullscreenCanvas:TCanvas; dc:HDC; begin timer1.Enabled:=false; Fullscreen := TBitmap.Create; Fullscreen.Width := screen.width; Fullscreen.Height := screen.Height; DC := GetDC (0); FullscreenCanvas := TCanvas.Create; FullscreenCanvas.Handle := DC; Fullscreen.Canvas.CopyRect (Rect (0, 0, screen.Width, screen.Height), fullscreenCanvas, Rect (0, 0, Screen.Width, Screen.Height)); FullscreenCanvas.Free; ReleaseDC (0, DC); image1.picture.Bitmap:=fullscreen; image1.Width:=fullscreen.Width; image1.Height:=fullscreen.Height; fullscreen.free; form2.WindowState:=wsMaximized; form2.show; messagebeep(1); foldx:=-1; foldy:=-1; image1.Canvas.Pen.mode:=pmnot; //笔的模式为取反 image1.canvas.pen.color:=clblack; //笔为黑色 image1.canvas.brush.Style:=bsclear; //空白刷子 flag:=true; end; ---- 9.TIMAGE 部 件 上 有 两 个 事 件 的 程 序 需 要 编 写, 一 个 是ONMOUSEDOWN, 另 一 个 是ONMOUSEMOVE。 ---- 10. 可 以 回 头 看 看 区 域 拷 贝 的 思 路, 此 时 需 要 作 区 域 拷 贝 的 幕 我 们 已 经 得 到, 也 显 示 在 幕 上 了, 按 下 鼠 标 左 键 是 区 域 的 原 点, 此 后 移 动 鼠 标, 将 有 一 个 矩 形 在 原 点 和 鼠 标 之 间, 它 会 随 着 鼠 标 的 移 动 而 变 化, 再 次 按 下 鼠 标 的 左 键, 此 时 矩 形 所 包 含 的 区 域 就 是 我 们 要 得 到 的 图 象 了。 ---- 11. 所 以MOUSEDOWN 有 两 次 响 应 的 处 理, 见 以 下 程 序。 procedure TForm2.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var width,height:integer; newbitmap:Tbitmap; begin if (trace=false) then // TRACE表示是否在追踪鼠标 begin //首次点击鼠标左键,开始追踪鼠标。 flag:=false; with image1.canvas do begin moveTo(foldx,0); LineTo(foldx,screen.height); moveto(0,foldy); lineto(screen.width,foldy); end; x1:=x; y1:=y; oldx:=x; oldy:=y; trace:=true; image1.Canvas.Pen.mode:=pmnot; //笔的模式为取反 //这样再在原处画一遍矩形,相当于擦除矩形。 image1.canvas.pen.color:=clblack; //笔为黑色 image1.canvas.brush.Style:=bsclear;//空白刷子 end else begin //第二次点击,表示已经得到矩形了, //把它拷贝到FORM1中的IMAGE部件上。 x2:=x; y2:=y; trace:=false; image1.canvas.rectangle(x1,y1,oldx,oldy); width:=abs(x2-x1); height:=abs(y2-y1); form1.image1.Width:=Width; form1.image1.Height:=Height; newbitmap:=Tbitmap.create; newbitmap.width:=width; newbitmap.height:=height; newbitmap.Canvas.CopyRect (Rect (0, 0, width, Height),form2.image1.canvas, Rect (x1, y1,x2,y2)); //拷贝 form1.image1.picture.bitmap:=newbitmap; //放到FORM的IMAGE上 newbitmap.free; form2.hide; form1.show; end; end; ---- 12.MOUSEMOVE 的 处 理 就 是 在 原 点 和 鼠 标 当 前 位 置 之 间 不 断 地 画 矩 形 和 擦 除 矩 形。 procedure TForm2.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if trace=true then //是否在追踪鼠标? begin //是,擦除旧的矩形并画上新的矩形 with image1.canvas do begin rectangle(x1,y1,oldx,oldy); Rectangle(x1,y1,x,y); oldx:=x; oldy:=y; end; end else if flag=true then //在鼠标所在的位置上画十字 begin with image1.canvas do begin moveTo(foldx,0); //擦除旧的十字 LineTo(foldx,screen.height); moveto(0,foldy); lineto(screen.width,foldy); moveTo(x,0); //画上新的十字 LineTo(x,screen.height); moveto(0,y); lineto(screen.width,y); foldx:=x; foldy:=y; end; end; end; ---- 13. 好 了, 让 我 们 回 过 头 来 编 写REGION 按 钮 的 代 码。 procedure TForm1.RegionClick(Sender: TObject); begin form1.Hide; form2.hide; form2.Timer1.Enabled:=true; end; ---- 好 了, 我 们 终 于 胜 利 完 工 了, 赶 快 运 行 一 遍, 把 漂 亮 的 幕 拷 下 来 ! 瞧 DELPHI 不 仅 是 一 个 优 秀 的 数 据 库 开 发 工 具, 而 且 是 一 个 优 秀 的 编 写WINDOWS 程 序 的 好 帮 手。 让 我 们 不 禁 赞 叹: 伟 大 的DELPHI
var intPos,intX,intY: longint; begin intPos := message.lParam; intX := Trunc(intPos/10000); intY := (intPos mod 10000); if not CutRange.MouseIsDown then begin if not ((intX>Left) and (intX<Left+47) and (intY>Top) and (intY<Top+Height)) then begin MoveWindow(CutRangeFormHan,intX,intY,1,1,True); end; end; case CurAction of alCut: //篒礶 begin if message.WParam = WM_LBUTTONDOWN then begin CutRange.StartPoint.X := intX; CutRange.StartPoint.Y := intY; CutRange.MouseIsDown := True; end else if message.WParam = WM_LBUTTONUP then begin SendMessage(CutRangeFormHan,WM_CLOSE,0,0); CutRangeFormHan := 0; uUnWinHook; CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; btnCut.Down := False; CutRange.MouseIsDown := False; CurAction := alNone; uCutScreenToClipboard(CutRange); end; if CutRange.MouseIsDown then begin uDrawCutRange(intX,intY); end; end; alLine: //礶絬 begin if message.WParam = WM_LBUTTONDOWN then begin CutRange.StartPoint.X := intX; CutRange.StartPoint.Y := intY; CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := True; end else if message.WParam = WM_LBUTTONUP then begin CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := False; uDrawLine(intX,intY,pmCopy); end; if CutRange.MouseIsDown then begin uDrawLine(intX,intY,pmXor); end; end; alPolyLine: //礶ヴ種Ρ絬 begin if message.WParam = WM_LBUTTONDOWN then begin CutRange.StartPoint.X := intX; CutRange.StartPoint.Y := intY; CutRange.MouseIsDown := True; end else if message.WParam = WM_LBUTTONUP then begin CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := False; uDrawPolyLine(intX,intY); end; if CutRange.MouseIsDown then begin uDrawPolyLine(intX,intY); end; end; alRang: //礶痻 begin if message.WParam = WM_LBUTTONDOWN then begin CutRange.StartPoint.X := intX; CutRange.StartPoint.Y := intY; CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := True; end else if message.WParam = WM_LBUTTONUP then begin CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := False; uDrawRang(intX,intY,pmCopy); end; if CutRange.MouseIsDown then begin uDrawRang(intX,intY,pmXor); end; end; alRangC: //礶蛾à痻 begin if message.WParam = WM_LBUTTONDOWN then begin CutRange.StartPoint.X := intX; CutRange.StartPoint.Y := intY; CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := True; end else if message.WParam = WM_LBUTTONUP then begin CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := False; uDrawRangC(intX,intY,pmCopy); end; if CutRange.MouseIsDown then begin uDrawRangC(intX,intY,pmXor); end; end; alRoud: //礶蛾 begin if message.WParam = WM_LBUTTONDOWN then begin CutRange.StartPoint.X := intX; CutRange.StartPoint.Y := intY; CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := True; end else if message.WParam = WM_LBUTTONUP then begin CutRange.EndPoint.X := intX; CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := False; uDrawRoud(intX,intY,pmCopy); end; if CutRange.MouseIsDown then begin uDrawRoud(intX,intY,pmXor); end; end; alText: //糶ゅ begin if message.WParam = WM_LBUTTONDOWN then begin if TextFormHan<=0 then begin SendMessage(CutRangeFormHan,WM_CLOSE,0,0); CutRangeFormHan := 0; TextForm := TTextForm.Create(nil); TextFormHan := TextForm.Handle; TextForm.Left := intX; TextForm.Top := intY; CutRange.StartPoint.X := intX; CutRange.StartPoint.Y := intY; TextForm.Show; btnText.Down := False; end else begin if (intX<TextForm.Left) or (intY<TextForm.Top) or (intX>TextForm.Left+TextForm.Width) or (intY>TextForm.Top+TextForm.Height) then begin SendMessage(TextFormHan,MSG_SANWRITETEXT,100,0); // SendMessage(TextFormHan,WM_CLOSE,0,0); TextFormHan :=0; uUnWinHook; // CutRange.EndPoint.X := intX; // CutRange.EndPoint.Y := intY; CutRange.MouseIsDown := False; CurAction := alNone; end; end; end else if message.WParam = WM_LBUTTONUP then begin end; //MoveWindow(TextFormHan,intX,intY,1,1,True); end; end; end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值