由于最近一直在搞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);
}