超級(jí)鏈接效果
在很多共享軟件的關(guān)于對(duì)話框里有一些模仿網(wǎng)頁(yè)的超級(jí)鏈接,如主頁(yè)URL或E-Mail之類的,當(dāng)鼠標(biāo)移到它上面的時(shí)候,文字變成紅色的,當(dāng)鼠標(biāo)離開時(shí),文字又變回原來的藍(lán)色,如果用鼠標(biāo)點(diǎn)擊這個(gè)鏈接則會(huì)彈出瀏覽器窗口打開指定的URL或是運(yùn)行默認(rèn)的E-Mail程序撰寫新郵件,就和真的超鏈接一樣。你是不是也想在你的程序里做一個(gè)呢?其實(shí),我們只要調(diào)用API函數(shù)ShellExecute和在鼠標(biāo)移動(dòng)時(shí)改變一下文字的顏色,就可以在自己的程序中出現(xiàn)這種效果。
首先新建一個(gè)工程,在窗體Form1上添加兩個(gè)Label組件,它們的Name屬性使用默認(rèn)的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="主頁(yè):初學(xué)者之家網(wǎng)站";
Label2-$#@62;Caption="E-Mail: fdlweb@sina.com";
再在Label1的OnClick(單擊)事件中加入:
//藍(lán)色的字請(qǐng)改成自己的主頁(yè)地址
ShellExecute(Handle,NULL," http://fdlweb.myrice.com/",NULL,NULL,SW_SHOWNORMAL);
在OnMouseMove事件中加入:
Label1-$#@62;Font-$#@62;Color=clRed;
在Label2的OnClick事件中加入:
//藍(lán)色的字請(qǐng)改成自己郵箱地址
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編譯運(yùn)行程序就看到效果了。
拷貝屏幕
BitBlt函數(shù)可以將一幅位圖從一個(gè)設(shè)備場(chǎng)景拷貝到另一個(gè)設(shè)備場(chǎng)景,這個(gè)函數(shù)經(jīng)常用在抓圖程序和游戲編程方面,也可以用來做基于桌面的屏幕保護(hù)程序。下面讓我們用BitBlt函數(shù)來做一個(gè)虛假桌面的程序:
首先,添加一個(gè)Image組件到窗體中,將窗體Form1的BorderStyle屬性設(shè)為: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)返回桌面設(shè)備的句柄(HDC)
BitBlt( Image1-$#@62;Canvas-$#@62;Handle,0,0,Screen-$#@62;Width,Screen-$#@62;Height,GetDC(0),0,0,SRCCOPY);
按F9運(yùn)行,一個(gè)假的桌面就出來了,在這個(gè)“桌面”上怎么按鼠標(biāo)都沒有反應(yīng),可以用來捉弄人喔!。有些桌面的小游戲也是這么干的,你可以在這個(gè)程序的基礎(chǔ)上加上更多的功能,如在窗體上加上Label組件和Timer組件,用Timer組件來控制Label組件在窗體上移動(dòng),再在窗體Form1的OnKeyDown事件和Image1的OnMouseDown事件中加入關(guān)閉窗口的代碼“Close();”,最后將編譯了的程序的擴(kuò)展名改為scr,這就成了一個(gè)文字在桌面上亂動(dòng)的屏幕保護(hù)程序了。
取得磁盤總空間和剩余空間
要取得磁盤總空間和剩余空間,最簡(jiǎn)單直接的方法是調(diào)用API函數(shù) GetDiskFreeSpace。
GetDiskFreeSpace函數(shù)有5個(gè)參數(shù),第一個(gè)參數(shù)是要判斷可用空間的驅(qū)動(dòng)器名,第二個(gè)參數(shù)是一個(gè)存放每簇扇區(qū)數(shù)的變量,第三個(gè)參數(shù)是一個(gè)存放每扇區(qū)字節(jié)數(shù)的變量,第四個(gè)參數(shù)是存放剩余簇?cái)?shù)的變量,第五個(gè)參數(shù)是存放總簇?cái)?shù)的變量。套用相應(yīng)計(jì)算磁盤空間的公式即可得出指定驅(qū)動(dòng)器的總空間或剩余空間。
磁盤總空間和剩余空間的計(jì)算公式分別為:
磁盤上剩余空間(字節(jié)) = 簇的扇區(qū)數(shù) * 扇區(qū)的字節(jié)數(shù) * 剩余簇?cái)?shù)
磁盤上總空間(字節(jié)) = 簇的扇區(qū)數(shù) * 扇區(qū)的字節(jié)數(shù) * 總簇?cái)?shù)
下面就是取得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技巧集(五)
提取圖標(biāo)
調(diào)用API函數(shù)ExtractIcon可以提取出在程序文件中的圖標(biāo),它的頭文件是shellapi.h,原型為:
HICON ExtractIcon
(
HINSTANCE hInst, //實(shí)例句柄
LPCTSTR lpszExeFileName, //要提取圖標(biāo)的那個(gè)程序的文件名
UINT nIconIndex //要提取的圖標(biāo)的索引
);
調(diào)用該函數(shù)時(shí),參數(shù)hInst一般設(shè)為當(dāng)前應(yīng)用程序的實(shí)例句柄,如: Form1-$#@62;Handle。
參數(shù)lpszExeFileName為需要提取圖標(biāo)的程序文件的完整路徑,這個(gè)程序文件可以是EXE文件、DLL文件、ICO文件等,只要是包含有圖標(biāo)資源的文件一般都可以提取圖標(biāo)。
當(dāng)參數(shù)nIconIndex指定一個(gè)圖標(biāo)的索引可以返回指向圖標(biāo)的句柄,如指定的文件中不存在圖標(biāo),則返回零,當(dāng)參數(shù)nIconIndex設(shè)為-1,函數(shù)返回文件的圖標(biāo)總數(shù)。
函數(shù)返回的句柄可以賦給一個(gè)用TIcon類聲明的變量,再使用該變量的SaveToFile方法就可以把圖標(biāo)保存出來。
例子:
TIcon *Icon = new TIcon();
AnsiString FileName = "C:\WINDOWS\SYSTEM\SHELL32.DLL";
int TotalIcon;
//得到文件SHELL32.DLL的總圖標(biāo)數(shù)
TotalIcon = (int)ExtractIcon(Form1->Handle,FileName.c_str(), -1);
//提取第一個(gè)圖標(biāo),0為第一個(gè),1為第二個(gè),類推...
Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), 0);
//保存圖標(biāo)
Icon->SaveToFile("C:\1.ICO");
下面給出一個(gè)完整的圖標(biāo)提取程序源碼。
這個(gè)程序需要四個(gè)按鈕控件(Button)、四個(gè)文本標(biāo)簽控件(Label)、兩個(gè)文本框控件(Edit)、一個(gè)水平滾動(dòng)條控件(ScrollBar)、一個(gè)打開文件對(duì)話框控件(OpenDialog)、一個(gè)保存文件對(duì)話框控件(SaveDialog)和一個(gè)圖片控件(Image),還有一個(gè)Panel控件是裝飾用的。界面如圖所示:
把各個(gè)控件排列好,再把四個(gè)Label控件的Caption屬性修改一個(gè),最后輸入程序代碼,運(yùn)行程序,一個(gè)提取圖標(biāo)的程序就出來了,你以后也就不會(huì)為沒有圖標(biāo)資源可用而發(fā)愁了。
程序清單(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="圖標(biāo)小偷 1.0";
Button1-$#@62;Caption="選擇文件";
Button2-$#@62;Caption="保存圖標(biāo)";
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="可執(zhí)行文件(*.exe,*.dll)|*.exe;*.dll|圖標(biāo)文件(*.ico)|*.ico|所有文件(*.*)|*.*";
SaveDialog1-$#@62;Filter="圖標(biāo)文件|*.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("該文件沒有圖標(biāo)");
}
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if( SaveDialog1-$#@62;Execute())
{
//保存圖標(biāo)
Icon-$#@62;SaveToFile( SaveDialog1-$#@62;FileName);
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if( SaveDialog1-$#@62;Execute())
//提取所有的圖標(biāo)
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;
}
//----------------------------------------------------------------
判斷驅(qū)動(dòng)器的類型
使用API函數(shù)GetDriveType能判斷一個(gè)驅(qū)動(dòng)器的類型,該函數(shù)返回一個(gè)int型的值,當(dāng)返回值為2時(shí),是軟盤;為3時(shí),是硬盤;為4時(shí),是網(wǎng)絡(luò)映射盤;為5時(shí),是光驅(qū);為6時(shí),是 RAM 磁盤;為其它值時(shí),是非法的盤符。這個(gè)API函數(shù)包含在winbase.h頭文件中,首先在程序頭部加上語句:
include $#@60;winbase.h$#@62;
包含頭文件,然后在程序中加入以下代碼就可以判斷驅(qū)動(dòng)器的類型:
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("網(wǎng)絡(luò)映射盤");
break;
case 5 : //DRIVE_CDROM
ShowMessage("光驅(qū)");
break;
case 6 : //DRIVE_RAMDISK
ShowMessage("RAM 磁盤");
break;
default :
ShowMessage("這個(gè)磁盤不存在!");
break;
}
注:case語句后的數(shù)值也可以用注釋后的常數(shù)替換。如2可用常數(shù) DRIVE_REMOVABLE 來替換。
審核編輯黃宇
-
API
+關(guān)注
關(guān)注
2文章
1475瀏覽量
61758 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4286瀏覽量
62335
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論