窗口最小化、最大化和恢复
通过调用API函数ShowWindow可以控制指定窗口的状态,如将窗口最小化、最大化或者是恢复原来的状态,等等。
虽然通过窗口标题栏上的控制按钮也可以将窗口最小化、最大化或者是恢复,但ShowWindow函数能实现更多的功能,又如隐藏窗口、将窗口最小化到桌面等,这些是标准的控制按钮所做不到的。
下面介绍一个ShowWindow函数的例子。这个例子演示了如何将一个窗口最小化到桌面或最小化到任务栏和最大化、恢复窗口原始状态。
首先,在C++ Builder中新建一个工程,为了方便演示,工程需要两个窗口。添加第二个窗口Form2的方法是:选择“File”菜单下的“New Form”。添加了新窗口后,选择“File”菜单下的“Include Unit Hdr...”包含窗口Form2的头文件“Unit2.h”,或是直接在Form1的代码编辑窗口的头部加上“#include "Unit2.h"”语句。然后在Form1上放上四个按钮,它们的Caption属性分别为“最大化”、“最小化到桌面”、“恢复”和“最小化到任务栏并恢复”。
接着,双击窗件Form1,在它的OnCreate事件中加入:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//设置Form1为顶层窗口
Form1-$#@62;FormStyle=fsStayOnTop;
}
双击按钮Button1,在它的OnClick事件中加入:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//最大化
ShowWindow( Form2-$#@62;Handle, SW_MAXIMIZE);
}
双击按钮Button2,在它的OnClick事件中加入:
void __fastcall TForm1::Button2Click(TObject *Sender)
{ //最小化到桌面
ShowWindow( Form2-$#@62;Handle, SW_MINIMIZE);
}
双击按钮Button3,在它的OnClick事件中加入:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//恢复最小化
ShowWindow( Form2-$#@62;Handle, SW_RESTORE);
}
{{秪峈最唗郔苤赵恄魊蛹鞶 酸傿蒚鰽蔑棠奴 埶朒锸◆ 芼硌斯譬 賱拨霾蝌阭棠 utton4腔OnClick岈璃笢〔峈賸?虴别载陇珆ㄛ笢洁楼?珨跺晊奀腔测钨ㄩ
void __fastcall TForm1::Button4Click(TObject *Sender)
{
//最小化到任务栏
ShowWindow( Application-$#@62;Handle, SW_MINIMIZE);
//延时1秒
Sleep(1000);
//恢复最小化
ShowWindow( Application-$#@62;Handle, SW_RESTORE);
}
最后,编译运行程序。
获取磁盘序列号、卷标和文件系统类型
使用API函数GetVolumeInformation,可以获取一个磁盘的有关信息,如磁盘的序列号、卷标、文件系统类型。有些软件就是利用磁盘的序列号来加密的。
需要获取磁盘信息的时候,加入下面的代码就可以了:
//定义长度为255的卷标字符串变量缓冲区:
AnsiString VolumeName=AnsiString::StringOfChar(" ", 255);
//序列号
unsigned long SerialNumber;
//定义长度为20的文件系统类型字符串缓冲区
AnsiString SystemName = AnsiString::StringOfChar(" ",20);
//获取磁盘信息
GetVolumeInformation("C:\\", VolumeName.c_str(), 255, &SerialNumber, 0, 0, SystemName.c_str(), 20);
ShowMessage("C盘的卷标:" + Trim(VolumeName));
ShowMessage("C盘的序列号:" + IntToStr(SerialNumber));
ShowMessage("C盘的文件系统类型:" + Trim(SystemName));
屏幕放大镜
你一定用过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("本对话框已经延迟了三秒!");
这个例子演示了一个延时的对话框,单击了该按钮,本应立即弹出的对话框延迟了三秒钟的时间才弹出。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70030223/viewspace-2954278/ ,如需转载,请注明出处,否则将追究法律责任。