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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2617
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2110
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

25410
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2872
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2717
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2606
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4948
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

32210
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3899

扫码关注云+社区