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

學(xué)習(xí)收貨:
01日麸,這個作用蚁滋。(感覺還是很復(fù)雜啊,理解不了赘淮,一時半會)
鏈接:https://blog.csdn.net/minghui_/article/details/80748142

image.png

ifdef _DEBUG

define new DEBUG_NEW

endif

這樣就很清楚了辕录,當在 debug模式 下時,我們分配內(nèi)存時的new被替換成DEBUG_NEW梢卸,而這個DEBUG_NEW 不僅要傳入內(nèi)存塊的大小走诞,還要傳入源文件名和行號 ,這就有個好處蛤高,即當發(fā)生 內(nèi)存泄漏 時蚣旱,我們可以在調(diào)試模式下定位到該問題代碼處。若刪掉該句戴陡,就不能進行定位了塞绿。而在 release版本 下的new就是簡單的new,并不會傳入文件名和行號恤批。
因此异吻,我們在開發(fā)代碼階段,保留上述代碼是值得的喜庞。

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

02诀浪,notify屬性:其作用就是該控件被單擊或雙擊的時候?qū)⑾蚋讣壈l(fā)送通知
MFC控件的Notify屬性
MFC控件的屬性欄,有一個選項為Notify延都,其作用就是該控件被單擊或雙擊的時候?qū)⑾蚋讣壈l(fā)送通知雷猪。如果將其設(shè)置為false,父窗口就無法響應(yīng)鼠標點擊的消息晰房。有的時候在VS中創(chuàng)建的控件求摇,Notify選項默認是False。如果發(fā)現(xiàn)控件不響應(yīng)某些點擊事件殊者,很有可能是這個選項設(shè)置為false導(dǎo)致的与境。

===============================================
03,#CString.Format的詳細用法(轉(zhuǎn)):https://www.cnblogs.com/yzl050819/p/6019166.html
在MFC程序中幽污,使用CString來處理字符串是一個很不錯的選擇嚷辅。CString既可以處理Unicode標準的字符串,也可以處理ANSI標準的字符串距误。CString的Format方法給我們進行字符串的轉(zhuǎn)換帶來了很大的方便簸搞,比如常見的int扁位、float和double這些數(shù)字類型轉(zhuǎn)換為CString字符串只需一行代碼就可以實現(xiàn)。
  先看看Format用于轉(zhuǎn)換的格式字符:
  %c 單個字符
  %d 十進制整數(shù)(int)
  %ld 十進制整數(shù)(long)
  %f 十進制浮點數(shù)(float)
  %lf 十進制浮點數(shù)(double)
  %o 八進制數(shù)
  %s 字符串
  %u 無符號十進制數(shù)
  %x 十六進制數(shù)
  1趁俊、int轉(zhuǎn)換為CString:
  CString str;
  int number=15;
  //str="15"
  str.Format(_T("%d"),number);
  //str=" 15"(前面有兩個空格域仇;4表示將占用4位,如果數(shù)字超過4位將輸出所有數(shù)字寺擂,不會截斷)
  str.Format(_T("%4d"),number);
  //str="0015"(.4表示將占用4位暇务,如果數(shù)字超過4位將輸出所有數(shù)字,不會截斷)
  str.Format(_T("%.4d"),number);
  long轉(zhuǎn)換為CString的方法與上面相似怔软,只需要把%d改為%ld就可以了垦细。
================================================================
04,如何獲取某個窗口挡逼,或者控件的區(qū)域大欣ǜ摹?
//顯示區(qū)域矩形的獲取 ,數(shù)據(jù)存儲在showRect當中家坎。
CRect showRect;在頭文件定義了嘱能。
GetDlgItem(IDC_SHOW)->GetClientRect(&showRect);

image.png

============================================================
05,常用的函數(shù):atoi虱疏,itoa惹骂,atof,_ttoi等
鏈接:https://blog.csdn.net/zzyoucan/article/details/10260093
_ttoi---可以將CString轉(zhuǎn)換成整形
itoa---integer to ASCII--將整形轉(zhuǎn)換成字符串
atof---ascii to float--字符串轉(zhuǎn)換成浮點型
atol---ascii to long---字符串轉(zhuǎn)換成長整形
gcvt---浮點型轉(zhuǎn)換成字符串(四舍五入)
strtod---字符串轉(zhuǎn)換成浮點型
strtol---字符串轉(zhuǎn)換成長整形
strtoul--字符串轉(zhuǎn)換成無符號長整形
toascii---將整形轉(zhuǎn)換成合法的ASCII碼字符

============================================
06做瞪,重點函數(shù)对粪,分析

//放大屏幕某一指定的區(qū)域,并且把數(shù)據(jù)保存到bitmap對象當中穿扳。
//3個參數(shù)衩侥,第一個是顯示區(qū)域大小。第二矛物,放大的倍數(shù)。第三跪但,作為保存放大后的mBmp對象履羞。此參數(shù)是引用類型。
BOOL StretchScreenToBitmap(CRect tRect, int iZoom, CBitmap &outBmp)
{   //上節(jié)課有說明了屡久,下部分代碼忆首。
    //::GetDC(NULL)--------獲取桌面的dc
    CDC *pDC = CDC::FromHandle(::GetDC(NULL));
    if (!pDC)
    {
        return false;
    }

    //獲取一下鼠標當前的坐標,存儲在pt結(jié)構(gòu)體當中被环。
    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個內(nèi)存dc,為的是讓截圖的時候能把鼠標截圖下來
    CBitmap tBmp, *pOldBmp = NULL;

    //分別創(chuàng)建兼容的屏幕dc
    hMemDC.CreateCompatibleDC(pDC);  //該函數(shù)創(chuàng)建一個與指定設(shè)備兼容的內(nèi)存設(shè)備上下文環(huán)境(DC)筛欢。
    hTDc.CreateCompatibleDC(pDC);


    //創(chuàng)建了2個畫布浸锨。
    outBmp.CreateCompatibleBitmap(pDC, tRect.Width(), tRect.Height());  //outBmp是傳出去的唇聘,所以他的寬和高,就得是處理過的寬和高柱搜。
    tBmp.CreateCompatibleBitmap(pDC, xScreen, yScreen);  //屏幕的寬和高迟郎。

    //到了這一步,dc創(chuàng)建好了聪蘸,畫布也創(chuàng)建好了宪肖。下一步,就得選擇相應(yīng)的dc設(shè)備

    pOldBmp = hMemDC.SelectObject(&outBmp);
    hTDc.SelectObject(&tBmp); //hTDc保存的是整個屏幕的內(nèi)容健爬,并且向鼠標畫


    //把整個屏幕的內(nèi)容-pDC拷貝到hTDc當中控乾。
    hTDc.BitBlt(0, 0, xScreen, yScreen, pDC, 0, 0, SRCCOPY);
    //繪制圖標。娜遵。
    hTDc.DrawIcon(pt, AfxGetApp()->LoadIcon(IDR_MAINFRAME));

    //實現(xiàn)一個功能阱持,選擇范圍,這個范圍在鼠標周圍魔熏。鼠標在中心
    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;

    //縮放復(fù)制位圖到設(shè)備上下文衷咽。前4個參數(shù),都是目標地區(qū)蒜绽,而hTDc是源設(shè)備指針
    BOOL bRet = hMemDC.StretchBlt(0, 0, tRect.Width(), tRect.Height(), &hTDc, iPosLeft, iPosTop, iWidth, iHeigh, SRCCOPY);

    tBmp.DeleteObject();
    hMemDC.SelectObject(pOldBmp);//選擇GDI對象到設(shè)備環(huán)境當中镶骗。
    hMemDC.DeleteDC();
    hTDc.DeleteDC();
    ReleaseDC(NULL, pDC->m_hDC);

    return bRet;
}

=========================
07,總之躲雅,有點迷糊鼎姊,知識不成體系。

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


image.png

image.png
image.png

7分17秒相赁,下拉框賦值相寇,結(jié)束了。

9:09秒钮科,開始講解唤衫,開始嘍函數(shù)


image.png

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

10:59,添加定時器響應(yīng)函數(shù)


image.png

========================================
14:25绵脯,StretchScreenToBitmap函數(shù)的添加
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));





}

這個函數(shù)一直講解到32:56秒

============================
第六步佳励,34:12開始講解:DrawTargetBitmap函數(shù)


image.png

這個函數(shù),一直講解到39分鐘蛆挫。

第七部赃承,42分鐘20秒,開始講解悴侵。


image.png

============
第八部分:45:05開始講解


image.png

==========
最后老師留下了個作業(yè)瞧剖,
2個小作業(yè)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抓于,隨后出現(xiàn)的幾起案子做粤,更是在濱河造成了極大的恐慌,老刑警劉巖毡咏,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驮宴,死亡現(xiàn)場離奇詭異,居然都是意外死亡呕缭,警方通過查閱死者的電腦和手機堵泽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恢总,“玉大人迎罗,你說我怎么就攤上這事∑拢” “怎么了纹安?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砂豌。 經(jīng)常有香客問我厢岂,道長,這世上最難降的妖魔是什么阳距? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任塔粒,我火速辦了婚禮,結(jié)果婚禮上筐摘,老公的妹妹穿的比我還像新娘卒茬。我一直安慰自己,他們只是感情好咖熟,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布圃酵。 她就那樣靜靜地躺著,像睡著了一般馍管。 火紅的嫁衣襯著肌膚如雪郭赐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天咽斧,我揣著相機與錄音堪置,去河邊找鬼。 笑死张惹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的岭洲。 我是一名探鬼主播宛逗,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盾剩!你這毒婦竟也來了雷激?” 一聲冷哼從身側(cè)響起替蔬,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屎暇,沒想到半個月后承桥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡根悼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年凶异,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挤巡。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡剩彬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矿卑,到底是詐尸還是另有隱情喉恋,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布母廷,位于F島的核電站轻黑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琴昆。R本人自食惡果不足惜氓鄙,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椎咧。 院中可真熱鬧玖详,春花似錦、人聲如沸勤讽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚牍。三九已至向臀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诸狭,已是汗流浹背券膀。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驯遇,地道東北人芹彬。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像叉庐,于是被迫代替她去往敵國和親舒帮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容