謝謝各位大蝦。。。。
你一定用过Windows98自带的那个屏幕放大镜吧,你想不想自已做一个呢?其它,这个程序的关键是使用了API函数StretchBlt。 调用API函数StretchBlt可以把一个设备中指定大小的位图从拷贝到另一个设备,在拷贝的过程中,还可以根据需要来缩放位图。 下面是它的原型和参数说明: BOOL StretchBlt ( HDC hdcDest, //目标设备句柄 int nXOriginDest, //目标矩形左上角的X坐标 int nYOriginDest, //目标矩形左上角的Y坐标 int nWidthDest, //目标矩形的宽度 int nHeightDest, //目标矩形的高度 HDC hdcSrc, //源设备句柄 int nXOriginSrc, //源矩形左上角的X坐标 int nYOriginSrc, //源矩形左上角的Y坐标 int nWidthSrc, //源矩形的宽度 int nHeightSrc, //源矩形的高度 DWORD dwRop //光栅运算操作 ); StretchBlt函数的头文件为“wingdi.h”。其中,它的dwRop参数有15种操作,最常用的就是拷贝运算SRCCOPY了。当源设备和目标设备指定的矩形大小不相等时,函数会根据源矩形和目标矩形的大小比例对位图进行放大或缩小操作后,拷贝到目标设备中。 下面就是一个把屏幕上左上角坐标为0x0、宽和高都为100的矩形位图缩小2倍后拷贝到图片控件Image1中的例子: StretchBlt(Image1-$#@62;Canvas-$#@62;Handle, 0, 0, 50, 50, GetDC(0), 0, 0, 100, 100, SRCCOPY); 这句代码的GetDC(0)语句为取得桌面设备的句柄。 如果不断地使用上面那句代码,把屏幕缩小放到Image1中,这就成一个“屏幕缩小镜”了。当然,缩小屏幕并没有什么实际的用处,我们只要把它改一下就可以做成“屏幕放大镜”了。 要做这个“屏幕放大镜”,首先要运行Borland C Builder,在窗体Form1上放上一个图片控件Image1和一个时间控件Timer1。 双击窗体Form1,在它的OnCreate事件中加入代码: void __fastcall TForm1::FormCreate(TObject *Sender) { Image1-$#@62;Width=200; Image1-$#@62;Height=200; Timer1-$#@62;Interval=10; //设置顶层窗口SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE); } 双击时间控件Timer1,在它的OnTimer事件中加入以下代码: void __fastcall TForm1::Timer1Timer(TObject *Sender) { int x,y; POINT CurPos; //取得鼠标当前坐标 GetCursorPos(&CurPos); //保证拷贝的图象不在屏幕外 if(CurPos.x $#@62; Screen-$#@62;Width - 100) x=Screen-$#@62;Width - 100; else if(CurPos.x $#@60; 50) x=0; else x=CurPos.x-50; if(CurPos.y $#@62; Screen-$#@62;Height-100) y=Screen-$#@62;Height-100; else if(CurPos.y $#@60; 50) y=0; else y=CurPos.y-50; Caption="坐标:" + IntToStr(CurPos.x) + "," + IntToStr(CurPos.y); Image1-$#@62;Canvas-$#@62;FillRect(Rect(0,0,200,200)); //拷贝放大图象StretchBlt(Image1-$#@62;Canvas-$#@62;Handle, 0, 0, 200, 200, GetDC(0), x, y, 100, 100, SRCCOPY); } 代码输入完了,按F9或点击运行按钮运行程序。怎么样?和Windows自带的那个差不多吧! 需要注意的是:C++ Builder并象VB那样图片控件可以是非持久性的,在C++ Builder中,并不能直接不断地调用StretchBlt函数来得到连贯的图象,而是要先使用图片控件的FillRect方法填充图片框(相当于清空图片框),再调用StretchBlt函数才行。 时间的延迟 延迟在程序设计中非常有意义!比如,程序启动时的等待画面,又或者你需要等待一个过程的完成才能运行程序下面的代码,这时就要使用到时间的延迟了。 但是在很多编程语言中一般都没有现成的延迟函数。在Dos的C时代,当程序需要延迟时,有不少人使用的是for循环: for(int i=0;i$#@60;10000;i++); 到现在也可能还有人在用吧。到了Win32时代,在系统的API函数库里已经提供有时间延迟的函数了,它就是Sleep函数。当然,在Windows编程中,你也可以使用Timer控件,但使用Sleep函数更方便、快捷。我们只需简单的调用一下Sleep函数,就可以实现时间的延迟。 Sleep函数只有一个参数cMilliseconds,用来指定需要延迟的时间,它的单位是毫秒。让我们看下面的例子,请在一个按钮的单击(OnClick)事件中加入下面的代码: Sleep(3000); //延迟三秒 ShowMessage("本对话框已经延迟了三秒!"); 这个例子演示了一个延时的对话框,单击了该按钮,本应立即弹出的对话框延迟了三秒钟的时间才弹出。
[此贴子已经被作者于2005-1-23 11:03:17编辑过]