用C++生成一个windows(win32)的窗口程序
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。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项目

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

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


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


保存为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;
}效果图如下:
