調色盤和點陣圖物件

来源:百度文库 编辑:神马文学网 时间:2024/04/28 01:05:56

調色盤和點陣圖物件
 

程式16-17中的SHOWDIB7程式顯示了如何使用與DIB相關聯的調色盤,這些DIB是使用CreateDIBitmap函式轉換成GDI點陣圖物件的。

 程式16-17  SHOWDIB7SHOWDIB7.C/*--------------------------------------------------------------------------SHOWDIB7.C -- Shows DIB converted to DDB(c) Charles Petzold, 1998----------------------------------------------------------------------------*/#include #include "..\\ShowDib3\\PackeDib.h"#include "resource.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;TCHAR szAppName[] = TEXT ("ShowDib7") ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){HWND     hwnd ;MSG      msg ;WNDCLASS wndclass ;wndclass.style         = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc   = WndProc ;wndclass.cbClsExtra    = 0 ;wndclass.cbWndExtra    = 0 ;wndclass.hInstance     = hInstance ;wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName  = szAppName ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName, TEXT ("Show DIB #7: Converted to DDB"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){static HBITMAP     hBitmap ;static HPALETTE     hPalette ;static int          cxClient, cyClient ;static OPENFILENAME     ofn ;static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")TEXT ("All Files (*.*)\0*.*\0\0") ;BITMAP              bitmap ;BITMAPINFO           *pPackedDib ;HDC                 hdc, hdcMem ;PAINTSTRUCT         ps ;switch (message){caseWM_CREATE:ofn.lStructSize       = sizeof (OPENFILENAME) ;ofn.hwndOwner         = hwnd ;ofn.hInstance         = NULL ;ofn.lpstrFilter       = szFilter ;ofn.lpstrCustomFilter = NULL ;ofn.nMaxCustFilter    = 0 ;ofn.nFilterIndex      = 0 ;ofn.lpstrFile         = szFileName ;ofn.nMaxFile          = MAX_PATH ;ofn.lpstrFileTitle    = szTitleName ;ofn.nMaxFileTitle     = MAX_PATH ;ofn.lpstrInitialDir   = NULL ;ofn.lpstrTitle        = NULL ;ofn.Flags             = 0 ;ofn.nFileOffset       = 0 ;ofn.nFileExtension    = 0 ;ofn.lpstrDefExt       = TEXT ("bmp") ;ofn.lCustData         = 0 ;ofn.lpfnHook          = NULL ;ofn.lpTemplateName    = NULL ;return 0 ;case WM_SIZE:cxClient = LOWORD (lParam) ;cyClient = HIWORD (lParam) ;return 0 ;case WM_COMMAND:switch (LOWORD (wParam)){case IDM_FILE_OPEN:// Show the File Open dialog boxif (!GetOpenFileName (&ofn))return 0 ;// If there's an existing packed DIB, free the memoryif (hBitmap){DeleteObject (hBitmap) ;hBitmap = NULL ;}// If there's an existing logical palette, delete itif (hPalette){DeleteObject (hPalette) ;hPalette = NULL ;}// Load the packed DIB into memorySetCursor (LoadCursor (NULL, IDC_WAIT)) ;ShowCursor (TRUE) ;pPackedDib = PackedDibLoad (szFileName) ;ShowCursor (FALSE) ;SetCursor (LoadCursor (NULL, IDC_ARROW)) ;if (pPackedDib){// Create palette from the DIB and select it into DChPalette = PackedDibCreatePalette (pPackedDib) ;hdc = GetDC (hwnd) ;if (hPalette){SelectPalette (hdc, hPalette, FALSE) ;RealizePalette (hdc) ;}// Create the DDB from the DIBhBitmap = CreateDIBitmap(hdc,(PBITMAPINFOHEADER) pPackedDib,CBM_INIT,PackedDibGetBitsPtr (pPackedDib),pPackedDib, DIB_RGB_COLORS) ;ReleaseDC (hwnd, hdc) ;// Free the packed-DIB memoryfree (pPackedDib) ;}else{MessageBox (hwnd, TEXT ("Cannot load DIB file"),szAppName, 0) ;}InvalidateRect (hwnd, NULL, TRUE) ;return 0 ;}break ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;if (hPalette){SelectPalette (hdc, hPalette, FALSE) ;RealizePalette (hdc) ;}if (hBitmap){GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;hdcMem = CreateCompatibleDC (hdc) ;SelectObject (hdcMem, hBitmap) ;BitBlt (hdc,0,0,bitmap.bmWidth, bitmap.bmHeight,hdcMem,0,0,SRCCOPY) ;DeleteDC (hdcMem) ;}EndPaint (hwnd, &ps) ;return 0 ;case WM_QUERYNEWPALETTE:if (!hPalette)return FALSE ;hdc = GetDC (hwnd) ;SelectPalette (hdc, hPalette, FALSE) ;RealizePalette (hdc) ;InvalidateRect (hwnd, NULL, TRUE) ;ReleaseDC (hwnd, hdc) ;return TRUE ;case WM_PALETTECHANGED:if (!hPalette || (HWND) wParam == hwnd)break ;hdc = GetDC (hwnd) ;SelectPalette (hdc, hPalette, FALSE) ;RealizePalette (hdc) ;UpdateColors (hdc) ;ReleaseDC (hwnd, hdc) ;break ;case WM_DESTROY:if (hBitmap)DeleteObject (hBitmap) ;if (hPalette)DeleteObject (hPalette) ;PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}
 SHOWDIB7.RC (摘錄)//Microsoft Developer Studio generated resource script.#include "resource.h"#include "afxres.h"/////////////////////////////////////////////////////////////////////////////// MenuSHOWDIB7 MENU DISCARDABLEBEGINPOPUP "&File"BEGINMENUITEM "&Open",  IDM_FILE_OPENENDEND
 RESOURCE.H (摘錄)// Microsoft Developer Studio generated include file.// Used by ShowDib7.rc#define IDM_FILE_OPEN      40001

與前面的程式一樣,SHOWDIB7獲得了一個指向packed DIB的指標,該DIB回應功能表的「File」、「Open」命令。程式從packed DIB建立了調色盤,然後-還是在WM_COMMAND訊息的處理過程中-獲得了用於視訊顯示的裝置內容,並選進調色盤,顯現調色盤。然後SHOWDIB7呼叫CreateDIBitmap以便從DIB建立DDB。如果調色盤沒有選進裝置內容並顯現,那麼CreateDIBitmap建立的DDB將不使用邏輯調色盤中的附加顏色。

呼叫CreateDIBitmap以後,該程式將釋放packed DIB佔用的記憶體空間。pPackedDib變數不是靜態變數。相反的,SHOWDIB7按靜態變數保留了點陣圖代號(hBitmap)和邏輯調色盤代號(hPalette)。

在WM_PAINT訊息處理期間,調色盤再次選進裝置內容並顯現。GetObject函式可獲得點陣圖的寬度和高度。然後,程式通過建立相容的記憶體裝置內容在顯示區域顯示點陣圖,選進點陣圖,並執行BitBlt。顯示DDB時所用的調色盤,必須與從CreateDIBitmap呼叫建立時所用的一樣。

如果將點陣圖複製到剪貼簿,則最好使用packed DIB格式。然後Windows可以將點陣圖物件提供給希望使用這些點陣圖的程式。然而,如果需要將點陣圖物件複製到剪貼簿,則首先要獲得視訊裝置內容並顯現調色盤。這允許Windows依據目前的系統調色盤將DDB轉換為DIB。