学习windows编程 day3 之窗口绘画一:点线绘制

#include <windows.h>
#include <math.h>

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

#define PI 3.1415926
#define NUM 1000

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;
    int i;
    static int padding;
    static int xCount, yCount;    //线条数
    static int xClient, yClient;//窗口大小

    switch (message)
    {
    case WM_CREATE:
        padding = 50;
        break;
    case WM_SIZE:
        xClient = LOWORD(lParam);
        yClient = HIWORD(lParam);

        xCount = xClient / padding - 1;
        yCount = yClient / padding - 1;
        break;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);

        GetClientRect(hwnd, &rect);
//1        //画点
//         for (i = rect.left; i < rect.right;i++)
//         {
//             //画像素点--->成线
//             //setpixel返回的是个颜色rgb,因为系统有时候会自动用相近颜色替换,效率不高
//             //setpixelv返回bool类型,效率更高
//             //但是当用这些函数绘制图形,会快速出入栈,效率不高
//             SetPixel(hdc, i, 100, RGB(255, 0, 0));
//         }

//2        //画线
        //movetoex将当前绘图位置移动到某个具体的点,可以获得之前的位置坐标
//         POINT pt;
//         MoveToEx(hdc, 100, 50, &pt);    //默认起点是左上角
//         //LineTo(hdc, pt.x, pt.y);
//         LineTo(hdc, 150, 100);
//         LineTo(hdc, 300, 400);
// 
//         //getcurrentpositionex获取当前绘图点坐标
//         GetCurrentPositionEx(hdc, &pt);

//3        //绘制一个网格
        //先绘制上到下
        //获取线条数量
//         for (i = 1; i <= xCount;i++)
//         {
//             MoveToEx(hdc, i*padding, 0, NULL);
//             LineTo(hdc, i*padding, yClient);
//         }
// 
//         //再绘制左到右
//         for (i = 1; i <= yCount;i++)
//         {
//             MoveToEx(hdc, 0, i*padding, NULL);
//             LineTo(hdc, xClient, i*padding);
//         }

//4        //绘制网格2
        //rect就是客户区矩形......
//         for (int x = 0; x < rect.right;x+=50)
//         {
//             MoveToEx(hdc, x, 0, NULL);
//             LineTo(hdc, x, rect.bottom);
//         }
// 
//         for (int x = 0; x < rect.bottom; x += 50)
//         {
//             MoveToEx(hdc, 0, x, NULL);
//             LineTo(hdc, rect.right, x);
//         }

//5.    //画一个五角星
//         MoveToEx(hdc, 30, 10,NULL);
//         LineTo(hdc, 20, 50);
//         LineTo(hdc, 50, 20);
//         LineTo(hdc, 10, 20);
//         LineTo(hdc, 40, 50);
//         LineTo(hdc, 30, 10);

//6.    //折线绘制五角星
//         POINT apt[] = { 30, 10, 20, 50, 50, 20, 10, 20, 40, 50, 30, 10 };
//         Polyline(hdc, apt, 6);
//         PolylineTo(hdc, apt, 6);    //会重当前位置为起点开始向顶点绘制

//7.    //同时绘制多个图像
//         POINT apt2[] = {
//             30, 10, 20, 50, 50, 20, 10, 20, 40, 50, 30, 10,    //五角星
//             120, 120, 180, 120, 120, 180,120,120,    //直角三角形
//             300, 300, 300, 400, 400, 400, 400, 300,300,300    //矩形
//         };
        
//         DWORD count[] = { 6, 4, 5 };
//         PolyPolyline(hdc, apt2, count, 3);;

//        MoveToEx(hdc, 100, 100, NULL);
//        LineTo(hdc, 500, 100);
//8.    //绘制sin曲线
//         POINT apt3[400];
//         double x, y,rad;
//         for (int i = 0; i < 400;i+=1)
//         {
//             x = i;
//             rad = PI / 180.0 * (360.0 / 400.0)*i;
//             y = sin(rad);
//             
//             apt3[i].x = x+100;
//             apt3[i].y = y*100+100;
//         }
//         Polyline(hdc, apt3, 400);

//9.    //h绘制sin曲线,规范
        POINT apt4[NUM];
        MoveToEx(hdc, 0, yClient / 2, NULL);
        LineTo(hdc, xClient, yClient / 2);

        for (int j = 0; j < NUM;j++)
        {
            apt4[j].x = j*xClient/NUM;
            apt4[j].y = (int)((1 - sin(PI * 2 / NUM*j)) / 2 * yClient);
        }
        Polyline(hdc, apt4, NUM);

        DrawText(hdc, L"this is my first pragram win32", -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }


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