MFC绘图总结

来源:互联网 发布:药品网络销售方法 编辑:程序博客网 时间:2024/05/19 17:49

hWnd(Handle ofWindow,也可以这么说:h是类型描述,表示句柄;wnd是变量对象描述,表示窗口)是窗口句柄,其中包含窗口的属性。例如,窗口的大小、显示位置、父窗口。

hDC(Handle to Device Context)是图像的设备描述表,窗口显示上下文句柄,其中可以进行图形显示。

利用hDC=GetDC(hWnd),可以获得一个窗口的图形设备描述表。可以通过ReleaseDC()函数释放。

 

hWnd句柄是描述一个窗口的形状、位置、大小、是否显示、它的父窗口、兄弟窗口、等等的一组数据结构;  

hDC句柄是一个实实在在的用于具体表现这个窗口时,需要对这个窗口有个场合来实现的地方。

 

hWnd是窗体句柄;hDC是设备场景句柄。

hWnd与窗口管理有关;hDC与绘图API(GDI函数)有关。

hWnd是windows给窗口发送消息(事件)用的;hDC是把窗口绘制在屏幕上用的。

有了hWnd,可以使用API的GetDC()函数得到与其相关的hDC:hDC=GetDC(hWnd)。

 

Cpoint 记录坐标

1、直线的画法和曲线及扇形(需要三个点)的画法,MFC每次窗口重绘都会加载视图类的onDraw成员函数。

HDC画直线实例:

HDC hdc;

hdc=::GetDC(m_hWnd);

::MoveToEx(hdc,m_sPoint.x,m_sPoint.y,NULL);

::LineTo(hdc,m_ePoint.x,m_ePoint.y);

::ReleaseDC(m_hWnd,hdc);

CDC画直线实例:

CDC *cdc=GetDC();

cdc->MoveTo(m_sPoint);

cdc->LineTo(m_ePoint);

ReleaseDC(cdc);

2.采用GDI绘图:

HDC hdc;

hdc=::GetDC(m_hWnd);

HPENhpen=::CreatePen(PS_SOLID,1,RGB(255,0,55));//创建画笔

HPEN oHpen;

oHpen=(HPEN)::SelectObject(hdc,hpen);//把新的画笔填充到DC

::MoveToEx(hdc,m_sPoint.x,m_sPoint.y,NULL);

::LineTo(hdc,m_ePoint.x,m_ePoint.y);

::SelectObject(hdc,oHpen);

::DeleteObject(hpen);

::ReleaseDC(m_hWnd,hdc);

3.使用CWindowDC

CWindowDC dc(this);                             //this为获得的窗口句柄,可以用GetDesktopWindow()获取桌面的句柄,使其可以在桌面可以画图

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

3.1使用CClientDC

CClientDC dcthis);

dc.MoveTo(m_ptOrigin);                         //CClientDC会自动释放

dc.LineTo(point);

4.CPen pen(PS_SOLID, 1, RGB(255, 0, 55));          //创建画笔

 

CWindowDC dc(GetDesktopWindow());           //获取句柄,指定窗口

 

CPen *pOldPen = dc.SelectObject(&pen);         //为该窗口类对象选入该画笔

 

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

 

dc.SelectObject(pOldPen);

 

5.使用画刷

CBrush::CBrush

 

CBrush( );

CBrush( COLORREF crColor);

  throw(CResouceException );

CBrush( int nIndex,COLORREF crColor );

  throw(CResouceException );

CBrush( CBitmap* pBitmap);

  throw(CResouceExecption );

参数:

crColor

指定画刷的前景色(RGB方式)。如果画刷是阴影线型的,则指定阴影线的颜色。

nIndex

指定画刷阴影线采用的风格,取值如下:

·

HS_BDIAGONAL

45度的向下影线(从左到右)

·

HS_CROSS

水平和垂直方向以网格线作出阴影

·

HS_DIAGCROSS

45度的网格线阴影

·

HS_FDIAGONAL

45度的向上阴影线(从左到右)

·

HS_HORIZONTAL

水平的阴影线

·

HS_VERTICAL

垂直的阴影线

pBitmap

指向CBitmap对象的指针,该对象指定了画刷要绘制的位图。

           CBrush brush(RGB(255, 0, 55));

CWindowDC dc(GetDesktopWindow());

dc.FillRect(CRect(m_ptOrigin, point), &brush);

6.使用位图作为画刷

        CBitmapbitmap;

        bitmap.LoadBitmap(IDB_BITMAP1);

        CBrushbrush(&bitmap);

        CClientDCdc(this);

        dc.Rectangle(CRect(m_ptOrigin,point));

7.绘画空的矩形框

CClientDCdc(this);

CBrush*pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

CBrush*pOldBrush = dc.SelectObject(pBrush);

dc.Rectangle(CRect(m_ptOrigin,point));

dc.SelectObject(pOldBrush);

 

CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。用法是:

CClientDCdc(this);//this一般指向本窗口或当前活动视图

dc.TextOut(10,10,str,str.GetLength());

//利用dc输出文本,如果是在CScrollView中使用,还要注意调用OnPrepareDC(&dc)调整设备上下文的坐标。

CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。


注:内容总结来自《VC++ 深入详解》 孙鑫  和 CSDN文档上


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 张字繁体几画 一字繁体 几组词多音字 几的组词 几字组词 几怎么组词 几怎么组词多音字 几是多音字吗怎么组词 和有几种读音和组词 几加偏旁组词 几的多音并组词 几的多音字组词 几的组词有什么 每组词 一个个组词 厚的组词有什么 一个个什么组词 几维鸟 几维空间 铃木维特拉2019款几月上市上市 麦克维尔属于几线品牌 鬼生活在几维空间 修仙之几维空间 斯维登酒店是几星级 几维智能家居 几维遥控器 人生活在几维空间 维景国际酒店是几星级 几周做4维b超 几读音 几的读音 焱有几种读音 寒号鸟读音号读第几声 穗的有几种读音 血字有几种读音 宜的读音有几种 落有几种读音 畦有几种读音 当作的读音是几声 不的读音有几种 潜读音是第几声