Visual C++——LoadBitmap加载位图的操作过程
生活随笔
收集整理的這篇文章主要介紹了
Visual C++——LoadBitmap加载位图的操作过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基本概念
位圖:位圖圖像(bitmap),亦稱為點陣圖像或柵格圖像,是由稱作像素(圖片元素)的單個點組成的。這些點可以進行不同的排列和染色以構成圖樣。當放大位圖時,可以看見賴以構成整個圖像的無數單個方塊。擴大位圖尺寸的效果是增大單個像素,從而使線條和形狀顯得參差不齊。然而,如果從稍遠的位置觀看它,位圖圖像的顏色和形狀又顯得是連續的。用數碼相機拍攝的照片、掃描儀掃描的圖片以及計算機截屏圖等都屬于位圖。位圖的特點是可以表現色彩的變化和顏色的細微過渡,產生逼真的效果,缺點是在保存時需要記錄每一個像素的位置和顏色值,占用較大的存儲空間。
位圖的操作過程
DEMO源代碼
?Visual C++版本
?Visual Sudio 2019版本
// 2018329621200_申屠志剛_Win32Application_7-2.cpp : 定義應用程序的入口點。 //#include "framework.h" #include "2018329621200_申屠志剛_Win32Application_7-2.h"#define MAX_LOADSTRING 100// 全局變量: HINSTANCE hInst; // 當前實例 WCHAR szTitle[MAX_LOADSTRING]; // 標題欄文本 WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口類名 HBITMAP hBm; BITMAP bm; HDC hdc, hdcmem; // 此代碼模塊中包含的函數的前向聲明: 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 wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdShow) {UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此處放置代碼。// 初始化全局字符串LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadStringW(hInstance, IDC_MY2018329621200WIN32APPLICATION72, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 執行應用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY2018329621200WIN32APPLICATION72));MSG msg;// 主消息循環:while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam; }// // 函數: MyRegisterClass() // // 目標: 注冊窗口類。 // ATOM MyRegisterClass(HINSTANCE hInstance) {WNDCLASSEXW 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_MY2018329621200WIN32APPLICATION72));wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_MY2018329621200WIN32APPLICATION72);wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassExW(&wcex); }// // 函數: InitInstance(HINSTANCE, int) // // 目標: 保存實例句柄并創建主窗口 // // 注釋: // // 在此函數中,我們在全局變量中保存實例句柄并 // 創建和顯示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {hInst = hInstance; // 將實例句柄存儲在全局變量中HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);if (!hWnd){return FALSE;}//加載或創建位圖hBm = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3));GetObject(hBm, //為位圖句柄sizeof(BITMAP), //BITMAP結構的大小(LPVOID)&bm //BITMAP結構的地址);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE; }// // 函數: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目標: 處理主窗口的消息。 // // WM_COMMAND - 處理應用程序菜單 // WM_PAINT - 繪制主窗口 // WM_DESTROY - 發送退出消息并返回 // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;switch (message){case WM_CREATE:hdc = GetDC(hWnd); //獲取設備環境句柄hdcmem = CreateCompatibleDC(hdc);//內存設備環境句柄ReleaseDC(hWnd, hdc); //釋放設備環境句柄case WM_COMMAND:{int wmId = LOWORD(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_PAINT:{HDC hdc = BeginPaint(hWnd, &ps);// TODO: 在此處添加使用 hdc 的任何繪圖代碼...WCHAR lpsz[] = _T("測試");TextOut(hdc, 0, 0, lpsz, wcslen(lpsz));//輸出文本SelectObject(hdcmem, hBm); //將位圖選入內存設備環境//將內存設備環境中的位圖拷貝到設備環境中BitBlt(hdc, 180, 80, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY);TextOut(hdc, 0, 0, lpsz, wcslen(lpsz));//輸出文本EndPaint(hWnd, &ps);}break;case WM_DESTROY:DeleteObject(hBm);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; }?運行結果
注意事項
1、資源ID無引號。
2、確保添加位圖到resource.h中。
參考資料
Visual C++ 面向對象與可視化程序設計(第2版)——黃維通
參考文章
https://www.cnblogs.com/tupx/archive/2013/08/27/3284546.html
https://blog.csdn.net/lxw907304340/article/details/45501899
總結
以上是生活随笔為你收集整理的Visual C++——LoadBitmap加载位图的操作过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual C++——无法响应WM_L
- 下一篇: 汇编语言 + Visual Studio