四个编辑框从上到下,从左到右的ID号分别是:
IDC_FILENAME 关联成员变量m_FileName
IDC_ORIGINX 关联成员变量m_OriginX
IDC_ORIGINY 关联成员变量m_OriginY
IDC_WATERMARK 关联成员变量m_WaterText
然后就是两个按钮控件的ID号(从左到右)标题改为“...”,“水印效果”
IDC_BROWSE 为这两个ID号添加类向导
IDC_IMAGE_TEXT
最后就是四个静态文本空间,分别写上如图标题
最后就是图片控件哦!
我们需要修改类型为“位图”,同时我们为它关联一个成员变量m_ImageDemo。
我们在ImageTextDlg的头文件中添加上《水印1》中的开头部分的代码,也就是需要我们链接的库以及需要包含的头文件等。但首先你得有一个GDI+头文件包哦!我们把它放到ImageText文件夹中。
我们先看看添加成员变量的页面:
注意哦!成员变量的种类哦!有三个是控件类型的,两个坐标就是值类型的
接着就是处理的我们的两个类向导了。
第一个:
void CImageTextDlg::OnBrowse()
{
CFileDialog flDlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"图像文件|*.bmp;*.jpg;*.jpeg;*.gif||"); //定义文件打开对话框
if (flDlg.DoModal() == IDOK)
{
CString szText = flDlg.GetPathName();
m_FileName.SetWindowText(szText);
if (m_pBmp != NULL)
{
delete m_pBmp;
m_pBmp = NULL;
}
m_pBmp = Bitmap::FromFile(szText.AllocSysString());//根据文件名称生成GDI+位图对象
Color bkClr(0, 0, 0);
HBITMAP hBmp;
m_pBmp->GetHBITMAP(bkClr, &hBmp);
m_ImageDemo.SetBitmap(hBmp);
szText.ReleaseBuffer();
}
}
这个类向导的形式我们不陌生吧。《学习心得之八------实现从磁盘读入图片文件》里也有介绍哦,而且关于成员变量的创建也有介绍哦!不懂的话你可以看看。我就不解释了。第二个类向导:
//水印处理
void CImageTextDlg::OnImageText()
{
UpdateData();//更新窗口获取数据
CString szText;
m_WaterText.GetWindowText(szText);//1
if (!szText.IsEmpty() && m_pBmp != NULL)
{
Graphics *pGraph = Graphics::FromImage(m_pBmp);//生成Graphics对象//2
Brush *brush = new SolidBrush (Color(255,255,0,0));//定义GDI+画刷对象//3
Font *font = new Font(L"Arial", 12);//定义GDI+字体对象 //4
PointF ptf;//5
ptf.X = m_OriginX;
ptf.Y = m_OriginY;
//确定字符长度
int nLen = MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0);//6
//在位图中输出字符串
pGraph->DrawString(szText.AllocSysString(), nLen, font, ptf, brush);//7
szText.ReleaseBuffer();
Color clr;
HBITMAP hBmp, hOldBmp;
m_pBmp->GetHBITMAP(clr, &hBmp);
hOldBmp = m_ImageDemo.SetBitmap(hBmp);//8
if (hOldBmp)
{
DeleteObject(hOldBmp);
}
}
}
这就是我们处理水印的关键代码!我们按着顺序解释:1,对于我们写入文字的编辑框,我们已经关联了m_WaterText,并调用getwindowtext函数来获取文本给szText。
2,首先呢FromImage函数的参数是Image类的,但,bitmap类是Image类的派生类,因此我们也可以用bitmap类。我们调用这个函数将我们的位图对象变成Gdiphics对象
3,我们利用SolidBrush创建一个实心画笔对象。其参数是color类。color类后三个参数就是红绿蓝三种颜色,你可以自己设置,第一个我们将其设为255,你可以自己查MSDN哦!
4,我们写入图片的水印文字的描述,第一个就是字体的种类,第二个就是字体的颜色,
5,是我们写入水印文字的坐标,与CPoint不同的是,这个是一对。你可以不必掌握
6,就是我们水印写入文字成功字数!
7,就是我们关键中的关键哦!我们调用这个函数实现写入水印。对于他的实现,我们看下面的例子:
VOID Example_DrawString2(HDC hdc)
{
Graphics graphics(hdc);
// Create a string.
WCHAR string[] = L"Sample Text";
// Initialize arguments.
Font myFont(L"Arial", 16);
PointF origin(0.0f, 0.0f);
SolidBrush blackBrush(Color(255, 0, 0, 0));
// Draw string.
graphics.DrawString(
string,
11,
&myFont,
origin,
&blackBrush);
}
8,就是将我们的水印图片添加到图片控件上!
但是,还是有bug哦!下篇我们再详述!先看看最后应该有的实现结果吧!
刚刚我同学和我说:“苦逼的程序员,现在还在敲代码!”,我还不是程序员呢!不过在努力!谁说程序员就是苦的,累的!!!来看福利(暂时先发出实现的结果效果!)