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对象作画的时候,取这个变量的地址,绘画文字,图像等
原文地址:https://www.cnblogs.com/saintdingspage/p/12399660.html