我是靠谱客的博主 精明钢笔,最近开发中收集的这篇文章主要介绍第一个windows API窗口程序编写WinMain函数设计窗口类注册窗口类创建窗口显示并更新窗口编写消息循环编写窗口过程函数总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

步骤

  • 编写WinMain函数
  • 设计窗口类
  • 注册窗口类
  • 创建窗口
  • 显示并更新窗口
  • 编写消息循环
  • 编写窗口过程函数
  • 总结
    • 整体源码
    • 效果图
    • 第一次写Windows窗口程序,第一次写博客,遇到很多问题。

编写WinMain函数

WinMian函数格式固定,可以直接粘贴复制

int WINAPI WinMain(HINSTANCE hInstance, //应用程序实例
	HINSTANCE hPrevInstance, //上一个应用程序实例,不用
	LPSTR lpCmdLine, //命令行参数
	int nCmdShow //窗口显示的样式, 最大化,最小化
	{}

设计窗口类

即给窗口成员变量赋值,具体成员怎么赋值参考
MSDN

WNDCLASS wc;
	wc.cbClsExtra = 0; //类的附加信息,一般设置为0
	wc.cbWndExtra = 0; //窗口附加信息,一般设置为0
	wc.hbrBackground = CreateSolidBrush(RGB(255, 100, 100)); //背景色设置
	wc.hCursor = LoadCursor(NULL, IDC_HAND); //加载系统默认光标
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //加载系统默认图标
	wc.hInstance = hInstance; //传递给MyRegisterClass的hInstance参数值。主窗口需要知道正在使用的是哪个实例。
	wc.lpfnWndProc = WinProc; //窗口过程函数名字,消息处理函数
	wc.lpszClassName = TEXT("windows"); //类的名字
	wc.lpszMenuName = TEXT("MENU"); //菜单名字
	wc.style = CS_HREDRAW | CS_VREDRAW;; //显示风格

注册窗口类

即告诉窗口过程函数的入口地址,函数固定为RegisterClass(窗口地址)

RegisterClass(&wc);

创建窗口

设计并注册窗口类后用 CreateWindow函数创建窗口,函数成员变量如下

HWND hWnd = CreateWindow(TEXT("windows"), TEXT("窗口标题"),
		WS_OVERLAPPEDWINDOW,//窗口风格
		300, 300, 300, 300,//(x,y,width,height)位置及大小
		NULL, NULL, hInstance, NULL);//父窗口的句柄、主菜单的句柄、应用程序实例句柄

显示并更新窗口

ShowWindow(窗口句柄,窗口显示状态)

ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);

编写消息循环

GetMessage(消息结构体指定接受窗口消息的窗口句柄(通常为NULL,用于接收属于调用线程的所有窗口的窗口消息),获取消息最小值获取消息最大值)
后两个均设置为0时接受所有消息

MSG msg;
	//如果接受到WM_QUIT, 返回0, 退出; 如果出错,返回-1,不退出
	while (GetMessage(&msg, NULL, 0, 0))//默认接受所有信息
	{
		//翻译
		TranslateMessage(&msg);
		//给操作系统分发消息
		DispatchMessage(&msg);
	}

编写窗口过程函数

即我们对窗口做出的举动窗口应该怎么反应,比如按下鼠标左键,会弹出一个消息框,用MessageBox(窗口句柄,消息框内容,消息框标题,消息框样式)

LRESULT CALLBACK WinProc(HWND hWnd, //窗口句柄,消息所属窗口
	UINT uMsg,	//消息标志
	WPARAM wParam, //附加信息
	LPARAM lParam
)
{
	switch (uMsg) {
	case WM_LBUTTONDOWN: //鼠标左键按下
		MessageBox(hWnd, TEXT("按了左键就这样"), TEXT("左键按下消息框标题"), MB_OK);
		break;
	case WM_CLOSE: {//关闭窗口
		if (IDYES == MessageBox(hWnd, TEXT("关闭窗口"),TEXT( "关闭窗口消息框标题"), MB_YESNO))
		{
			DestroyWindow(hWnd);
		}
		break;
	}
	
	case WM_DESTROY:
		PostQuitMessage(0); //WM_QUIT, 给主函数返回 msg.wParam
		break;
	default:
		/* 该函数对未被处理的消息提供默认响应 */
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}

总结

整体源码

只是主程序,vs创建一个win32程序有很多文件,主代码如下

#include <windows.h>
#include "stdafx.h"

//窗口过程函数
LRESULT CALLBACK WinProc(HWND hWnd, //窗口句柄,消息所属窗口
	UINT uMsg,	//消息标志
	WPARAM wParam, //附加信息
	LPARAM lParam
)
{
	switch (uMsg) {
	case WM_LBUTTONDOWN: //鼠标左键按下
		MessageBox(hWnd, TEXT("按了左键就这样"), TEXT("左键按下消息框标题"), MB_OK);
		break;
	case WM_CLOSE: {//关闭窗口
		if (IDYES == MessageBox(hWnd, TEXT("关闭窗口"),TEXT( "关闭窗口消息框标题"), MB_YESNO))
		{
			DestroyWindow(hWnd);
		}
		break;
	}
	
	case WM_DESTROY:
		PostQuitMessage(0); //WM_QUIT, 给主函数返回 msg.wParam
		break;
	default:
		/* 该函数对未被处理的消息提供默认响应 */
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}


//WINAPI: 修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈
//1)定义WinMain函数
int WINAPI WinMain(HINSTANCE hInstance, //应用程序实例
	HINSTANCE hPrevInstance, //上一个应用程序实例,不用
	LPSTR lpCmdLine, //命令行参数
	int nCmdShow //窗口显示的样式, 最大化,最小化
) {
	//2)设计窗口类WNDCLASS(给成员变量赋值)
	WNDCLASS wc;
	wc.cbClsExtra = 0; //类的附加信息
	wc.cbWndExtra = 0; //窗口附加信息
	wc.hbrBackground = CreateSolidBrush(RGB(255, 100, 100)); //背景色
	wc.hCursor = LoadCursor(NULL, IDC_HAND); //加载系统默认光标
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //加载系统默认图标
	wc.hInstance = hInstance; //传递给MyRegisterClass的hInstance参数值。主窗口需要知道正在使用的是哪个实例。
	wc.lpfnWndProc = WinProc; //窗口过程函数名字,消息处理函数
	wc.lpszClassName = TEXT("windows"); //类的名字
	wc.lpszMenuName = TEXT("MENU"); //菜单名字
	wc.style = CS_HREDRAW | CS_VREDRAW;; //显示风格


										 //3)注册窗口类, 告诉系统窗口过程函数的入口地址
	RegisterClass(&wc);

	//4)创建窗口类
	HWND hWnd = CreateWindow(TEXT("windows"), TEXT("窗口标题"),
		WS_OVERLAPPEDWINDOW,//窗口风格
		300, 300, 300, 300,//(x,y,width,height)位置及大小
		NULL, NULL, hInstance, NULL);//父窗口的句柄、主菜单的句柄、应用程序实例句柄

									 //5)显示和更新窗口
	ShowWindow(hWnd, SW_SHOWNORMAL);
	UpdateWindow(hWnd);

	//6)消息循环
	MSG msg;
	//如果接受到WM_QUIT, 返回0, 退出; 如果出错,返回-1,不退出
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//翻译
		TranslateMessage(&msg);
		//给操作系统分发消息
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

效果图

按下关闭键
按左键
运行程序

第一次写Windows窗口程序,第一次写博客,遇到很多问题。

vc++和vs的不同没有意识到,直接把vc++源码粘贴到vs上一直报错,到现在也没弄懂怎么回事

一直感觉windows窗口程序那一堆堆固定格式的代码很复杂很难,看懂其实也就那样,就是要弄懂每块代码的意思,就好理解了,只是英语有些复杂,对我这种英语渣渣很不友好

很多函数的参数都是固定的,需要自己去查帮助文档,有点麻烦

markdown编辑好像是比word方便

最后

以上就是精明钢笔为你收集整理的第一个windows API窗口程序编写WinMain函数设计窗口类注册窗口类创建窗口显示并更新窗口编写消息循环编写窗口过程函数总结的全部内容,希望文章能够帮你解决第一个windows API窗口程序编写WinMain函数设计窗口类注册窗口类创建窗口显示并更新窗口编写消息循环编写窗口过程函数总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部