MFC---GDI之DC类杂记,以画尺子为例
GDI是Windows操作系统提供的一种接口,目的是和各型其他硬件设备,如打印机,显示器等交互,这些硬件只需满足windows
提供的接口,即可实现同操作系统的交互
DC类是GDI类的一个子类,DC类无法直接使用,从他派生出CClientDC CWindowDC CPaintDC CMetaFileDC等,
其中CClientDC CPaintDC较为常用,他们都用于在MFC窗口的“用户区”(除了标题行,导航栏以外的区域)绘制图像和文字,(没错,文字也是“画”出来的)
需要注意的是CPaintDC只能用于On_Paint()方法体中。
- 下例为在CClientDC中画一把尺子
- 定义窗口类.h文件
#pragma once #include <afxwin.h> class MyApp :public CWinApp { virtual BOOL InitInstance(); }; class MyWnd:public CFrameWnd { public: MyWnd(); protected: DECLARE_MESSAGE_MAP(); afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); ~MyWnd(); };
- 定义类的实体
#include "MyWnd.h" MyApp app; BOOL MyApp::InitInstance() { this->m_pMainWnd = new MyWnd; this->m_pMainWnd->ShowWindow(this->m_nCmdShow); this->m_pMainWnd->UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(MyWnd,CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() MyWnd::MyWnd() { CRect rect; this->Create(NULL,TEXT("一次征途,就是一首歌"),WS_OVERLAPPEDWINDOW|WS_VSCROLL); } MyWnd::~MyWnd() { } void MyWnd::OnPaint() { CPaintDC pdc(this); pdc.TextOutW(100,100,TEXT("所有的往事都刻在心里")); pdc.SetMapMode(MM_LOENGLISH);//设置英寸作为计量单位一英寸约等于25.4毫米,这也是下列循环从25开始 pdc.SetTextAlign(TA_CENTER|TA_TOP);//刻度上的数字显示方式,居中,与上方刻度对齐 pdc.SetBkMode(TRANSPARENT);//背景设置透明,否则画出的数字会盖住矩形区域一部分 CBrush brush(RGB(116,124,24)); CBrush* oldbrush = pdc.SelectObject(&brush);//好的编程习惯,保存定义好的画刷,这句可以没有,但建议保留 pdc.Rectangle(100,-100,1300,-200);由于上边设置MapMode为MM_LOENGLISH所以坐标体系是:尺子以客户区域的最顶端为(0,0),画尺子的位置相当于y轴的负半轴,下面的移动画刷,画线皆以此为出发点 pdc.SelectObject(oldbrush);//让DC设备握住画刷 for (int i = 125; i < 1300;i+=25) { pdc.MoveTo(i,-100); pdc.LineTo(i,-108); } for (int i = 150; i < 1300;i+=50) { pdc.MoveTo(i,-100); pdc.LineTo(i, -116); } for (int i = 200; i < 1300;i+=100) { pdc.MoveTo(i,-100); pdc.MoveTo(i, -124); CString str; str.Format(TEXT("%d"),i/100-1);//循环变量i与刻度对应关系的算法,你懂的 pdc.TextOutW(i,-124,str); } }
运行结果:
总结:DC绘画的思路大致是
- 实例化一个DC类例如:CClientDC cdc(this);中的this是指DC对象所依附的窗口
- 实例化一个CBrush或者CPen对象,初始化的时候这些类都有自己特定的实例化参数
- 调用DC对象的selectObject方法“握住”实现的画笔或者画刷,作画,比如画出一个长方形
pdc.Rectangle(100,-100,1300,-200);
- 有的还会声明一个CRect类的变量rect的矩形区域,dc对象作画的时候,取这个变量的地址,绘画文字,图像等