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。
为视图类编写消息处理函数,我们首先解决鼠标左键消息处理问题,不能使用框架类,因为处理消息层次方面,视图类在前面,框架类在后面。
增加一个成员变量,保存鼠标位置
类视图
或类向导
增加一个鼠标起始位置
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 函数从当前位置绘制一行,但不包括指定点。
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;
未完,下一节继续
上一篇:autoxjs