最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c++ - Snap assist menu on hovering custom maximise button - Stack Overflow

programmeradmin3浏览0评论

I want to trigger the snap menu, for my C++ Windows application, by hovering the custom maximise button, made using HTML and CSS in the client space. I do not use the default title bar provided. Is there any way to do this?

Followed the guide from here, but It's not working.

Tried the below code from here, but not working (even after handling WM_NCHITTEST and WM_NCACLSIZE, as I don't use the default title bar at all)

#include <stdio.h>

#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <windowsx.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[]  = L"Sample Window Class";

    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Test Window",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

    if (hwnd == NULL)
    {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.

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

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.

        FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

        EndPaint(hwnd, &ps);
    }
    return 0;

    case WM_NCHITTEST:
    {
        // Get the point in screen coordinates.
        // GET_X_LPARAM and GET_Y_LPARAM are defined in windowsx.h
        POINT point = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
        // Map the point to client coordinates.
        ::MapWindowPoints(nullptr, hwnd, &point, 1);
        RECT maximizeRect {0, 0, 200, 200};
        // If the point is in your maximize button then return HTMAXBUTTON
        if (::PtInRect(&maximizeRect, point))
        {
            printf("maxmize button rect %d\n", rand());
            fflush(stdout);
            return HTMAXBUTTON;
        }

        break;
    }

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
发布评论

评论列表(0)

  1. 暂无评论