VC绘图初步

本文详细介绍了在Windows环境下使用各种绘图技术进行图形绘制的方法,包括通过不同方式获取设备上下文(DC)、利用画笔和画刷进行线条绘制及区域填充,并展示了如何设置绘图模式以实现特定效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要做路径规划东东了,仿真需要陈vc,先扫扫盲吧!

1.使用SDK获取DC句柄
HDC hdc;
hdc=::GetDc(m_hWnd);<wbr><wbr><wbr>//获取DC句柄<br> MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);<br> LineTo(hdc,point.x,point.y);<br> ::ReleaseDC(m_hWnd,hdc);<wbr><wbr><wbr>//释放DC</wbr></wbr></wbr></wbr></wbr></wbr>

2.利用CDC类指针和CWin类成员函数获取DC
CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);

3.利用CClientDC对象 (CClientDC类从CDC类派生来的)
<wbr> CClientDC派生自CDC<br><wbr>构造CClientDC对象的时候自动调用GetDC,而在析构的时候自动调用ReleaseDC.从而我们不需要<br><wbr> 显示的去调用这两个函数.只需要仅仅构造一个CClientDC对象.</wbr></wbr></wbr>

CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
----------
The CClientDC class is derived from CDC and takes care of callingthe Windows functions GetDC at construction time and ReleaseDC atdestruction time. This means that the device context associatedwith a CClientDC object is the client area of a window.

4.利用CWindowDC对象 (CWindowDC类从CDC类派生来的)
CWindowDC dc(this);//
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
-----------
The CWindowDC class is derived from CDC. It calls the WindowsfunctionsGetWindowDC at construction time andReleaseDC atdestruction time. This means that a CWindowDC object accesses theentire screen area of a CWnd (both client and nonclient areas).

5.GetParent()得到父窗口指针; GetDesktopWindow()得到屏幕窗口指针

6.利用画笔改变线条颜色和类型:
CPenpen(PS_DOT,1,RGB(0,255,0));<wbr><wbr><wbr>//构造画笔对象<br> CClientDC dc(this);CPen*pOldPen=dc.SelectObject(&amp;pen);<wbr><wbr><wbr>//将画笔选入DC<br> dc.MoveTo(m_ptOrigin);<br> dc.LineTo(point);<br> dc.SelectObject(pOldPen);<wbr><wbr><wbr>//恢复先前的画笔</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

7.使用画刷 (通常利用画刷去填充矩形区域):
使用单色画刷
CBrushbrush(RGB(255,0,0));<wbr><wbr><wbr>//构造画刷对象<br> CClientDC dc(this);<br> dc.FillRect(CRect(m_ptOrigin,point),&amp;brush);<wbr><wbr><wbr>//用指定的画刷去填充矩形区域</wbr></wbr></wbr></wbr></wbr></wbr>

使用位图画刷
CBitmap bitmap;//构造位图对象 (使用前需要初试化)
bitmap.LoadBitmap(IDB_BITMAP1);<wbr><wbr><wbr>//初试化位图对象<br> CBrushbrush(&amp;bitmap);<wbr><wbr><wbr>//构造位图画刷<br> CClientDC dc(this);<br> dc.FillRect(CRect(m_ptOrigin,point),&amp;brush);<wbr><wbr><wbr>//用指定的位图画刷去填充矩形区域</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

使用透明画刷
CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));<wbr><wbr><wbr>//获取透明画刷对象指针<br> CClientDC dc(this);<br> CBrush *pOldBrush=dc.SelectObject(pBrush); //将透明画刷选入DC<br> dc.Rectangle(CRect(m_ptOrigin,point));<br> dc.SelectObject(pOldBrush);//释放透明画刷<br> ----------<br> The GetStockObject function retrieves a handle to one of thepredefined stock pens, brushes, fonts, or palettes.<br> HGDIOBJ GetStockObject(<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>int fnObject<wbr><wbr> // type of stockobject<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

Returns a pointer to a CBrush object when given a handle to aWindows HBRUSH object.
static CBrush* PASCAL FromHandle( HBRUSH hBrush);//FromHandle是一个静态方法.故可用CBrush::FromHandle()形式调用。
----------
1)静态方法不属于某一个具体对象.而属于类本身.在类加载的时候就已经为类静态方法分配了代码去.故可用CBrush::FromHandle()形式调用。
2)静态方法中.不能引用非静态的数据成员和方法。
3)静态数据成员需要在类外单独做初始化.形式如: 变量类型 类名::变量名=初始值;

8.CDC::SetROP2方法
int SetROP2( int nDrawMode );
Sets the current drawing mode.

画线:

CClientDC dc(this);

dc.SetROP2( R2_NOT);

dc.MoveTo(p_Orgpt);

dc.LineTo(p_Endpt);

dc.MoveTo(p_Orgpt);

dc.LineTo(p_Endpt);

p_Endpt = point;//这里要记住哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值