VC API常用函数简单例子大全八

第七十一个TextOut根据设备DC在窗口输出文字

函数定义:BOOL TextOut(HDC hdc,// 设备DC
int nXStart,// 窗口x坐标
int nYStart,// 窗口y坐标,字符串左上角是将是x,y
LPCTSTR lpString,// 字符串
int cbString// 字符串中字符的个数
);

例子:在窗口输出文字,为了方便,这里依旧在"无标题.txt - 记事本",窗口里输出文字

#include<windows.h>
#include<string.h>
int main()
{
 char Text[52]="从坐标点50,50开始输出文字";
 HWND wnd=FindWindow(NULL,"无标题.txt - 记事本");
 HDC dc=GetDC(wnd);
 SetTextColor(dc,RGB(255,0,0));//设置文字颜色
 while(1)
 {
  TextOut(dc,50,50,Text,strlen(Text));
  Sleep(200);
 }
 return 0;
}

第七十二个DrawText根据设备DC在窗口的一个矩形区输出文字。
int
DrawTextW(
    HDC hDC,//设备DC
    LPCWSTR lpString,//字符串
    int nCount,//字符串的个数
    LPRECT lpRect,//指明一个矩形区
    UINT uFormat);//输出格式

uFormat的常用取值

值                             说明
DT_BOTTOM 将正文调整到矩形底部。此值必须和DT_SINGLELINE组合。
DT_CENTER 使正文在矩形中水平居中。
DT_VCENTER 使正文在矩形中垂直居中。
DT_END_ELLIPSIS 对于显示的文本,如果结束的字符串的范围不在矩形内,它会被截断并以省略号标识。
如果一个字母不是在字符串的末尾处超出了矩形范围,它不会被截断并以省略号标识。
字符串不会被修改,除非指定了DT_MODIFYSTRING标志。
T_WORD_ELLIPSIS, DT_PATH_ELLIPSIS和DT_END_ELLIPSIS不能和此参数一起使用
DT_LEFT 正文左对齐。
T_RIGHT 正文右对齐。
DT_RTLREADING 当选择进设备环境的字体是希伯来文或阿拉伯文字体时,为双向正文安排从右到左的阅读顺序都是从左到右的。
DT_TOP 正文顶端对齐(仅对单行)。
DT_WORDBREAK 断开字。当一行中的字符将会延伸到由lpRect指定的矩形的边框时,此行自动地在字之间断开。一个回车一换行也能使行折断。
DT_WORD_ELLIPSIS 截短不符合矩形的正文,并增加省略号。

第七十三个GetLogicalDriveStrings获取系统分区信息

函数定义:DWORD
GetLogicalDriveStrings(
    DWORD nBufferLength,//指明lpBuffer参数大小
    LPSTR lpBuffer//分区信息将会存储在这个参数,格式是“分区NULL分区NULL分区NULL NULL”两个NULL结尾

 //假设当前电脑有C,D,E分区,那字符串的存储格式是 "C:\\\0D:\\\0E:\\\0\0";      ('\\'转义字符\)
    );

例子:枚举当前磁盘所有分区

#include<windows.h>
#include<stdio.h>
int main()
{
 char *szBuffer=new char[52];
 GetLogicalDriveStrings(52,szBuffer);
     while(*szBuffer!='\0')
  {
     printf("%s\n",szBuffer);
  szBuffer+=strlen(szBuffer)+1;
  }
 return 0;
}

第七十四个GetDiskFreeSpaceEx获取一个分区(盘符)的信息(已用空间,总大小,可用空间)

这个函数必须用ULARGE_INTEGER联合类型来存储磁盘使用信息。因为要获取磁盘的已用空间,总大小,可用空间,所以我们必须定义三个ULARGE_INTEGER类型变量来存储这三个信息。而具体信息就存储在ULARGE_INTEGER类型的QuadPart成员变量(该成员占八位字节)

