上一次制作了第一个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.《mfc如何自绘窗口》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《mfc如何自绘窗口》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3242731.html