学习windows编程 day3 之窗口绘画二:边框绘制函数

#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    //声明全局数据:类名
    static TCHAR szClassName[] = TEXT("MyWindows");
    HWND hwnd;
    MSG msg;

    //注册窗口类
    WNDCLASS wndclass;

    wndclass.hInstance = hInstance;
    wndclass.lpszClassName = szClassName;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.lpfnWndProc = WndProc;
    wndclass.lpszMenuName = NULL;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.style = CS_HREDRAW;

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("this program must run in Windows NT!"), szClassName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(
        szClassName,
        TEXT("MyFirstPractice"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
        );

    ShowWindow(hwnd, nShowCmd);
    UpdateWindow(hwnd);

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

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    static int cxClient, cyClient;
    static int cxClick, cyClick;
    static POINT apt[4];
    static int flag = 0;

    switch (message)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        //贝塞尔曲线需要四个点
        apt[0].x = cxClient / 4;
        apt[0].y = cyClient / 2;

        apt[1].x = cxClient / 2;
        apt[1].y = cyClient / 4;

        apt[2].x = cxClient / 2;
        apt[2].y = cyClient *3/4;

        apt[3].x = cxClient *3/ 4;
        apt[3].y = cyClient / 2;

        break;
    case WM_PAINT:
        hdc = BeginPaint(hwnd,&ps);
        SelectObject(hdc, GetStockObject(BLACK_PEN));
        //画贝塞尔曲线
        PolyBezier(hdc, apt,4);

//边框绘制函数:内部可以填充
        //画矩形
        SelectObject(hdc, GetStockObject(BLACK_BRUSH));//会填充
        Rectangle(hdc, 100, 100, 300, 300);
        //画椭圆
        SelectObject(hdc, GetStockObject(WHITE_BRUSH));
        Ellipse(hdc, 100, 100, 300, 300);
        //画矩形,带圆角
        SelectObject(hdc, GetStockObject(BLACK_BRUSH));
        RoundRect(hdc, 500, 100, 600, 200, 10, 10);
        //画弧线
        Arc(hdc, 700, 100, 900, 200, 800, 50, 600, 150);
        //封闭弧线两点        和下面一样都是第一点开始,第二点结束,默认逆时针
        Chord(hdc, 700, 100, 900, 200, 800, 50, 600, 150);
        //画扇形,默认逆时针(中点到第一个点的连线逆时针扫描到第二条线)
        Pie(hdc, 700, 100, 900, 200 , 800, 250, 1000, 50);

        EndPaint(hwnd, hdc);
        break;
    case WM_LBUTTONDOWN:
        //左键修改第一和第二点位置
        cxClick = LOWORD(lParam);
        cyClick = HIWORD(lParam);
        if (flag == 0)
        {
            apt[0].x = cxClick;
            apt[0].y = cyClick;
            flag = 1;
        }
        else
        {
            apt[1].x = cxClick;
            apt[1].y = cyClick;
            flag = 0;
        }
        InvalidateRect(hwnd, NULL, TRUE);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }


    return DefWindowProc(hwnd, message, wParam, lParam);
}
原文地址:https://www.cnblogs.com/ssyfj/p/8506367.html