• admin
  • 953
  • 2025-10-12 23:04:36

这周的软件开发大作业,自己也是初步学习MFC(俗称没饭吃),操作起来确实感觉有些晦涩难懂,今天就来分享下MFC的几个基本绘图的方式。

1、Onpaint()函数:

1 void CMyDrawer_CPlusDlg::OnPaint()

2 {

3 if (IsIconic())

4 {

5 CPaintDC dc(this); // 用于绘制的设备上下文

6

7 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

8

9 // 使图标在工作区矩形中居中

10 int cxIcon = GetSystemMetrics(SM_CXICON);

11 int cyIcon = GetSystemMetrics(SM_CYICON);

12 CRect rect;

13 GetClientRect(&rect);

14 int x = (rect.Width() - cxIcon + 1) / 2;

15 int y = (rect.Height() - cyIcon + 1) / 2;

16

17 // 绘制图标

18 dc.DrawIcon(x, y, m_hIcon);

19

20 }

21 else

22 {

23 //图像刷新时

24 if (draw)

25 {

26 BitBlt(ownerHDC, 0, 0, ownerRect.right, ownerRect.bottom, memHDC, 0,0, SRCCOPY); //显示已绘制图像

27 DrawLine(ownerHDC, xFirst, yFirst, xSecond, ySecond);

28 }

29 else

30 {

31 BitBlt(ownerHDC, 0, 0, ownerRect.right, ownerRect.bottom, memHDC, 0,0, SRCCOPY); //显示已绘制图像

32 }

33 CDialogEx::OnPaint();

34 //-------------------------------------------------------------------自己画的东西

35 CClientDC dc(this);//选定当前画图环境

36 HDC hdc = this->GetDC()->m_hDC;

37 /* DrawBall(hdc, 400, 100, 450, 150);*/

38 CPen mypen(PS_SOLID, 2, RGB(255, 0, 0));

39 CBrush mybrush(RGB(0, 0, 255));

40 CFont myfont;

41 myfont.CreatePointFont(200, L"Times New Roman");

42 CPen *oldpen = (CPen *)SelectObject(hdc, mypen);

43 CBrush *oldbrush = (CBrush *)SelectObject(hdc, mybrush);

44 CFont *oldfont = (CFont *)SelectObject(hdc, myfont);

45

46 MoveToEx(hdc, 50, 250, NULL);

47 LineTo(hdc, 50, 450);

48 MoveToEx(hdc, 125, 250, NULL);

49 LineTo(hdc, 125, 450);

50 ::TextOut(hdc, 150, 405, L"栈", 1);

51 ::TextOut(hdc, 150, 25, L"先序遍历的非递归实现", 10);

52 ////====================================================

53

54 SelectObject(hdc, oldpen);

55 DeleteObject(mypen);

56 SelectObject(hdc, oldbrush);

57 DeleteObject(mybrush);

58 SelectObject(hdc, oldfont);

59 DeleteObject(myfont);

60

61

62 }

63 }

这就是一个MFC当中的Onpaint()函数的一个demo,因为自己也是刚刚学习,就来给和我一样刚接触MFC绘图的人最简单的指引。

在资源视图类向导内添加入Onpaint()函数后,MFC会自动生成一个含有框架的一个函数。我们要做的就是在这个框架中的

CDialogEx::OnPaint();

这一句画之后填充自己想要的内容即可。要注意的是,在对这个界面画图的之前,需要或者这个窗口的句柄HDC,然后在利用MFC当中已经封装好的各种函数以及绘图方法将所要画的图绘制到这个窗体的句柄HDC上,简单的可以把它理解为一个绘画操作的一个对象,在每次进行绘画之前,都必须获取一个对象。

CClientDC dc(this);//选定当前画图环境

HDC hdc = this->GetDC()->m_hDC;

这两句代码的意思就是获取当前要花的窗体的hdc句柄。

之后就可以开始画图了!

2、画图的常用的几个函数:

2.1:画直线

MoveToEx(hdc, x1, y1, NULL);

LineTo(hdc, x2, y2);

第一个函数用来定位直线的起点坐标(x1,y1),第二个函数来定位直线的终点坐标(x2,y2);

2.2:画圆

Ellipse(hdc, x0, y0, x1, y1);

这个函数不仅可以画圆,也能画椭圆,定义的两个坐标值是与该(椭)圆外切的矩形的左上角的顶点坐标与右下角的顶点的坐标。

剩下的之后再更。