57_单文档画直线双缓冲

作业讲解

图形化用户输入数据选择最小化,好检测用户输入是否正确

课程内容

单文档对话框

    • 四个类

      • APP:初始化
      • VIEW:单文档客户区:空白区域
      • Frame:非客户区,整个窗口。标题,菜单,工具栏

什么时候绘图

    • 在SDK中,就是在WM_PAINT消息中响应
    • 在MFC中,在onDraw虚函数来画,本质上来自于onPaint,它又来自WM_PAINT

在哪里绘图

    • 通过获取DC绘图
    • MFC对DC的封装

CDC 内存DC:,CreateCompatibleDC 在内存中绘图

CClientDC GetDC 在客户区绘图,无视无效区

CPaintDc BeginPaint 在客户取绘图,绘制区域不超过无效区

CWindowDc GetWindowDC 在整个窗口绘图,无视无效区

    • 例子,截取当前屏幕显示到客户区
      • BitBlt:从指定源DC像素矩形到目标DC按位块传输
        • int x:目标x起点
        • int y:目标y起点
        • int nWidth:目标矩形宽度
        • int nHeight:目标矩形高度
        • CDC* pSrcDC:源dc
        • int xSrc:源x起点
        • int ySrc:源y起点
        • DWORD dwRop // 光栅操作,对图片中的颜色做位运算
          • SRCCOPY:不对目标做光栅操作
      • CreateDC:第一个填“DISPLAY”,后三个NULL,用来获取屏幕DC的
      • 获取屏幕宽和高: GetSystemMetrics

SM_CXFULLSCREEN

SM_CYFULLSCREEN

      • 怎么一直获取屏幕,使用定时器创建无效区,来获取屏幕

如何绘图

    • 画直线
      • API:
        • MoveTo:起点
        • LineTo:终点
      • 响应的消息:鼠标左键按下,鼠标移动,鼠标左键弹起

    • 特点:鼠标移动直线也在动,鼠标移出窗口也在动,直到鼠标左键弹起
    • CList迭代器,在GetNext中会更新迭代器的值

    • 绘制问题
      • 鼠标移出客户区不跟随问题
        • SetCapture,让鼠标可以接受客户区外的鼠标移动消息
        • ReleaseCapture,让鼠标不再接受客户区外的鼠标移动消息

    • 双击问题:双击消息第二个弹起消息

通过判断是否按下左键解决

    • 闪烁问题:如果不擦除背景,图不对;如果擦除背景,一会有,一会没有会出现闪烁
    • 双缓冲解决了闪烁问题:不直接画到DC里面,画到内存DC里面,再贴过来
      • 1. 创建内存DC,API:CreateCompatibleDC

CDC dc; //需要拷贝到的DC

dc.CreateCompatibleDC(pDC);

      • 2. 创建兼容位图,API: CreateCompatibleBitmap

Rect rc;

GetClientRect(&rc);

CBitmap bmpMem;

bmpMem. CreateCompatibleBitmap(要兼容的DC,宽度,高度);

dc.SelectObject(&bmpMem);//选入位图

      • 3. 设置位图背景

//dcMem.SetBKColor(pDC->GetBKColor); //设置为之前DC的背景色,无效果

//dcMem.SetBkColor(RGB(255,255,255)); //设置为三原色的白色,无效果

dcMemFillSolidRect(&rc, RGB(255,255,255)) //使用矩形填充,有效果

      • 4. 在内存DC中绘图

把之前的代码拷过来,使用内存DC创建

      • 5. 将内存DC图片贴到窗口

pDC->BitBle(坐标x,坐标y,宽度,高度,&dcMen, 源x,源y, SRCCOPY);

作业

  1. 添加绘制椭圆,矩形的功能

https://github.com/xkkhh/Cracking/tree/master/04CAD01

  1. MFC单文档中,所有继承了CCmdTarget的类都能处理command消息,APP,DOC,view,frame,是否都能处理command消息? 顺序是怎样的? 为什么?

都能处理command消息

顺序为View大于DOC大于frame大于APP

0 条评论
发表一条评论