如何写一个基于Windows API简单窗口的程序

问题描述

动手写一个基于windows API 的基于窗体、消息循环、事件驱动的 Windows C语言风格的Windows 程序。

目的

  1. 了解 windows操作系统应用程序开发的基本概念,win32 API函数、消息与事件驱动;
  2. 掌握WinMain函数的基本框架,窗口定义、窗口创建、消息循环及窗口过程函数;

一、窗口的创建

  1. 设计一个窗口类
//定义窗口类
typedef struct WNDCLASS{
    
    
	UINT style;//窗口类的类型
	WNDPROC lpfnWndProc;//窗口的过程函数(回调函数)
	int cbClsExtra;//窗口类的附加内存,一般设置为0
	int cbWndEXtra;//窗口附加内存空间,通常设置为0
	HISNSTANCE hInstance;//实例号
	HICON hIcon;//图标句柄
	HCURSOR hCursor;//光标句柄
	HBRUSH hbrBackground;//画刷句柄
	LPCTSTR lpszMenuName;//设置菜单的名字
	LPCTSTR lpszClassName;//设置类的名称
}WNDCLASS;
  1. 注册窗口类
//注册函数
RegisterClass(){
    
    
	const WNDCLASS *ipWndClass;//窗口类的指针
}
  1. 创建窗口
//创建窗口的函数原型声明
HWND CreateWindow(
	LPCTSTR lpClassName,//窗口类名称
	LPCTSTR lpWindowName,//窗口的名称
	DWORD dwstyle,//创建窗口的样式
	int x,//窗口左上角x坐标
	int y,//窗口左上角y坐标
	int nWidth,//窗口宽度
	int nHeight,//窗口高度
	HWND hWndParent,//创建窗口的父窗口句柄
	HMENU hMenu,//窗口菜单的句柄
	HANDLE hInstance,//窗口所属的应用程序的实例句柄
	LPVOID lpParam//数据指针
);
  1. 显示级更新窗口
//显示窗口
BOOL ShowWindow(
	HWND hWnd,//窗口句柄
	int nCmdShow//窗口显示状态
);
//更新窗口
BOOL UpdateWindow(
	HWND hWnd//创建成功后的窗口句柄
)

二、消息循环

  1. 消息类的定义
typedef struct tagMSG{
    
    
	HWND hWnd;//窗口表示,代表消息所属窗口
	UINT message;//消息标识
	WPARAM wParam;//消息附加信息
	LPARAM lParam;//消息附加信息
	DWORD time;//消息投递到消息队列的时间
	POINT pt;//鼠标当前位置
}
  1. 获取消息
BOOL GetMessage(
	LPMSG lpMsg,//指向消息结构体
	HWND hWnd,//接收属于哪个窗口的消息
	UINT wMsgFilteMin,//获取消息的最小值
	UINT wMsgFilteMax//获取消息的最大值
);
  1. 消息的循环
MSG msg;//一个消息对象
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
    
    
	TranslateMessage(&msg);//将虚拟键消息转换为字符消息
	DispatchMessage(&msg);//将消息传回给操作系统
}

三、过程函数

LRESULT CALLBACK WindowProc(
	HWND hWnd,//窗口句柄
	UINT uMsg,//消息代码
	WPARAM wParam,//消息附加参数
	LPARAM lParam//消息附加参数
)

四、窗口程序实例

#include<windows.h>
#include<stdio.h>
LRESULT CALLBACK WindowProc(
	HWND hWnd,//窗口句柄
	UINT uMsg,//消息代码
	WPARAM wParam,//消息附加参数
	LPARAM lParam//消息附加参数
);
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow
)
{
    
    
	//设计一个窗口类
	WNDCLASS wndclass;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	//wndclass.hbrBackground=CreateSolidBrush(RGB(183,157,226));//对窗口背景颜色的设置,画刷句柄
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);//光标句柄,IDC_CROSS表示十字形光标
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//图标句柄,窗口默认图标
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WindowProc;
	wndclass.lpszClassName="sunxin2006";//类名称可以自己选择
	wndclass.lpszMenuName=NULL;
	wndclass.style=CS_HREDRAW | CS_VREDRAW;
	//CS_HREDRAW表示窗口水平方向宽度变化,将重新绘制窗口;CS_VREDRAW表示窗口垂直方向高度变化,将重新绘制窗口
	//注册窗口
	RegisterClass(&wndclass);
	//创建窗口
	HWND hwnd;
	hwnd=CreateWindow("sunxin2006","http://www.sunxin.org",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
	//显示和刷新窗口
	ShowWindow(hwnd,SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	//消息循环
	MSG msg;//一个消息对象
	while(GetMessage(&msg,NULL,0,0))
	{
    
    
		TranslateMessage(&msg);//将虚拟键消息转换为字符消息
		DispatchMessage(&msg);//将消息传回给操作系统
	}
	return msg.wParam;
}

//窗口过程函数
LRESULT CALLBACK WindowProc(  
	HWND hwnd,      
	UINT uMsg,       
	WPARAM wParam,  
	LPARAM lParam  
)
{
    
    	
	RECT rect;//矩形结构
	switch(uMsg)	
	{
    
    	
	//表示当键盘输入一个按键,程序将获得一个WM_CHAR消息
	case WM_CHAR:		
		char szChar[20];		
		sprintf(szChar,"char is %d",wParam);//将字符转成ASCII,放到数组szChar
		MessageBox(hwnd,szChar,"提示信息",MB_OK);	//信息消息框
		break;	
	case WM_LBUTTONDOWN:	
		MessageBox(hwnd,"mouse clicked","提示信息",MB_OK);//鼠标点击,显示一个提示内容		
		HDC hdc;//设备环境句柄		
		hdc=GetDC(hwnd);		
		TextOut(hdc,250,200,"Hello World!",strlen("Hello World!"));//在窗口输出一句Hello World		
		ReleaseDC(hwnd,hdc);		
		break;
	//客户区重绘消息
	case WM_PAINT:		
		HDC hDC;//设备环境句柄		
		PAINTSTRUCT ps;	//绘制结构	
		hDC=BeginPaint(hwnd,&ps);		
		DrawText(hDC,TEXT("Hello"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);	
		EndPaint(hwnd,&ps);		
		break;	
	//实现关闭窗口的消息响应
	case WM_CLOSE:		
		if(IDYES==MessageBox(hwnd,"是否真的结束?","提示信息",MB_YESNO))		
		{
    
    			
			DestroyWindow(hwnd);		
		}		
		break;	
	case WM_DESTROY:		
		PostQuitMessage(0);		
		break;	
	default:		
		return DefWindowProc(hwnd,uMsg,wParam,lParam);	
	}	
	return 0;
}

鼠标点击,效果如下:
在这里插入图片描述
在这里插入图片描述

点击键盘按键,效果如下:
在这里插入图片描述

点击关闭按钮,效果如下:
在这里插入图片描述

五、总结

创建一个Win32的应用程序,主要步骤是对窗口的创建,显示,以及编写消息循环,窗口过程函数。完成这些步骤,一个基本的Window API窗口程序就基本完成。

提示:灵活使用MSDN对编写程序帮助很大

猜你喜欢

转载自blog.csdn.net/qq_43279579/article/details/108714380