您的位置 首页 > 数码极客

mfc如何自绘窗口

上一次制作了第一个MFC窗口程序地址:



显示了一个没有用的窗口,什么也没有显示,什么也没有出现。

为进一步解读MFC的机制和方法等,今天将在昨天发布文章的基础上增加显示功能。

即OnPaint()方法。。

在MFC文档中,在 Windows 或应用程序发出请求以重新绘制应用程序的窗口的一部分时,框架将调用此成员函数。 afx_msg void OnPaint();

Windows以消息驱动。收到WM_PAINT消息时,发送消息更新窗口或重绘窗口调用该成员函数。

所以OnPaint()方法具有绘制窗口界面的功能。

根据MFC的设计,MFC存在设备上下文对象CDC

而设备上下文:是包含显示器或打印机等设备的信息的绘制特性的 Windows 数据结构。所有绘图调用都是通过设备上下文对象,封装 Windows Api,可用于绘制线条、 形状和文本。设备上下文允许在 Windows 中的独立于设备的绘图。用于绘制到屏幕、 打印机或图元文件设备上下文。

CDC有四个子类:CPaintDC、CClientDC、CMetaFileDC、CWindowsDC

在微软开发文档中载明:

CPaintDC对象将封装 Windows,调用的常规用法BeginPaint函数,然后绘制在设备上下文中,然后调用EndPaint函数。 CPaintDC构造函数调用BeginPaint,和析构函数调用EndPaint。 简化的过程是创建CDC对象和绘制,然后销毁CDC对象。 在 framework 中,即使此过程的大部分可以自动完成。 具体而言,你OnDraw函数传递CPaintDC已准备好 (通过OnPrepareDC),并只需绘制到它。 由框架销毁和基础设备上下文从调用返回时发布到 Windows 应用OnDraw函数。

CClientDC对象将封装表示一个窗口的工作区的设备上下文的工作。 CClientDC构造函数调用GetDC函数和析构函数调用ReleaseDC函数。 CWindowDC对象将封装表示整个窗口,其中包括其框架的设备上下文。

CMetaFileDC对象封装到 Windows 图元文件绘制。与此相反CPaintDC传递给OnDraw,在这种情况下,必须调用OnPrepareDC自己。

而CWindowsDC,则是可以在窗口任意地方绘图。

根据上述论述,我们今天的代码任务就是,使用上述除CMetaFileDC对象来操作窗口进行一定的绘图操作。

绘图前我们要调用CDC的绘图方法,为此次顺利进行,我们将在Windows窗口中绘制一些直线、或者输出文字;

任务开始:

昨天定义了两个类:

MainApp类

MyMainWnd类

绘图操作窗口,所以今天修改MyMainWnd类:

首先在定义中增加一个保护方法afx_msg void OnPaint();

在cpp文件中编写代码如下:

void MyMainWnd::OnPaint()

{

PAINTSTRUCT lp; //定义绘图结构

CDC* dc = BeginPaint(&lp); //定义对象指向绘图结构

dc->TextOutA(10, 10, _T("你好,你成功开始在我上面画图了!")); //屏幕中绘图

EndPaint(&lp);

}

编译无反应。。。。。。。?

在MyMainWnd类定义中最后位置填入DECLARE_MESSAGE_MAP()

这是C语言中的宏,作用是向类中添加消息映射必要的结构体和函数声明。

同时在定义文件中写入如下代码将消息和方法进行映射。

BEGIN_MESSAGE_MAP(MyMainWnd,CFrameWnd)

ON_WM_PAINT()

END_MESSAGE_MAP()

编译运行后出现如下窗口!

增加后代码如下:

#include <a;

class MainApp :public CWinApp

{

public:

BOOL InitInstance();

};

class MyMainWnd :public CFrameWnd

{

public:

MyMainWnd();

protected:

afx_msg void OnPaint();

DECLARE_MESSAGE_MAP()

};

MainApp a;

BOOL MainApp::InitInstance()

{

m_pMainWnd = new MyMainWnd();

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

BEGIN_MESSAGE_MAP(MyMainWnd,CFrameWnd)

ON_WM_PAINT()

END_MESSAGE_MAP()

MyMainWnd::MyMainWnd()

{

Create(NULL, _T("第一个MFC程序"));

}

void MyMainWnd::OnPaint()

{

//PAINTSTRUCT lp;

//CDC* dc = BeginPaint(&lp);

//dc->TextOutA(10, 10, _T("你好,你成功开始在我上面画图了!"));

//dc->MoveTo(40, 100);

//dc->LineTo(300, 400);

//EndPaint(&lp);

/*CPaintDC dc(this);

dc.TextOutA(10, 10, _T("你好,你成功开始在我上面画图了!"));

dc.MoveTo(40, 100);

dc.LineTo(300, 400);*/

//CClientDC dc(this);

(10, 10, _T("你好,你成功开始在我上面画图了!"));

(40, 100);

(300, 400);

CWindowDC dc(this);

dc.TextOutA(10, 10, _T("你好,你成功开始在我上面画图了!"));

dc.MoveTo(0, 0);

dc.LineTo(300, 400);

}

除使用CWindowDC时文字看不见外,其他的绘图都是没问题的。CWindowDC时看不见我想应该是被标题栏遮住了吧。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“mfc如何自绘窗口”边界阅读