美文网首页
[12]打造自己的屏幕放大镜--有点迷糊。

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

作者: heiqimingren | 来源:发表于2020-12-21 11:11 被阅读0次

学习收货:
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个小作业!

相关文章

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

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

  • 有点迷糊

    最近好像会间歇性失忆一样,最近做的事情都忘得一干二净。 某个时间段做了什么事情,像断片一样,完全没有了印象。 是因...

  • 有点迷糊

    有点迷糊的一天,早上起来之后就好象没睡醒。然后就是忙着弄早饭,再去上班。 上班的路上有一点热,温度又开始上升。衣服...

  • 有点迷糊

    不明白为什么在大数据时代还需要人工一遍遍的统计?理解不了 一遍遍敲门,一遍遍打电话,一遍遍核实,最终一遍遍被撅 现...

  • 生活有点迷糊

    不知道生活的意义是什么,按部就班的过,平淡如水的活。 就连现在最在意的宝宝的成长,也在听到一个同龄二胎妈妈说孩子按...

  • 有点小迷糊

    今天早上起来倒是有个好心情,凉凉爽爽的早上,心情也就自然跟着凉爽起来了,昨天和今天都在思考一个问题,我也不想再考虑...

  • 最近有点迷糊

    最近的状态其实很不好 但是我知道其实大家都不容易 到了25岁 有些事情 不能跟家人说 怕他们担心 不能跟朋友说 怕...

  • 我有点迷糊了?

    我有点迷糊了?有没有亲历过这样新冠症状的朋友。不知道我这个是不是感染了新冠,一家人接连不断的病倒,鼻塞,发热,流鼻...

  • 迷糊的自己

    啦啦啦~~~ ,我是一个小迷糊小迷糊~~~ 记录一下自己曾经做过的小蠢事,今天想起记录这个事情,是因为自己在洗漱的...

  • 迷糊的自己

    今天有位我敬佩的姐姐约我电话沟通。 姐姐特别注重时间管理,每次和我聊天都时间安排好。说明沟通的时间段和具体到几分钟...

网友评论

      本文标题:[12]打造自己的屏幕放大镜--有点迷糊。

      本文链接:https://www.haomeiwen.com/subject/cmalnktx.html