所謂的靜態有兩種,一種是在picture屬性中直接加載(type選擇bitmap,image選擇已加載到資源中的位圖),另一種是通過編程加載,這兩種的前提都要我們先把位圖導入到資源中去,下面說下后一種。
001:新建對話框工程,加入picture控件,關聯變量為m_Bmp(類型為control),ID也要改一下,因為采用默認的,有重名,在關聯變量的時候找不到picture項,再拖一個按鈕上去,我們要實現的結果是,單擊一下按鈕,就會顯示出位圖
002:雙擊按鈕,在消息處理函數中添加
HBITMAP hBitmap;
hBitmap = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
m_Bmp.SetBitmap(hBitmap); /***IDB_BITMAP1是你載入資源中位圖的ID號***/
003:此時運行的話,圖片卻沒有出來,這是因為你還沒有把picture控件中的type設置為bitmap類型,設置一下,一切ok!簡簡單單!
下面說下動態載入,動態載入就是不用事先把位圖導入資源,直接在程序運行的時候,彈出一個文件選擇對話框,選擇你想要顯示的對話框即可。此列中依舊要把picture控件中的type設置為bitmap類型,否則會出現圖片顯示不出來的問題。
和以上靜態顯示唯一的區別只體現在按鈕的消息處理函數中,此列中的消息處理函數內容為
CString m_strfile; /***你在文件選擇對話框中選中的文件名***/
CRect r;
GetClientRect(&r);
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"Bmp files(*.bmp)|*.bmp|",NULL);
if(dlg.DoModal ())
{
m_strfile=dlg.GetPathName ();
}
HBITMAP hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
m_strfile,
IMAGE_BITMAP,
r.Width()/2,
r.Height()/2,
LR_LOADFROMFILE);
m_Bmp.SetBitmap(hbitmap);
好了,動態顯示也做出來了。
忘記告訴大家,加載文件的時候,路徑一定要是英文的!!!
轉自:
http://student.csdn.net/space.php?uid=210723&do=blog&id=19022
前幾天的一個項目,需要在對話框上顯示一張圖片,所以首先想到使用Picture控件來顯示。但是這個東西以前沒有用過,又懶得查幫助,所以就純粹把它當作顯示的Canvas,把它的DC取出來,把圖就給刷上去了。呵呵,說到底並沒有真正使用這個控件。不過即使這樣,圖像還是可以顯示,成功蒙混過關。
后來總覺得心里不踏實,於是總結了一下,發現這種做法確實不好。首先是這樣做的話,圖像邊界問題常常要自己考慮,否則一不小心,就把圖刷出界了。原先倒是有寫過一個視頻捕捉的程序,由於視頻流的每一幀是固定大小的,所以當時更加偷懶,呵呵,直接搞一個裸奔的對話框,然后把圖像直接滿屏刷到對話框的DC中。這次之所以第一感覺就看上Picture控件,是期望它能幫我完成裁剪的功能。畢竟這次需要顯示的圖像的尺寸差異甚大,所以我希望固定圖片的顯示區域,超出部分就自動裁剪了多好。可惜沒有那么便宜的事情,光取一個DC就刷圖,MFC居然是不分青紅皂白直接往上刷,管它邊界在哪里,所以Picture控件邊上一些可憐的Static控件努力透出Picture的DC來顯示,整個界面實在看不下去。不得已,最后只好老老實實自己縮放圖片,死活把全圖刷到Picture控件的Rect中,堅決打擊了越界現象;后來又發現了這樣做的另外一個壞處,就是刷新不及時。每次移動窗口時,MFC就是不主動去刷Picture的圖,此時會出現Picture控件中一部分是圖,一部分是別的桌面元素的現象,實在怪異。當下頗為懷念Doc/View結構,那玩意兒刷圖到View里實在省事多了。
今天終於痛下決心真正用一下Picture控件,所以稍稍研究了一下,發現其實用起來也不難。總結一下步驟:
1. 首先Picture控件的Type選Bitmap,沒查MSDN,不知道這種和別的Type有何區別,但是至少這個是能用的(名字最符合要求嘛);
2. 用一個CStatic類型的控件變量去關聯到這個控件上,例如叫m_picture;
3. 在需要改變圖片的地方,先從圖片生成一個HBITMAP,例如叫m_bitmap,然后只要m_picture.SetBitmap(m_bitmap)就可以了。這樣做的好處很明顯了,越界問題和刷新問題都解決了;如果對Picture的自動裁剪功能不爽,可以自己縮放圖片后再生成m_bitmap。我是用CxImage加載圖片的,因此顯示圖片的這段代碼就是:
CxImage image;
image.Load("welcome.jpg", CXIMAGE_FORMAT_JPG);
if (image.IsValid())
{
if (m_bitmap) DeleteObject(m_bitmap);
image.Resample(m_rect.Width(), m_rect.Height()); //按照Picture控件的大小,(不按比例)縮放原始圖片
m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);
HBITMAP OldBitmap = m_picture.SetBitmap(m_bitmap);
if (OldBitmap) DeleteObject(OldBitmap);
}