GDI 直线和折线(6)
设置开始点
MoveToEx 函数用于移动画笔到指定的位置:
BOOL MoveToEx(
HDC hdc, // 设备环境句柄
int X, // 要移动到的 x 坐标
int Y, // 要移动到的 y 坐标
LPPOINT lpPoint // 之前的位置(POINT 结构地址)
);
绘制直线
LineTo 函数用于绘制直线到指定位置(这会改变当前画笔的位置到结束位置):
BOOL LineTo(
HDC hdc, // 设备环境句柄
int nXEnd, // 结束位置的 x 坐标
int nYEnd // 结束位置的 y 坐标
);
绘制折线
Polyline 函数用于绘制一系列点构成的折线(这不会改变当前画笔的位置):
BOOL Polyline(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // POINT 结构数组(一系列点)
int cPoints // POINT 结构的数量(点的数量)
);
PolylineTo 函数用于绘制由画笔位置开始到一系列点所构成的折线(这会改变当前画笔的位置到最后一个点的位置):
BOOL PolylineTo(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // POINT 结构数组(一系列点)
DWORD cCount // POINT 结构的数量(点的数量)
);
PolyPolyline 函数用于同时绘制多条折线(这不会改变当前画笔的位置):
BOOL PolyPolyline(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // POINT 结构数组(一系列点)
CONST DWORD *lpdwPolyPoints, // 数组中的每个元素表示对应折线的点的数量
DWORD cCount // 折线数量(上个参数的元素个数)
);
绘制 Sin 函数图像的程序示例
#include <windows.h>
#include <strsafe.h>
#include <math.h> #define NUMS 10000
#define TWOPI 6.283185307 LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc;
PAINTSTRUCT ps;
RECT rcClient;
POINT apt[NUMS];
TCHAR szBuffer[100];
size_t nLength;
int cxClient, cyClient, i; switch (message) { case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rcClient);
cxClient = rcClient.right - rcClient.left;
cyClient = rcClient.bottom - rcClient.top; MoveToEx(hdc, 0, cyClient / 2, NULL);
LineTo(hdc, cxClient, cyClient / 2); for (i = 0; i < NUMS; i++) {
apt[i].x = i;
apt[i].y = (int)((1 - sin(i * TWOPI / cxClient)) * cyClient / 2);
} SetTextAlign(hdc, TA_TOP | TA_RIGHT); StringCchPrintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), TEXT("y = sin x"));
StringCchLength(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), &nLength);
TextOut(hdc, cxClient - 10, 10, szBuffer, nLength); Polyline(hdc, apt, i - 1); EndPaint(hwnd, &ps);
return 0; case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd, message, wParam, lParam);
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LPCTSTR lpszClassName = TEXT("Demo");
LPCTSTR lpszWindowName = TEXT("Demo Program"); WNDCLASS wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WindowProc;
wndclass.lpszClassName = lpszClassName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("This program requires Windows NT!"), lpszWindowName, MB_ICONERROR);
return 0;
} HWND hwnd = CreateWindow(
lpszClassName,
lpszWindowName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
); ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd); MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}
GDI 直线和折线(6)的更多相关文章
- MFC 直线 虚线 折线 圆 椭圆 矩形 弧形
****Dlg.h头文件加入: //为project加入画笔.点变量数组 public: CPen m_pen[5]; CPoint m_point[5]; public: void DrawLine ...
- PowerDesigner设置线风格(直线,折线。。。)
PowerDesigner中的绘图功能真是不敢恭维. 1.修改显示设置 Tools-->Display Preferences 这里有很多表现设置,我们需要的在Format菜单下. 点Modif ...
- 使用html5 Canvas绘制线条(直线、折线等)
使用html5 Canvas绘制直线所需的CanvasRenderingContext2D对象的主要属性和方法(有"()"者为方法)如下: 属性或方法 基本描述 strokeSty ...
- GDI+编程说明及小结
原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...
- GDI+编程小结
GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...
- 7C - 折线分割平面
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示. Input ...
- MFC绘图(转载)
http://www.cppblog.com/bestcln/articles/83189.html 1 几何对象的结构和类 为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类.这些结 ...
- WinForm 工作流设计 1
从事软件行业那么多年,一直很少写博.很多技术,长时间不用都慢慢淡忘. 把自己学到的用笔记下来,可以巩固和发现不足,也可以把自己对技术的一些 理解,分享出来供大家批评指正. 废话不多说,进入正题.工作流 ...
- C# 生成chart图表的三种方式
.net中,微软给我们提供了画图类(system.drawing.imaging),在该类中画图的基本功能都有.比如:直线.折线.矩形.多边形.椭圆形.扇形.曲线等等,因此一般的图形都可以直接通过代码 ...
随机推荐
- Pavel and barbecue
Pavel and barbecue time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 推荐一个同步Mysql数据到Elasticsearch的工具
把Mysql的数据同步到Elasticsearch是个很常见的需求,但在Github里找到的同步工具用起来或多或少都有些别扭. 例如:某记录内容为"aaa|bbb|ccc",将其按 ...
- 【ACM】hdu_1004_Let the Balloon Rise
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 洛谷 P1535 游荡的奶牛
P1535 游荡的奶牛 题目描述 Searching for the very best grass, the cows are travelling about the pasture which ...
- 手把手实现Java权限(1)-Shiro介绍
功能介绍 Authentication :身份认证/登录.验证用户是不是拥有对应的身份: Authorization :授权,即权限验证.验证某个已认证的用户是否拥有某个权限:即推断用 户能否做事 ...
- no projects are found to import
从svn上导出的项目在导入Eclipse中常常出现 no projects are found to import . 产生的原因是:项目文件里中没有".classpath"和&q ...
- cocos2d-x的gitignore配置
# Ignore thumbnails created by windows Thumbs.db # Ignore files build by Visual Studio *.obj *.exe * ...
- [ Javascript ] 内存泄露以及循环引用解析
内存泄露 在javascript中,我们非常少去关注内存的管理. 我们创建变量,使用变量,浏览器关注这些底层的细节都显得非常正常. 可是当应用程序变得越来越复杂而且ajax化之后,或者用户在一个页面停 ...
- JDBC的使用(MySQL数据库)
一.MySQL数据库安装与数据库连接驱动程序设置 在官网中下载MySQL:https://dev.mysql.com/downloads/mysql/ 下载JDBC驱动包:https://dev.my ...
- Python去除多余空格
今天做爬虫时.发现结果中好多多余的空格.然后有强迫症的我当然不会放过 " xyz ".strip() # returns "xyz" " xyz &q ...