[12]打造自己的屏幕放大镜--有点迷糊。

2020-12-21  本文已影响0人  heiqimingren

学习收货:
01,这个作用。(感觉还是很复杂啊,理解不了,一时半会)
链接:https://blog.csdn.net/minghui_/article/details/80748142

image.png

ifdef _DEBUG

define new DEBUG_NEW

endif

这样就很清楚了,当在 debug模式 下时,我们分配内存时的new被替换成DEBUG_NEW,而这个DEBUG_NEW 不仅要传入内存块的大小,还要传入源文件名和行号 ,这就有个好处,即当发生 内存泄漏 时,我们可以在调试模式下定位到该问题代码处。若删掉该句,就不能进行定位了。而在 release版本 下的new就是简单的new,并不会传入文件名和行号。
因此,我们在开发代码阶段,保留上述代码是值得的。

=============================================================

02,notify属性:其作用就是该控件被单击或双击的时候将向父级发送通知
MFC控件的Notify属性
MFC控件的属性栏,有一个选项为Notify,其作用就是该控件被单击或双击的时候将向父级发送通知。如果将其设置为false,父窗口就无法响应鼠标点击的消息。有的时候在VS中创建的控件,Notify选项默认是False。如果发现控件不响应某些点击事件,很有可能是这个选项设置为false导致的。

===============================================
03,#CString.Format的详细用法(转):https://www.cnblogs.com/yzl050819/p/6019166.html
在MFC程序中,使用CString来处理字符串是一个很不错的选择。CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串。CString的Format方法给我们进行字符串的转换带来了很大的方便,比如常见的int、float和double这些数字类型转换为CString字符串只需一行代码就可以实现。
  先看看Format用于转换的格式字符:
  %c 单个字符
  %d 十进制整数(int)
  %ld 十进制整数(long)
  %f 十进制浮点数(float)
  %lf 十进制浮点数(double)
  %o 八进制数
  %s 字符串
  %u 无符号十进制数
  %x 十六进制数
  1、int转换为CString:
  CString str;
  int number=15;
  //str="15"
  str.Format(_T("%d"),number);
  //str=" 15"(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
  str.Format(_T("%4d"),number);
  //str="0015"(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
  str.Format(_T("%.4d"),number);
  long转换为CString的方法与上面相似,只需要把%d改为%ld就可以了。
================================================================
04,如何获取某个窗口,或者控件的区域大小?
//显示区域矩形的获取 ,数据存储在showRect当中。
CRect showRect;在头文件定义了。
GetDlgItem(IDC_SHOW)->GetClientRect(&showRect);

image.png

============================================================
05,常用的函数:atoi,itoa,atof,_ttoi等
链接:https://blog.csdn.net/zzyoucan/article/details/10260093
_ttoi---可以将CString转换成整形
itoa---integer to ASCII--将整形转换成字符串
atof---ascii to float--字符串转换成浮点型
atol---ascii to long---字符串转换成长整形
gcvt---浮点型转换成字符串(四舍五入)
strtod---字符串转换成浮点型
strtol---字符串转换成长整形
strtoul--字符串转换成无符号长整形
toascii---将整形转换成合法的ASCII码字符

============================================
06,重点函数,分析

//放大屏幕某一指定的区域,并且把数据保存到bitmap对象当中。
//3个参数,第一个是显示区域大小。第二,放大的倍数。第三,作为保存放大后的mBmp对象。此参数是引用类型。
BOOL StretchScreenToBitmap(CRect tRect, int iZoom, CBitmap &outBmp)
{   //上节课有说明了,下部分代码。
    //::GetDC(NULL)--------获取桌面的dc
    CDC *pDC = CDC::FromHandle(::GetDC(NULL));
    if (!pDC)
    {
        return false;
    }

    //获取一下鼠标当前的坐标,存储在pt结构体当中。
    CPoint pt;
    GetCursorPos(&pt);

    //获取屏幕的宽和高
    int xScreen = GetSystemMetrics(SM_CXSCREEN);
    int yScreen = GetSystemMetrics(SM_CYSCREEN);

    int iPosLeft = 0, iPosTop = 0;
    //iWidth,iHeigh--是放大之后的尺寸。
    int iWidth = tRect.Width() / iZoom;
    int iHeigh = tRect.Width() / iZoom;

    CDC hMemDC, hTDc;  //定义了2个内存dc,为的是让截图的时候能把鼠标截图下来
    CBitmap tBmp, *pOldBmp = NULL;

    //分别创建兼容的屏幕dc
    hMemDC.CreateCompatibleDC(pDC);  //该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。
    hTDc.CreateCompatibleDC(pDC);


    //创建了2个画布。
    outBmp.CreateCompatibleBitmap(pDC, tRect.Width(), tRect.Height());  //outBmp是传出去的,所以他的宽和高,就得是处理过的宽和高。
    tBmp.CreateCompatibleBitmap(pDC, xScreen, yScreen);  //屏幕的宽和高。

    //到了这一步,dc创建好了,画布也创建好了。下一步,就得选择相应的dc设备

    pOldBmp = hMemDC.SelectObject(&outBmp);
    hTDc.SelectObject(&tBmp); //hTDc保存的是整个屏幕的内容,并且向鼠标画


    //把整个屏幕的内容-pDC拷贝到hTDc当中。
    hTDc.BitBlt(0, 0, xScreen, yScreen, pDC, 0, 0, SRCCOPY);
    //绘制图标。。
    hTDc.DrawIcon(pt, AfxGetApp()->LoadIcon(IDR_MAINFRAME));

    //实现一个功能,选择范围,这个范围在鼠标周围。鼠标在中心
    iPosLeft = (pt.x - iWidth / 2) > 0 ? (pt.x - iWidth / 2) : 0;
    iPosTop = (pt.y - iHeigh / 2) > 0 ? (pt.y - iHeigh / 2) : 0;

    iPosLeft = (pt.x + iWidth / 2) < xScreen ? iPosLeft : xScreen - iWidth;
    iPosTop = (pt.y + iHeigh / 2) < yScreen ? iPosTop : yScreen - iHeigh;

    //缩放复制位图到设备上下文。前4个参数,都是目标地区,而hTDc是源设备指针
    BOOL bRet = hMemDC.StretchBlt(0, 0, tRect.Width(), tRect.Height(), &hTDc, iPosLeft, iPosTop, iWidth, iHeigh, SRCCOPY);

    tBmp.DeleteObject();
    hMemDC.SelectObject(pOldBmp);//选择GDI对象到设备环境当中。
    hMemDC.DeleteDC();
    hTDc.DeleteDC();
    ReleaseDC(NULL, pDC->m_hDC);

    return bRet;
}

=========================
07,总之,有点迷糊,知识不成体系。

===============================


image.png
image.png image.png

7分17秒,下拉框赋值,结束了。

9:09秒,开始讲解,开始喽函数


image.png

===========================================================

10:59,添加定时器响应函数


image.png

========================================
14:25,StretchScreenToBitmap函数的添加
StretchScreenToBitmap


image.png
BOOL StretchScreenToBitmap(CRect tRect, int iZoom, CBitmap &outBmp)
{
    CDC *pDC = CDC::FromHandle(::GetDC(NULL));
    if (!pDC )
    {
        return False;
    }

    CPoint pt;
    GetCursorPos(&pt);

    int xScreen = GetSystemMetrics(SM_CXSCREEN);
    int yScreen = GetSystemMetrics(SM_CYSCREEN);

    int iPOsLeft = 0, iPosTop = 0;
    int iWidth = tRect.Width() / iZoom;
    int iHeigh = tRect.Width() / iZoom;

    CDC hMemDC, hTDc;
    CBitmap tBmp, *pOldBmp = NULL;

    hMemDC.CreateCompatibleDC(pDC);
    hTDc.CreateCompatibleDC(pDC);

    outBmp.CreateCompatibleBitmap(pDC, tRect.Width(), tRect.Height());
    tBmp.CreateCompatibleBitmap(pDC, xScreen, yScreen);

    pOldBmp = hMemDC.SelectObject(&outBmp);
    hTDc.SelectObject(&tBmp);

    hTDc.BitBlt(0, 0, xScreen, yScreen, pDC, 0, 0, SRCCOPY);
    hTDc.DrawIcon(pt, AfxGetApp()->LoadIcon(IDI_CURSOR_ICON));





}

这个函数一直讲解到32:56秒

============================
第六步,34:12开始讲解:DrawTargetBitmap函数


image.png

这个函数,一直讲解到39分钟。

第七部,42分钟20秒,开始讲解。


image.png

============
第八部分:45:05开始讲解


image.png

==========
最后老师留下了个作业,
2个小作业!

上一篇 下一篇

猜你喜欢

热点阅读