C++常用绘图操作示例

mengkun 11.5K 0
  1. /*
  2. *C++常用绘图操作示例
  3. *包含:直线、多边线段、圆弧、饼图、矩形、圆角矩形、椭圆、多边形、自定义文本的绘制及其前景色、背景色配置
  4. *编写:mengkun   2016/10/18
  5. */
  6. #include<windows.h>
  7. #include<tchar.h>
  8. BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow);
  9. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  10. //主函数
  11. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  12.     LPSTR lpCmdLine, int nCmdShow)
  13. {
  14.     MSG Message;
  15.     if (!InitWindowClass(hInstance, nCmdShow))
  16.     {
  17.         MessageBox(NULL, _T("创建窗口失败!"), _T("创建窗口"), NULL);
  18.         return 1;
  19.     }
  20.     while (GetMessage(&Message, 0, 0, 0))   //消息循环
  21.     {
  22.         TranslateMessage(&Message);
  23.         DispatchMessage(&Message);
  24.     }
  25.     return (int)Message.wParam;
  26. }
  27. //消息处理函数 
  28. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
  29. {
  30.     HDC hDC;            //定义指向设备上下文的句柄
  31.     PAINTSTRUCT PtStr;  //定义指向包含绘图信息的结构体变量
  32.     HBRUSH hBrush;          //定义指向画刷的句柄
  33.     HPEN hPen;          //定义指向画笔的句柄
  34.     HFONT myFont;   //定义字体句柄  
  35.     LPCWSTR String1 = L"我擦这行字居然有背景色!!"//创建一个变量存储要输出的字符串  
  36.     LPCWSTR String2 = L"我擦这行字是斜的有下划线还没背景"//创建一个变量存储要输出的字符串  
  37.     static POINT myPoint[3];    //定义多边形的坐标.
  38.     static long i = 0;
  39.     long x[3] = { 20,50,60 };   //定义多边形各点的X和Y坐标
  40.     long y[3] = { 40,20,30};
  41.     switch (iMessage)  //处理消息
  42.     {
  43.     case WM_CREATE:
  44.         for (i = 0; i < 2; i++)     //吧多边形的各点坐标存进myPoint中
  45.         {
  46.             myPoint[i].x = x[i];
  47.             myPoint[i].y = y[i];
  48.         }
  49.         break;
  50.     case WM_PAINT:                              //处理绘图消息
  51.         hDC = BeginPaint(hWnd, &PtStr);
  52.         SetMapMode(hDC, MM_TEXT);       //设置映像模式
  53.         //===============================
  54.         //画一条线的示例
  55.         //===============================
  56.         //第一个参数-PS_SOLID:实线;PS_DASH:虚线;PS_DOT:点线
  57.         //第二个参数-线条的宽度(如果是虚线或点线,宽度只能设为1!!!)
  58.         //第三个参数-RGB颜色(分别对应红、绿、蓝,范围:0~255)
  59.         hPen = CreatePen(PS_DOT, 1, RGB(255, 0, 0));    //设置画笔
  60.         SelectObject(hDC, hPen);        //选择画笔
  61.         //第二个参数:画线的起点X坐标
  62.         //第三个参数:画线的起点Y坐标
  63.         MoveToEx(hDC, 100, 200, NULL);      //设置画笔当前位置
  64.         //第二个参数:画线的终点X坐标
  65.         //第三个参数:画线的终点Y坐标
  66.         LineTo(hDC, 300, 400);          //从画笔当前位置画一条线到指定位置
  67.         //===============================
  68.         //画一个圆角矩形的示例
  69.         //===============================
  70.         //这一句参数的含义请参照上面的画线的画笔设置
  71.         hPen = CreatePen(PS_SOLID, 5, RGB(0, 255, 0));  //设置画笔
  72.         //第一个参数-填充模式
  73.         //HS_HORIZONTAL    ----- 水平阴影
  74.         //HS_VERTICAL      |||||        垂直阴影
  75.         //HS_FDIAGONAL \\\\\        45度向下,自左至右阴影
  76.         //HS_BDIAGONAL   /////      从左至右的阴影
  77.         //HS_CROSS       +++++      水平和垂直交叉阴影
  78.         //HS_DIAGCROSS       xxxxx  45度交叉阴影
  79.         //第二个参数:填充颜色
  80.         hBrush = CreateHatchBrush(HS_CROSS, RGB(0, 0, 255));//设置一个【网格状】的画刷
  81.         //如果不需要网状画刷,请使用下面这一句创建画刷:
  82.         //hBrush = CreateSolidBrush(RGB(0, 0, 255));    //设置一个单色填充画刷(只有唯一的一个设置颜色的参数)
  83.         SelectObject(hDC, hBrush);              //选择画刷
  84.         SelectObject(hDC, hPen);                //选择画笔
  85.         //第二、三个参数:圆角矩形的左上角坐标(x,y)
  86.         //第四、五个参数:圆角矩形的右下角坐标(x,y)
  87.         //第七、八个参数:圆【角】的宽度和高度
  88.         RoundRect(hDC, 50, 120, 100, 200, 15, 15); //绘制圆角矩形
  89.         //===============================
  90.         //画一个椭圆弧线的示例
  91.         //===============================
  92.         hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));  //设置画笔(画笔的设定参照上面画线的说明)
  93.         SelectObject(hDC, hPen);                //选择画笔
  94.         //第二、三个参数:圆弧的左上角坐标(x,y)
  95.         //第四、五个参数:圆弧的右下角坐标(x,y)
  96.         //第六、七个参数:圆弧的起始点坐标(x,y)
  97.         //第八、九个参数:圆弧的结束点坐标(x,y)
  98.         Arc(hDC,200,200,300,300,95,5,30,190);   //画一段圆弧
  99.         //===============================
  100.         //画一个饼图的示例
  101.         //===============================
  102.         //画笔和画刷的设置参照上面的程序说明
  103.         hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //采用系统预定义的灰色画刷
  104.         SelectObject(hDC, hBrush);              //选择画刷
  105.         //这里的参数和圆弧的异曲同工
  106.         Pie(hDC, 250, 50, 300, 100, 250, 50, 300, 50);      //饼形
  107.         //===============================
  108.         //画一个矩形的示例
  109.         //===============================
  110.         //画刷和画笔如果不重新设定,就会沿用上一次(画饼图那里)的设定
  111.         //参数:左上角坐标(x,y),右下角坐标(x,y)
  112.         Rectangle(hDC, 300, 300, 400, 400);     //绘制矩形
  113.         //===============================
  114.         //画一个椭圆的示例
  115.         //===============================
  116.         //如果当前图形的颜色与上一个画的不一样,就需要重新设定画刷(或画笔)
  117.         hPen = CreatePen(PS_SOLID, 5, RGB(166, 66, 66));    //设置画笔
  118.         hBrush = CreateSolidBrush(RGB(100, 100,255));   //设置一个单色填充画刷
  119.         SelectObject(hDC, hBrush);              //选择画刷
  120.         SelectObject(hDC, hPen);                //选择画笔
  121.         //这里的参数与画矩形的一样
  122.         Ellipse(hDC, 150, 50, 200, 150);        //椭圆
  123.         //===============================
  124.         //画一个多边形的示例
  125.         //===============================
  126.         //Polyline(hDC, myPoint, 3);        //画一个不封闭的形状
  127.         Polygon(hDC, myPoint, 3);       //画一个封闭的形状(可以自己试试这两个语句有什么异同)
  128.         //===============================
  129.         //显示文字的示例
  130.         //===============================
  131.         myFont = CreateFont(        //创建一个自定义字体  
  132.             40,             //字体的高度(字体大小)  
  133.             0,              //由系统根据高宽比选取字体最佳宽度值  
  134.             0,              //文本的倾斜度为0,表示水平  
  135.             0,              //字体的倾斜度为0  
  136.             FW_NORMAL,      //字体的粗度,FW_NORMAL为正常  FW_HEAVY为最粗  
  137.             0,              //非斜体字  
  138.             0,              //无下划线  
  139.             0,              //无删除线  
  140.             GB2312_CHARSET, //表示所用的字符集为ANSI_CHARSET  
  141.             OUT_DEFAULT_PRECIS, //输出精度为缺省精度  
  142.             CLIP_DEFAULT_PRECIS,    //剪裁精度为缺省精度  
  143.             DEFAULT_QUALITY,        //输出质量为缺省值  
  144.             DEFAULT_PITCH | FF_DONTCARE,//字间距和字体系列使用缺省值  
  145.             L"微软雅黑"             //字体名称  
  146.         );
  147.         SetTextColor(hDC, RGB(255, 0, 0));  //设置文本颜色为蓝色  
  148.         SetBkColor(hDC, RGB(150, 50, 50));  //设置背景颜色  
  149.         SelectObject(hDC, myFont);      //将自定义字体选入设备环境  
  150.         TextOutW(hDC, 50,600, String1, wcslen(String1));//使用当前字体输出文本  
  151.         //===============================
  152.         //显示文字的示例二(倾斜的文字)
  153.         //===============================
  154.         myFont = CreateFont(        //创建一个自定义字体  
  155.             40,             //字体的高度(字体大小)  
  156.             0,              //由系统根据高宽比选取字体最佳宽度值  
  157.             100,              //文本的倾斜度为0,表示水平  
  158.             0,              //字体的倾斜度为0  
  159.             FW_NORMAL,      //字体的粗度,FW_NORMAL为正常  FW_HEAVY为最粗  
  160.             0,              //非斜体字  
  161.             1,              //有下划线  
  162.             0,              //无删除线  
  163.             GB2312_CHARSET, //表示所用的字符集为ANSI_CHARSET  
  164.             OUT_DEFAULT_PRECIS, //输出精度为缺省精度  
  165.             CLIP_DEFAULT_PRECIS,    //剪裁精度为缺省精度  
  166.             DEFAULT_QUALITY,        //输出质量为缺省值  
  167.             DEFAULT_PITCH | FF_DONTCARE,//字间距和字体系列使用缺省值  
  168.             L"楷体"             //字体名称  
  169.         );
  170.         SetTextColor(hDC, RGB(61, 145, 0));  //设置文本颜色为翠绿色  
  171.         SetBkMode(hDC, TRANSPARENT);  //设置背景颜色为透明色  
  172.         SelectObject(hDC, myFont);      //将自定义字体选入设备环境  
  173.         TextOutW(hDC, 50,400, String2, wcslen(String2));//使用当前字体输出文本  
  174.         EndPaint(hWnd, &PtStr);                 //结束绘图
  175.         DeleteObject(myFont);   //删除自定义字体,释放内存 
  176.         return 0;
  177.     case WM_DESTROY:                        //结束应用程序
  178.         PostQuitMessage(0);
  179.         return 0;
  180.     default:                                    //其他消息处理程序
  181.         return(DefWindowProc(hWnd, iMessage, wParam, lParam));
  182.         break;
  183.     }
  184.     return 0;
  185. }
  186. BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow)          //定义窗口类
  187. {
  188.     WNDCLASSEX wcex;
  189.     HWND hWnd;
  190.     TCHAR *szWindowClass = _T("C++常用绘图操作示例");
  191.     TCHAR *szTitle = _T("C++常用绘图操作示例");
  192.     wcex.cbSize = sizeof(WNDCLASSEX);
  193.     wcex.style = 0;                     //窗口类型为缺省类型
  194.     wcex.lpfnWndProc = WndProc;     //窗口处理函数为WndProc
  195.     wcex.cbClsExtra = 0;                //窗口类无扩展
  196.     wcex.cbWndExtra = 0;                //窗口实例无扩展
  197.     wcex.hInstance = hInstance;     //当前实例句柄
  198.     wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
  199.     //窗口的最小化图标为缺省图标
  200.     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  201.     //窗口采用箭头光标
  202.     wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  203.     //窗口背景为白色
  204.     wcex.lpszMenuName = NULL;           //窗口中无菜单
  205.     wcex.lpszClassName = szWindowClass;//窗口类名为"窗口示例"
  206.     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
  207.     if (!RegisterClassEx(&wcex))        //如果注册失败则发出警告声音
  208.         return FALSE;
  209.     hWnd = CreateWindow(szWindowClass,                          //生成窗口
  210.         szTitle,
  211.         WS_OVERLAPPEDWINDOW,
  212.         CW_USEDEFAULT,      //窗口左上角的X坐标
  213.         0,                              //窗口左上角的Y坐标
  214.         500,                        //窗口宽度(请根据需要调整)
  215.         700,                        //窗口高度(请根据需要调整)
  216.         NULL,
  217.         NULL,
  218.         hInstance,
  219.         NULL);
  220.     if (!hWnd)
  221.         return FALSE;
  222.     ShowWindow(hWnd, nCmdShow);                 //显示窗口
  223.     UpdateWindow(hWnd);
  224.     return TRUE;
  225. }

运行截图:

C++常用绘图操作示例

C++常用绘图操作示例运行截图

发表评论 取消回复
表情 图片 链接 代码

分享