VC编程之VC常用API+示例4
小标 2019-01-15 来源 : 阅读 1514 评论 0

摘要:本文主要向大家介绍了VC编程之VC常用API+示例4,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC常用API+示例4,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之VC常用API+示例4

第六十一个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频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程