很久都没写博客了,前段时间ACM那些题都是有空的时候水着玩的,虽然大二的课只有6门,但是作业很多,也一直很忙,刚刚都才完成一个电路设计的实验报告。准备TOEFL,GRE,还要跟着导师做计算机视觉的一些东西,脑细胞死一大片。最近又要用到Windows编程,高中的时候看《Windows程序设计 第五版 珍藏版》学的东西也都忘得差不多了,但是思路还在,只是查MSDN查得很多。既然要处理位图,那得先加载咯。

  直接上代码:

  1 #include <windows.h>
  2 #include <tchar.h>
  3 #include "resource.h"
  4 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  5 void LoadBMPFile(HWND, HDC, TCHAR *);               //加载位图
  6 TCHAR * openFileDialog(HWND);              //打开文件对话框
  7
  8 OPENFILENAME ofn;
  9 TCHAR szFile[MAX_PATH];
 10
 11 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
 12 {
 13     WNDCLASSEX wcex; //声明窗口类
 14     HWND hwnd;
 15     MSG msg;
 16     TCHAR szWindowClass[] = TEXT("helloworld");
 17     TCHAR szTitle[] = TEXT("My Windows");
 18
 19     //窗口类定义
 20     wcex.cbSize = sizeof(WNDCLASSEX);
 21     wcex.style = CS_HREDRAW | CS_VREDRAW;
 22     wcex.lpfnWndProc = WndProc;
 23     wcex.cbClsExtra = 0;
 24     wcex.cbWndExtra = 0;
 25     wcex.hInstance = hInstance;
 26     wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
 27     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
 28     wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 29     wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
 30     wcex.lpszClassName = szWindowClass;
 31     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
 32
 33     //注册窗口类
 34     if (!RegisterClassEx(&wcex))
 35     {
 36         MessageBox(NULL, TEXT("窗口注册失败"), TEXT("窗口注册"), NULL);
 37         return 1;
 38     }
 39
 40     //创建窗口
 41     hwnd = CreateWindow(
 42         szWindowClass,
 43         szTitle,
 44         WS_OVERLAPPEDWINDOW,
 45         CW_USEDEFAULT,
 46         CW_USEDEFAULT,
 47         CW_USEDEFAULT,
 48         CW_USEDEFAULT,
 49         NULL,
 50         NULL,
 51         hInstance,
 52         NULL
 53         );
 54     //显示窗口
 55     ShowWindow(hwnd, nCmdShow);
 56     UpdateWindow(hwnd);
 57
 58     //消息循环
 59     while (GetMessage(&msg, NULL, 0, 0))
 60     {
 61         TranslateMessage(&msg);
 62         DispatchMessage(&msg);
 63     }
 64
 65     return (int)msg.wParam;
 66 }
 67
 68 //窗口过程
 69 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 70 {
 71     HDC hdc;
 72     PAINTSTRUCT ps;
 73     static int count = 0;  //用于统计加载次数
 74     static TCHAR * path;
 75
 76     switch (message)
 77     {
 78     case WM_COMMAND:
 79         switch (LOWORD(wParam))
 80         {
 81         case ID_FILE_OPEN:           //这个地方的处理不太恰当,每次重画都会重新打开一遍位图文件,而不是保存在内存中,等到打开另一张图片再释放。
 82             path = openFileDialog(hwnd);
 83             hdc = GetDC(hwnd);
 84             LoadBMPFile(hwnd, hdc, path);
 85             ReleaseDC(hwnd, hdc);
 86             count++;
 87             break;
 88
 89         case ID_FILE_EXIT:
 90             PostQuitMessage(0);
 91             break;
 92         }
 93         break;
 94     case WM_DESTROY:
 95         PostQuitMessage(0);
 96         break;
 97
 98     case WM_SIZE:
 99         InvalidateRect(hwnd, NULL, TRUE);
100         break;
101
102     case WM_PAINT:
103         hdc = BeginPaint(hwnd, &ps);
104         if(count)
105             LoadBMPFile(hwnd, hdc, path);
106         EndPaint(hwnd, &ps);
107         break;
108
109     default:
110         return DefWindowProc(hwnd, message, wParam, lParam);
111         break;
112     }
113     return 0;
114 }
115
116 void LoadBMPFile(HWND hwnd, HDC hdc, TCHAR * path)
117 {
118     HDC hdcMem;
119     HBITMAP hBmp;       //位图句柄
120     BITMAP bmp;
121     RECT clientRect;
122     int x, y;
123
124     hdcMem = CreateCompatibleDC(hdc);       //创建一个与指定设备兼容的内存设备上下文环境
125     hBmp = (HBITMAP)LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
126     GetObject(hBmp, sizeof(BITMAP), &bmp);      //得到一个位图图像
127
128     GetClientRect(hwnd, &clientRect);
129     x = (clientRect.left + clientRect.right) / 2 - bmp.bmWidth / 2;
130     y = (clientRect.left + clientRect.bottom) / 2 - bmp.bmHeight / 2;
131     SelectObject(hdcMem, hBmp);
132     BitBlt(hdc, x, y, bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY);
133     //SetStretchBltMode(hdc, HALFTONE);
134     //StretchBlt(hdc, 0, 0, bmp.bmWidth-100, bmp.bmHeight-100, hdcMem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
135     DeleteDC(hdcMem);
136     DeleteObject(hBmp);
137 }
138
139 //打开文件对话框
140 TCHAR * openFileDialog(HWND hwnd)
141 {
142     // Initialize OPENFILENAME
143     ZeroMemory(&ofn, sizeof(ofn));
144     ofn.lStructSize = sizeof(ofn);
145     ofn.hwndOwner = hwnd;
146     ofn.lpstrFile = szFile;
147     ofn.lpstrFile[0] = '\0';
148     // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
149     // use the contents of szFile to initialize itself.
150     //
151     ofn.nMaxFile = sizeof(szFile);
152     ofn.lpstrFilter = _T("Text files (*.bmp)\0*.bmp\0\0");
153     ofn.nFilterIndex = 1;
154     ofn.lpstrFileTitle = NULL;
155     ofn.nMaxFileTitle = 0;
156     ofn.lpstrInitialDir = NULL;
157     ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
158     ofn.lpstrTitle = _T("打开");
159
160     GetOpenFileName(&ofn);
161     return (TCHAR*)ofn.lpstrFile;
162 }

因为用到菜单资源,下面是resource.h文件的内容

 1 //{{NO_DEPENDENCIES}}
 2 // Microsoft Visual C++ generated include file.
 3 // Used by LoadBMPFile.rc
 4 //
 5 #define IDR_MENU1                       101
 6 #define ID_FILE_OPEN                    40001
 7 #define ID_FILE_EXIT                    40002
 8
 9 // Next default values for new objects
10 //
11 #ifdef APSTUDIO_INVOKED
12 #ifndef APSTUDIO_READONLY_SYMBOLS
13 #define _APS_NEXT_RESOURCE_VALUE        102
14 #define _APS_NEXT_COMMAND_VALUE         40003
15 #define _APS_NEXT_CONTROL_VALUE         1001
16 #define _APS_NEXT_SYMED_VALUE           101
17 #endif
18 #endif

下面是菜单资源文件内容:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS
/////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"/////
#undef APSTUDIO_READONLY_SYMBOLS/////
// Chinese (Simplified, PRC) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED#ifdef APSTUDIO_INVOKED
/////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN"resource.h\0"
END2 TEXTINCLUDE
BEGIN"#include ""winres.h""\r\n""\0"
END3 TEXTINCLUDE
BEGIN"\r\n""\0"
END#endif    // APSTUDIO_INVOKED/////
//
// Menu
//

IDR_MENU1 MENU
BEGINPOPUP "File"BEGINMENUITEM "Open",                        ID_FILE_OPENMENUITEM "Exit",                        ID_FILE_EXITEND
END#endif    // Chinese (Simplified, PRC) resources
/////
#ifndef APSTUDIO_INVOKED
/////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////
#endif    // not APSTUDIO_INVOKED

转载于:https://www.cnblogs.com/Artprog/p/4903255.html

Windows API(非MFC)编程加载位图相关推荐

  1. 基于对话框的MFC程序加载位图为背景图案

    from: http://rwsk.snnu.edu.cn/?uid-156-action-viewspace-itemid-240 先载入一张图片 ,ID 为 IDB_BITMAP2 TestDlg ...

  2. java做windows屏保_java编程加载窗口,制作动画(屏保泡泡)

    1.整体的结构图: 2.编写GameFrame02.java代码: package cn.bjsxt.test; import java.awt.Frame; import java.awt.Grap ...

  3. 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入

    成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...

  4. MFC加载位图和图标

    MFC加载位图和图标 | 火苗999℃的博客 从文件加载位图 #pragma once// ZBitmap从文件加载位图资源 class ZBitmap { private:HBITMAP m_hBi ...

  5. win32汇编--加载位图(bmp)资源

    本例通过静态(static)控件的SS_BITMAP属性来加载位图: 核心代码如下:(完整工程下载) 转载于:https://www.cnblogs.com/wbbice/archive/2012/0 ...

  6. VC++图片框控件静态和动态加载位图

    win10,vc6:新建一个对话框工程:右击资源文件夹,插入...: 类型,Bitmap:引入:选择一个bmp图片: 插入后如下:自动给了一个id: 图片框属性:类型,下拉选中 位图: 图像属性,选中 ...

  7. [OpenGL]自己写的加载位图并转换成纹理的两个函数

    这学期初接触OpenGL,本来就是要跟图形学同时学的东西,不过本人太懒,并没有把OpenGL跟进上.虽然对于其中的算法算是有所了解,不过细节的东西估计要歇菜了,外加考试那天出了点事故,默哀一下我的图形 ...

  8. 小米妙享中心非小米电脑加载失败电脑能发现手机,手机能发现电脑,无法打开镜像画面,无法打开最近文件,能够看到但是无法打开,无法流转应用,无法共享屏幕

    小米妙享中心非小米电脑加载失败电脑能发现手机,手机能发现电脑,无法打开镜像画面,无法打开最近文件,能够看到但是无法打开,无法流转应用,无法共享屏幕 安装妙享中心pc版 这里开始是解决无法镜像,流转失败 ...

  9. Windows Phone开发之路(14) 加载位图

    除了文本之外,位图是Silverlight程序中最常见的对象之一,通常我们将其定义为与图形显示设备的像素相对应的二维比特(bit)数组. Windows原生的位图文件的扩展名是bmp,但是近年它已不占 ...

最新文章

  1. java海康sdk_java 集成 海康 SDK
  2. 中国雪糕红黑榜,谁才是Top 1
  3. 哈希表的详细介绍 -转载
  4. 消息队列MQ/JMS/Kafka,你都了解多少?
  5. SpringMVC的请求-文件上传-单文件上传的代码实现1
  6. 轻松理解spring IOC
  7. HttpService远程校验
  8. 从远程(包括ftp,http等协议)地址获取文件流信息
  9. 领导:“请在今晚进行网络系统升级”
  10. SQL SERVER 和EXCEL的数据导入导出
  11. 拼音字母搜索匹配汉字
  12. 海伦公式——初中数学证明
  13. java面试题——常见项目真实面试题(实际面试被问到)
  14. 谷歌及360浏览器插件制作
  15. pip install -U里面的-U是什么意思
  16. 51单片机入门学习篇-led灯、按键、数码管、中断
  17. 静态对象、全局对象与程序的运行机制
  18. Uniapp低功耗蓝牙操作实例
  19. 给Revit中的Button添加动画和图片
  20. CSS——伪类选择器

热门文章

  1. 常见的爬虫分析库(1)-Python3中Urllib库基本使用
  2. 参加kaggle比赛
  3. AD服务器不愿意处理该请求
  4. 71道经典Android面试题和答案
  5. Blink, 通向哈里·波特的魔法世界
  6. jQuery EasyUI API 中文文档 - 文档
  7. PHP 正在干掉 Python
  8. 数据科学最常用流程CRISP-DM,终于有人讲明白了
  9. OMG!这1010本书的书名都是什么鬼?
  10. STM32之串口例程