繁体   English   中英

WinAPI - ShowWindow() 无法最大化 window

[英]WinAPI - ShowWindow() fails to maximize the window

我的 window 没有使用标题栏,因此我希望 window 在我双击时最大化。 所以我使用ShowWindow(hwnd, SW_MAXIMIZE) ,但它似乎不起作用。 我什至尝试过SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0) WM_NCLBUTTONDBLCLK上,它会打印其中的语句,但不会执行您在该视频中看到的命令 - https://imgur.com/a/r0oVD5W

这是我的最小复制代码:

#include <dwmapi.h>
#include <stdio.h>
#include <windows.h>

#define border_size 4
#define w_width 1000
#define w_height 500
#define caption_size 30
#define corner_rounding 7

char* w_name = "test title";
char* app_name = "test";

HWND hwnd;

ATOM MyRegisterClass(HINSTANCE hInst, char* name, UINT styles, COLORREF bkg_colour, WNDPROC proc)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = styles;
    wc.lpfnWndProc = proc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInst;
    wc.hIcon = LoadIconA(hInst, IDI_APPLICATION);
    wc.hCursor = LoadCursorA(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)CreateSolidBrush(bkg_colour);
    wc.lpszMenuName = NULL;
    wc.hIconSm = LoadIconA(hInst, IDI_APPLICATION);
    wc.lpszClassName = name;

    return RegisterClassExA(&wc);
}

LRESULT CALLBACK Caption(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) // returns HTTRANSPARENT
{
    switch (msg)
    {
    case WM_NCHITTEST:;
        return HTTRANSPARENT;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProcA(hwnd, msg, wp, lp);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    PAINTSTRUCT ps;
    HDC hdc;
    switch (msg)
    {
    case WM_NCLBUTTONDBLCLK:
        printf("works\n");
        ShowWindow(hwnd, SW_MAXIMIZE);
        break;
    case WM_NCHITTEST:;
        return HTCAPTION;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProcA(hwnd, msg, wp, lp);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;

    MyRegisterClass(hInstance, app_name, CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, RGB(255, 0, 0), WndProc);
    MyRegisterClass(hInstance, "caption_wind", CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, RGB(255, 255, 0), Caption);

    hwnd = CreateWindowExA(WS_EX_LAYERED | WS_EX_NOINHERITLAYOUT, app_name, "main", WS_POPUP, 0, 0, w_width + 2 * border_size + corner_rounding / 2, w_height + 2 * border_size + corner_rounding / 2, NULL, NULL, hInstance, NULL);
    HWND hcaption = CreateWindowExA(0, "caption_wind", NULL, WS_CHILD | WS_VISIBLE, border_size, border_size, w_width, w_height, hwnd, NULL, hInstance, NULL);

    HRGN mrgn = CreateRoundRectRgn(border_size, border_size, w_width, w_height, corner_rounding, corner_rounding);
    HRGN trgn = CreateRectRgn(0, caption_size + border_size, w_width, w_height);
    CombineRgn(mrgn, mrgn, trgn, RGN_DIFF);
    DeleteObject(trgn);
    SetWindowRgn(hcaption, mrgn, 1);
    SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);

    ShowWindow(hwnd, SW_MAXIMIZE);
    // ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while (GetMessageA(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
    }
    return msg.wParam;
}

任何帮助将不胜感激。

我同意 ElderBug,您应该尝试使用ShowWindowAsync function而不是ShowWindow function 如下:

case WM_NCLBUTTONDBLCLK:
    printf("works\n");

    ShowWindowAsync(hwnd, SW_MAXIMIZE);
    break;

应用程序第一次调用 ShowWindow 时,它应该使用 WinMain 函数的 nCmdShow 参数作为它的nCmdShow参数。 我建议您可以尝试使用nCmdShow而不是SW_MAXIMIZE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM