Delphi API 之 BitBlt

BitBlt

该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境

BitBlt(
  DestDC: HDC;                  {目标 DC}
  X, Y, Width, Height: Integer; {目标位置与大小}
  SrcDC: HDC;                   {源 DC}
  XSrc, YSrc: Integer;          {源起始位置}
  Rop: DWORD                    {光栅操作码, 也就是源像素与目标像素的混合方式}
): BOOL;

var
  bit1,bit2: TBitmap;
  cvs1,cvs2,cvs3: TCanvas;
procedure TForm1.FormCreate(Sender: TObject);
begin
   with ListBox1.Items do
  begin
    Add(‘SRCCOPY    ‘);
    Add(‘SRCPAINT   ‘);
    Add(‘SRCAND     ‘);
    Add(‘SRCINVERT  ‘);
    Add(‘SRCERASE   ‘);
    Add(‘NOTSRCCOPY ‘);
    Add(‘NOTSRCERASE‘);
    Add(‘MERGECOPY  ‘);
    Add(‘MERGEPAINT ‘);
    Add(‘PATCOPY    ‘);
    Add(‘PATPAINT   ‘);
    Add(‘PATINVERT  ‘);
    Add(‘DSTINVERT  ‘);
    Add(‘BLACKNESS  ‘);
    Add(‘WHITENESS  ‘);
end;
   Panel1.Caption := ‘‘;
  Panel2.Caption := ‘‘;
  Panel3.Caption := ‘‘;

  bit1 := TBitmap.Create;
  bit1.Width := Panel1.ClientWidth;
  bit1.Height := Panel1.ClientHeight;

  bit2 := TBitmap.Create;
  bit2.Width := Panel2.ClientWidth;
  bit2.Height := Panel2.ClientHeight;

  cvs1 := TCanvas.Create;
  cvs2 := TCanvas.Create;
  cvs3 := TCanvas.Create;

  cvs1.Handle := GetDC(Panel1.Handle);
  cvs2.Handle := GetDC(Panel2.Handle);
  cvs3.Handle := GetDC(Panel3.Handle);
end;

procedure TForm1.FormPaint(Sender: TObject);
const
  ColorArr: array[0..5] of TColor = (clRed, clGreen, clBlue, clYellow, clFuchsia, clPurple);
var
  wi,hi: Integer;
  I: Integer;
begin
  wi := bit1.Width div 4;
  hi := bit1.Height div 4;

  bit1.Canvas.Pen.Width := 10;

  for I := 1 to 3 do
  begin
    bit1.Canvas.Pen.Color := ColorArr[i-1];
    bit1.Canvas.MoveTo(wi*i, 0);
    bit1.Canvas.LineTo(wi*i, bit1.Height);

    bit1.Canvas.Pen.Color := ColorArr[i+2];
    bit1.Canvas.MoveTo(0, hi*i);
    bit1.Canvas.LineTo(bit1.Width, hi*i);
  end;

  bit2.Canvas.Pen.Width := 15;
  bit2.Canvas.Ellipse(15, 15, bit2.Width-15, bit2.Height-15);

  cvs1.Draw(0, 0, bit1);
  cvs2.Draw(0, 0, bit2);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
  Rop: Cardinal;
begin
  Repaint;
  Rop := SRCCOPY;
  case ListBox1.ItemIndex of
    0 : Rop := SRCCOPY    ;
    1 : Rop := SRCPAINT   ;
    2 : Rop := SRCAND     ;
    3 : Rop := SRCINVERT  ;
    4 : Rop := SRCERASE   ;
    5 : Rop := NOTSRCCOPY ;
    6 : Rop := NOTSRCERASE;
    7 : Rop := MERGECOPY  ;
    8 : Rop := MERGEPAINT ;
    9 : Rop := PATCOPY    ;
    10: Rop := PATPAINT   ;
    11: Rop := PATINVERT  ;
    12: Rop := DSTINVERT  ;
    13: Rop := BLACKNESS  ;
    14: Rop := WHITENESS  ;
  end;

  cvs3.Draw(0, 0, bit1);
  BitBlt(cvs3.Handle, (bit1.Width - bit2.Width) div 2, (bit1.Height - bit2.Height) div 2,
    bit2.Width, bit2.Height, bit2.Canvas.Handle, 0, 0, Rop);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 bit1.Free;
  bit2.Free;
  cvs1.Free;
  cvs2.Free;
  cvs3.Free;
end;

end.
时间: 2024-11-07 17:16:17

Delphi API 之 BitBlt的相关文章

C++编程 使用QT5 SDK录制屏幕并显示

