#include
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
#include
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
#include
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
#include
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
#include
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窗口边框高度 例子:获取屏幕分辨率(桌面宽高度) #include
#include
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
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
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
#include
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; }