是不是很羡慕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(); //结束绑定 }
注意有些函数要用双冒号来调用全局的函数来完成。
截图:
屏幕显示
文件打开