1. 程式人生 > >vc6.0 圖片顯示(個人筆記)

vc6.0 圖片顯示(個人筆記)

公司專案,要求做一個裝置執行的動畫。我首先做了一個圖片,發現vc6.0上的picture控制元件不支援真彩色

顯示。於是個人在網上搜了很多資料,這裡做一個關於vc6.0圖片顯示的總結。方便自己,也方便他人。

總結的工程程式碼下載地址:http://download.csdn.net/detail/yongan1006/9507347

這篇文章,我分為以下幾步:

       1.如何顯示256色以下的圖片

        2.bmp格式圖片檔案介紹

       3.顯示真彩色圖片       

4.其它方面

1.如何顯示256色以下的圖片

     1.1使用picture控制元件。將picture控制元件的屬性改成點陣圖。插入點陣圖資源,並將點陣圖資源ID,選到picture控制元件

            屬性中(示例工程程式碼中,右鍵DIALOGUE1)

      1.2 使用訊息wm_ctlcolor,在這個訊息中返回一個自定義的畫刷。(示例工程中,主介面的背景顯示

             的就是一幅圖)。這種方法也可以顯示真彩色的點陣圖。真彩色的點陣圖,也可以插入到點陣圖資源編輯器

中。只是資源編輯器無法顯示。但是不影響後面的程式對其ID的引用。

            這種方法有侷限性。使用這個訊息的控制元件有CTLCOLOR_DLG 對話方塊
CTLCOLOR_EDIT 編輯框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 訊息框
CTLCOLOR_SCROLLBAR 滑動條
CTLCOLOR_STATIC 靜態文字框、矩形等。

         此方法不適用於按紐控制元件。

2.bmp格式圖片檔案介紹

    這裡上一個圖片,更加具體的介紹請參看網址:http://www.docin.com/p-1304460575.html

    還有一個要說明的是,真彩色的bmp圖片,調色盤這一項是沒有的。

3.顯示真彩色圖片 

    我的示例工程中,右鍵DIALOGUE2,展示的是如何用picture控制元件來顯示真彩色圖片。右鍵DIALOG3展示的

     是如何用cdc來繪製真彩色圖片。

   3.1 picture控制元件來顯示真彩色圖片。

         這裡我是從cstatic上繼承出了一個子類CPicBtn。子類中重寫了函式PreSubclassWindow()。本來我是想

初始化一些東西,這些程式碼最好寫在類似於onInitDialogue中訊息響應函式中。可惜cstatic上沒有

WM_INITDIALOGUE的類似訊息。

網上大牛,可寫了一些總結關於PreSubclassWindow()和PreclassWindow()的。這裡我就貼個結論出來。

具體參看:http://blog.csdn.net/liu_cheng_ran/article/details/7571843


3.2 cdc來繪製真彩色圖片

             程式碼中在WM_PAINT訊息響應函式中,使用了三種方法。分別呼叫了函式BitBlt(),StretchBlt(),

StretchDIBits()。

             BitBlt()只是貼上了原圖,StretchBlt()函式可以對原圖進行拉伸和縮放,以適應顯示視窗的大小。

它們的操作物件是載入了點陣圖的cdc物件。 StretchDIBits()操作的是原圖的記憶體。它需要bmp的

點陣圖資料。要求的引數多一些。但是這些資訊,都可以通過CBitmap的物件

 方法GetBitmap(),GetDIBits()直接或間接獲取。

            另外注意到呼叫StretchBlt()函式之前 呼叫了 SetStretchBltMode()函式。它的作用是防止顏色失真。

但是呼叫SetStretchBltMode()函式,還需要再呼叫SetBrushOrgEx()保證cdc工作的初始位置正確。

4.其它方面

   寫程式時,會需要一些轉化。

         4.1  CDC和HDC的區別與轉換

獲取cdc

CDC* pDC
pDC=GetDC();

獲取hdc

HDC hDC;
hDC=pDC->m_hDC;

hDC=GetSafeHDC(pDC);

hDC=::GetDC(HWND handle)

轉化
CDC* pDC
HDC hDC;
pDC=Attach(hDC);
hDC=GetSafeHDC(pDC);
pDC->m_hDC==hDC

     4.2視窗ID,控制代碼,指標三者相互轉換函式
ID--HANDLE--HWND三者之間的互相轉換
===============
id->控制代碼
hWnd = ::GetDlgItem(hParentWnd,id);
===============
id->指標
CWnd::GetDlgItem();
===============
控制代碼->id
id = GetWindowLong(hWnd,GWL_ID);
===============
控制代碼->指標
CWnd *pWnd=CWnd::FromHandle(hWnd);
===============
指標->ID
id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
=================
指標->控制代碼
hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;