用win32API画线
HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_pOrigin.x,m_pOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);*/
用封装的cdc画线
/* CDC *pdc=GetDC();
pdc->MoveTo(m_pOrigin);
pdc->LineTo(point);
ReleaseDC(pdc);*/
用cdc派生的CClientDC画线
CClientDC dc(this); //dc和view联系
CClientDC dc(GetParent()); //将dc和frame联系
dc.MoveTo(m_pOrigin);
dc.LineTo(point);
这就不需要我们去调用dc了,在它对象构造析构的时候自动完成
用cdc派生的CWindowDC 画线
CWindowDC dc(this);
CWindowDC dc(GetParent());
dc.MoveTo(m_pOrigin); //这也不需要我们去调用dc了
dc.LineTo(point);
这也不需要我们去调用dc了,在它对象构造析构的时候自动完成
注意,它能访问到整个屏幕,客户区和非客户区(标题栏和菜单)
CWindowDC dc(GetDesktopWindow());我们就可以画到桌面,主要看
你将dc和哪个窗口联系起来了
想画其他颜色的线条,可以创建一个新画笔,然后选到dc中
用cpen类
CPen pen(PS_GEOMETRIC ,1,RGB(0,0,255)); (用后面参数构造一个画笔对象,这都忘了。。。)
CClientDC dc(this);
CPen *pOldpen=dc.SelectObject(&pen);
dc.MoveTo(m_pOrigin);
dc.LineTo(point);
dc.SelectObject(pOldpen);
//将现在的画笔选入设备上下文,然后返回一个旧画笔的指针,我们保存起来,用完这个画 笔,再把以前的选回去
画刷,填充
CBrush brush(RGB(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(m_pOrigin,point),&brush);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //用位图填充
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_pOrigin,point),&brush);
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//(强制转换)获取空画刷句柄再转为指针
CBrush *pOldbrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_pOrigin,point));
dc.SelectObject(pOldbrush);
fromhandle 从句柄转到指针
fillrect和rectangle方法是不同的,前者提供一个画刷,所以不用选中画刷,而后者,我们需要创建画刷再选入
实现连续划线功能:声明一个bool变量,buttondown为真,buttonup为假,
CClientDC dc(this);
if(m_bDraw==TRUE) //为真的时候,响应鼠标移动这个信息
{
dc.MoveTo(m_pOrigin);
dc.LineTo(point);
m_pOrigin=point; 、、不断地画两点间的小线段,线段尾点是下一段的起点,直到buttonup,不再画
}
CClientDC dc(this);
CPen pen(PS_SOLID ,1,RGB(255,0,0));
CPen *pOldpen=dc.SelectObject(&pen); //复习填充更换画笔的代码
if(m_bDraw==TRUE)
{
dc.MoveTo(m_pOrigin);
dc.LineTo(point);
m_pOrigin=point;
}
dc.SelectObject(pOldpen);