如获取C盘的信息:ULARGE_INTEGER dwAvailable,dwFree,dwTotal;

GetDiskFreeSpaceEx("c:\\",&dwAvailable,&dwTotal,&dwFree);//获取分区信息

下面结合GetLogicalDriveStrings举个例子:获取当前磁盘所有分区信息并输出

#include<windows.h>
#include<stdio.h>
int GetSpace(char *P);
int main()
{
 char *szBuffer=new char[52];
 GetLogicalDriveStrings(52,szBuffer);
     while(*szBuffer!='\0')
  {
     printf("%s  ",szBuffer);
     GetSpace(szBuffer);
  szBuffer+=strlen(szBuffer)+1;
  }
 return 0;
}
int GetSpace(char *Par)
{
ULARGE_INTEGER dwAvailable,dwFree,dwTotal;
double fDwa,fDwf,fDwt;
char szSize[128]={0};
int Size;
GetDiskFreeSpaceEx(Par,&dwAvailable,&dwTotal,&dwFree);//获取分区信息
Size=dwTotal.QuadPart/1024/1024;//获取总大小
fDwt=Size/1024.0;
Size=dwAvailable.QuadPart/1024/1024;//获取已用空间
fDwa=Size/1024.0;
Size=dwFree.QuadPart/1024/1024;//获取可用空间
fDwf=Size/1024.0;
sprintf(szSize,"总大小:%0.2fGB   已用空间:%0.2fGB  可用空间:%0.2fGB",fDwt,fDwa,fDwf);
printf("%s\n",szSize);
return 0;
}

第七十五个WritePrivateProfileString修改或创建一个INI文件里的数据

INI文件的内容一般由节名,键名,键值组成,先来看一下INI文件的结构,打开一个INI文件,我们可能会看到以下内容

[gmy_p]
exist_p=0
linux_p=

[boot]
a20=0
a21=0

///

上面的内容中[gmy_p]和[boot]便是INI文件的节名,节名包含键名,和键值。一个INI文件可以有多个节名.

那么哪些是键名,那些是键值呢,在“=”左边的是键名,而在右边的就是键值,键值可以为NULL。

好了,看一下WritePrivateProfileString的函数的定义:

BOOL
WritePrivateProfileString(
    LPCWSTR lpAppName,//节名
    LPCWSTR lpKeyName,//键名
    LPCWSTR lpString,//修改的数据
    LPCWSTR lpFileName//INI文件名
    );

如果要修改键值,那么要提供哪些信息呢,首先,必须要知道INI文件的路径(lpFileName),要修改的键值是在哪个节名下(lpAppName),以及具体是哪个键名(lpKeyName),还有修改的键值数据(lpString).

比如我要把之前INI文件里节名为gmy_p下的键名exist_p的键值改为100(假设这个文件的路径为d:\gho.ini).

那么就是语句:WritePrivateProfileString("gmy_p","exist_p","100","d:\\gho.ini");

WritePrivateProfileString函数功能不止于此,当函数提供的INI文件名,节名,键名不存在时,那么函数就会创建他们。这样,我们就可以用这个函数创建一个INI文件,或在一个INI文件里创建一个节名,或在一个节名下创建一个键名。

如:WritePrivateProfileString("ZhengYong","QQ","***980073","d:\\Info.ini");

第七十六个GetPrivateProfileString获取一个INI文件里的数据

函数定义:DWORD
GetPrivateProfileStringW(
    LPCWSTR lpAppName,//节名
    LPCWSTR lpKeyName,//键名
    LPCWSTR lpDefault,//默认值,填0既可
    LPWSTR lpReturnedString,//接收数据的缓存区(字符串)
    DWORD nSize,//指明缓存区的大小
    LPCWSTR lpFileName//INI文件名
    );

例子获取一个键值:假设D盘下有一个名为Info.ini文件,它的内容如下:

[ZhengYong]
QQ=***980073
Age=100
Weight=65kg
[LiYang]
QQ=***990129
Age=22
Weight=55kg

