WinAPI入门
当前位置:以往代写 > C/C++ 教程 >WinAPI入门
2019-06-13

WinAPI入门

WinAPI入门

副标题#e#

不要以为奇怪,固然我们拥有浩瀚“所见即所得”的编程方法来开拓浩瀚界面精细的应用措施,这些可视化的编程情况提供了大量的类库和控件,可是在开拓者享受利便的同时, 他们的手脚已经不知不觉的受到了限制,有许多深入到Windows内部的操纵它们无法完成, 为什么?因为所用的类库不支持。

事实上这些类库与控件都是架构在Window API的基本上面的,API即 ApplicationProgramming Interface — 应用编程接口 的缩写,它不只为应用措施所挪用,同时也是 Windows的一部门,Windows自身的运行也挪用这些API函数。要相识如何利用API就必需了 解一些Windows的运行机制。

简朴地说,Windows是由事件驱动的抢占式多任务操纵系统。事件驱动是相对付进程驱动而言的,它改变了本来文件的顺序执行方法;Windows既然是多任务系统,就必需能同时 处理惩罚多个事件,系统为应用措施生成一个动静行列,动静在上面被张贴和发送,应用措施只 要从其动静行列中取出动静,然后一一执行就可以了。

此刻,我将利用最最根基的典型措施 HelloWin 来说明WIN32 API的运行机制 首先,一个措施必然要有进入点,Win32 App的进入点函数的名称是WinMain,它的原型如下 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) hInstance是所谓的“实例句柄”,它是一个数值,当措施在Windows下运行的时候,它被用 来独一的标示这个措施,固然用户大概同时运行多个同一个措施,即运行多个“实例”,我 们可以看到,每一个实例都有差异的hInstance值。


#p#副标题#e#

hPrevInstance,简朴地说就是没用…它是存在于16位Windows措施中的,在编写Windows 9x/NT/2000 措施的时候,总应该是NULL。

szCmdLine是一个指针,指向一个以0为终结的字串,内里包括传给该措施的呼吁行参数,假如想要让措施处理惩罚呼吁行,那么这个参数就有用了。

iCmdShow参数是一个数值,指示窗口将如何被显示,这个数值由在Windows下运行该措施的措施所抉择,凡是是SW_SHOWNORMAL。

接下来是注册一个窗口类,窗口老是从窗口类的基本上建设的,窗口类用以标示处理惩罚窗口动静的窗口进程,注册窗口类时利用 RegisterClassEx() 函数,它只需要一个参数,一个指向 范例为 WNDCLASSEX 的布局指针。

详细注册初始是这样的:

WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);     //布局的巨细
wcex.style = CS_HREDRAW | CS_VREDRAW; //类气势气魄
wcex.lpfnWndProc = (WNDPROC)WndProc;  //窗口类的窗口进程
wcex.cbClsExtra = 0;            //在类布局中预留的空间
wcex.cbWndExtra = 0;           //在Windows内部生存的窗口布局中预留的空间
wcex.hInstance = hInstance;        //措施的实例句柄
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_EXAMPLE);  //措施图标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);         //布局的巨细
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);    //指定窗口的配景颜色
wcex.lpszMenuName = (LPCSTR)IDC_EXAMPLE;         //菜单
wcex.lpszClassName = szWindowClass;             //类名,和措施名沟通
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);    //也是措施图标
return RegisterClassEx(&wcex);

#p#副标题#e#

接下来,界说一个HWND,然后利用 CreateWindow() 函数,原型如下:

HWND CreateWindow(
   LPCTSTR lpClassName,    // 窗口类名
   LPCTSTR lpWindowName,  // 窗口标题
   DWORD dwStyle,       // 窗口吻势气魄
   int x,             // 初始x
   int y,             // 初始y
   int nWidth,          // 窗口宽
   int nHeight,         // 窗口高
   HWND hWndParent,     // 父窗口句柄
   HMENU hMenu,       // 菜单句柄
   HINSTANCE hInstance,   // 实例句柄
   LPVOID lpParam       // 建设参数
);

在 CreateWindow() 挪用返回之后,Windows内部已经建设了这窗口。可是窗口并为显示,还需要两个挪用,一个是 ShowWindow(hwnd, iCmdShow):第一个参数是方才建设的窗口 句柄,第二个参数是通报给WinMain的nCmdShow;另一个是 UpdateWindow(hwnd) ,导致

客户区域被绘制。

接下来,措施通过执行一块被称为“动静轮回”的代码从动静行列中取出动静

while (GetMessage(&msg, NULL, 0, 0))
{
   if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
   {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
   }
}

#p#分页标题#e#

动静轮回以 GetMessage 开始,它从动静行列中取出一条动静,只要从动静行列中取出动静的 Message 域不为 WM_QUIT,GetMessage 就返回一个非零值,不然将导致措施退出 动静轮回,然后措施中止,返回 msg 布局的 wParam 参数。在轮回中,TranslateMessage 将 msg 布局的内容举办修改,而 DispatchMessage 找出筹备挪用的窗口进程。

#p#副标题#e#

上面举办的仅仅是筹备性事情:注册窗口类、建设窗口、显示窗口、进入动静轮回取出动静而实际的行动都产生在窗口进程中。

LRESULT CALLBACK WndProc(HWND hWnd, //方才建设的窗口句柄
   UINT message,           //获得的动静
   WPARAM wParam,
   LPARAM lParam           //动静的进一步具体的参数
)

在措施中窗口进程凡是是定名为 WndProc 的函数,其实窗口进程可以任意的定名,一个Windows措施可以包括多个窗口进程,一个窗口进程老是与挪用了 RegisterClassEx 注册的 窗口类相关联,CreateWindow 函数按照窗口类来建设窗口,可是一个窗口类可以被用来创 建多个窗口。

动静收到之后,接下来应该按照动静的差异来举办处理惩罚

switch(message)
{
  case …:
  …
  …

HelloWin措施只需要处理惩罚两条动静,即 WM_PAINT 和 WM_DESTROY。

WM_PAINT 动静在Windows措施中的职位极其重要,当窗口客户区的一部门可能全部变为“无效”,必需举办刷新的时候,将由这条动静通知措施。

为什么客户区域会变得无效呢?在建设窗口的时候,整个客户区都是无效的,因为还没有画任何的对象。第一条 WM_PAINT 动静指示窗口进程在窗口上面画一些对象;尚有在用户改 变了窗口的巨细之后,客户区域从头变得无效,除此之外最小化窗口之后再还原、窗口的一 部门被包围,城市激发这条动静。

WM_DESTROY动静则是当用户按下“封锁”按钮的时候被触发,尺度的处理惩罚要领是挪用PostQuitMessage 将一条 WM_QUIT 动静插入动静行列,这将使得 GetMessage 函数挪用 返回0,从而退出动静轮回,竣事整个措施。

其实,从上面可以看出,Windows措施的这种运行机制并不是很难领略,真正坚苦的是不知道挪用什么函数去完成想要的操纵,以及奈何挪用那些函数,从而机动的举办底层API措施 开拓,这是一个循序渐进的积聚进程,没有捷径可走的。请列位必然要记着。

    关键字:

在线提交作业