0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

api技巧集(四)

OBEason 来源:jf_88563726 作者:jf_88563726 2023-05-23 11:11 次阅读

超级链接效果

在很多共享软件的关于对话框里有一些模仿网页的超级链接,如主页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;

//得到文件SHELL32.DLL的总图标数

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
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61971
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62576
收藏 人收藏

    评论

    相关推荐

    API技巧(二)

    (一)不规则窗口 Windows提供的只是标准的矩形窗口,要想建立一个不规则的窗口就需要调用API函数来实现。建立一个不规则的窗口,一般是先用创建区域的API函数建立一个不规则的区域,再用API函数
    的头像 发表于 05-22 16:49 883次阅读

    鸿蒙元服务API全新呈现-开发更清晰高效

    鸿蒙元服务API全新呈现,开发更清晰高效,具体见如下截图,深黑色部分即本阶段公布支持的元服务API。 本材料整理来源于HarmonyOS NEXT Developer Beta1官
    发表于 07-11 10:23

    基于onepanel使用kaggle api提交结果和下载数据的步骤

    在onepanel上使用kaggle api提交结果和下载数据
    发表于 04-22 11:00

    高阶API构建模型和数据使用

    了TensorFlow2.0Beta版本,同pytorch一样支持动态执行(TensorFlow2.0默认eager模式,无需启动会话执行计算图),同时删除了杂乱低阶API,使用高阶API简单地构建复杂神经网络模型,本文主要分享用高阶A
    发表于 11-04 07:49

    【rtthread学习笔记系列】第篇:线程间同步的概念

    rtthread将互斥量抽象成rt_mutex.3.2 互斥量api3.3 互斥量示例、事件4.1 事件概念rtthread将事件
    发表于 04-22 11:31

    HarmonyOS/OpenHarmony应用开发-HUAWEI DevEco Studio 3.1API9成SDK

    /module.json5”中添加网络权限。*附件:HarmonyOSOpenHarmony应用开发-HUAWEI DevEco Studio 3.1API9成SDK.docx
    发表于 03-27 10:06

    vc++ api函数 (Windows API大全)

    Windows API大全,本书主要介绍VC++里API函数及其用法-WindowsAPI Daquan, the book introduces VC Lane API function
    发表于 10-14 11:45 32次下载

    Web API接口设计经验总结

    本文是对Web API接口设计的总结,我将从个方面进行分析。
    发表于 01-04 18:03 5165次阅读

    推荐这款好用的API测试工具

    如今,API日渐成为应用程序开发的核心。无可厚非,API测试是成功实现持续集成,并保持DevOps实践的重要组成部分。数据显示开发人员对于Web和API服务的测试兴趣,在过去几十年中呈逐渐增长的趋势。
    的头像 发表于 11-27 15:35 3748次阅读

    什么是API,不同场景中的API

    当公司构建他们的应用时,他们把它们设计成一组交互的API。最容易理解的例子是Lyft(或者Uber)。你可能想在Lyft应用中做一些事情,它们在幕后都会触发不同的API
    的头像 发表于 08-10 11:20 2181次阅读

    API+DevOps:华为云API Arts一体化平台,端到端呵护您的API

    华为云API Arts是API全生命周期一体化协作平台,支持开发者一站式高效实现API设计、API开发、API测试、
    的头像 发表于 03-01 15:45 797次阅读
    <b class='flag-5'>API</b>+DevOps:华为云<b class='flag-5'>API</b> Arts一体化平台,端到端呵护您的<b class='flag-5'>API</b>

    API Arts 全探秘 | 华为云新一代设计管理平台,功能强大!

    API设计不一致?API没地方归档?云服务开发项目合作低效?...... ? 华为云为广大开发者带来最新API设计管理平台:API Arts。它
    的头像 发表于 03-10 18:40 487次阅读

    API技巧(三)

    (一)闪烁程序的标题栏 在某些专业的应用程序中,当程序需要提醒用户或要引起用户的注意时,就不停地闪烁程序的标题栏。要实现这个功能,只需要一个Timer组件和使用一个API函数
    的头像 发表于 05-23 11:10 444次阅读

    api接口怎么使用

    本文就从API接口的维度,浅析API的概念以及为什么要了解它 一、API的概念 API,官方定义为应用程序编程接口。就是把是一些预先定义的接口,用来提供应用程序与开发人员基于某软件或硬
    的头像 发表于 05-24 14:44 1423次阅读

    API Arts 全探秘 | 华为云新一代设计管理平台,功能强大!

    API 设计不一致?API 没地方归档?云服务开发项目合作低效?...... ? 华为云为广大开发者带来最新 API 设计管理平台:API Arts。它
    的头像 发表于 09-03 00:36 380次阅读
    <b class='flag-5'>API</b> Arts 全探秘 | 华为云新一代设计管理平台,功能强大!