我用VC6.0做一个显示屏的程序,文字按照要求尺寸绘制出来,将字显示到bitmap上,然后取得象素点。目的是让单片机屏幕上显示,客户在PC 程序上设定的文字,显示的汉字是不限的,还可以设定字体大小,字体类型,这些显示的汉字要用点阵的格式下载到单片机上,让单片机屏知道需要显示什么,现在的问题是这些文字如何准确的转化为点针数据,传到单片机中 。大家能不能指个方向,说一下怎么的做法,最好有个例子程序发下看看。
调试欢乐多
BOOL Text2DIB( int x, //在DIB中的坐标
int y,
CString str, //待输出的字符串
LPSTR pDIB, //目的DIB
LOGFONT lgFont, //逻辑字体
COLORREF forColor) //字符的颜色
{
CDC * pDC = AfxGetMainWnd()->GetDC(); //原图像的尺寸//////////////////////////////////////
LPBITMAPINFOHEADER pBitmapInfo;
pBitmapInfo=(LPBITMAPINFOHEADER) pDIB;
int bitmapWidth=pBitmapInfo->biWidth;
int bitmapHeight=pBitmapInfo->biHeight;
//根据图像的宽度计算每行所占的字节数(必须是4的倍数)
int nBpl=bitmapWidth*3;
if(nBpl%4) nBpl=(nBpl/4)*4+4; //创建内存DC////////////////////////////////////////
CDC dcMem; // 内存的dc
CDC dcDisp; // 显示的dc
BOOL ok = dcDisp.Attach(*pDC);
int b = dcMem.CreateCompatibleDC(NULL);
if(b == 0) return FALSE;
CDC*pMemDC=&dcMem; // pMemDC //创建前、背景画刷
CBrush forBrush,backBrush;
COLORREF bakColor = RGB(0xdc,0xdc,0xaa);
forBrush.CreateSolidBrush(forColor);
backBrush.CreateSolidBrush(bakColor);
CBrush*ob=pMemDC->SelectObject(&forBrush); //创建字体////////////////////////////////////////////
CFont *pFont=new CFont;
pFont->CreateFontIndirect(&lgFont);
CFont *pOldFont=(CFont*)pMemDC->SelectObject(pFont);
//设置字体的颜色和背景
pMemDC->SetBkMode(TRANSPARENT); // SET BACKMODE
pMemDC->SetTextColor(forColor); //字符串范围////////////////////////////////////////////
CSize textSize=pMemDC->GetTextExtent(str,str.GetLength()); //创建位图,和文字范围大小一样的位图
CBitmap bmp;
b = bmp.CreateCompatibleBitmap(&dcDisp, textSize.cx, textSize.cy);
if(b == 0) return FALSE;
CBitmap * oldBmp=(CBitmap*)dcMem.SelectObject(&bmp);
oldBmp=(CBitmap*)dcMem.SelectObject(&bmp); //初始化位图,设置为背景颜色
pMemDC->SelectObject(&backBrush);
pMemDC->FillRect(CRect(0,0,textSize.cx,textSize.cy), &backBrush); //输出文字到新建的位图里面/////////////////////////////////////
pMemDC->TextOut(0,0,str);
//新位图的大小以及每行的字节数
int width=textSize.cx;
int height=textSize.cy;
int nBitsPerLine=width*3;
if(nBitsPerLine%4) nBitsPerLine=(nBitsPerLine/4)*4+4;
int tmp=nBitsPerLine*height+sizeof(BITMAPINFOHEADER); char*buf = new char[tmp];
//新的DIB
BITMAPINFOHEADER bi,*lpbi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = 0;
bi.biSizeImage = nBitsPerLine*height;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; lpbi=&bi;
int m=GetDIBits(dcMem,(HBITMAP)bmp.GetSafeHandle(),0l,(DWORD)height,
buf+sizeof(BITMAPINFOHEADER),(LPBITMAPINFO)lpbi,DIB_RGB_COLORS); int row,col;
COLORREF clr;
for(int ii=0; ii<height; ii++)
{
for(int j=0; j<width; j++)
{
clr=RGB(buf[(height-ii-1)*nBitsPerLine+j*3+42],
buf[(height-ii-1)*nBitsPerLine+j*3+41],
buf[(height-ii-1)*nBitsPerLine+j*3+40]);
if(clr!=forColor)
continue;
row=(ii+y);
col=(j+x);
if(row < 0 || row >= bitmapHeight || col < 0 || col >= bitmapWidth)
continue; pDIB[(bitmapHeight-row-1)*nBpl+col*3+40]=
buf[(height-ii-1)*nBitsPerLine+j*3+40];
pDIB[(bitmapHeight-row-1)*nBpl+col*3+41]=
buf[(height-ii-1)*nBitsPerLine+j*3+41];
pDIB[(bitmapHeight-row-1)*nBpl+col*3+42]=
buf[(height-ii-1)*nBitsPerLine+j*3+42];
}
}
//删除字体
pMemDC->SelectObject(pOldFont);
pFont->DeleteObject();
delete pFont; //删除画刷
pMemDC->SelectObject(ob);
forBrush.DeleteObject();
backBrush.DeleteObject(); AfxGetMainWnd()->ReleaseDC(pDC); delete [] buf;
return TRUE;
}
GetGlyphOutline函数要调用两次
第一次调用将LPVOID lpBuffer指定为NULL,函数将返回点阵数据需要的缓冲区大小(以字节为单位),将它传给cbBuffer参数,并依此值申请内存,将内存指针传给lpBuffer,再次调用GetGlyphOutline函数,lpBuffer缓冲区将被填充。依次读出即是点阵数据。