GDI编程
时间:2022-05-03
本文章向大家介绍GDI编程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
由于最近一直在搞GDI(GDI+)和图片处理的东西,怕自己忘记(其实已经忘得差不多),就仿照网上的BITMAPINFO查看器,写了个东西。
工程下载地址:点击打开链接
运行效果如图:
虽然比较(很)难看,但本人觉得图片显示那块还是做得不错的。嘿嘿。
图片显示的实现是:先把位图文件加载到内存当中(这里我很偷懒,没有任何检查!),然后通过双缓冲显示位图。为了能实现图片的移动,我是创建了两个兼容DC,先在一个兼容dc上做完所有的位拷贝再拷贝到窗口dc上,可能这里做的太麻烦了(毕竟技术菜啊)。
对话框头文件添加的内容有:
public:
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
BYTE* m_buf; //指向加载到内存的位图文件
BITMAPFILEHEADER* m_bmfh; //指向文件头
BITMAPINFO* m_bmi; //指向位图信息结构
BYTE* m_dibs; //指向dib数据
void Show(int x, int y); //显示位图
void TreeShow(void); //树形控件
int X; //X偏移
int Y; //Y偏移
CPoint old; //记录移动时的上一个点
BOOL flag; //标记鼠标左键是否被按下
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //左键
afx_msg void OnMouseMove(UINT nFlags, CPoint point); //移动
afx_msg void OnLButtonUp(UINT nFlags, CPoint point); //左键弹起
图片显示的关键代码:
void CBITMAP2Dlg::Show(int x, int y)
{
CDC* pdc = GetDlgItem(IDC_DDD)->GetDC();
CRect rect;
GetDlgItem(IDC_DDD)->GetWindowRect(&rect);
ScreenToClient(&rect);
CDC bk,kb;
bk.CreateCompatibleDC(pdc);
HBITMAP bmbk = CreateCompatibleBitmap(pdc->m_hDC,rect.Width(),rect.Height());
HBITMAP oldbm = (HBITMAP)bk.SelectObject(bmbk);
kb.CreateCompatibleDC(pdc);
HBITMAP bmkb = CreateDIBitmap(pdc->m_hDC,&m_bmi->bmiHeader,CBM_INIT,m_dibs,m_bmi,DIB_RGB_COLORS);
HBITMAP oldbm2 = (HBITMAP)kb.SelectObject(bmkb);
bk.BitBlt(0,0,rect.Width(),rect.Height(),NULL,0,0,WHITENESS);
bk.BitBlt(0,0,rect.Width(),rect.Height(),&kb,x,y,SRCCOPY);
pdc->BitBlt(0,0,rect.Width(),rect.Height(),&bk,0,0,SRCCOPY);
kb.SelectObject(oldbm2);
DeleteObject(bmkb);
DeleteDC(kb);
bk.SelectObject(oldbm);
DeleteObject(bmbk);
DeleteDC(bk.m_hDC);
ReleaseDC(pdc);
}
- 厚土Go学习笔记 | 10. 常量 与 数值常量
- Unity应用架构设计(7)——IoC工厂理念先行
- 厚土Go学习笔记 | 09. 类型转换 与 类型推导
- 厚积薄发,拥抱 .NET 2016
- 厚土Go学习笔记 | 08. 零值
- Unity应用架构设计(10)——绕不开的协程和多线程(Part 1)
- 代码审计|PHP代码执行函数进阶版实力上线了!
- Golang中巧用defer进行错误处理
- Unity应用架构设计(10)——绕不开的协程和多线程(Part 2)
- 厚土Go学习笔记 | 07. 基本类型
- Unity应用架构设计(11)——一个网络层的构建
- Go语言·Web调优详解
- Unity应用架构设计(12)——AOP思想的实践
- 厚土Go学习笔记 | 26. 函数闭包
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 11-1 环境中存储的是什么?
- 【Rust日报】2020-08-07 无船同志关于Rust未来Generator语法的新尝试
- 11-2 环境是如何建立的
- 11-3 激活修改
- 12-1 定制提示符
- MySQL INSERT的4种形态
- PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
- Java开发必备 Git 分支开发:规范指南及完全学会Git的24堂课笔记
- 聊聊dubbo-go的failbackCluster
- 视频综合管理平台EasyNVS通道列表如何获得RTMP地址和RTSP地址?
- 【每周一库】 rust-ftp - an FTP client written in Rust
- Mall 电商实战项目发布重大更新,全面支持SpringBoot 2.3.0 !
- Python与Tableau相结合,万字长文搞定传统线下连锁店数据分析
- 社群答疑精选03:拆分数据到新工作表
- 【Rust日报】2020-08-08:用rust制作的一个Taskwarrior终端用户界面