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