win32自用标准框架

这篇博客详细记录了作者在学习过程中创建的一个简单的Win32应用程序框架,旨在为自用提供基础支持。
摘要由CSDN通过智能技术生成

记录一下自己的学习内容:一个简易的win32框架

#include "考试2.h"
#include <Windows.h>
#include <Tchar.h>
using namespace std;
//引用系统预定义头文件


//函数声明,包括消息处理函数WndProc,窗口类创建函数WindowsClass,窗口创建函数Windows,对话框消息处理函数
LRESULT WINAPI WndProc(HWND window, UINT message, UINT wParam, LONG lParam);
BOOL WindowsClass(HINSTANCE instance , WCHAR name[]);
BOOL Windows(HINSTANCE instance,HWND& win, int nCmdShow, WCHAR name[]);
BOOL CALLBACK DlgProc(HWND dlg,UINT message, WPARAM wParam, LPARAM lParam);


//定义全局变量,窗口及菜单名字等
WCHAR menu_name[] = _T("menu");
WCHAR win_name[] = _T("考试2");
WCHAR heng[] = _T("横坐标");
WCHAR zong[] = _T("纵坐标");
WCHAR x_position[10];
WCHAR y_position[10];
BOOL position_falg = FALSE;
HINSTANCE instan;

//主函数
int WINAPI WinMain(HINSTANCE instance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HWND win;											//定义窗口句柄
	MSG message;											//创建消息实例
	HACCEL accel;										        //创建快捷键句柄
	if (!WindowsClass(instance,win_name))					        //窗口类实例
	{
		MessageBeep(0);
		return FALSE;
	}
	if (!Windows(instance, win, nCmdShow,win_name))			//创建窗口
	{
		MessageBeep(0);
		return FALSE;
	}
	instan = instance;									//程序实例句柄
	accel = LoadAccelerators(instance, menu_name);			//加载快捷键资源
	while (GetMessage(&message, 0, 0, 0))
	{
		if (!TranslateAccelerator(win, accel, &message))	//捕获快捷键消息并转换为WM_COMMAND消息,并将该消息加入消息队列,
		{												//最终只有非快捷键消息(包括快捷键消息转换的WM_COMMAND消息)才能够被处理
			TranslateMessage(&message);
			DispatchMessage(&message);
		}
	}
}

BOOL WindowsClass(HINSTANCE instance, WCHAR name[])
{
	WNDCLASS winclass;                                                               //定义窗口类实例
	winclass.cbClsExtra = 0;															//无窗口类扩展.
	winclass.cbWndExtra = 0;															//无窗口实例扩展.
	winclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));						//背景为白色.
	winclass.hCursor = LoadCursor(NULL, IDC_ARROW);										//窗口采用箭头光标.
	winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);									//采用缺省图标.
	winclass.hInstance = instance;														//当前应用程序句柄.
	winclass.lpfnWndProc = WndProc;													//窗口处理函数.
	winclass.lpszClassName = name;														//窗口类名称,加上_T()是使用Unicode编码
	winclass.lpszMenuName = menu_name;													//窗口菜单.
	winclass.style = 0;																//窗口类型为缺省类型.
	return RegisterClass(&winclass);													//注册窗口类实例,将参数装载进内存
}
BOOL Windows(HINSTANCE instance, HWND& win, int nCmdShow, WCHAR name[])
{
	win = CreateWindow(							//根据内存中的窗口类实例的参数创建窗口
		name,									//窗口类名.
		name,									//标题名.
		WS_OVERLAPPEDWINDOW,						//带标题栏,最大和最小按钮的窗口.
		CW_USEDEFAULT,							//窗口左上角坐标.
		0,
		CW_USEDEFAULT,							//采用缺省的宽度和高度.
		0,
		NULL,									//无父窗口.
		NULL,									//无主菜单.
		instance,								//当前实例句柄.
		NULL);									/*CreateWindow会产生一系列的消息交给窗口类实例中指定的消息处理函数处理,
												所以必须在消息处理函数的default中调用系统提供的默认系统处理函数,
												否则就得自己处理一系列的消息*/
	if (!win) return FALSE;						//判断创建窗口是否成功
	ShowWindow(win, nCmdShow);					//显示窗口,同createwindow相同,产生一系列消息
//	UpdateWindow(win);							//重新绘制窗口,会产生一个WM_PANIT消息,并且不会进入消息队列,而是直接进行处理
	return TRUE;
}
LRESULT WINAPI WndProc(HWND window, UINT message, UINT wParam, LONG lParam)
{
	HPEN pen;
	HDC dc;
	HBRUSH br;
	PAINTSTRUCT paint;
	int x, y;

	switch (message)
	{
	case WM_COMMAND:				//处理菜单栏消息
		switch (LOWORD(wParam))
		{
		case ID_START:			//按下开始
			if (MessageBox(window, _T("Link Start!开始记录鼠标位置"), _T("LINK"), MB_OK) == IDOK) position_falg = TRUE;
			InvalidateRect(window, NULL, 1);
			break;
		case ID_QUIT:			//按下退出
			DialogBox(instan,_T("Quit"),window,(DLGPROC)DlgProc);
			break;
		}
		break;
	case WM_MOUSEMOVE:			//鼠标移动时改变坐标显示
		x = LOWORD(lParam);
		y = HIWORD(lParam);
		wsprintf(x_position, _T("%d   \0"), x);
		wsprintf(y_position, _T("%d   \0"), y);
		if (position_falg)		//只有当开始键按下后才显示坐标
		{
			dc = GetDC(window);
			TextOut(dc, 105, 51, x_position, wcslen(x_position));
			TextOut(dc, 255, 51, y_position, wcslen(y_position));
			EndPaint(window, &paint);
		}
		break;
	case WM_PAINT:				//绘制作为背景的文字和矩形
		dc = BeginPaint(window,&paint);
		Rectangle(dc, 100, 50, 150, 70);
		Rectangle(dc, 250, 50, 300, 70);
		TextOut(dc, 50, 50, heng, wcslen(heng));
		TextOut(dc, 200, 50, zong, wcslen(zong));
		EndPaint(window, &paint);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(window, message, wParam, lParam);
	}
	return 0;
}
BOOL CALLBACK DlgProc(HWND dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch (message)				//处理对话框消息
	{
	case WM_INITDIALOG:			//初始化
		return 1;
	case WM_COMMAND:				//处理按钮消息
		switch (LOWORD(wParam))
		{
		case IDOK:				//点确定退出程序
			PostQuitMessage(0);
			break;
		case IDNO:				//点取消对话框销毁
			EndDialog(dlg, 0);
			break;
		}
		break;
	case WM_CLOSE:				//点叉销毁对话框
		EndDialog(dlg, 0);
		break;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值