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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容