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