0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

api技巧集(四)

OBEason ? 來源:jf_88563726 ? 作者:jf_88563726 ? 2023-05-23 11:11 ? 次閱讀

超級(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 來替換。

審核編輯黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1475

    瀏覽量

    61758
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4286

    瀏覽量

    62335
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    API技巧(二)

    (一)不規(guī)則窗口 Windows提供的只是標(biāo)準(zhǔn)的矩形窗口,要想建立一個(gè)不規(guī)則的窗口就需要調(diào)用API函數(shù)來實(shí)現(xiàn)。建立一個(gè)不規(guī)則的窗口,一般是先用創(chuàng)建區(qū)域的API函數(shù)建立一個(gè)不規(guī)則的區(qū)域,再用API函數(shù)
    的頭像 發(fā)表于 05-22 16:49 ?844次閱讀

    鴻蒙元服務(wù)API全新呈現(xiàn)-開發(fā)更清晰高效

    鴻蒙元服務(wù)API全新呈現(xiàn),開發(fā)更清晰高效,具體見如下截圖,深黑色部分即本階段公布支持的元服務(wù)API。 本材料整理來源于HarmonyOS NEXT Developer Beta1官
    發(fā)表于 07-11 10:23

    基于onepanel使用kaggle api提交結(jié)果和下載數(shù)據(jù)的步驟

    在onepanel上使用kaggle api提交結(jié)果和下載數(shù)據(jù)
    發(fā)表于 04-22 11:00

    高階API構(gòu)建模型和數(shù)據(jù)使用

    了TensorFlow2.0Beta版本,同pytorch一樣支持動(dòng)態(tài)執(zhí)行(TensorFlow2.0默認(rèn)eager模式,無需啟動(dòng)會(huì)話執(zhí)行計(jì)算圖),同時(shí)刪除了雜亂低階API,使用高階API簡(jiǎn)單地構(gòu)建復(fù)雜神經(jīng)網(wǎng)絡(luò)模型,本文主要分享用高階A
    發(fā)表于 11-04 07:49

    【rtthread學(xué)習(xí)筆記系列】第篇:線程間同步的概念

    rtthread將互斥量抽象成rt_mutex.3.2 互斥量api3.3 互斥量示例、事件4.1 事件概念rtthread將事件
    發(fā)表于 04-22 11:31

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-HUAWEI DevEco Studio 3.1API9成SDK

    /module.json5”中添加網(wǎng)絡(luò)權(quán)限。*附件:HarmonyOSOpenHarmony應(yīng)用開發(fā)-HUAWEI DevEco Studio 3.1API9成SDK.docx
    發(fā)表于 03-27 10:06

    vc++ api函數(shù) (Windows API大全)

    Windows API大全,本書主要介紹VC++里API函數(shù)及其用法-WindowsAPI Daquan, the book introduces VC Lane API function
    發(fā)表于 10-14 11:45 ?32次下載

    Web API接口設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    本文是對(duì)Web API接口設(shè)計(jì)的總結(jié),我將從個(gè)方面進(jìn)行分析。
    發(fā)表于 01-04 18:03 ?5144次閱讀

    推薦這款好用的API測(cè)試工具

    如今,API日漸成為應(yīng)用程序開發(fā)的核心。無可厚非,API測(cè)試是成功實(shí)現(xiàn)持續(xù)集成,并保持DevOps實(shí)踐的重要組成部分。數(shù)據(jù)顯示開發(fā)人員對(duì)于Web和API服務(wù)的測(cè)試興趣,在過去幾十年中呈逐漸增長(zhǎng)的趨勢(shì)。
    的頭像 發(fā)表于 11-27 15:35 ?3704次閱讀

    什么是API,不同場(chǎng)景中的API

    當(dāng)公司構(gòu)建他們的應(yīng)用時(shí),他們把它們?cè)O(shè)計(jì)成一組交互的API。最容易理解的例子是Lyft(或者Uber)。你可能想在Lyft應(yīng)用中做一些事情,它們?cè)谀缓蠖紩?huì)觸發(fā)不同的API
    的頭像 發(fā)表于 08-10 11:20 ?2108次閱讀

    API+DevOps:華為云API Arts一體化平臺(tái),端到端呵護(hù)您的API

    API+ | 以API-First理論為基礎(chǔ),以API為核心構(gòu)建數(shù)字化生態(tài) 摘要:華為云API Arts是API全生命周期一體化協(xié)作平臺(tái),支
    的頭像 發(fā)表于 02-17 19:05 ?1080次閱讀

    API Arts 全探秘 | 華為云新一代設(shè)計(jì)管理平臺(tái),功能強(qiáng)大!

    API設(shè)計(jì)不一致?API沒地方歸檔?云服務(wù)開發(fā)項(xiàng)目合作低效?...... ? 華為云為廣大開發(fā)者帶來最新API設(shè)計(jì)管理平臺(tái):API Arts。它
    的頭像 發(fā)表于 03-10 18:40 ?460次閱讀

    API技巧(三)

    (一)閃爍程序的標(biāo)題欄 在某些專業(yè)的應(yīng)用程序中,當(dāng)程序需要提醒用戶或要引起用戶的注意時(shí),就不停地閃爍程序的標(biāo)題欄。要實(shí)現(xiàn)這個(gè)功能,只需要一個(gè)Timer組件和使用一個(gè)API函數(shù)
    的頭像 發(fā)表于 05-23 11:10 ?416次閱讀

    api接口怎么使用

    本文就從API接口的維度,淺析API的概念以及為什么要了解它 一、API的概念 API,官方定義為應(yīng)用程序編程接口。就是把是一些預(yù)先定義的接口,用來提供應(yīng)用程序與開發(fā)人員基于某軟件或硬
    的頭像 發(fā)表于 05-24 14:44 ?1387次閱讀

    API?Arts?全探秘?|?華為云新一代設(shè)計(jì)管理平臺(tái),功能強(qiáng)大!

    API 設(shè)計(jì)不一致?API 沒地方歸檔?云服務(wù)開發(fā)項(xiàng)目合作低效?......?? 華為云為廣大開發(fā)者帶來最新 API 設(shè)計(jì)管理平臺(tái):API?Arts。它
    的頭像 發(fā)表于 09-03 00:36 ?353次閱讀
    <b class='flag-5'>API</b>?Arts?全探秘?|?華為云新一代設(shè)計(jì)管理平臺(tái),功能強(qiáng)大!