win32 API 窗口基础框架代码

目录

    • win32 api 窗口基础框架代码
    • 动态添加菜单方法:
    • 定时器,实现功能:弹出对话框,点击确定后2秒继续弹出,不会重复是因为杀了再新建
    • 定时器,实现功能:显示系统时间年月日时分秒
    • win32 api 窗口基础框架代码详解

win32 api 窗口基础框架代码

#define _CRT_SECURE_NO_WARNINGS 0
#include 
#include 
#include 
#include 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreinstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASS wc;
	wc.style = CS_BYTEALIGNCLIENT;
	wc.lpfnWndProc = WindowProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = NULL;
	wc.hCursor = NULL;
	wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "Main";
	if (!RegisterClassA(&wc))
		MessageBox(NULL, "此程序不能运行", "提示信息", MB_OK);
	HWND hWnd = CreateWindow("Main","OK", WS_OVERLAPPEDWINDOW, 300, 133, 800, 600, NULL,NULL,hInstance,NULL);
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	MSG msg;
	while (true)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if (GetMessage(&msg, NULL, 0, 0))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
			{
				return 0;
			}
		}
		else
		{
		}
	}
	return 0;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)//窗口过程函数
{
	switch (Msg)
	{
	case WM_TIMER:
		break;
	case WM_SIZE:
		break;
	case WM_CREATE:
		break;
	case WM_DESTROY:
		PostMessage(hWnd, WM_QUIT, 0, 0);
		break;
	case WM_QUIT:
		break;
	case WM_COMMAND:
		break;
	case WM_RBUTTONUP:
		break;
	case WM_CONTEXTMENU:
		break;
	case WM_SYSCOMMAND:
	case WM_PAINT:
		break;
	}
	return DefWindowProc(hWnd, Msg, wParam, lParam);
}



动态添加菜单方法:

#define ID_NEW 100
#define ID_OPEN 200
	HMENU hmenu = CreateMenu();
	HMENU hpopmenu = CreatePopupMenu();
	AppendMenu(hmenu, MF_POPUP, (UINT_PTR)hpopmenu, "文件");
	AppendMenu(hpopmenu, MF_STRING, ID_NEW, "新建");
	AppendMenu(hpopmenu, MF_SEPARATOR, 0, NULL);//分割线
	AppendMenu(hpopmenu, MF_STRING, ID_OPEN, "打开");

	HWND hWnd = CreateWindow("Main", "OK", WS_OVERLAPPEDWINDOW, 300, 133, 800, 600, NULL, hmenu, hInstance, NULL);
	注:也可以把创建过程放在WM_CREATE消息中,下面加一句代码就行,把上面创建主窗口里面的菜单置空就可以了。
	setmenu(hwnd,hmenu);
下面是增加点击响应
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{case ID_NEW:
			MessageBox(hWnd, "new", "new", MB_OK);
			break;
		case ID_OPEN:
			MessageBox(hWnd, "open", "open", MB_OK);
			break;
		default:
			break;
		}

定时器,实现功能:弹出对话框,点击确定后2秒继续弹出,不会重复是因为杀了再新建

UINT idtimer;//定义一个定时器全局变量接收返回值。
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);

	idtimer = SetTimer(hWnd, 1, 2000, NULL);

	MSG msg;

