首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WinAPI:创建不带标题栏的可调整大小的窗口,但使用最小化/最大化/关闭按钮(如Firefox/Chrome/Opera)

关于WinAPI创建不带标题栏的可调整大小的窗口,但使用最小化/最大化/关闭按钮,可以使用以下方法:

  1. 首先,在创建窗口时,需要设置WS_POPUP样式,以创建一个不带标题栏的窗口。
  2. 然后,在窗口类中设置CS_HREDRAW和CS_VREDRAW样式,以允许窗口在调整大小时重绘。
  3. 接下来,在窗口过程中捕获WM_NCHITTEST消息,并返回HTCAPTION,以便在窗口的任何地方单击时捕获鼠标。
  4. 最后,在窗口中添加最小化、最大化和关闭按钮,并处理它们的消息。

以下是一个简单的示例代码:

代码语言:c++
复制
#include<Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "MyWindowClass";
    wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL, "Call to RegisterClassEx failed!", "Error", NULL);
        return 1;
    }

    HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "MyWindowClass", "My Window", WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, NULL, NULL, hInstance, NULL);

    if (!hWnd)
    {
        MessageBox(NULL, "Call to CreateWindow failed!", "Error", NULL);
        return 1;
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_NCHITTEST:
        {
            LRESULT hit = DefWindowProc(hWnd, message, wParam, lParam);
            if (hit == HTCLIENT)
                hit = HTCAPTION;
            return hit;
        }
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

这个示例代码创建了一个不带标题栏的窗口,并使用最小化/最大化/关闭按钮。你可以根据需要修改代码以满足你的需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券