GDI编程

来源:互联网 发布:mac brick o la试色 编辑:程序博客网 时间:2024/06/05 10:47

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