明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

VC中如何在對話框上顯示位圖

[摘要]在用VC開發(fā)應(yīng)用程序的時候,經(jīng)常要在對話框上顯示位圖。如果把位圖加入資源中,當(dāng)然是省時省力,但程序卻也增肥不少,并且失去了靈活性。而如果你要動態(tài)地顯示一大堆圖片,各個圖片大小不一,這豈不…本文就是介紹如何在對話框上顯示位圖,并且如何讓對話框自動適應(yīng)位圖的大小的。 ---- VC對位圖的操作比較煩瑣...
  在用VC開發(fā)應(yīng)用程序的時候,經(jīng)常要在對話框上顯示位圖。如果把位圖加入資源中,當(dāng)然是省時省力,但程序卻也增肥不少,并且失去了靈活性。而如果你要動態(tài)地顯示一大堆圖片,各個圖片大小不一,這豈不…本文就是介紹如何在對話框上顯示位圖,并且如何讓對話框自動適應(yīng)位圖的大小的。

---- VC對位圖的操作比較煩瑣,要顯示一個位圖到對話框上去,很麻煩。我在開發(fā)的過程中走通了兩條路:一是使用Kodak圖象編輯控件;二是利用Microsoft提供的例子中的一個類,并稍加改造。兩種方法各有優(yōu)缺點。我把它寫下來,以避免其他人多走彎路。

    一、利用控件

   利用WINDOWS98中帶的Kodak圖象編輯控件來在對話框上顯示一個位圖,雖然有點兒殺雞用牛刀的感覺,但卻不失為一個極方便快捷的方法。顧名思義,這個控件不但可以顯示,它更強大的功能還是在編輯圖象,它可以對圖象進行放大、縮小、標(biāo)注等操作。而且,使用起來很方便。但它畢竟是別人的東東,不太清楚它的底細,用起來就不免…我就吃了它的苦頭。在本機上調(diào)試通過,安裝了其他幾臺機器也很正常,但是有一臺卻顏色失真了,變成了水粉畫。不知是不是那臺機器的顯卡有問題。還有就是據(jù)我初步實驗,在95下好象行不通。不過現(xiàn)在大家都是WIN98,這似乎已經(jīng)不算一個問題了。下面就把我的過程寫下來:

  首先應(yīng)該保證系統(tǒng)中有這個控件。注意,它不能單獨使用,必須和其他幾個控件(特別是Imgcmn.dll)一同使用。如果沒有,從別的機器上copy過來即可。這幾個文件是Imgadmin.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll,把它們copy到windows\system目錄下,然后用regsvr32.exe將它們分別注冊。

  打開VC,新建一個基于對話框的工程(主要是為了說明方便),刪除掉對話框上其他的東西(按鈕和LABEL),在對話框上單擊右鍵,單擊Insert Activex control… 選擇Kodak圖象編輯控件,大小任意。

  在對話框上選中該控件,打開view classwizard,單擊Member Variables,點擊Add Variable…按鈕,系統(tǒng)會彈出一個對話框,大體上是提示你它要把控件加入工程中了,確定即可。在接下來的對話框上繼續(xù)點擊OK,此時,會出現(xiàn)一個對話框,提示你輸入變量名,輸入你想要的名字即可。我們輸入m_ctrlPicture。單擊確定。

  此時你的工程中已經(jīng)有了一個名字為m_ctrlPicture的控件,接下來就可以利用它來顯示圖片了,我們把它加到對話框的初始化中。單擊ClassWizard,選擇OnInitDialog,單擊Edit Code按鈕。

  在OnInitDialog中,找到// TODO: Add extra initialization here,在下面加入如下代碼:
m_ctrlPicture.SetImage("c:\\windows\Clouds.bmp");
m_ctrlPicture.Display();


  編譯運行,看到了嗎?就這么簡單。

  但是它的大小卻是固定的,要看全圖只能利用滾動條。下面我們再來得到圖象的尺寸,然后使對話框自動適應(yīng)圖象的大小。還是在初始化中,代碼如下:
m_ctrlPicture.SetImage("c:\\windows\\Clouds.bmp");
const int nAddConst=40;
//圖象尺寸不會正合適,需要加點增量。
long lPictureWidth=m_ctrlPicture.GetImageWidth();
long lPictureHeight=m_ctrlPicture.GetImageHeight();
MoveWindow(0,0,lPictureWidth,lPictureHeight,true);
    //改變對話框大小

    //改變控件的大小
m_ctrlPicture.MoveWindow(0,0,lPictureWidth,
lPictureHeight+nAddConst,true);
m_ctrlPicture.Display();

成功了。
注意,這個控件不但只能顯示bmp,還可顯示許多其他的格式,你可以自己試一下。
 

   二、利用Cdib類

  這個方法比較煩瑣,并且只能顯示bmp,但它不依賴特定的系統(tǒng),也比較實用。這個類在MSDN提供的例子中有,名字為ex10c.dsw,找到cdib.cpp和cdib.h,加入你的工程即可。如果你找不到,也可以到我的網(wǎng)頁去看看http://dlgis.topcool.net或者給我寫信ytdl@263.net。

---- 下面是過程:

新建一個基于對話框的工程,單擊Add Files to Project,加入上面所說的兩個文件。

在對話框的頭文件中加入#include "cdib.h",然后給對話框類加入一個成員變量,代碼如下: Cdib m_dibFile;

在對話框的初始化函數(shù)中,加入如下代碼:
#ifdef MEMORY_MAPPED_FILES
if (m_dibFile.AttachMapFile
("c:\\windows\\clouds.bmp",TRUE)==TRUE)
{ // share
Invalidate();
}
#else
CFile file;
file.Open("c:\\windows\\clouds.bmp",
Cfile::modeRead);
if (m_dibFile.Read(&file) == TRUE)
{
Invalidate();
}
#endif // MEMORY_MAPPED_FILES
CClientDC dc(this);
m_dibFile.SetSystemPalette(&dc);


在OnPaint函數(shù)中,找到else,然后在里面加入如下代碼:
BeginWaitCursor();
m_dibFile.UsePalette(GetDC());
CSize sizeFileDib = m_dibFile.GetDimensions();
m_dibFile.Draw(GetDC() ,CPoint(0,0), sizeFileDib);
EndWaitCursor();

  運行程序,是不是看到藍天白云了?!下面繼續(xù)加入讓對話框自動適應(yīng)圖片大小的代碼,還是在初始化中,緊接這上一次的代碼,加入如下兩行:
CSize sizeFileDib = m_dibFile.GetDimensions();
MoveWindow(0,0,sizeFileDib.cx,sizeFileDib.cy,true);

  完全顯示了嗎?也許不完全合適,你可以細微地調(diào)整cx,cy兩個參數(shù),使之適應(yīng)。