///

如果我想要获取节名为"ZhengYong"下的键名QQ的键值,那么就是:

#include<windows.h>
#include<stdio.h>
int main()
{
 char KeyValue[252];
    ::GetPrivateProfileString("ZhengYong","QQ",0,KeyValue,252,"d:\\Info.ini");
 printf("%s\n",KeyValue);
 return 0;
}

同WritePrivateProfileString类似,如果提供的节名,或键名为NULL,则获取当前所有的节名或键名。跟分区信息存储格式一样,字符串里,多个节名,或键名以'\0'间隔,字符串最终以两个'\0'结束。

例子:枚举ZhengYong节名下的所有键名:

#include<windows.h>
#include<stdio.h>
int main()
{
 char Data[252];
    ::GetPrivateProfileString("ZhengYong",NULL,0,Data,252,"d:\\Info.ini");
 char *pKey=Data;
 while(*pKey!='\0')
 {
  printf("%s\n",pKey);
  pKey+=strlen(pKey)+1;
 }
 return 0;
}

那么枚举节名只要在上面的例子中,把函数的节名参数设为NULL就行了,如:

GetPrivateProfileString(NULL,NULL,0,Data,252,"d:\\Info.ini");

大家可以用这个函数编一个读取INI文件内容的程序,以便更好的掌握这个函数。记得把接收数据的缓存区设置大一点。

第七十七个GetSystemMetrics获得特定窗口的高宽度

该函数只有一个参数,常用取值如下:

SM_CXSCREEN 屏幕宽度

SM_CYSCREEN屏幕高度

SM_CXFULLSCREEN窗口客户区宽度

SM_CYFULLSCREEN窗口客户区高度

SM_CYMENU菜单栏高度

SM_CYCAPTION//标题栏高度

SM_CXBORDER窗口边框宽度

SM_CYBORDER窗口边框高度

SM_CXSIZE 标题栏上的按钮宽度
SM_CYSIZE 标题栏上的按钮高度

例子:获取屏幕分辨率(桌面宽高度)

#include<windows.h>
#include<stdio.h>
int main()
{
 int ScreenX=::GetSystemMetrics(SM_CXSCREEN);
 int ScreenY=::GetSystemMetrics(SM_CYSCREEN);
 printf("屏幕分辨率:%dX%d\n",ScreenX,ScreenY);
 return 0;
}

第七十八个SetWindowPos设置一个窗口的大小和它的Z序

窗口的Z序是什么意思呢?用过MFC的人应该都清楚,在对话框编辑区按CTRL+D就会显示出每个控件的顺序。如下图:

设置控件的顺序有什么用呢,大家看到上面两个控件有什么特别的吗?对了,两个控件正好有一部分重叠,这时候问题就来了,重叠的部分显示的是那个窗口呢,或者说是以什么来确定显示哪个窗口,我想大家也应该猜到了,是以控件的顺序来确定的。顺序较大的会被显示。这个程序运行如下图如示:

明白窗口的Z序了,我们就来看一下这个函数的参数及其意思。

函数定义:BOOL
SetWindowPos(
    HWND hWnd,//要设置的窗口句柄
    HWND hWndInsertAfter,
    int X,
    int Y,//X,Y指明窗口左上角的位置
    int cx,//窗口宽度
    int cy,//窗口高度
    UINT uFlags);

第二个参数hWndInsertAfter的常用取值:

HWND_BOTTOM:
将窗口置于Z序的底部.
HWND_NOTOPMOST:如果窗口在Z序顶部,则取消顶部位置,如果不是,则该参数无效
HWND_TOP:将窗口置于Z序的顶部。
HWND_TOPMOST:将窗口置于Z序的顶部。窗口当前未被激活,也依然是顶部位置

最后一个参数uFlags可以是Z序中hWnd的前一个窗口句柄的或以下常用取值:

