- /*
- *C++常用绘图操作示例
- *包含:直线、多边线段、圆弧、饼图、矩形、圆角矩形、椭圆、多边形、自定义文本的绘制及其前景色、背景色配置
- *编写:mengkun 2016/10/18
- */
- #include<windows.h>
- #include<tchar.h>
- BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- //主函数
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
- LPSTR lpCmdLine, int nCmdShow)
- {
- MSG Message;
- if (!InitWindowClass(hInstance, nCmdShow))
- {
- MessageBox(NULL, _T("创建窗口失败!"), _T("创建窗口"), NULL);
- return 1;
- }
- while (GetMessage(&Message, 0, 0, 0)) //消息循环
- {
- TranslateMessage(&Message);
- DispatchMessage(&Message);
- }
- return (int)Message.wParam;
- }
- //消息处理函数
- LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
- {
- HDC hDC; //定义指向设备上下文的句柄
- PAINTSTRUCT PtStr; //定义指向包含绘图信息的结构体变量
- HBRUSH hBrush; //定义指向画刷的句柄
- HPEN hPen; //定义指向画笔的句柄
- HFONT myFont; //定义字体句柄
- LPCWSTR String1 = L"我擦这行字居然有背景色!!"; //创建一个变量存储要输出的字符串
- LPCWSTR String2 = L"我擦这行字是斜的有下划线还没背景"; //创建一个变量存储要输出的字符串
- static POINT myPoint[3]; //定义多边形的坐标.
- static long i = 0;
- long x[3] = { 20,50,60 }; //定义多边形各点的X和Y坐标
- long y[3] = { 40,20,30};
- switch (iMessage) //处理消息
- {
- case WM_CREATE:
- for (i = 0; i < 2; i++) //吧多边形的各点坐标存进myPoint中
- {
- myPoint[i].x = x[i];
- myPoint[i].y = y[i];
- }
- break;
- case WM_PAINT: //处理绘图消息
- hDC = BeginPaint(hWnd, &PtStr);
- SetMapMode(hDC, MM_TEXT); //设置映像模式
- //===============================
- //画一条线的示例
- //===============================
- //第一个参数-PS_SOLID:实线;PS_DASH:虚线;PS_DOT:点线
- //第二个参数-线条的宽度(如果是虚线或点线,宽度只能设为1!!!)
- //第三个参数-RGB颜色(分别对应红、绿、蓝,范围:0~255)
- hPen = CreatePen(PS_DOT, 1, RGB(255, 0, 0)); //设置画笔
- SelectObject(hDC, hPen); //选择画笔
- //第二个参数:画线的起点X坐标
- //第三个参数:画线的起点Y坐标
- MoveToEx(hDC, 100, 200, NULL); //设置画笔当前位置
- //第二个参数:画线的终点X坐标
- //第三个参数:画线的终点Y坐标
- LineTo(hDC, 300, 400); //从画笔当前位置画一条线到指定位置
- //===============================
- //画一个圆角矩形的示例
- //===============================
- //这一句参数的含义请参照上面的画线的画笔设置
- hPen = CreatePen(PS_SOLID, 5, RGB(0, 255, 0)); //设置画笔
- //第一个参数-填充模式
- //HS_HORIZONTAL ----- 水平阴影
- //HS_VERTICAL ||||| 垂直阴影
- //HS_FDIAGONAL \\\\\ 45度向下,自左至右阴影
- //HS_BDIAGONAL ///// 从左至右的阴影
- //HS_CROSS +++++ 水平和垂直交叉阴影
- //HS_DIAGCROSS xxxxx 45度交叉阴影
- //第二个参数:填充颜色
- hBrush = CreateHatchBrush(HS_CROSS, RGB(0, 0, 255));//设置一个【网格状】的画刷
- //如果不需要网状画刷,请使用下面这一句创建画刷:
- //hBrush = CreateSolidBrush(RGB(0, 0, 255)); //设置一个单色填充画刷(只有唯一的一个设置颜色的参数)
- SelectObject(hDC, hBrush); //选择画刷
- SelectObject(hDC, hPen); //选择画笔
- //第二、三个参数:圆角矩形的左上角坐标(x,y)
- //第四、五个参数:圆角矩形的右下角坐标(x,y)
- //第七、八个参数:圆【角】的宽度和高度
- RoundRect(hDC, 50, 120, 100, 200, 15, 15); //绘制圆角矩形
- //===============================
- //画一个椭圆弧线的示例
- //===============================
- hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0)); //设置画笔(画笔的设定参照上面画线的说明)
- SelectObject(hDC, hPen); //选择画笔
- //第二、三个参数:圆弧的左上角坐标(x,y)
- //第四、五个参数:圆弧的右下角坐标(x,y)
- //第六、七个参数:圆弧的起始点坐标(x,y)
- //第八、九个参数:圆弧的结束点坐标(x,y)
- Arc(hDC,200,200,300,300,95,5,30,190); //画一段圆弧
- //===============================
- //画一个饼图的示例
- //===============================
- //画笔和画刷的设置参照上面的程序说明
- hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //采用系统预定义的灰色画刷
- SelectObject(hDC, hBrush); //选择画刷
- //这里的参数和圆弧的异曲同工
- Pie(hDC, 250, 50, 300, 100, 250, 50, 300, 50); //饼形
- //===============================
- //画一个矩形的示例
- //===============================
- //画刷和画笔如果不重新设定,就会沿用上一次(画饼图那里)的设定
- //参数:左上角坐标(x,y),右下角坐标(x,y)
- Rectangle(hDC, 300, 300, 400, 400); //绘制矩形
- //===============================
- //画一个椭圆的示例
- //===============================
- //如果当前图形的颜色与上一个画的不一样,就需要重新设定画刷(或画笔)
- hPen = CreatePen(PS_SOLID, 5, RGB(166, 66, 66)); //设置画笔
- hBrush = CreateSolidBrush(RGB(100, 100,255)); //设置一个单色填充画刷
- SelectObject(hDC, hBrush); //选择画刷
- SelectObject(hDC, hPen); //选择画笔
- //这里的参数与画矩形的一样
- Ellipse(hDC, 150, 50, 200, 150); //椭圆
- //===============================
- //画一个多边形的示例
- //===============================
- //Polyline(hDC, myPoint, 3); //画一个不封闭的形状
- Polygon(hDC, myPoint, 3); //画一个封闭的形状(可以自己试试这两个语句有什么异同)
- //===============================
- //显示文字的示例
- //===============================
- myFont = CreateFont( //创建一个自定义字体
- 40, //字体的高度(字体大小)
- 0, //由系统根据高宽比选取字体最佳宽度值
- 0, //文本的倾斜度为0,表示水平
- 0, //字体的倾斜度为0
- FW_NORMAL, //字体的粗度,FW_NORMAL为正常 FW_HEAVY为最粗
- 0, //非斜体字
- 0, //无下划线
- 0, //无删除线
- GB2312_CHARSET, //表示所用的字符集为ANSI_CHARSET
- OUT_DEFAULT_PRECIS, //输出精度为缺省精度
- CLIP_DEFAULT_PRECIS, //剪裁精度为缺省精度
- DEFAULT_QUALITY, //输出质量为缺省值
- DEFAULT_PITCH | FF_DONTCARE,//字间距和字体系列使用缺省值
- L"微软雅黑" //字体名称
- );
- SetTextColor(hDC, RGB(255, 0, 0)); //设置文本颜色为蓝色
- SetBkColor(hDC, RGB(150, 50, 50)); //设置背景颜色
- SelectObject(hDC, myFont); //将自定义字体选入设备环境
- TextOutW(hDC, 50,600, String1, wcslen(String1));//使用当前字体输出文本
- //===============================
- //显示文字的示例二(倾斜的文字)
- //===============================
- myFont = CreateFont( //创建一个自定义字体
- 40, //字体的高度(字体大小)
- 0, //由系统根据高宽比选取字体最佳宽度值
- 100, //文本的倾斜度为0,表示水平
- 0, //字体的倾斜度为0
- FW_NORMAL, //字体的粗度,FW_NORMAL为正常 FW_HEAVY为最粗
- 0, //非斜体字
- 1, //有下划线
- 0, //无删除线
- GB2312_CHARSET, //表示所用的字符集为ANSI_CHARSET
- OUT_DEFAULT_PRECIS, //输出精度为缺省精度
- CLIP_DEFAULT_PRECIS, //剪裁精度为缺省精度
- DEFAULT_QUALITY, //输出质量为缺省值
- DEFAULT_PITCH | FF_DONTCARE,//字间距和字体系列使用缺省值
- L"楷体" //字体名称
- );
- SetTextColor(hDC, RGB(61, 145, 0)); //设置文本颜色为翠绿色
- SetBkMode(hDC, TRANSPARENT); //设置背景颜色为透明色
- SelectObject(hDC, myFont); //将自定义字体选入设备环境
- TextOutW(hDC, 50,400, String2, wcslen(String2));//使用当前字体输出文本
- EndPaint(hWnd, &PtStr); //结束绘图
- DeleteObject(myFont); //删除自定义字体,释放内存
- return 0;
- case WM_DESTROY: //结束应用程序
- PostQuitMessage(0);
- return 0;
- default: //其他消息处理程序
- return(DefWindowProc(hWnd, iMessage, wParam, lParam));
- break;
- }
- return 0;
- }
- BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow) //定义窗口类
- {
- WNDCLASSEX wcex;
- HWND hWnd;
- TCHAR *szWindowClass = _T("C++常用绘图操作示例");
- TCHAR *szTitle = _T("C++常用绘图操作示例");
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = 0; //窗口类型为缺省类型
- wcex.lpfnWndProc = WndProc; //窗口处理函数为WndProc
- wcex.cbClsExtra = 0; //窗口类无扩展
- wcex.cbWndExtra = 0; //窗口实例无扩展
- wcex.hInstance = hInstance; //当前实例句柄
- wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
- //窗口的最小化图标为缺省图标
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- //窗口采用箭头光标
- wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
- //窗口背景为白色
- wcex.lpszMenuName = NULL; //窗口中无菜单
- wcex.lpszClassName = szWindowClass;//窗口类名为"窗口示例"
- wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
- if (!RegisterClassEx(&wcex)) //如果注册失败则发出警告声音
- return FALSE;
- hWnd = CreateWindow(szWindowClass, //生成窗口
- szTitle,
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, //窗口左上角的X坐标
- 0, //窗口左上角的Y坐标
- 500, //窗口宽度(请根据需要调整)
- 700, //窗口高度(请根据需要调整)
- NULL,
- NULL,
- hInstance,
- NULL);
- if (!hWnd)
- return FALSE;
- ShowWindow(hWnd, nCmdShow); //显示窗口
- UpdateWindow(hWnd);
- return TRUE;
- }
运行截图:
本文作者为mengkun,转载请注明。