BYTE tmStruckOut; BYTE tmFirstChar; BYTE tmLastChar; BYTE tmDefaultChar; BYTE tmBreakChar; BYTE tmPitchAndFamily; int tmOverhang; int tmDigitizedAspectX; int tmDigitizedAspectY; } TEXTMETRIC; CFont fontText; CString strText; CSize sizeText;
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_ROMAN, \调用CFont::CreateFont函数,建立GDI的字体对象,参数1和2是字体的高度和宽度,最后一个参数是字体的名称
CFont* pOldFont = (CFont*) pDC->SelectObject(&fontText);//将新字体选进
设备,并返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时恢复它
pDC->GetTextMetrics(&tm);//参数是指向TEXTMETRIC结构的指针,得到当前字体的属
性,
strText.FormanPoint t(\磅 WINDOWS 中文字体范例 1234567890\
sizeText = pDC->GetTextExtent(strText); pDC->TextOut(0, nPos, strText);
pDC->SelectObject(pOldFont);//恢复原来的对象 nPos -= tm.tmHeight + tm.tmExternalLeading; }
4)编辑CMy82View::OnDraw函数
- 16 -
void CMy82View::OnDraw(CDC* pDC) {
int nPosition = 0;
for (int i = 12; i <= 24; i += 2) { ShowFont(pDC, nPosition, i); }
三、图形绘画程序的具体实现
(一)在视类中添加成员变量并初始化
class CDrawView : public CView {// Implementation public: };
int m_nMaxX; // 用于保存屏幕尺寸 int m_nMaxY;
CDC * m_pMemDC; //内存DC
CBitmap * m_pBitmap; // 与显示DC的位图兼容的位图 int m_nDrawType; //画图类型 int m_nLineWidth; //线宽
COLORREF m_cLineColor; //线的颜色 COLORREF m_cFillColor; //填充颜色 bool m_bDrawing; //是否正在画图 CPoint m_ptStart; //画图的起始点 CPoint m_ptOld; //保存鼠标临时点 virtual ~CDrawView();
( 1 )在构造函数中初始化部分成员变量
CDrawView::CDrawView() {
// TODO: add construction code here
m_pMemDC = new CDC; //构造内存DC对象
- 17 -
}
m_pBitmap = new CBitmap; // 构造位图对象
m_nDrawType = -1; //程序启动时没有选中绘图类型,不处于绘图状态 m_nLineWidth = 1; //线宽初始为1个像素
m_cLineColor = RGB(0,0,0); //线的颜色初始为黑色 m_cFillColor = RGB(0,0,255); //填充色初始为蓝色 m_bDrawing = false; //程序启动时不处于画图状态
( 2 )在析构造函数中释放指针变量占用的内存
CDrawView::~CDrawView() {
delete m_pMemDC; //删除内存DC对象 delete m_pBitmap; //删除位图对象
}
( 3 )为视类添加WM_CREATE消息处理函数
int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct {
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_nMaxX = GetSystemMetrics(SM_CXSCREEN);//得到屏幕宽度 m_nMaxY = GetSystemMetrics(SM_CYSCREEN); //得到屏幕高度 CDC * pDC = GetDC(); //获得显示DC的指针
m_pMemDC->CreateCompatibleDC(pDC); //创建显示DC的兼容内存DC //创建与显示DC的“位图”兼容的位图,位图和屏幕一样大
m_pBitmap->CreateCompatibleBitmap(pDC, m_nMaxX, m_nMaxY); //将兼容位图选进内存DC,pOldBitmap用来保存内存DC中的原位图
CBitmap * pOldBitmap = m_pMemDC->SelectObject(m_pBitmap);// 创建一个白色画刷 CBrush brush;
brush.CreateStockObject(WHITE_BRUSH);
- 18 -
//将选进内存DC的位图整个填上白色(与窗口底色一致) }
CRect rect(-1,-1,m_nMaxX, m_nMaxY); m_pMemDC->FillRect(rect,&brush); //恢复内存DC中的原有位图
m_pMemDC->SelectObject(pOldBitmap); ReleaseDC(pDC); // 释放显示DC return 0;
(二)在视类中添加菜单消息响应函数
1、在视图类中添加 “直线”、“矩形”、“椭圆”、“填充”4个菜单项的消息响应函数和“线宽”菜单中5个菜单项的消息响应函数 DrawView.h文件
afx_msg void OnSelectDrawType(UINT nID);
afx_msg void OnUpdateSelectDrawType(CCmdUI * pCmdUO); afx_msg void OnDrawLineWidth(UINT nID);
afx_msg void OnUpdateDrawLineWidth(CCmdUI * pCmdUO); DrawView.cpp文件
ON_COMMAND_RANGE(ID_DRAW_LINE,ID_DRAW_FILL, OnSelectDrawType) ON_UPDATE_COMMAND_UI_RANGE(ID_DRAW_LINE,ID_DRAW_FILL, OnUpdateSelectDrawType)
ON_COMMAND_RANGE(ID_DRAW_LINEWIDTH_ONE,ID_DRAW_LINEWIDTH_FIVE, OnDrawLineWidth)
ON_UPDATE_COMMAND_UI_RANGE(ID_DRAW_LINEWIDTH_ONE,ID_DRAW_LINEWIDTH_FIVE,OnUpdateDrawLineWidth)
void CDrawView::OnSelectDrawType(UINT nID) { }
m_nDrawType = nID - ID_DRAW_LINE;
- 19 -
void CDrawView::OnUpdateSelectDrawType(CCmdUI * pCmdUI) { }
void CDrawView::OnDrawLineWidth(UINT nID) { }
void CDrawView::OnUpdateDrawLineWidth(CCmdUI * pCmdUI) { }
int nID = pCmdUI->m_nID - ID_DRAW_LINEWIDTH_ONE + 1; if(nID == m_nLineWidth)
pCmdUI->SetCheck(true);
m_nLineWidth = nID - ID_DRAW_LINEWIDTH_ONE + 1; int nID = pCmdUI->m_nID - ID_DRAW_LINE; if(nID == m_nDrawType)
pCmdUI->SetCheck(true);
else
pCmdUI->SetCheck(false);
else
pCmdUI->SetCheck(false);
2、在视图类中添加 “线色?”和“填充色?”2个菜单项的消息处理函数
void CDrawView::OnDrawLinecolor() {
CColorDialog dlg;
dlg.m_cc.Flags |= CC_PREVENTFULLOPEN | CC_RGBINIT; dlg.m_cc.rgbResult = m_cLineColor; if(dlg.DoModal() == IDOK) {
- 20 -
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新高中教育课程设计论文-基于MFC的绘图软件的设计与实现 (4)全文阅读和word下载服务。
相关推荐: