標籤:位元影像
1 位元影像的使用1.1位元影像介紹
位元影像—通過儲存在映像上每個點的顏色,產生響應的位元影像檔案。
光柵圖:映像點陣的儲存
向量圖:繪圖命令的儲存。
1.2位元影像的使用
1、 載入位元影像資源
LoadBitap();
2、 建立防止位元影像的DC
CreateCompatibleDC
3、 將位元影像放入建立的DC
SlectObject
4、 繪製位元影像到當前DC中
BitBlt
5、 取出位元影像
SlectObject
6、 刪除建立的位元影像DC
DeleteDC
7、 刪除位元圖資源
DeleteOject
// WinBmp.cpp : 定義應用程式的進入點。//#include "stdafx.h"#include "WinBmp.h"#define MAX_LOADSTRING 100// 全域變數:HINSTANCE hInst;// 當前執行個體TCHAR szTitle[MAX_LOADSTRING];// 標題列文本TCHAR szWindowClass[MAX_LOADSTRING];// 主視窗類名// 此代碼模組中包含的函數的前向聲明:ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代碼。MSG msg;HACCEL hAccelTable;// 初始化全域字串LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_WINBMP, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 執行應用程式初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINBMP));// 主訊息迴圈:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;}//// 函數: MyRegisterClass()//// 目的: 註冊視窗類別。//// 注釋://// 僅當希望// 此代碼與添加到 Windows 95 中的“RegisterClassEx”// 函數之前的 Win32 系統相容時,才需要此函數及其用法。調用此函數十分重要,// 這樣應用程式就可以獲得關聯的// “格式正確的”小表徵圖。//ATOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINBMP));wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= MAKEINTRESOURCE(IDC_WINBMP);wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassEx(&wcex);}//// 函數: InitInstance(HINSTANCE, int)//// 目的: 儲存執行個體控制代碼並建立主視窗//// 注釋://// 在此函數中,我們在全域變數中儲存執行個體控制代碼並// 建立和顯示主程式視窗。//BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ HWND hWnd; hInst = hInstance; // 將執行個體控制代碼儲存在全域變數中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE;}void OnPaint(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){PAINTSTRUCT ps = {‘\0‘};HDC hDc = BeginPaint(hWnd,&ps);//載入位元影像資源HBITMAP hBmp = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));//獲得位元影像的資訊BITMAP bmpInfo = {‘\0‘};GetObject(hBmp,sizeof(bmpInfo),&bmpInfo);//建立位元影像的DC.一個和指定的hDc相匹配的DC(DC中包含的資訊一致)HDC hBmpDC = CreateCompatibleDC(hDc);//將位元影像放入hBmpDcHBITMAP hOldBmp = (HBITMAP) SelectObject(hBmpDC,hBmp);/*繪製位元影像 * BOOL BitBlt( * HDC hdcDest,//繪製的目的DC控制代碼 * int nXDest,//繪製的目的左上x座標 * int nYDest,//繪製的目的左上Y座標 * int nWidth,//繪製的目的寬 * int nHeight,//繪製的目的高 * HDC hdcSrc,//需要繪製的DC控制代碼 * int nXSrc,//需要繪製的原圖的起始X座標 * int nYSrc,//需要繪製的原圖的起始Y座標 * DWORD dwRop);//繪圖的方式 */BitBlt(hDc,100,100,100,100,hBmpDC,0,0,SRCCOPY);/*位元影像的展開函數 */StretchBlt(hDc,200,200,200,200,hBmpDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);//取出位元影像SelectObject(hBmpDC,hOldBmp);//刷出DCDeleteDC(hBmpDC);//刪除位元圖DeleteObject(hBmp);EndPaint(hWnd,&ps);}//// 函數: WndProc(HWND, UINT, WPARAM, LPARAM)//// 目的: 處理主視窗的訊息。//// WM_COMMAND- 處理應用程式菜單// WM_PAINT- 繪製主視窗// WM_DESTROY- 發送退出訊息並返回////LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;switch (message){case WM_PAINT:OnPaint(hWnd,message,wParam,lParam);break;case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// 分析菜單選擇:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// “關於”框的訊息處理常式。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;}
2 座標系和映射模式2.1座標系2.1.1裝置座標系
裝置座標系以像素為單位,X正方向從左往右,Y正方向從上往下
螢幕座標系:以螢幕的左上方為原點。
視窗座標系:以視窗最外邊框的左上方為原點。
客戶區座標系:以視窗內的客戶區的左上方為原點。
2.1.2邏輯座標系
以邏輯單位定義座標系,繪圖過程中使用的座標基本是以邏輯座標系繪製。預設情況下和裝置座標系保持一致,但是可以修改。
2.2映射模式
邏輯座標和裝置座標之間的映射關係
2.2.1映射模式的種類
MM_TEXT ==預設的映射方式,邏輯座標系和裝置座標系一致。
MM_LOMETRIC – 0.1MM X 方向向右,Y方向向左
MM_HIMETRIC – 0.01MM X方向想右邊,Y方向向左
MM_LOEGLISH – 0.1in, X方向想右邊,Y方向向左
MM_HIENGLISH – 0.01in X方向想右邊,Y方向向左
MM_TWIPS – 1/1440/in X方向想右邊,Y方向向左
MM_ISOROPIC – 可以指定邏輯單位XY的正方向
X軸單位= Y軸的單位
MM_ANISOTROPIC – 可以指定邏輯單位和XY正方向X軸單位與Y軸單位可以不相等
2.2.2映射模式的使用
1、 設定新的映射模式
setMapMode();返回原來舊的映射方式
2、 繪圖
3、 恢複新的映射模式
setMapMode();