2023年7月17日发(作者:)
MFC笔记——VC++深⼊详解(第3版)孙鑫1、Windows下的程序都是基于消息的,窗⼝在创建时都会产⽣⼀个WM_CREATE消息。其他类可以响应这个消息,添加WM_CREATE消息的处理函数。类视图——某个类处⿏标右键,属性——消息(找到WM_CREATE)。或者使⽤“类向导”。2、⽂档/视类结构,视类窗⼝始终覆盖在框架类窗⼝之上,⿏标所有操作都只能由视类窗⼝捕获。如,CMainFrame中⿏标单击事件⽆反应,⽽在CDrawView中就有反应。 3、消息映射机制消息映射表,由头⽂件的DECLARE_MESSAGE_MAP()、源⽂件的BEGIN_MESSAGE_MAP与END_MESSAGE_MAP构建⽽成。BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间,有消息映射宏,⼀旦有消息产⽣,程序就调⽤对应的消息响应函数来处理。 消息响应函数 4、画线,推荐⽅式三 /* ⽅式⼀:SDK // ⾸先获得窗⼝的设备描述表 HDC hdc; hdc = ::GetDC(m_hWnd); //当前窗⼝的设备描述表 //移动到线条的起点 MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL); //画线 LineTo(hdc, point.x, point.y); //释放设备描述表 ::ReleaseDC(m_hWnd, hdc); */ /* ⽅式⼆:MFC的CDC类,封装了所有与绘图相关的操作 CDC* pDC = GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); */ ⽅式三:MFC的CClientDC类,CDC的进⼀步封装,省去GetDC与ReleaseDC CClientDC dc(this); //客户区范围 //CClientDC dc(GetParent()); //客户区+⼯具栏区 (m_ptOrigin); (point); /* ⽅式四:MFC的CWindowDC类,也是派⽣⾃CDC,可画的范围更⼤ CWindowDC dc(this); //客户区范围 //CWindowDC dc(GetParent()); //客户区+⼯具栏区 //CWindowDC dc(GetDesktopWindow()); //所有窗⼝ (m_ptOrigin); (point); */5、画笔 CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); //PS_DASH、PS_DOT宽度≤1,虚线才有效 CClientDC dc(this); CPen* pOldPen = Object(&pen); //选择画笔 (m_ptOrigin); (point); //推荐写上以下两⾏,不然可能造成GDI对象的增加,程序崩溃 Object(pOldPen); //重置画笔 Object(); //释放画笔6、画刷,⼀般⽤于填充 CBrush brush(RGB(255, 0, 0));//创建⼀个红⾊画刷 CClientDC dc(this); //创建并获得设备描述表 ct(CRect(m_ptOrigin, point), &brush);//利⽤红⾊画刷填充⿏标拖曳过程中形成的矩形区域 Object();画刷画矩形,dc中有默认⽩⾊画刷。但是新的会覆盖旧的。透明矩形的实现。 /* 画矩形,dc中有默认⽩⾊画刷 CClientDC dc(this); gle(CRect(m_ptOrigin, point)); //绘制矩形,⿊边⽩⾊填充 */ // 透明矩形,新的不遮蔽旧的 CClientDC dc(this);//创建并获得设备描述表 CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建⼀个空画刷 CBrush *pOldBrush = Object(pBrush);//将空画刷选⼊设备描述表 gle(CRect(m_ptOrigin, point));//绘制⼀个矩形 Object(pOldBrush);//恢复先前的画刷 pBrush->DeleteObject();说明,CClientDC操作的都是对象⽽不是句柄。GetStockObject()获取画刷、画笔、字体的句柄。
将句柄转为对象,⽤画刷、画笔、字体类提供的FromHandle()函数。 7、绘制连续线条⿏标移动消息WM_MOUSEMOVE,不断更新起始点,不断在起始点与最新点之间画⾮常短的线段。void CDrawView::OnMouseMove(UINT nFlags, CPoint point){ CClientDC dc(this);
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));//创建⼀个红⾊的、宽度为1的实线画笔 CPen *pOldPen = Object(&pen);//把创建的画笔选⼊设备描述表 if (m_bDraw == TRUE) //⿏标按下开始,抬起结束 { (m_ptOrigin); (point);
m_ptOrigin = point;//修改线段的起点 }
Object(pOldPen);//恢复设备描述表 Object(); CView::OnMouseMove(nFlags, point);} 8、窗⼝重绘当窗⼝创建时、尺⼨发⽣变化时,都会调⽤OnDraw()。防⽌⽂字等内容在窗⼝重绘时消失,可以将代码写在OnDraw()中。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689609390a270323.html
评论列表(0条)