是不是很羡慕PHP的动态生成验证码图片的功能呢?其实无所不能的C++干这个也是小菜的啦~~
自己用mfc写了个小例子,能实现绘制一张图片显示到屏幕上,并保存到文件目录
1,生成文字图片的函数
HBITMAP CmfctestDlg::NewBitmap(HDC hdc, wchar_t *pszText, int iWidth, int iHeight)
{
if (pszText == NULL)
return NULL;
HBITMAP hBmp = CreateCompatibleBitmap(hdc, iWidth, iHeight);//创建要返回的位图句柄,此处的hdc参数必须是与实际窗口绑定的DC,如果是内存DC则图片没有颜色只有灰度
HDC hMemDC = CreateCompatibleDC(hdc);//创建与显示设备相关的内存设备上下文
SelectObject(hMemDC, hBmp);
//在位图上写字
SetBkMode(hMemDC, TRANSPARENT);
RECT rc = {0, 0, iWidth, iHeight};
HBRUSH hb = ::CreateSolidBrush(RGB(0, 0, 0)); //设置笔刷颜色
FillRect(hMemDC, &rc, hb); //填充矩形
HFONT hf;
LOGFONT lf; //创建字体结构体
lf.lfHeight=70;
lf.lfWidth=20;
lf.lfEscapement=0;
lf.lfOrientation=0;
lf.lfItalic=false;
lf.lfUnderline=false;
lf.lfStrikeOut=false;
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfOutPrecision=0;
lf.lfWeight=500; //0-1000,1000加到最粗
lf.lfClipPrecision=0;
lf.lfQuality=0;
lf.lfPitchAndFamily=0;
//可以使宋体,楷体,微软雅黑 等等中文字体 或者Arial Times New Roman 等英文字体
wcscpy_s(lf.lfFaceName,L"微软雅黑"); //此处不能用strcpy
hf=CreateFontIndirect(&lf);
SelectObject(hMemDC,hf);
SetTextColor(hMemDC,RGB(0,255,0)); //设置字体颜色
DrawText(hMemDC, pszText, -1, &rc, DT_CENTER); //居中
//释放资源
DeleteDC(hMemDC);
DeleteObject(hb);
return hBmp; //返回创建好的位图
}
2,调用图片生成并保存到文件目录void CmfctestDlg::OnBnClickedButton3()
{
// TODO: Add your control notification handler code here
HDC hdc = ::GetDC(m_hWnd); //m_hWnd是当前窗口的句柄,在这个窗口上建立一个绘制上下文,也可以不依托于实际的窗口,直接在内存中创建DC
int iWidth = 400, iHeight = 100;
HBITMAP hBmp = NewBitmap(hdc, L"踏莎行hyx", iWidth, iHeight);
HDC hMemDC = CreateCompatibleDC(hdc);
SelectObject(hMemDC, hBmp);
BitBlt(hdc, 0, 0, iWidth, iHeight, hMemDC, 0, 0, SRCCOPY);
DeleteDC(hMemDC);
CImage image;
image.Attach(hBmp); //将位图转化为一般图像
CString str=L"testimg.bmp";
image.Save(str); //保存图像
image.Detach(); //结束绑定
}
注意有些函数要用双冒号来调用全局的函数来完成。
截图:
屏幕显示
文件打开