在项目中,我们有要录制屏幕的需求,录制屏幕有多种方法,可以基于windows api的BitBlt .ffmpeg的AVDevice.directx 和QT,本文讲解基于QT5的抓屏.QT相对于其他几种抓屏方式优势是跨平台做的比较好,接口简单,劣势相对于directx抓屏消耗大一些,但directx只能是windows.经过测试directx抓屏速度最快,其他接口速度基本一致. 在我的电脑上qt 1080P屏幕抓屏消耗60~80毫秒,720p消耗30~50,也就是说如果抓屏1080我一秒最多录制

SDL2源码分析8:视频显示总结

===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源码分析2:窗体(SDL_Window) SDL2源码分析3:渲染器(SDL_Renderer) SDL2源码分析4:纹理(SDL_Texture) SDL2源码分析5:更新纹理(SDL_UpdateTexture()) SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy()) SDL2源

SDL2源代码分析8:视频显示总结

本文简单总结一下SDL显示视频的源代码. SDL显示视频的结构体 SDL显示视频涉及到下列结构体: SDL_Window:代表了窗口SDL_Renderer:代表了渲染器SDL_Texture:代表了纹理SDL_Rect:一个矩形框,用于确定纹理显示的位置. 上述几个结构体之间的关系如下图所示. PS:该图源自于文章<最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)> 由图可见,YUV/RGB像素数据首先加载至SDL_Texture,然后通过SDL_Render渲染

SevenZip.pas BUG修改版

本来用的是Henri Gourvest <[email protected]> 1.2版本 然后发现了2个问题: 1.对于文件名中带有空格的文件, 无法压缩, 原因是1488行, 压缩调用的是TStringList.Delimiter 来拆分文件字符串, 而空格是默认分行符, 导致文件名错误 2.解压缩函数, 如果目标文件已存在并且为只读属性时, 报错, 原因是1105行 创建文件流的时候直接使用了TFileStream.Create(path, fmCreate)导致 针对以上2个问题, 对

测试工具的选择和使用

2003年第9期<程序员>上啄木鸟部落发文“测试工具的选择和使用”,现将其中的工具列表摘录,以备忘 Parasoft白盒测试工具集 工具名 支持语言环境 简介 Jtest Java 代码分析和动态类.组件测试 Jcontract Java 实时性能监控以及分析优化 C++ Test C,C++ 代码分析和动态测试 CodeWizard C,C++ 代码静态分析 Insure++ C,C++ 实时性能监控以及分析优化 .test .Net 代码分析和动态测试 Compuware白盒测试工具集 工

转:SDL2源代码分析

1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中已经叙述过了,不再重复.这两篇文章中也提到了一张SDL的原理图,如下所示: 从这个图中可以看出,SDL根据系统的不同调用不同的API完成相应的功能.至于它是如何实现的,将会在后文中详细叙述.下面不再罗嗦,直接进入正题. 使用SDL播放一个视频代码流程大体如下 初始化: SDL_Init(): 初始化SDL. 

用VB6实现电影特效

电影或电视中经常可见到一些字幕或图片的动态变化特技,在制作多媒体教学软件或广告宣传等多媒体演示文档时,也常常需要用到一些图文的动态变化效果.VB6.0作为Windows软件的强有力开发工具,在多媒体程序设计方面具有广阔的应用前景.本文讨论运用VB6.0的定时器并结合Windows API函数实现图片或文字的动态缩放和渐隐渐现等特技效果.沈阳463整形医院http://www.hengnaya.com/ 一.实现图文动态缩放和渐隐渐现特效的程序方法 1.程序界面 取窗体名为Form1,其Windo

测试人员需要了解工具使用

我们将常用的测试工具分为10类. 1. 测试管理工具 2. 接口测试工具 3. 性能测试工具 4. C/S自动化工具 5.白盒测试工具 6.代码扫描工具 7.持续集成工具 8.网络测试工具 9.app自动化工具 10.web安全测试工具 注:工具排名没有任何意义. 大多数初学者,或者某个领域知识的入行者,习惯性地去搜集各种看似无用的资料.视频.工具.其实,如果都去研读.理解.并应用之,还是有点用的.否则,只会占用磁盘空间,还浪费时间.然而,工具嘛.虽然不用全部搞懂.但,还是要懂一点的. 混在软件

软件测试工程师提升工作效率必知的28种工具!【附带图】

结合自己的工作经验分享给大家软件测试工程师必须知道的几种工具废话不多说直接上干货!一.app自动化工具1,appium 这个应该算是目前最流行的基于app的自动化测试框架了2,instruments ios平台下的自动化测试框架,用java语言写的3,uiautomator安卓自动化测试框架,基本上支持安卓的所有事件操作4,Monkey 安卓自带的测试工具5,Monkey Runner Monkey改进版,支持自己编写脚本测试,用Python语言6,Robotium 一款国外的Android自动