再探win32绘制正弦图像的最优雅方法:DPtoLP

来源:互联网 发布:上海和数软件 编辑:程序博客网 时间:2024/05/16 01:08

一、引言

前面已经讨论了两种win32绘制正弦图像的方法,这里在学习小甲鱼win32 SDK教程第27课时,看到了更加优雅的方法。使用设备坐标向逻辑坐标的转换。

二、讨论三种绘制方案

这里附上我之前讨论过的两种绘制正弦图像的方案地址。

Win API绘制y = sinx函数图像。

再探win32绘制正弦图像的另一种方法:指定映射模式。

这里总结如下:

第一种方式,不使用映射模式转换,使得我们在计算坐标位置的时候,使用数学方法进行计算,增加了算法的难度;

第二种方式,我们使用了映射模式转换,将逻辑空间单位转换成了设备空间单位,非常简单的实现了正弦函数的绘制,但是并不能很好的控制正弦图像的大小;

我们立马要说的第三种方式,我觉得是最优雅的方式:
使用映射模式转换,并且使用客户端的区域大小,将之进行设备坐标到逻辑坐标的转换(使用DPtoLP函数),从而简单的实现了正弦函数的绘制和大小的控制。

三、欣赏小甲鱼老师带来的优雅的代码

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){    HDC hdc;    PAINTSTRUCT ps;    RECT rect;    POINT apt[NUM];    int i;    int iMapMode;    static int cxClient, cyClient;    switch (message)    {    case WM_SIZE:        cxClient = LOWORD(lParam);        cyClient = HIWORD(lParam);        return 0;    case WM_PAINT:        hdc = BeginPaint(hwnd, &ps);        // 绘制辅助线        MoveToEx(hdc, 0, cyClient / 2, NULL);        LineTo(hdc, cxClient, cyClient / 2);        MoveToEx(hdc, cxClient / 2, 0, NULL);        LineTo(hdc, cxClient / 2, cyClient);        iMapMode = GetMapMode(hdc);        // 设置映射模式        SetMapMode(hdc, MM_LOMETRIC);        SetViewportOrgEx(hdc, 0, cyClient / 2, NULL);        // 将当前客户端的设备坐标转换成逻辑坐标        GetClientRect(hwnd, &rect);        DPtoLP(hdc, (PPOINT)&rect, 2);        for (i = 0; i < NUM; i++)        {            // 使用逻辑坐标计算坐标位置            apt[i].x = i * (rect.right - rect.left) / NUM;            apt[i].y = (int)(rect.top * sin(TWOPI * i / NUM));        }        // 绘制正弦图像        MoveToEx(hdc, apt[0].x, apt[0].y, NULL);        PolylineTo(hdc, apt, NUM);        // 恢复原来的映射模式        SetMapMode(hdc, iMapMode);        EndPaint(hwnd, &ps);        return 0;    case WM_DESTROY:        PostQuitMessage(0);        return 0;    }    return DefWindowProc(hwnd, message, wParam, lParam);}

四、总结

对待一个问题,要寻找各个方法去解决它,寻找最优解。

0 0
原创粉丝点击