靜態框顯示圖像

其實VC中的Pictrue控件和靜態框控件都是一樣的,只不過它們的屬性不同罷了。

如果在靜態框裏面顯示圖像呢?

靜態框,CStatic有一個函數SetBitmap,可以使用這個函數設置靜態框中的圖像,詳見MSDN

但是靜態框顯示圖像是有條件的,不用作深入的介紹,簡單的說一下用法。

//假設一個靜態框和一個變量m_picture關聯(當然要修改ID號)

可以在對話框初始化函數中修改靜態框的屬性,使其支持圖像的顯示:

m_picture.ModifyStyle(0, SS_BITMAP, 0);

 

這樣就可以在其它地方使用SetBitmap函數修改與靜態框關聯的圖像了

HBITMAP hBmp = GetBitmap();//GetBitmap自己寫的返回圖像句柄的函數,等會兒說

HBITMAP hOldBmp = m_picture.SetBitmap(hBmp);//我沒有驗證hBmp的有效性,當然如果hBmp爲NULL的話,也不會出錯,

//靜態框會取消與原來圖像的關聯,什麼圖像都不畫。

if (NULL != hOldBmp)

{

     ::DeleteObject(hOldBmp);//hOldBmp是SetBitmap函數返回的原來與靜態框關聯的圖像句柄

}

 

在銷燬對話框的函數(OnDestroy)中加上:

HBITMAP hBmp = m_picture.GetBitmap();

if (NULL != hBmp)

{

      ::DeleteObject(hBmp);

}

 

已經結束了,就這麼多!

現在說說那個GetBitmap函數怎麼寫:

載入圖像的方法很多,可以用LoadBitmap或者LoadImage函數

這兩個函數在MSDN上面解釋的都很詳細,我想說說不用SDK API,用大家常用的一個開源圖像庫CxImage

CxImage在網上介紹的也很多,不說用法,就說說怎麼做一個等價於GetBigmap的函數(其實網上也有)

CxImage img;

CString strPhotoPath = "Your image path";

if (false == img.Load(strPhotoPath))

{

MessageBox("無法載入源圖像", "Error", MB_OK);

}

else

{

CDC *pDC = m_picture.GetDC();

HBITMAP hPhoto = img.MakeBitmap(pDC->GetSafeHdc());//這就是那個相當於GetBitmap的函數

if (NULL != hPhoto)

{

m_picture.SetBitmap(hPhoto);

}

m_picture.ReleaseDC(pDC);

}

 

基本上沒有問題了,但是實際使用時有時還是會有莫名其妙的問題,今天就遇到了,我的控件被其他人改成了Center屬性,結果怎麼調就是不顯示圖像,

最後改成Left對齊,圖像成功顯示,讓人很鬱悶。

 

還有最後一個問題,就是這個:m_picture.ModifyStyle(0, SS_BITMAP, 0);

修改屬性時,第二個參數有兩個可選:一個是SS_BITMAP,另一個就是SS_CENTERIMAGE

兩個能同時用,SS_BITMAP | SS_CENTERIMAGE,

這是MSDN上的解釋:

SS_BITMAP   Use this style always for bitmaps.很短,就不用解釋了

 

SS_CENTERIMAGE   Use to center in the static control. If the image is larger than the static control, 

it will be clipped. If it is smaller than the static control, the empty space around the image will be 

filled by the color of the pixel in the upper left corner of the bitmap.

簡單的說一下,不知道準確不準確:這個屬性用來在靜態控件中居中顯示。如果圖像比靜態控件大,就會被剪切。如果比靜態控件小,

圖像周圍的空白部分會使用位圖左上角的顏色填充。

 

結束!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章