SWP_HIDEWINDOW;隐藏窗口

SWP_SHOWWINDOW:显示窗口

SWP_NOMOVE指明X,Y参数无效

SWP_NOSIZE指明CX ,CY参数无效

SWP_NOZORDER指明hWndInsertAfter参数无效

例子:设置一个窗口像PPS和任务栏那样,总在最前显示。

以"无标题.txt - 记事本"窗口为例

#include<windows.h>
int main()
{
 HWND wnd=::FindWindow(NULL,"无标题.txt - 记事本");
 ::SetWindowPos(wnd,HWND_TOPMOST,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
 return 0;
}

例子2:全屏一个窗口

依旧以"无标题.txt - 记事本"窗口为例:

#include<windows.h>
int main()
{
 int ScreenX=::GetSystemMetrics(SM_CXSCREEN);
 int ScreenY=::GetSystemMetrics(SM_CYSCREEN);
 HWND wnd=::FindWindow(NULL,"无标题.txt - 记事本");
 ::SetWindowPos(wnd,HWND_TOPMOST,0,0,ScreenX,ScreenY,SWP_SHOWWINDOW);
 return 0;
}

第七十九个CreateFile创建一个文件,或打开一个文件用于读写,函数返回文件句柄

函数定义:HANDLE
CreateFile(
    LPCSTR lpFileName,//文件名
    DWORD dwDesiredAccess,//指明对文件进行何种操作,是要读它(GENERIC_READ)还是要写入(GENERIC_WRITE)
    DWORD dwShareMode,//指明文件可以同时被多个程序读写吗?FILE_SHARE_READ可以同时读,FILE_SHARE_WRITED可以同时写
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,//指向一个SECURITY_ATTRIBUTES结构的指针,一般为NULL

    DWORD dwCreationDisposition,//安全属性,指明以何种方式打开或创建文件
    DWORD dwFlagsAndAttributes,//指明文件的属性,隐藏?只读?系统文件?为NULL表示默认属性
    HANDLE hTemplateFile// 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性 
    );

第五个参数dwCreationDisposition的常用取值及意思

TRUNCATE_EXISTING 将现有文件缩短为零长度,清空文件的内容,文件必须已经存在

CREATE_ALWAYS 创建一个文件,如果文件已经存在,则覆盖它

CREATE_NEW 创建文件,如果文件已经存在,则函数执行失败

OPEN_ALWAYS打开文件,如果文件不存在,则创建它

OPEN_EXISTING 打开文件,文件必须存在。

第六个参数dwFlagsAndAttributes的常用取值及其意思

FILE_ATTRIBUTE_NORMAL 默认属性

FILE_ATTRIBUTE_HIDDEN 隐藏

FILE_ATTRIBUTE_READONLY 只读

FILE_ATTRIBUTE_SYSTEM 系统文件

第八十个ReadFile根据文件句柄,从文件中读取一段数据

函数定义:BOOL
WINAPI
ReadFile(
    HANDLE hFile,//文件句柄
    LPVOID lpBuffer,//接收文件数据的缓存区
    DWORD nNumberOfBytesToRead,//指明读取多少数据(字节)
    LPDWORD lpNumberOfBytesRead,//实际读取数据
    LPOVERLAPPED lpOverlapped// 一般为NULL,如文件打开时指定了FILE_FLAG_OVERLAPPED,该参才有具体取值。
    );

例子:读取txt文件的内容,假设E盘下有一个名a.txt的文件,文件内容为123456789

#include<windows.h>

#include<stdio.h>

int main()
{
char Text[25]={0};
DWORD dwSize;
HANDLE FileHandle=CreateFile("e:\\a.txt",GENERIC_READ,0,NULL,OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL ,NULL);//获取文件句柄
ReadFile(FileHandle,Text,15,&dwSize,NULL);//从文件中读取15个字节
printf("内容:%s 实际读入字节:%d\n",Text,dwSize);
return 0;

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bczheng1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值