第四讲 绘图与文本编程

更新时间:2023-08-26 02:53:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Fundamentals of Computers

第四讲 绘图与文本编程

制作:刘晓翔 暨南大学珠海学院《Windows编程》 2015-7-22

简单绘图Fundamentals of Computers

JINAN University

利用API全局函数实现画线功能void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_ptOrigin = point; CView::OnLButtonDown(nFlags, point); } void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { 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); CView::OnLButtonUp(nFlags, point); } 2暨南大学珠海学院《Windows编程》

制作:刘晓翔 2015-7-22

简单绘图Fundamentals of Computers

JINAN University

利用CDC类实现画线功能void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { CDC* pDC = GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); CView::OnLButtonUp(nFlags, point);

}3暨南大学珠海学院《Windows编程》

制作:刘晓翔 2015-7-22

简单绘图Fundamentals of Computers

JINAN University

利用CClientDC类实现画线功能CClientDC派生于CDC类,并且在构造时调用GetDC函数,在析 构时调用ReleaseDC函数。它与CDC一样,都是实现在窗口的客 户区绘图。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point);CView::OnLButtonUp(nFlags, point); }制作:刘晓翔

4

暨南大学珠海学院《Windows编程》

2015-7-22

简单绘图Fundamentals of Computers

JINAN University

利用CWindowDC类实现画线功能CWindowDC派生于CDC类,并且在构造时调用GetWindowDC 函数,在析构时调用ReleaseDC函数。该对象可以访问整个窗口 区域,包括客户区与非客户区。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { CWindowDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point);CView::OnLButtonUp(nFlags, point); }制作:刘晓翔

5

暨南大学珠海学院《Windows编程》

2015-7-22

小小知识点Fundamentals of Computers

JINAN University

窗口的客户区与非客户区MFC框架程序界面中,整个程序窗口就是框架窗口, 工具栏以下白色区域才是视类窗口。 视类窗口只有客户区(即视类窗口本身) 框架窗口既有客户区(菜单栏以下部分),还有非 客户区(标题栏和菜单栏)。 绘图操作一般都是在窗口的客户区进行的(使用CDC 或CClientDC);要在非客户区绘图,则要使用 CWindowDC。制作:刘晓翔

6

暨南大学珠海学院《Windows编程》

2015-7-22

简单绘图Fundamentals of Computers

JINAN University

在桌面上绘图void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { CWindowDC dc(NULL); //CWindowDC dc(GetDesktopWindow()); dc.MoveTo(m_ptOrigin); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); }7暨南大学珠海学院《Windows编程》 制作:刘

晓翔 2015-7-22

简单绘图Fundamentals of Computers

JINAN University

绘制彩色线条——使用CPen类CPen pen(PS_SOLID,5,RGB(255,0,0)); CClientDC dc(this); CPen* pOldPen = dc.SelectObject(&pen); dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.SelectObject(pOldPen);注意:当构造一个GDI对象后,该对象并不会立即生效,必须通 过SelectObject函数选入设备描述表,它才会在以后的绘制操作 中生效。在完成绘图操作之后,都要利用SelectObject把先前的 GDI对象选入设备描述表,以便使其恢复到先前的状态。制作:刘晓翔

8

暨南大学珠海学院《Windows编程》

2015-7-22

简单绘图Fundamentals of Computers

JINAN University

使用画刷CBrush类绘图//绘制矩形填充块 CBrush brush(RGB(255,0,0)); CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point), &brush); //绘制位图填充块 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); CBrush brush(&bmp); CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point), &brush);制作:刘晓翔

9

暨南大学珠海学院《Windows编程》

2015-7-22

简单绘图Fundamentals of Computers

JINAN University

绘制矩形框CPen pen(PS_SOLID,5,RGB(255,0,0)); CClientDC dc(this); CPen* pOldPen = dc.SelectObject(&pen); dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldPen);

//若要绘制空心的矩形框,需要在设备描述表中将默认 画刷(填充白色)换成透明画刷 CBrush* pOldBrush =(CBrush*)dc.SelectStockObject(HOLLOW_BRUSH); dc.SelectObject(pOldBrush);10暨南大学珠海学院《Windows编程》

