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;
}
}
效果