您的位置:首页 > 其它

关于各种dc的实例简单使用

2011-01-21 20:59 197 查看
用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: