以下是经典的windows API入门代码,本人做了点注释贴出,对于理解windows程序的运行原理相当有好处。
#include<windows.h>
#include<stdio.h>
#include<iostream>
using namespace std;
//声明一个回调函数
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
//LESULT指由窗口程序或者回调函数返回的32位整型数据
//CALLBACK函数 指凡是由windows系统呼叫的函数 窗口过程函数用于响应消息
//回调函数由系统呼叫 程序作者定义
//hwnd窗口句柄 UINT消息类型如WM_KEYDOWN
//PARAM消息附加参数
int WINAPI WinMain( //声明WinMain函数及其参数 WINAPI函数调用约定
HINSTANCE hInstance, //当前程序的实例句柄
HINSTANCE hPrevInstance, //前一个程序的实例句柄
LPSTR lpCmdLine, //命令行参数
int nCmdShow) //指定窗口改如何显示
{
WNDCLASS wndcls; //设计一个窗口类
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;//窗口类的额外附加空间 通常为0
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
//该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。
//函数原型HGDIOBJ GetStockObject(int fnObject);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//加载光标资源
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); //加载图标资源
wndcls.hInstance=hInstance; //应用程序实例句柄由WinMain函数传进来
wndcls.lpfnWndProc=WinSunProc; //指定窗口过程函数
wndcls.lpszClassName="chenqi827";//指定窗口类名称
wndcls.lpszMenuName=NULL; //菜单句柄名称
wndcls.style=CS_HREDRAW|CS_VREDRAW; //指定窗口样式
RegisterClass(&wndcls); //注册窗口类
HWND hwnd; //创建一个句柄用于保存返回的窗口句柄
hwnd=CreateWindow("chenqi827","http://www.ecjtu.org",WS_OVERLAPPEDWINDOW,300,300,600,400,NULL,NULL,hInstance,NULL);
//参数列表:要注册的窗口类名称(该名称在wndcls定义时被指定),窗口标题名称,窗口样式,窗口位置(两个参数),窗口大小,
//父窗口句柄,菜单的句柄,应用程序句柄,作为WM_CREATE参数的附加参数
ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口
UpdateWindow(hwnd); //更新窗口
MSG msg; //定义一个消息
while(GetMessage(&msg,NULL,0,0)) //当GetMessage的hWnd参数无效的时候,GetMessage将返回-1
{
TranslateMessage(&msg);//翻译虚拟键值消息
DispatchMessage(&msg);//将消息传回给操作系统
}
//GetMessgae()参数列表:消息结构体,指定接受哪一个窗口的消息,指定要获取消息最大值与最小值
return msg.wParam;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","message",0);
HDC hDc;
hDc=GetDC(hwnd);
TextOut(hDc,0,50,"计算机紧急响应组",strlen("计算机紧急响应组"));
break;
case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,0,0,"http://www.ecjtu.org",strlen("http://www.ecjtu.org"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的要结束?","message",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
有几个要点要注意:
1.窗口创建初期,客户区与非客户区都是无效的(windows 将不予显示),所以要响应 WM_PAINT消息使其变成有效的
2.窗口过程函数由系统调用,windows将为每个应用程序创建一个消息队列,应用程序感应到消息后,将消息投递到系统的消息队列,系统再对消息队列中的消息依次响应(调用窗口过程函数)
3.GetMessage函数中的窗口句柄参数若无效 则会返回-1.若要对特定的某个窗口响应消息 则要进行特定的处理(当窗口句柄仍然有效时 才投递消息给系统)