制作:刘晓翔 2015-7-22

简单绘图Fundamentals of Computers

JINAN University

绘制连续线条m_ptOrigin = point; //OnLButtionDown //OnMouseMove CClientDC dc(this); if (nFlags == MK_LBUTTON ) { dc.MoveTo(m_ptOrigin); dc.LineTo(point); m_ptOrigin = point; }11暨南大学珠海学院《Windows编程》

制作:刘晓翔 2015-7-22

简单绘图Fundamentals of Computers

JINAN University

橡皮筋技术//OnLButtionDown m_ptOrigin = m_ptEnd = point; //OnMouseMove CClientDC dc(this); if (nFlags == MK_LBUTTON ) { //通过取反的模式擦除旧线条 dc.SetROP2(R2_NOT); dc.MoveTo(m_ptOrigin); dc.LineTo(m_ptEnd); //绘制新线条 m_ptEnd = point; dc.MoveTo(m_ptOrigin); dc.LineTo(m_ptEnd); }12暨南大学珠海学院《Windows编程》

制作:刘晓翔 2015-7-22

文本编程Fundamentals of Computers

JINAN University

在窗口输入文字——视类OnDraw函数MFC中专门为视类提供了响应WM_PAINT消息的响 应函数OnDraw(CDC* pDC)。 如果要防止窗口重绘时显示的文字或图形被刷新,文 字输出和图形绘制的操作都应该在OnDraw函数里完成。void CTextView::OnDraw(CDC* pDC) { CTextDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);}13

pDC->TextOut(100,100, "第四讲 文本编程");制作:刘晓翔 暨南大学珠海学院《Windows编程》 2015-7-22

文本编程Fundamentals of Computers

JINAN University

在窗

口输入文字——CString类MFC中提供了一个字符串类:CString,这个类没有基类。一个 CString对象由一串可变长度的字符组成。 利用CString操作字符串时,无论存储多少个字符,我们都不需 要对它进行内存分配,因为这些操作在CString类的内部都已经替我 们完成了。void CTextView::OnDraw(CDC* pDC) { CTextDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CString str("第四讲 文本编程"); pDC->TextOut(100,100, str); }制作:刘晓翔 暨南大学珠海学院《Windows编程》

14

2015-7-22

文本编程Fundamentals of Computers

JINAN University

添加字符串资源CString提供了一个成员函数:LoadString 该函数可以装载一个由nID标识的字符串资源。其好 处是,在需要使用的时候将其装载到字符串变量中,这 样就不需要在程序中对字符串变量直接赋值。 在VC开发界面左边的Resource View中,通过String Table可添加字符串资源。void CTextView::OnDraw(CDC* pDC) { … CString str; str.LoadString(IDS_MYSTRING); pDC->TextOut(100,100, str); }15暨南大学珠海学院《Windows编程》

制作:刘晓翔 2015-7-22

文本编程Fundamentals of Computers

JINAN University

创建文本插入符int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CreateSolidCaret(20,200); ShowCaret(); return 0; }制作:刘晓翔

16

暨南大学珠海学院《Windows编程》

2015-7-22

文本编程Fundamentals of Computers

JINAN University

创建文本插入符(续)通常,插入符的大小应当根据当前所选的字号来变化。 调用CDC类的GetTextMetrics成员函数可以得到设备描述表中当 前字体的度量信息。

BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const //详见MSDN

gh17

tmAscent

tmDescent base line

制作:刘晓翔 暨南大学珠海学院《Windows编程》 2015-7-22

文本编程Fundamentals of Computers

JINAN University

根据当前所选字号设置插入符大小int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight); ShowCaret(); return 0;

}18暨南大学珠海学院《Windows编程》

制作:刘晓翔 2015-7-22

文本编程Fundamentals of Computers

JINAN University

创建图形插入符int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); CreateCaret(&bmp); ShowCaret(); return 0; }

制作:刘晓翔

19

暨南大学珠海学院《Windows编程》

2015-7-22

本文来源:https://www.bwwdw.com/article/a04i.html

Top