我做了个自定义截屏小工具,截屏之后已经设置好了自定义手写字,想再加个自定义输入,就想到了label,当label随鼠标拖动生成label,背景设置为透明,输入内容后给人感觉像是输入在图片上了,可是当把图片保存时就没有label上的内容,今天上windows课时,老师指教说获得picture的HDC应该就可以把picture及覆盖上的东西都涉及到.我就想到bitblt(),可是无奈能力有限没有做出想要的效果来,请指教一下.再有一个问题就是当截屏图片大于ScrollBox时,通过移动ScrollBox的游标移动图片后,再动态生成label时,label生成的left,top的相对位置就不对了,试了几种方法都没有成功,请帮忙分析一下,应该怎么设置?
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin  if isWrite then
  begin
   Write:=true;
  if self.Image1.Width>=self.ScrollBox1.Width then
   begin
   ...
   //
   end
   else
   la.Left:=abs(X+self.Image1.Left);
   la.Top:=abs(Y+self.Image1.Top);
   ptX:=abs(X+self.Image1.Left);
   ptY:=abs(Y+self.Image1.Top);
  end;

解决方案 »

  1.   

    第一个问题已经解决,只是还没有试验,如果还有其他方法,请多多发言var 
      bt:tbitmap; 
    begin 
        bt:=tbitmap.create; 
        bitblt(bt.canvas.handle,image1.left,image1.top,image1.width,image1.height,self.Canvas.Handle,image1.left,image1.top,srccopy); 
      bt.savetofile( 'aaa.bmp '); 
      bt.free; 
    end;
      

  2.   

    折腾Label那么麻烦干嘛输出文字用Canvas.TextOut/TextRect就好了
      

  3.   


    SetBkMode(Canvas.Handle,TRANSPARENT); //设置背景透明
    Image1.Canvas.TextOut(100,100,'你要输出的文字');
      

  4.   

    补充
    SetBkMode(Image1.Canvas.Handle,TRANSPARENT); //设置背景透明
    Image1.Canvas.TextOut(100,100,'你要输出的文字');
      

  5.   


    我想让用户自定义选择区域输入,TextOut()里的前两个位置参数不好设置呀?
      

  6.   

    假设截图小于ScrollBox不出现滚动条,我想在图片上的任意位置写上几句话,比如像在嘴角边配几句话,textout的位置参数与ScrollBox滚动条有关吗?还是没有思路...请再说明白点,之前没有碰到过这样的问题
      

  7.   

    textout的位置参数与ScrollBox滚动条有关吗?无关
      

  8.   

    因为客户区大小是滚定的,
    假设scrollbax没有出现滚动条,那么真实区域当然就是客户区了;
    如果出现滚动条,则必须计算滚动条(垂直和水平都需要)位置,否则,结果就是你在主楼说的,位置不对。
    这样说你明白不?
      

  9.   

    ///debug
    因为客户区大小是定的,
    假设scrollbax没有出现滚动条,那么真实区域当然就是客户区了;
    如果出现滚动条,则必须计算滚动条(垂直和水平都需要)位置,否则,结果就是你在主楼说的,位置不对。
    这样说你明白不?