摘要:本文主要向大家介绍了VC编程之VC常用API+示例4,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
本文主要向大家介绍了VC编程之VC常用API+示例4,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
第六十一个GetWindowThreadProcessId根据窗口句柄获得对应进程ID号,和线程ID号
函数只有两个参数,第一个参数是窗口句柄,第二个参数是一个DOWRD类型的指针,函数返回线程ID
如:
DWORD ThreadId,ProcessId;
ThreadId=GetWindowThreadProcessId(wnd,&ProcessId);
第六十二个EnumWindows枚举当前正运行的所有主窗口,不包括子窗口
调用这个函数,还必须定义一个回调函数,它的格式是这样的:BOOL CALLBACK lpEnumFunc(HWND wnd, LPARAM lParam);
EnumWindows函数有两个参数,第一个就是回调函数的地址,另一个是自定义参数,对应着回调函数的第二个参数。
每枚举一次窗口,这个回调函数就会被执行一次,而获得的窗口句柄,就会传递给回调函数,对应着回调函数的第一个参数。直到枚举完所有窗口。而在回调用函数里,返回真表示继续枚举,返回假则停止枚举。
例子:枚举窗口
#include
#include
BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam);
int main()
{
::EnumWindows(lpEnumFunc,0);
return 0;
}
BOOL CALLBACK lpEnumFunc(HWND wnd, LPARAM lParam)
{
char WindowName[52]={0};
GetWindowText(wnd,WindowName,sizeof(WindowName));//根据窗口句柄获得窗口名
printf("窗口句柄:%d 窗口名称:%s\n,",wnd,WindowName);
//可以在这里加个判断当前是否有一个窗口正在运行
//如if(strcmp(WindowName,"Windows 任务管理器")==0) return 0;结束枚举,
return 1;
}
第六十三个MessageBox弹出一个消息提示框
int
MessageBox(
HWND hWnd ,//指明消息框是属于哪个窗口的,可以为NULL
LPCSTR lpText,//消息提示具体内容
LPCSTR lpCaption,//提示框窗口标题
UINT uType);//指明提示框类型,按钮,图标
这里只说下uType的常用可选值:
按钮:
MB_ABORTRETRYIGNORE 终止 重试 忽略
MB_OK 确定
MB_OKCANCEL 确定 取消
MB_RETRYCANCEL 重试 取消
MB_YESNO 是 否
MB_YESNOCANCEL 是 否 取消
图标:
MB_ICONWARNING 感叹号
MB_ICONINFORMATION 提示i
MB_ICONQUESTION 问号
MB_ICONSTOP 红X号
按钮和图标可以结合用,如:
MessageBox(NULL,"该内存不能访问","出错",MB_OK|MB_ICONSTOP);
系统模式:MB_SYSTEMMODAL
函数的返回值确定用户选择了哪个按钮,正面给各按钮的定义:
IDABORT “放弃”按钮
IDCANCEL “取消”按钮
IDIGNORE “忽略”按钮
IDNO “否”按钮
IDOK 确定
IDRETRY 重试
IDYES 是
判断返回值是否与其相等即可。
第六十四个GetForegroundWindow获得当前激活的窗口句柄
函数没参数,调用即返回最前窗口句柄
这里举一个例子:每当切换窗口的时候弹出一个消息提示框
#include
int main()
{
char WindowName[52];
HWND wnd,Orgwnd;
wnd=Orgwnd=NULL;
while(1)
{
wnd=GetForegroundWindow();
if(wnd!=Orgwnd)
{ GetWindowText(wnd,WindowName,sizeof(WindowName));
MessageBox(NULL,WindowName,"切换窗口到",MB_OK);
Orgwnd=wnd;
}
Sleep(200);
}
}
第六十五个GetTopWindow根据窗口句柄获得其下第一子窗口句柄(如果有)
用过MFC的人都知道,在对话编辑区,如果要为控件排序的话,就按CTRL+D显示出每个控件的顺序,如下图:
而GetTopWindow函数获取的就是控件顺序为1的窗口句柄。
例子:改变一个主窗口下的第一子窗口的显示内容(前提得它有),这里就以上面那个abc对话框为例:
#include
int main()
{
HWND wnd;
wnd=FindWindow(NULL,"abc");
HWND FirstWnd=GetTopWindow(wnd);
SetWindowText(FirstWnd,"first");
return 0;
}
执行效果:
第六十六个GetNextWindow根据子窗口句柄获得下一个或上一个同级的窗口句柄(返回NULL,函数执行失败)
函数有两个参数,第一个是子窗口句柄,第二个参数指明寻找上一个,还是一下个窗口句柄,值:GW_HWNONEXT(下一个),GW_HWNDPREV(上一个)。比如子窗口句柄在主窗口的顺序为3,那么获取的是顺序为2或顺序为3的窗口句柄(具体取决于第二个参数),函数返回获得的窗口句柄.这样GetNextWindow结合GetTopWindow函数就可以遍历一个主窗口里的所有子窗口了。
例子:遍历一个窗口里的所有子窗口,以上面的abc窗口为例
#include
#include
int main()
{
char Name[52];
HWND wnd;
wnd=FindWindow(NULL,"abc");
wnd=GetTopWindow(wnd);
while(wnd!=NULL)
{
GetWindowText(wnd,Name,sizeof(Name));
printf("窗口句柄:%d,名称:%s\n",wnd,Name);
wnd=GetNextWindow(wnd,GW_HWNDNEXT);//GW_HWNDNEXT获取下一个
}
return 0;
}
第六十七个InvalidateRect发送一个WM_PAINT消息给窗口(刷新窗口)
函数定义:BOOL
InvalidateRect(
HWND hWnd ,//要刷新窗口的句柄
CONST RECT *lpRect,//刷新的范围
BOOL bErase//重画为TRUE
);
例子:在SetTimer函数里会举例
第六十八个SetTimer设置一个定时器(每隔一段时间执行一次定时器函数)
函数定义:UINT
SetTimer(
HWND hWnd ,//窗口句柄
UINT nIDEvent,//定时器ID号,为了能设置多个定时器
UINT uElapse,//时间,指明间隔多久执行一次定时器函数,单位:毫秒
TIMERPROC lpTimerFunc);//定时器回调函数的地址
定时器函数的固定格式:VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent, DWORD dwTime);
例子:在用w,a,s,d键控制一个矩形移动的同时,一个相同的矩形自动移动。
#include
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);//函数声明
VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent, DWORD dwTime);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wndcls; //定义一个存储窗口信息WNDCLASS变量
wndcls.cbClsExtra=0; //默认为0
wndcls.cbWndExtra=0; //默认为0
wndcls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //背景画刷
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); //光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); //窗口图标
wndcls.hInstance=hInstance; //应用程序实例句柄由WinMain函数传进来
wndcls.lpfnWndProc=WinSunProc; //窗口消息处理函数
wndcls.lpszClassName="windowclass"; //窗口类名
wndcls.lpszMenuName=NULL; //窗口菜单名,没有菜单,为NULL
wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口类型,CS_HREDRAW和CS_VERDRAW 表明
//当窗口水平方向垂直方向的宽度变化时重绘整个窗口
RegisterClass(&wndcls); //把窗口信息提交给系统,注册窗口类
HWND hwnd; //用以存储CreateWindow函数所创建的窗口句柄
hwnd=CreateWindow("windowclass","first windows",
WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);//创建窗口
ShowWindow(hwnd,SW_SHOWNORMAL);//窗口创建完了,显示它
UpdateWindow(hwnd); //更新窗口,让窗口毫无延迟的显示
SetTimer(hwnd,1,200,(TIMERPROC)TimerProc);//设置定时器
MSG msg;//消息结构类型
while(GetMessage(&msg,NULL,0,0))//获取消息
{
TranslateMessage(&msg); //此函数用于把键盘消息(WM_KEYDOWN,WM_KEYUP)转换成字符消息WM_CHAR
DispatchMessage(&msg); //这个函数调用窗口过程处理函数,并把MSG里的信息处理后传给过程函数的四个参数
}
return 0;
}
VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent, DWORD dwTime)//定时器函数
{
static int x=0,y=0;
x+=15;
if(x>500)
{y+=15;x=0;}
HDC dc=GetDC(hwnd);
Rectangle(dc,x,y,x+30,y+30);
}
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{ static int x=0,y=0;
switch(uMsg)
{
case WM_CHAR:
{
if(wParam=='a') x-=10;
else if(wParam=='d') x+=10;
else if(wParam=='w') y-=10;
else if(wParam=='s') y+=10;
RECT rect;
GetClientRect(hwnd,&rect);
::InvalidateRect(hwnd,&rect,TRUE);//发送WM_PAINT消息,刷新窗口
}
break;
case WM_PAINT:
HDC dc;
PAINTSTRUCT ps;
dc=BeginPaint(hwnd,&ps); //BeginPaint只能在响应WM_PAINT,不能用GetDC获取设备上下文
Rectangle(dc,x,y,x+30,y+30);
break;
case WM_CLOSE://用户关闭了窗口
DestroyWindow(hwnd);//销毁窗口,并发送WM_DESTROY消息
break;
case WM_DESTROY://如果窗口被销毁
PostQuitMessage(0);//让进程退出
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam); //未处理的消息通过DefWindowProc函数交给系统处理
}
第六十九个RegisterHotKey注册一个热键
函数定义:BOOL
RegisterHotKey(
HWND hWnd ,
int id,
UINT fsModifiers,
UINT vk);
第一个参数hWnd表明热键消息(HOT_KEY)发送给哪个窗口,为NULL表明直接把消息投递给调用这个函数进程的消息队列。
第二个参数可以自定取值,取值范围0xC000-0xFFFF,这个参数是为了程序能同时拥有多个热键而存在。
第三个参数fsModifiers的可选取值如下:MOD_ALT(Alt键),MOD_CONTROL(Ctrl键),MOD_SHIFT(Shift键),MOD_WIN(‘田’图标键)
最一个参数是一个ASCII值,指明具体和哪个非系统键组合。
如QQ的热键ctrl+alt+z,注册这个热键的语句是RegisterHotKey(NULL,0x0001,MOD_CONTROL|MOD_ALT,‘Z’)
如QQ的截图热键 RegisterHotKey(NULL,0x0001,MOD_CONTROL|MOD_ALT,'A')
例子:按下ctrl+alt+x热键,弹出消息提示框,询问是否要退出。
//#include "stdafx.h" 新建空工程,不需要该头文件
#include
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
RegisterHotKey(NULL,0x0001,MOD_CONTROL|MOD_ALT,'X');//注册热键
MSG msg;
while(GetMessage(&msg,NULL,0,0))//从消息队伍获取消息
{
if(msg.message==WM_HOTKEY)//热键消息
{
if(MessageBox(NULL,"你确定要退出程序吗?","热键提示",MB_YESNO|MB_SYSTEMMODAL)==IDYES)
{
UnregisterHotKey(NULL,0x0001);//卸载热键
break;
}
}
}
return 0;
}
记得要退出程序
第七十个StretchBlt在窗口输出一个位图
这个函数比BitBlt多了两个参数,那就是源目标DC的宽高,像BitBlt函数,只有目标DC的宽高。
有了这两个参数的加入,StretchBlt函数功能就比BitBlt函数强大了许多,它可以缩小或放大图片,可以把一张图片上的任意矩形区域覆盖到另一张图片上的任意区域。
函数语句:StretchBlt(hdc,0,0,bmInfo.bmWidth,bmInfo.bmHeight,memDC,0,0,50,50,SRCCOPY);
具体用法参考BitBlt函数。
第七十一个TextOut根据设备DC在窗口输出文字
函数定义:BOOL TextOut(HDC hdc,//设备DC
int nXStart,// 窗口x坐标
int nYStart,// 窗口y坐标,字符串左上角是将是x,y
LPCTSTR lpString,// 字符串
int cbString// 字符串中字符的个数
);
例子:在窗口输出文字,为了方便,这里依旧在"无标题.txt - 记事本",窗口里输出文字
#include
#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;
}
以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号