在WM_TIMER中加入下面代码
	switch (Msg)
	{
	case WM_TIMER:
		if (wParam==idtimer)
		{
			KillTimer(hWnd, idtimer);
			MessageBox(hWnd, "idtimer", "timer", MB_OK);
			idtimer = SetTimer(hWnd, 1, 2000, NULL);
		}
		break;

定时器,实现功能:显示系统时间年月日时分秒

int GetTimeStr(HWND hWnd)
{
	PAINTSTRUCT ps;//画家
	const CHAR* str_org = "现在是%4d年%2d月%2d日%2d小时%2d分%2d秒";
	SYSTEMTIME st;//系统时间变量
	WCHAR text[28];
	GetLocalTime(&st);//获取系统时间
	wsprintf((LPSTR)text, str_org, st.wYear, st.wMonth,  st.wDay, st.wHour, st.wMinute, st.wSecond);
	HDC hdc = BeginPaint(hWnd, &ps);
	TextOut(hdc, 33, 33, (LPCSTR)text, wcslen(text));
	EndPaint(hWnd, &ps);
	return 0;
}
========================================================
	case WM_PAINT:
		GetTimeStr(hWnd);//这条也可以放在WM_TIMER消息中执行。
		break;
	case WM_TIMER:
		if (wParam==idtimer)
		{
			KillTimer(hWnd, idtimer);
			//MessageBox(hWnd, "idtimer", "timer", MB_OK);
			InvalidateRect(hWnd, NULL, FALSE);//刷新屏幕
			idtimer = SetTimer(hWnd, 1, 1000, NULL);
		}
		break;

win32 api 窗口基础框架代码详解

#define _CRT_SECURE_NO_WARNINGS 0
#include 
#include 
#include 
#include "resource.h"
#include 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreinstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASS wc;//结构体
	wc.style = CS_BYTEALIGNCLIENT;//style-窗口风格,这里可以加多属性,一般不加全局窗口类(CS_GOLBALCLASS)
	wc.lpfnWndProc = WindowProc;//窗口处理函数
	wc.cbClsExtra = 0;//给窗口类开缓冲区大小
	wc.cbWndExtra = 0;//给窗口开缓冲区大小
	wc.hInstance = hInstance;//当前模块的实例句柄
	wc.hIcon = LoadIcon(hInstance,(char*)IDI_ICON1);//窗口图标句柄,默认小图作为窗口图标,大图作为切换图标,大小随便画,只留两张就行
	wc.hCursor = LoadCursor(hInstance, (char*)IDC_CURSOR1);//鼠标的句柄
	wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));//绘制窗口背景的画刷句柄
	wc.lpszMenuName = (char*)IDR_MENU1;//窗口菜单的资源ID字符串,也可以在下面创建窗口时挂菜单。
	//上面这个菜单需要先创建菜单资源,引入资源头文件,填入资源视图里面的菜单ID。
	wc.lpszClassName = "Main";//要注册的这个窗口类的名称
	if (!RegisterClassA(&wc))//注册函数成功返回一串数字标识,失败返回0。
		MessageBox(NULL, "此程序不能运行", "提示信息", MB_OK);
	char szTitle[256]{ 0 };
	LoadStringA(hInstance, IDS_WND, szTitle, 256);
	HWND hWnd = CreateWindow(//这个函数在内存中创建窗口,创建顺序是先到局部-全局-系统中找(根据类名main和程序句柄hInstance,其中全局和系统中只需要比对类名就行,全局和系统本来就可以全部调用)
		"Main", //己经注册了的窗口类名
		szTitle, //窗口标题栏的名字
		WS_OVERLAPPEDWINDOW, //窗口风格(填这个风格省心,一个就行),WS_开头的为系统风格
		//WS_TILEDWINDOW这个风格和上面的一样(省事)
		300, 133, 800, 600, //窗口x,y,宽,高
		NULL,//窗口的父窗口句柄
		NULL,//窗口菜单句柄,也可以在这里挂菜单(方法:LoadMenu(hInstance, (char*)IDR_MENU1)),不用在设计时挂
		hInstance,//应用程序实例句柄
		NULL);//窗口创建时附加参数,一般给NULL就行
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	MSG msg;
	while (true)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))//发现有消息
		{
			if (GetMessage(&msg, NULL, 0, 0))//派get去抓消息
			{
					TranslateMessage(&msg);
					DispatchMessage(&msg);
			}
			else
			{
				//进入这里说明get返回零,也就是抓到了WM_QUIT退出的消息了,程序结束
				return 0;
			}
		}
		else
		{
			//空闲处理
		}
	}
	return 0;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)//窗口过程函数
{
	switch (Msg)
	{
	case WM_TIMER:
		break;
	case WM_SIZE://产生时间:窗口的小大发生变化后。
		break;
	case WM_CREATE://产生时间:在窗口创建成功但还未显示时。由此可见getmessage并不是显示窗口后才工作,而是从创建时就工作了。
		break;
	case WM_DESTROY:
		//PostQuitMessage(0);//可以使getmessage函数返回零。底层就是调用postmessage给get发送wm_quit消息。
		break;
	case WM_QUIT://产生时间:程序员自己发送
		break;
	case WM_COMMAND:
		break;
	case WM_RBUTTONUP://鼠标右击弹起消息
		break;
	case WM_CONTEXTMENU://这个是官方提供的专门用来处理右击弹出菜单的消息
		break;
	case WM_SYSCOMMAND://产生时间:点击窗口最大化,最小化,关闭等,一般用在窗口关闭时,提示用户处理。
	case WM_PAINT://用于绘图。产生时间:当窗口需要䌊的时候,也就是getmessage没事可干的时候,做这个
		break;
	}
	return DefWindowProc(hWnd, Msg, wParam, lParam);
}


你可能感兴趣的:(c++,mfc)