win32- 使用WM_NCPAINT在非客户区域绘制边框

时间:2020-05-20
本文章向大家介绍win32- 使用WM_NCPAINT在非客户区域绘制边框,主要包括win32- 使用WM_NCPAINT在非客户区域绘制边框使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#pragma comment(lib, "UxTheme")
#include <windows.h>
#include <uxtheme.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, 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 = NULL;
    wcex.hCursor = (HICON)LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = CreateSolidBrush(RGB(0, 128, 0));
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = L"window";
    wcex.hIconSm = NULL;

    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindowEx(
        NULL,
        L"window",
        NULL,
        WS_OVERLAPPEDWINDOW,
        100,
        100,
        600,
        400,
        NULL,
        NULL,
        hInstance,
        NULL);

    ShowWindow(hWnd, nCmdShow);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
    case WM_CREATE:
        SetWindowTheme(hWnd, L"", L"");
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_NCCALCSIZE:
    {
        LPNCCALCSIZE_PARAMS ncParams = (LPNCCALCSIZE_PARAMS)lParam;
        ncParams->rgrc[0].top += 4;
        ncParams->rgrc[0].left += 4;
        ncParams->rgrc[0].bottom -= 4;
        ncParams->rgrc[0].right -= 4;
        return 0;
    }
    case WM_NCPAINT:
    {
        RECT rect;
        GetWindowRect(hWnd, &rect);
        HRGN region = NULL;
        if (wParam == NULLREGION) {
            region = CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);
        }
        else {
            HRGN copy = CreateRectRgn(0, 0, 0, 0);
            if (CombineRgn(copy, (HRGN)wParam, NULL, RGN_COPY)) {
                region = copy;
            }
            else {
                DeleteObject(copy);
            }
        }
        HDC dc = GetDCEx(hWnd, region, DCX_WINDOW | DCX_CACHE | DCX_INTERSECTRGN | DCX_LOCKWINDOWUPDATE);
        if (!dc && region) {
            DeleteObject(region);
        }
        HPEN pen = CreatePen(PS_INSIDEFRAME, 4, RGB(255, 0, 0));
        HGDIOBJ old = SelectObject(dc, pen);
        int width = rect.right - rect.left;
        int height = rect.bottom - rect.top;
        Rectangle(dc, 0, 0, width, height);
        SelectObject(dc, old);
        ReleaseDC(hWnd, dc);
        DeleteObject(pen);
        return 0;
    }
    case WM_NCACTIVATE:
        RedrawWindow(hWnd, NULL, NULL, RDW_UPDATENOW);
        return 0;
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

原文地址:https://www.cnblogs.com/strive-sun/p/12923397.html