Windows API入门代码浅析

以下是经典的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.若要对特定的某个窗口响应消息 则要进行特定的处理(当窗口句柄仍然有效时 才投递消息给系统)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值