超级链接效果
在很多共享软件的关于对话框里有一些模仿网页的超级链接,如主页URL或E-Mail之类的,当鼠标移到它上面的时候,文字变成红色的,当鼠标离开时,文字又变回原来的蓝色,如果用鼠标点击这个链接则会弹出浏览器窗口打开指定的URL或是运行默认的E-Mail程序撰写新邮件,就和真的超链接一样。你是不是也想在你的程序里做一个呢?其实,我们只要调用API函数ShellExecute和在鼠标移动时改变一下文字的颜色,就可以在自己的程序中出现这种效果。
首先新建一个工程,在窗体Form1上添加两个Label组件,它们的Name属性使用默认的Label1和Label2。
然后在Form1的OnCreate事件中加入代码:
Label1-$#@62;Cursor=crHandPoint;
Label2-$#@62;Cursor=crHandPoint;
Label1-$#@62;Font-$#@62;Color =clBlue;
Label2-$#@62;Font-$#@62;Color =clBlue;
Label1-$#@62;Caption="主页:初学者之家网站";
Label2-$#@62;Caption="E-Mail: fdlweb@sina.com";
再在Label1的OnClick(单击)事件中加入:
//蓝色的字请改成自己的主页地址
ShellExecute(Handle,NULL," http://fdlweb.myrice.com/",NULL,NULL,SW_SHOWNORMAL);
在OnMouseMove事件中加入:
Label1-$#@62;Font-$#@62;Color=clRed;
在Label2的OnClick事件中加入:
//蓝色的字请改成自己邮箱地址
ShellExecute(Handle,NULL," mailto:fdlweb@sina.com",NULL,NULL,SW_SHOWNORMAL);
在OnMouseMove事件中加入:
Label2-$#@62;Font-$#@62;Color=clRed;
最后在Form1的OnMouseMove事件中加入:
Label1-$#@62;Font-$#@62;Color=clBlue;
Label2-$#@62;Font-$#@62;Color=clBlue;
代码输入完了,按F9编译运行程序就看到效果了。
拷贝屏幕
BitBlt函数可以将一幅位图从一个设备场景拷贝到另一个设备场景,这个函数经常用在抓图程序和游戏编程方面,也可以用来做基于桌面的屏幕保护程序。下面让我们用BitBlt函数来做一个虚假桌面的程序:
首先,添加一个Image组件到窗体中,将窗体Form1的BorderStyle属性设为:bsNone。
接着在窗体的OnCreate事件加入程序代码:
Left=0;
Top=0;
Width=Screen-$#@62;Width;
Height=Screen-$#@62;Height;
Image1-$#@62;Left=0;
Image1-$#@62;Top=0;
Image1-$#@62;Width=Screen-$#@62;Width;
Image1-$#@62;Height=Screen-$#@62;Height;
//这句代码就是将桌面拷贝到组件Image1中来存放,
// 其中GetDC(0)返回桌面设备的句柄(HDC)
BitBlt( Image1-$#@62;Canvas-$#@62;Handle,0,0,Screen-$#@62;Width,Screen-$#@62;Height,GetDC(0),0,0,SRCCOPY);
按F9运行,一个假的桌面就出来了,在这个“桌面”上怎么按鼠标都没有反应,可以用来捉弄人喔!。有些桌面的小游戏也是这么干的,你可以在这个程序的基础上加上更多的功能,如在窗体上加上Label组件和Timer组件,用Timer组件来控制Label组件在窗体上移动,再在窗体Form1的OnKeyDown事件和Image1的OnMouseDown事件中加入关闭窗口的代码“Close();”,最后将编译了的程序的扩展名改为scr,这就成了一个文字在桌面上乱动的屏幕保护程序了。
取得磁盘总空间和剩余空间
要取得磁盘总空间和剩余空间,最简单直接的方法是调用API函数 GetDiskFreeSpace。
GetDiskFreeSpace函数有5个参数,第一个参数是要判断可用空间的驱动器名,第二个参数是一个存放每簇扇区数的变量,第三个参数是一个存放每扇区字节数的变量,第四个参数是存放剩余簇数的变量,第五个参数是存放总簇数的变量。套用相应计算磁盘空间的公式即可得出指定驱动器的总空间或剩余空间。
磁盘总空间和剩余空间的计算公式分别为:
磁盘上剩余空间(字节) = 簇的扇区数 * 扇区的字节数 * 剩余簇数
磁盘上总空间(字节) = 簇的扇区数 * 扇区的字节数 * 总簇数
下面就是取得C盘的总空间和剩余空间的例子:
unsigned long Sectors,Bytes,Free,Total;
GetDiskFreeSpace("C:",&Sectors,&Bytes,&Free,&Total);
//可用空间(单位:MB)
int FreeKB = Bytes * Sectors * Free / 1024;
//总空间(单位:MB)
int TotalKB = Bytes * Sectors * Total / 1024;
ShowMessage("C盘的可用空间有:" + IntToStr(FreeKB) + "MB,总空间有:" + IntToStr(TotalKB) +"MB");
api技巧集(五)
提取图标
调用API函数ExtractIcon可以提取出在程序文件中的图标,它的头文件是shellapi.h,原型为:
HICON ExtractIcon
(
HINSTANCE hInst, //实例句柄
LPCTSTR lpszExeFileName, //要提取图标的那个程序的文件名
UINT nIconIndex //要提取的图标的索引
);
调用该函数时,参数hInst一般设为当前应用程序的实例句柄,如: Form1-$#@62;Handle。
参数lpszExeFileName为需要提取图标的程序文件的完整路径,这个程序文件可以是EXE文件、DLL文件、ICO文件等,只要是包含有图标资源的文件一般都可以提取图标。
当参数nIconIndex指定一个图标的索引可以返回指向图标的句柄,如指定的文件中不存在图标,则返回零,当参数nIconIndex设为-1,函数返回文件的图标总数。
函数返回的句柄可以赋给一个用TIcon类声明的变量,再使用该变量的SaveToFile方法就可以把图标保存出来。
例子:
TIcon *Icon = new TIcon();
AnsiString FileName = "C:\WINDOWS\SYSTEM\SHELL32.DLL";
int TotalIcon;
TotalIcon = (int)ExtractIcon(Form1->Handle,FileName.c_str(), -1);
//提取第一个图标,0为第一个,1为第二个,类推...
Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), 0);
//保存图标
Icon->SaveToFile("C:\1.ICO");
下面给出一个完整的图标提取程序源码。
这个程序需要四个按钮控件(Button)、四个文本标签控件(Label)、两个文本框控件(Edit)、一个水平滚动条控件(ScrollBar)、一个打开文件对话框控件(OpenDialog)、一个保存文件对话框控件(SaveDialog)和一个图片控件(Image),还有一个Panel控件是装饰用的。界面如图所示:
把各个控件排列好,再把四个Label控件的Caption属性修改一个,最后输入程序代码,运行程序,一个提取图标的程序就出来了,你以后也就不会为没有图标资源可用而发愁了。
程序清单(Unit1.cpp):
//--------------------------------------- ----------------------
#include $#@60;vcl.h$#@62;
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString FileName;
TIcon *Icon = new TIcon();
int TotalIcon;
//----------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Caption="图标小偷 1.0";
Button1-$#@62;Caption="选择文件";
Button2-$#@62;Caption="保存图标";
Button3-$#@62;Caption="保存所有";
Button4-$#@62;Caption="退出";
Edit1-$#@62;Text=0;
Edit2-$#@62;Text=0;
Image1-$#@62;Width=32;
Image1-$#@62;Height=32;
OpenDialog1-$#@62;Filter="可执行文件(*.exe,*.dll)|*.exe;*.dll|图标文件(*.ico)|*.ico|所有文件(*.*)|*.*";
SaveDialog1-$#@62;Filter="图标文件|*.ico";
ScrollBar1-$#@62;Enabled=false;
Button2-$#@62;Enabled=false;
Button3-$#@62;Enabled=false;
}
//----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if( OpenDialog1-$#@62;Execute())
{
TotalIcon = (int)ExtractIcon( Form1-$#@62;Handle, OpenDialog1-$#@62;FileName.c_str(), -1 );
if( TotalIcon$#@62;0)
{
if( TotalIcon$#@60;2)
ScrollBar1-$#@62;Enabled=false;
else
ScrollBar1-$#@62;Max=TotalIcon-1;
Button2-$#@62;Enabled=true;
Button3-$#@62;Enabled=true;
FileName = OpenDialog1-$#@62;FileName;
Edit1-$#@62;Text =TotalIcon;
Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(), 0);
Image1-$#@62;Picture-$#@62;Icon=Icon;
Edit2-$#@62;Text=1;
}
else
{
ShowMessage("该文件没有图标");
}
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if( SaveDialog1-$#@62;Execute())
{
//保存图标
Icon-$#@62;SaveToFile( SaveDialog1-$#@62;FileName);
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if( SaveDialog1-$#@62;Execute())
//提取所有的图标
for(int i=0;i$#@60;TotalIcon-1;i++)
{
Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(), i);
Icon-$#@62;SaveToFile(SaveDialog1-$#@62;FileName+(AnsiString)i+".ico");
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Close();
}
//----------------------------------------------------------------
void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
{
Edit2-$#@62;Text=ScrollBar1-$#@62;Position+1;
Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(),ScrollBar1-$#@62;Position);
Image1-$#@62;Picture-$#@62;Icon=Icon;
}
//----------------------------------------------------------------
判断驱动器的类型
使用API函数GetDriveType能判断一个驱动器的类型,该函数返回一个int型的值,当返回值为2时,是软盘;为3时,是硬盘;为4时,是网络映射盘;为5时,是光驱;为6时,是 RAM 磁盘;为其它值时,是非法的盘符。这个API函数包含在winbase.h头文件中,首先在程序头部加上语句:
include $#@60;winbase.h$#@62;
包含头文件,然后在程序中加入以下代码就可以判断驱动器的类型:
int drv;
//这里的"C:"为要判断的盘符
drv=GetDriveType("C:");
switch (drv) //判断drv的值
{
case 2 : //DRIVE_REMOVABLE
ShowMessage("软盘");
break;
case 3 : //DRIVE_FIXED
ShowMessage("硬盘");
break;
case 4 : //DRIVE_REMOTE
ShowMessage("网络映射盘");
break;
case 5 : //DRIVE_CDROM
ShowMessage("光驱");
break;
case 6 : //DRIVE_RAMDISK
ShowMessage("RAM 磁盘");
break;
default :
ShowMessage("这个磁盘不存在!");
break;
}
注:case语句后的数值也可以用注释后的常数替换。如2可用常数 DRIVE_REMOVABLE 来替换。
审核编辑黄宇
-
API
+关注
关注
2文章
1499浏览量
61971 -
函数
+关注
关注
3文章
4329浏览量
62576
发布评论请先 登录
相关推荐
评论