我用VC6.0做一个显示屏的程序,文字按照要求尺寸绘制出来,将字显示到bitmap上,然后取得象素点。目的是让单片机屏幕上显示,客户在PC 程序上设定的文字,显示的汉字是不限的,还可以设定字体大小,字体类型,这些显示的汉字要用点阵的格式下载到单片机上,让单片机屏知道需要显示什么,现在的问题是这些文字如何准确的转化为点针数据,传到单片机中 。大家能不能指个方向,说一下怎么的做法,最好有个例子程序发下看看。

解决方案 »

  1.   

    用双缓冲的办法设定一块内存DC,与显示DC兼容,向内存DC输出文字,这时文字在内存DC里面就是点阵。把这块内存DC传到你得单片机里面即可。
      

  2.   

    给你一个别的地方的函数自己慢慢挑吧
    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;
    }
      

  3.   

    取得字符点阵主要用GetGlyphOutline函数 
    GetGlyphOutline函数要调用两次 
    第一次调用将LPVOID lpBuffer指定为NULL,函数将返回点阵数据需要的缓冲区大小(以字节为单位),将它传给cbBuffer参数,并依此值申请内存,将内存指针传给lpBuffer,再次调用GetGlyphOutline函数,lpBuffer缓冲区将被填充。依次读出即是点阵数据。 
      

  4.   

    谢谢上面各位呀,有没有一个实例代码呀。谢谢  dirdirdir3
      

  5.   

    感谢各位指导 ,特别  gordon3000   ,谢谢。