不依赖MFC创建Win32窗口

Windows.h提供了CreateWindow系列的函数,自己注册一个class,然后就能创建窗口,创建之后需要在WndProc中处理Message

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
    WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:{
        PrintLogEx(L"windows create\n");
    }
    break;
    case WM_CLOSE: {
        ExitProcess(0);
    }
    break;
    case WM_DESTROY:{
        PostQuitMessage(0);//可以使GetMessage返回0??
    }
    break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

// 注册窗口类, 注册之后才能CreateWindow
BOOL RegisterWndClass(LPTSTR lpClassName, WNDPROC wndProc)
{
    WNDCLASSEX wce = { 0 };
    wce.cbSize = sizeof(wce);
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hIconSm = NULL;
    wce.hInstance = GetModuleHandleW(NULL);
    wce.lpfnWndProc = wndProc;
    wce.lpszClassName = lpClassName;
    wce.lpszMenuName = NULL;
    wce.style = CS_HREDRAW | CS_VREDRAW;
    ATOM nAtom = RegisterClassEx(&wce);
    if (nAtom == 0)
        return FALSE;
    return TRUE;
}


// 创建主窗口,要注册窗口类之后才能创建对应的classname
HWND CreateMain(LPTSTR lpClassName, LPTSTR lpWndName)
{
    HWND hWnd = CreateWindowExW(0, lpClassName, lpWndName,
        WS_POPUP, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, GetModuleHandleW(NULL), NULL);

    PrintLogEx(L"CreateWindowExW return %p\n", hWnd);

    return hWnd;
}

//显示窗口
void DisplayWindow(HWND hWnd)
{
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
}

//消息循环
void HandleMessage(HWND hWnd)
{
    MSG nMsg = { 0 };
    while (GetMessageW(&nMsg, hWnd, 0, 0))
    {
        TranslateMessage(&nMsg);
        DispatchMessage(&nMsg);
    }
}

int main() {
    HWND hWnd = NULL;
    TCHAR className[20], windowName[20];

    PrintLogEx(L"create window\n");

    _tcscpy_s(className, sizeof(className) / sizeof(className[0]), L"MyClassWnd");
    _tcscpy_s(windowName, sizeof(windowName) / sizeof(windowName[0]), L"hello world");

    PrintLogEx(L"create window %s-%s\n", className, windowName);

    
    if (RegisterWndClass(className, WndProc)) {
        hWnd = CreateMain(className, windowName);
        DisplayWindow(hWnd);
        HandleMessage(hWnd);
    }
    else {
        PrintLogEx(L"Register failed\n");
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值