第七十一个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;
}