一种在MFC程序上显示jpeg图片的方法(一)宁滥勿缺
鳴謝:https://blog.csdn.net/guo_lei_lamant/article/details/79484818?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
感謝上面的博主,讓我知道了除了臭大街的CBitmap居然還有CImage
同時(shí)鳴謝:https://www.cnblogs.com/DOMLX/p/9598974.html,這位博主讓我學(xué)習(xí)了設(shè)備上下文如何準(zhǔn)確的獲取窗口上任意坐標(biāo)位置上的一片矩形區(qū)域,并把圖片流畫上去,這位一看就是高手,估計(jì)是寫軍事間諜衛(wèi)星圖片處理軟件的,開個(gè)玩笑
學(xué)了visual C++驀然發(fā)現(xiàn),原來根本不放在眼里的“windows拖控件編程”背后是怎樣一種令人震驚的復(fù)雜:就連鼠標(biāo)定位,圖片的加載也成了一項(xiàng)登月工程!,寫下這篇文章的目的源自一個(gè)偉大的想法:我想在MFC對(duì)話框上插入一張美麗的jpeg圖片,讓編程和程序界面更富有詩意。結(jié)果卻是:主流編程書籍,這個(gè)寶典,那個(gè)入門到精通都閉口不談實(shí)現(xiàn)方式。更讓人哭笑不得的是,他們卻不厭其煩的談?wù)撛诎粹o上加載bmp圖片。我想他們一定有把飯菜盛在枕頭上吃的雅好,要不怎么能想出這么驚悚的主意呢。
縱觀現(xiàn)在主流vc書籍,用vs2010及以后的書也就占了3-4成,而這也是這幾年來最好的情況了。MFC編程一開始,給人一種要把windows API進(jìn)行到底的感覺,然而不久你會(huì)發(fā)現(xiàn),為了開發(fā)效率----大家都慫了,MFC還是允許自定義對(duì)話框的嘛,那還不如直接windows form算了。但是為了體現(xiàn)MFC的偉大之處,還是應(yīng)該弄的難一點(diǎn),比如picture control控件休想加載jpeg便是一例。窮其篇幅,還是得感謝上帝提供了IPicture這樣一個(gè)圖像接口,配合IStream在堆區(qū)中開辟一片空間,把圖片文件生成流的形式渲染到窗口設(shè)備上去。
你以為這就萬事大吉了?不挖坑怎么能體現(xiàn)windows的深邃呢,于是大多數(shù)書籍,都裝孫子般的教你把整張圖片渲染到整個(gè)MFC窗口客戶區(qū)去-----這再次暴露了他們喜歡把內(nèi)褲邊提到外套胸口處的愛好,當(dāng)然了,你想把圖片渲染到窗口的某個(gè)坐標(biāo)位置上的矩形區(qū)域也不是不可以,那就先聲明個(gè)CRect的區(qū)域吧,然后獲取對(duì)話框上顯示圖片的控件picture control 的·ID IDC_STATIC通過GetDlgItem函數(shù)把控件區(qū)域?qū)?yīng)到CRect類的指針(這里的類指針更像是個(gè)傳出參數(shù),這個(gè)函數(shù)把picture control的坐標(biāo)賦值給了CRect類指針)
GetDlgItem(IDC_STATIC)->GetDC()的作用是生成一個(gè)畫布,其作用類似聲明一個(gè)CDC類的指針pdc然后把得到的圖片渲染到畫布pdc->m_hDC,后面的4個(gè)參數(shù)依次是相對(duì)于對(duì)話框左邊,頂端的距離
以及目標(biāo)區(qū)域的寬高
CImage image;
image.Load(_T("E:\b82e84b7g.jpg"));
//獲取圖片客戶區(qū)位置
CRect zcRect;
GetDlgItem(IDC_STATIC)->GetClientRect(&zcRect);
// 將圖像顯示在界面之上
image.Draw(GetDlgItem(IDC_STATIC)->GetDC()->m_hDC,
zcRect.left,
zcRect.top,
zcRect.Width(),
zcRect.Height());
}
上述代碼的優(yōu)點(diǎn)在于,可以快速(代碼量少)且體面的為我們?cè)趯?duì)話框上插一個(gè)圖。不足之處在于,盡管你加載的是jpeg圖片,但生成的是一個(gè)bmp圖片,失真嚴(yán)重,但畢竟在
設(shè)備上下文區(qū)域獲取的方法方面為我們提供了寶貴的參考,而且很容易的實(shí)現(xiàn)了圖片以適應(yīng)的模式顯示在控件中。
效果:
但起碼還算是實(shí)現(xiàn)了在指定位置顯示
且看下回分解:你今天在申請(qǐng)的堆空間中,為加載的IPicture生成IStream了嗎
總結(jié)
以上是生活随笔為你收集整理的一种在MFC程序上显示jpeg图片的方法(一)宁滥勿缺的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 特斯拉自动辅助驾驶遭遇车祸:摩托车司机当
- 下一篇: 4核大战6核!酷睿i3-12100F V