windows应用(vc++2022)MFC基础到实战(4)-画图程序(1)
创始人
2024-06-01 15:57:32
0

目录

  • CWnd 对象
  • 画图程序
    • 新建MFC项目
    • 鼠标位置成员变量
    • 类向导增加消息处理函数
    • 扩展画线功能
      • LineTo 函数 (wingdi.h)
      • 两种常用画线方式

CWnd 对象

CWnd 对象与 Windows 窗口不同,但这两者紧密相关。 CWnd 对象由 CWnd 构造函数和析构函数进行创建或销毁。 另一方面,Windows 窗口是 Windows 内部的数据结构,由 Create 成员函数创建,并由 CWnd 虚拟析构函数销毁。 DestroyWindow 函数销毁 Windows 窗口而不销毁对象。

CWnd 类和消息映射机制会隐藏 WndProc 函数。 传入的 Windows 通知消息会通过消息映射自动路由到正确的 OnMessageCWnd 成员函数。 可重写 OnMessage 成员函数以在派生类中处理成员的特定消息。

通过 CWnd 类还可以为应用程序创建 Windows 子窗口。 从 CWnd 派生类,然后将成员变量添加到派生类,以存储特定于应用程序的数据。 可派生类中实现消息处理程序成员函数和消息映射,以指定在消息定向到窗口时所发生的情况。

可采用两个步骤创建子窗口。 首先,调用构造函数 CWnd 以构造 CWnd 对象,然后调用 Create 成员函数以创建子窗口,然后将它附加到 CWnd 对象。

当用户终止子窗口时,销毁 CWnd 对象,或调用 DestroyWindow 成员函数以移除窗口并销毁其数据结构。

在 Microsoft 基础类库中,从 CWnd 派生了更多类以提供特定窗口类型。 其中许多类(包括 CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView 和 CDialog)是为进一步派生而设计的。 派生自 CWnd 的控件类(如 CButton)可以直接使用,也可以用于进一步派生类。
“属性” 说明
CWnd::m_hWnd 指示附加到此 CWnd 的 HWND。

画图程序

新建MFC项目

在这里插入图片描述
为视图类编写消息处理函数,我们首先解决鼠标左键消息处理问题,不能使用框架类,因为处理消息层次方面,视图类在前面,框架类在后面。
在这里插入图片描述

鼠标位置成员变量

增加一个成员变量,保存鼠标位置
类视图
在这里插入图片描述
或类向导在这里插入图片描述
增加一个鼠标起始位置
在这里插入图片描述

类向导增加消息处理函数

在这里插入图片描述

void CMFCLearn1View::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_beginMousePoint = point;CView::OnLButtonDown(nFlags, point);
}

除了上面1处需要加上m_beginMousePoint = point;外,还有以下2处增加了这个函数的相关代码体,不需要修改它们。

class CMFCLearn1View : public CView
{
....
// 生成的消息映射函数
protected:DECLARE_MESSAGE_MAP()
private:CPoint m_beginMousePoint;
public:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
// CMFCLearn1ViewIMPLEMENT_DYNCREATE(CMFCLearn1View, CView)BEGIN_MESSAGE_MAP(CMFCLearn1View, CView)ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

上面是鼠标按下的消息,接下来处理鼠标抬起的消息。

void CMFCLearn1View::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值HDC hdc;hdc = ::GetDC(m_hWnd);MoveToEx(hdc, m_beginMousePoint.x, m_beginMousePoint.y, NULL);LineTo(hdc, point.x, point.y);::ReleaseDC(m_hWnd, hdc);CView::OnLButtonUp(nFlags, point);
}

在这里插入图片描述

扩展画线功能

增加鼠标移动处理
在这里插入图片描述

LineTo 函数 (wingdi.h)

LineTo 函数从当前位置绘制一行,但不包括指定点。

BOOL LineTo([in] HDC hdc,[in] int x,[in] int y
);

参数

[in] hdc

设备上下文的句柄。

[in] x

指定线条终点的 x 坐标(以逻辑单位为单位)。

[in] y

指定线条终点的 y 坐标(以逻辑单位为单位)。
返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。

该线条是使用当前笔绘制的,如果笔是几何笔,则为当前画笔。
如果 LineTo 成功,则当前位置设置为指定的结束点。

CreatePen 函数 (wingdi.h)

CreatePen 函数创建具有指定样式、宽度和颜色的逻辑笔。 随后可以将笔选入设备上下文,并用于绘制线条和曲线。
HPEN CreatePen( [in] int iStyle, [in] int cWidth, [in]
COLORREF color );

两种常用画线方式

MFC的CClientDC

void CMFCLearn1View::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_isMouseDown = false;CPen cPen (PS_SOLID, 2, RGB(100, 200, 50));CClientDC dc(this);CPen* cOldPen = dc.SelectObject(&cPen);dc.MoveTo(m_beginMousePoint);dc.LineTo(point);dc.SelectObject(cOldPen);DeleteObject(cPen);CView::OnLButtonUp(nFlags, point);
}

CClientDC 类

处理 Windows 函数 GetDC(在构造时)和 ReleaseDC(在析构时)的调用。

和HDC

void CMFCLearn1View::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if (!m_isMouseDown) {return;}m_tempMousePoint = point;HPEN hPen = CreatePen(PS_SOLID, 2, RGB(100, 200, 50));HDC hdc;hdc = ::GetDC(m_hWnd);HPEN hOldPen = (HPEN)SelectObject(hdc, hPen);   MoveToEx(hdc, m_beginMousePoint.x, m_beginMousePoint.y, NULL);LineTo(hdc, m_tempMousePoint.x, m_tempMousePoint.y);SelectObject(hdc, hOldPen);::ReleaseDC(m_hWnd, hdc);CView::OnMouseMove(nFlags, point);}

HDC

设备上下文的句柄 (DC) 。

此类型在 WinDef.h 中声明,如下所示:

typedef HANDLE HDC;
未完,下一节继续

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...