1.创建一个基于对话框的程序
2.添加对Gdi+的支持
3.在对话框类中添加公有成员
Gdiplus::Bitmap *m_IamgeShow; Gdiplus::RectF m_rect; void ImageAtomization(Gdiplus::Bitmap *pImage); CString m_FileName;在Initstance()函数中初始化
m_ImageShow=NULL; m_FileName=_T(""); CRect rc; GetClientRect(&rc); m_rect.X=rc.left; m_rect.Y=rc.top; m_rect.Width=rc.Width(); m_rect.Height=rc.Height();
3.接下来我们编写雾化操作的具体代码
void CMFCApplication1Dlg::ImageAtomization(Gdiplus::Bitmap *pImage) { int width=m_rect.Width; int height=m_recr.Height; for(int x=1;x<width;x++) for(int y=1;y<height;y++) { Color color; double f=RAND_MAX; int k=(int)(24*rand()/f); dx=x+k%15; dy=y+k%15; if(dx>width) dx=width-1; if(dy>height) dy=height-1; pImage->GetPixel(x,y,&color); PImage->SetPixel(dx,dy,color); } }4.接下来我们添加鼠标左键单击消息和计时器消息
void CMFCApplication1Dlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (m_ImageShow == NULL) { MessageBox(_T("没有图像文件是不能执行此项操作的!"), _T("信息提示"), MB_OK); return; } this->DiffuseImage(m_ImageShow); CDialogEx::OnLButtonDown(nFlags, point); }
void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 HDC hdc = ::GetDC(GetSafeHwnd()); CDC m_dcMemory; CDC* dc = CClientDC::FromHandle(hdc); m_dcMemory.CreateCompatibleDC(dc); CRect rc; GetClientRect(&rc); CBitmap bmp; bmp.CreateCompatibleBitmap(dc, rc.Width(), rc.Height()); CBitmap *pOldbmp=m_dcMemory.SelectObject(&bmp); Graphics gh(m_dcMemory.GetSafeHdc()); gh.Clear(Color(128, 128, 12)); gh.DrawImage(m_ImageShow, 0,0, rc.Width(), rc.Height()); ::BitBlt(hdc,0, 0, rc.Width(), rc.Height(),m_dcMemory.GetSafeHdc(), 0, 0, SRCCOPY); dc->DeleteDC(); m_dcMemory.SelectObject(pOldbmp); DeleteObject(bmp); ReleaseDC(&m_dcMemory); CDialogEx::OnTimer(nIDEvent); }
在Initstance函数中添加
SetTimer(1,100,NULL);
5,将对话框 确定按钮标题修改为"打开”ID为ID_OPEN
添加事件处理
void CMFCApplication1Dlg::OnBnClickedFileOpen() { // TODO: 在此添加控件通知处理程序代码 CString strFilter = _T("All Files(*.*)|*.*|"); //打开文件对话框 CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, strFilter); int hResult = (int)dlg.DoModal(); if (hResult != IDOK) { return; } m_StrImageFileName.Format(dlg.GetPathName()); //装入图像文件 m_ImageShow = NULL; m_ImageShow = Bitmap::FromFile(m_StrImageFileName); if (!m_ImageShow) { MessageBox(_T("装入图像操作失败"), _T("错误信息提示"), MB_OK); return; } }
效果