用C++生成一个windows(win32)的窗口程序

来源:赵克立博客 分类: C/C++ 标签:C/C++发布时间:2014-04-29 06:04:00最后更新:2016-08-17 15:53:06浏览:7746
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2016-08-17 15:53:06
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

使用vs开发程序的时候用mfc已经把windows下面的窗口程序实现过程封装的很厉害,下面直接用c++代码调用vc++封装好的类库实现一个win32的窗口程序,了解下windows下面窗口程序的消息循环和处理过程


本例中使用vs2015纯c++代码调用window sdk API生成windows中的一个窗口程序 不用mfc 看代码:  

打开vs2015新建项目vc++ win32项目

QQ截图20160817151940.png


然后选择 window应用程序和空项目

QQ截图20160817152431.png

点击完成,项目就创建完成啦,然后在项目上右键属性 设置项目的字符集为多字节,如图:

QQ截图20160817152845.png

QQ截图20160817152746.png


然后开始创建源代码文件 main.cpp

QQ截图20160817152522.png

QQ截图20160817152535.png


保存为main.cpp文件


打开main.cpp输入以下代码然后运行

#include <windows.h>;

//声明一个窗口消息回调函数
LRESULT CALLBACK MAINWNDPROC(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	static	char str[2] = { 0 };
	// 消息处理
	switch (msg)
	{
	case WM_KEYDOWN:
		str[0] = char(wparam);
		if (msg == MK_SHIFT&&wparam)
			InvalidateRect(hwnd, NULL, 1);
		return 0;
	case WM_PAINT:
		PAINTSTRUCT ps;
		BeginPaint(hwnd, &ps);
		TextOut(ps.hdc, 0, 0, str, strlen(str));
		EndPaint(hwnd, &ps);
		return 0;
	case WM_DESTROY:
		//发送 WM_QUIT 退出消息到消息队列
		PostQuitMessage(0);
		break;
	case WM_CLOSE:
		PostMessage(hwnd, WM_QUIT, 0, 0);
		return 0;
	default:
		// 对没有处理的消息进行默认的处理 
		return DefWindowProc(hwnd, msg, wparam, lparam);
	}
	return DefWindowProc(hwnd, msg, wparam, lparam);
}
class CFrameWindow {
public:
	LRESULT CreateShowWindow(HINSTANCE hinstance, HINSTANCE Phinstance, LPSTR lpstr, int showcmd) {
		WNDCLASS MYWND;
		MYWND.cbClsExtra = 0;
		MYWND.cbWndExtra = 0;
		MYWND.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
		MYWND.hInstance = hinstance;
		MYWND.lpszClassName = "应用程序";
		MYWND.lpszMenuName = NULL;//没有菜单
		MYWND.style = CS_BYTEALIGNCLIENT;

		MYWND.hIcon = LoadIcon(NULL, IDI_APPLICATION);//窗口默认的图标和鼠标
		MYWND.hCursor = LoadCursor(NULL, IDC_ARROW);
		MYWND.lpszMenuName = NULL;                 //没有菜单
		MYWND.cbClsExtra = 0;                      //窗口类扩展
		MYWND.cbWndExtra = 0;                      //结构或窗口实例
		MYWND.lpfnWndProc = MAINWNDPROC;		   //窗口回调函数										   
		//MYWND.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
		MYWND.hbrBackground = CreateSolidBrush(RGB(255, 0, 0));//窗口的默认颜色和背景色

		//注册失败就退出
		if (!RegisterClass(&MYWND)) {
			return 0;
		}

		//类注册成功,就可以用这个类来创建一个窗口
		HWND hwnd = CreateWindowEx(
			0,                   // 扩展,为空 
			MYWND.lpszClassName,         // 类名 
			"Windows 32 App",       // 标题 
			WS_OVERLAPPEDWINDOW, // 默认窗口类型 
			CW_USEDEFAULT,       // 窗口在屏幕上的开始位置
			CW_USEDEFAULT,       // 窗口在屏幕上的结束位置 
			544,                 // 宽 
			375,                 // 高  以像素计算 
			HWND_DESKTOP,        // 父窗口为桌面 
			NULL,                // 没有菜单 
			hinstance,       // 程序实例句柄 
			NULL                 // 数据为空 
			);
		ShowWindow(hwnd, showcmd);
		UpdateWindow(hwnd);
		MSG msg;
		// 运行消息循环直到 GetMessage() 返回 0 
		while (GetMessage(&msg, NULL, 0, 0) != 0)
		{
			//该函数将虚拟键消息转换为字符消息 
			TranslateMessage(&msg);
			// 发送消息到窗口循环函数 MAINWNDPROC 
			DispatchMessage(&msg);
		}
		return 0;
	}
};
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE Phinstance, LPSTR lpstr, int showcmd)
{
	CFrameWindow* wnd = new CFrameWindow();
	if (wnd == NULL)return 0;
	wnd->CreateShowWindow(hinstance, Phinstance, lpstr, showcmd);
	return 0;
}

效果图如下:

QQ截图20160817154513.png




微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python