走進windows編程的世界-----位元影像及映射模式

來源:互聯網
上載者:User

標籤:位元影像

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();


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.