超級鏈接效果
在很多共享軟件的關于對話框里有一些模仿網頁的超級鏈接,如主頁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
發布評論請先 登錄
相關推薦
評論