首先就是设置控件来实现水印:
如图所示,我添加了三个静态控件,三个编辑框控件。并且关联了三个变量,分别用来表示水印文字,水印坐标位置。接着就是GDI+的声明了。我们需要注意的是,在VS2008以后的编译器中编译器自身提供了GDI+包,不需要我们再像在VC中那样添加GDI+包,接着的声明本站的相关水印文章,我都详细讲解了,尤其是在《纹理画刷的深入讲解》中。我在这里就不详述了。接着就是代码的实现。我们在“开始转换”按钮的消息响应函数中添加如下代码:
//开始转换
void CPictureProcessDlg::OnBnClickedBtnPictureConvert()
{
if (m_PicturePathName.IsEmpty())
{
MessageBox(L"请选择图片", L"提示", MB_ICONEXCLAMATION);
return;
}
int curWidth, curHigh, oriWidth, oriHigh;//当前宽高,原始宽高
if(m_mode==FALSE)//指定大小
{
UpdateData(TRUE);
curWidth = m_iWidth;
curHigh = m_iHigh;
}
int fileNum = m_filePathName.size();
m_ctpro.SetStep(10);
m_ctpro.SetRange(0, fileNum * 10);
for (int i = 0; i < fileNum; i++)
{
CImage imSrc, imDest;
imSrc.Load(m_filePathName[i]);//加载图片到图片对象中
oriWidth = imSrc.GetWidth();
oriHigh = imSrc.GetHeight();
if (m_mode == TRUE)
{
UpdateData(TRUE);
curWidth = m_iWidthMax;
curHigh = (int)(curWidth*oriHigh / oriWidth + 0.5);
}
imDest.Create(curWidth, curHigh, 32);//创建新图片
HDC imDestDC;
imDestDC = imDest.GetDC();
SetStretchBltMode(imDestDC, HALFTONE);//设置位图拉伸模式
SetBrushOrgEx(imDestDC, 0, 0, NULL);//设置刷子起始点,此2句能够消除失真,获得高质量图像
imSrc.StretchBlt(imDestDC, 0, 0, curWidth, curHigh);
////////////////////////////////水印代码begin///////////////////////////
CString szText;
m_WaterText.GetWindowText(szText);
Graphics *graphics = Graphics::FromHDC(imDestDC);
Brush *brush = new SolidBrush(Color::Red);//定义GDI+画刷对象
FontFamily fontFamily(L"宋体");
Gdiplus::Font font(&fontFamily, 50, FontStyleRegular, UnitPoint);
PointF ptf;
ptf.X = m_Xorigin;
ptf.Y = m_Yorigin;
//确定字符长度
//int nLen = MultiByteToWideChar(CP_ACP, 0, szText.GetLength(), -1, NULL, 0);
//在位图中输出字符串
graphics->DrawString(szText, szText.GetLength(), &font, ptf, brush);
////////////////////水印end//////////////
imDest.ReleaseDC();
m_PictureTitle.Format(L"%s_%d×%d.", m_fileTitle[i], curWidth, curHigh);
m_DestPicturePathName = m_PictureFolder + m_PictureTitle + m_fileExt[i];
imDest.Save(m_DestPicturePathName);
imSrc.Destroy();
imDest.Destroy();
m_ctpro.SetPos(10 * (i + 1));
}
m_ctrl_s_tips.ShowWindow(SW_SHOW);
}
在这里我们需要注意的是我们添加的水印代码的位置,也就是逻辑顺序!我之前就是把水印代码放错了位置,我把它放在了for语句的外面,结果就出不来!我被这个盲区缠住了整整四天!后来修改了团队里新来的一位MFC大神,多亏他帮我修改了位置,后来我仔细琢磨了,其实就是imSrc这个变量的原因,因为他的生命周期只在for语句之内,而我把水印代码放在了for语句之外,在这里这个imSrc的作用就是贴图,没有他那可不成。好了最后看下效果图: