CSDN论坛中,经常看到有关截屏的贴。所谓截屏,指的是获取屏幕,或者屏幕上某个窗口上的信息,并将其转换为图像的操作。为此,也写了几个Windows下的“截屏”函数:
过程定义:
// 获取Canvas有效区域内的图像数据。必须用FreeImageData释放数据结构
// 应调用ImageEmpty检查返回数据结构是否空
function GetImageData(Canvas: TCanvas): TImageData; overload;
// 获取窗口有效区域内的图像数据。必须用FreeImageData释放数据结构
// 应调用ImageEmpty检查返回数据结构是否空
function GetImageData(Handle: HWnd): TImageData; overload;
// 获取TGpGraphics对象有效区域内的图像数据。必须用FreeImageData释放数据结构
// 应调用ImageEmpty检查返回数据结构是否空
function GetImageData(g: TGpGraphics): TImageData; overload;
实现代码:
procedure FillAlpha(Data: TImageData);
asm
mov edx, [eax].TImageData.Scan0
mov ecx, [eax].TImageData.Width
imul ecx, [eax].TImageData.Height
mov eax, 0ff000000h
@PixelLoop:
or [edx], eax
......
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://bigpower.blog.51cto.com/209892/90287
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,Comobj;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Panel1Resize(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FComApp:OleVariant;
gWaveHwnd:Hwnd;
public
{ Public declarations }
procedure SetParentWindow(pPare ......
Delphi的TThread类
http://bigpower.blog.51cto.com/209892/89525
我们常有工作线程和主线程之分,工作线程负责作一些后台操作,比如接收邮件;主线程负责界面上的一些显示。工作线程的好处在某些时候是不言而喻的,你的主界面可以响应任何操作,而背后的线程却在默默地工作。
VCL中,工作线程执行在Execute方法中,你必须从TThread继承一个类并覆盖Execute方法,在这个方法中,所有代码都是在另一个线程中执行的,除此之外,你的线程类的其他方法都在主线程执行,包括构造方法,析构方法,Resume等,很多人常常忽略了这一点。
最简单的一个线程类如下:
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
在Execute中的代码,有一个技术要点,如果你的代码执行时间很短,像这样,Sleep(1000),那没有关系;如果是这样Sleep (10000),10秒,那么你就不能直接这样写了,须把这10秒拆分成10个1秒,然后判断Terminated属性,像下面这样:
procedure TMyThread.Execute;
var
i: Integer;
begin
for i := 0 to 9 do
&nb ......
图像旋转,是指按照给定的角度,计算出图像每个像素坐标点在新图像上的坐标位置,从而实现整个图像坐标变换的图像处理手段。其像素坐标的变换公式为:
(1)、x' = x * cos(angle) + y * sin(andle)
y' = x * cos(andle) - y * sin(angle)
公式中,x',y'为变换后的像素坐标点,x,y为变换前像素坐标点,angle为旋转角度。
但是,按照上面的公式旋转图像,会出现多个原图像像素点对应新图像同一个点的问题,这不仅会多消耗图像旋转处理的时间,而且也会使旋转后的图像产生不必要的失真,如果是32位带Alpha通道像素格式的图像,更会因此造成图像的混乱,所以在实际的图像旋转处理代码中,是以目标图(旋转后的图像)的像素坐标点,逐点反推原图像素的位置,这样,目标图的各个像素点既不会重复,也不会遗漏。其计算公式为:
(2)、x = x' * cos(angle) - y * sin(angle)
y = y' * cos(angle) + y * sin(angle)
......
网上搜集资料 参考写的代码 实现控件的动态创建 完整代码如下:
(实现界面)
-------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
type
TControlClass =class of TControl ;
TForm1 = class(TForm)
RadioGroup1: TRadioGroup;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
ControlClassArry: array[0..2]of
TControlClass= (TMonthCalendar,TMemo,TColorBox) ;
var
i:integer;
ControlObj:TObject ;
begin
for i:=0 ......
提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。(举个例子,笔者的Win95 System目录下尽有500多个DLL文件。)其实,DLL是一种特殊的可执行文件。说它特殊主要是因为一般它都不能直接运行,需要宿主程序比如*.EXE程序或其他DLL的动态调用才能够使用。简单的说,在通常情况下DLL是经过编译的函数和过程的集合。
使用DLL技术主要有以下几个原因:
一、减小可执行文件大小。
DLL技术的产生有很大一部分原因是为了减小可执行文件的大小。当操作系统进入Windows时代后,其大小已经达到几十兆乃至几百兆。试想如果还是使用DOS时代的单执行文件体系的话一个可执行文件的大小可能将达到数十兆,这是大家都不能接受的。解决的方法就是采用动态链接技术将一个大的可执行文件分割成许多小的可执行程序。
二、实现资源共享。
这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。早期的程序员经常碰到这样的事情,在不同的编程任务中编写同样的代码。这种方法显然浪费了很多时间,为了解决这个问题人们编写了各种各样的库。但由于编程语言和环境的不同这些库一 ......