首页 > 代码库 > 走进windows编程的世界-----位图及映射模式
走进windows编程的世界-----位图及映射模式
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]; // 主窗口类名 // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(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); //将位图放入hBmpDc HBITMAP 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); //刷出DC DeleteDC(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();