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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值