zoukankan      html  css  js  c++  java
  • 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对象作画的时候,取这个变量的地址,绘画文字,图像等
  • 相关阅读:
    Android获取IMEI码
    Android动态壁纸的制作教程
    Android编程之解决androidsupportv4打包问题
    获取文字的宽度(android)
    json 数据格式
    Android隐藏标题栏,全屏显示
    android 解析json数据格式(转)
    RelativeLayout 布局属性
    anroid 样式列表
    Windows Phone 7 淺談手勢(Gestures)運作
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12399660.html
Copyright © 2011-2022 走看看