学习收货:
01,这个作用。(感觉还是很复杂啊,理解不了,一时半会)
链接:https://blog.csdn.net/minghui_/article/details/80748142
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);
============================================================
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个小作业!
网友评论