当前位置: 代码迷 >> WinCE >> WinCE6 GDI写文本锯齿有关问题
  详细解决方案

WinCE6 GDI写文本锯齿有关问题

热度:615   发布时间:2016-04-28 11:50:42.0
WinCE6 GDI写文本锯齿问题

    HDC hdc = GetDC(0);
    HDC hdcCompat = CreateCompatibleDC(hdc);
    HBITMAP hb;
    HGDIOBJ hbold;

    BITMAPINFO bmi;
    int *bmdata;

    int w = 500;
    int h = 200;

    bmi.bmiHeader.biSize=sizeof(bmi.bmiHeader);
    bmi.bmiHeader.biWidth=w;
    bmi.bmiHeader.biHeight=-h;
    bmi.bmiHeader.biPlanes=1;
    bmi.bmiHeader.biBitCount=32;
    bmi.bmiHeader.biCompression=BI_RGB;
    bmi.bmiHeader.biSizeImage=0;
    bmi.bmiHeader.biClrUsed=0;
    bmi.bmiHeader.biClrImportant=0;

    hb=CreateDIBSection(hdcCompat, &bmi, DIB_RGB_COLORS,
                       (void**)&bmdata, NULL, 0);

    hbold=SelectObject(hdcCompat, hb);

    RECT r;
    r.top=0;
    r.left=0;
    r.right=w;
    r.bottom=h;

    SetBkColor(hdcCompat, RGB(255, 255, 255));
    SetTextColor(hdcCompat, RGB(255, 0, 0));
    SetBkMode(hdcCompat, OPAQUE);
//    FillRect(hdc, &r, (HBRUSH)GetStockObject(WHITE_BRUSH));

    HFONT hf;
    LOGFONT lf;
    lf.lfHeight = 200;
    lf.lfWidth = 100;
    lf.lfEscapement = 0;
    lf.lfOrientation = 0;
    lf.lfItalic = TRUE;
    lf.lfUnderline = FALSE;
    lf.lfStrikeOut = FALSE;
    lf.lfCharSet = ANSI_CHARSET;
    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf.lfQuality = ANTIALIASED_QUALITY;
    lf.lfPitchAndFamily = FF_ROMAN;
    lf.lfWeight= FW_NORMAL;
    hf = CreateFontIndirect(&lf);
    QString fam = "Tahoma";
    memcpy(lf.lfFaceName, fam.utf16(), sizeof(wchar_t) * qMin(fam.length() + 1, 32));

    SelectObject(hdcCompat, hf);

    DrawText(hdcCompat, TEXT("8SS"), -1, &r, DT_LEFT);

    BitBlt(hdc, 0, 0, w, h, hdcCompat , 0, 0, SRCCOPY);

WinCE 6.0系统下面。
用CreateDIBSection或者CreateCompatibleBitmap都是有锯齿的。
直接用DrawText(hdc, TEXT("8SS"), -1, &r, DT_LEFT); 写出的文本是没有锯齿的。
------解决思路----------------------
如果写到内存中也是调用 DrawText,那么也不应该出现锯齿才对。
如果出现问题,可能是因为颜色(透明)等的设置有问题。

因为你绘制到内存中,字体的笔画就与内存中的背景色融合在一起了。再将内存绘制到 DC 上时,就可能出现问题。
------解决思路----------------------
绘制到内存和屏幕效果一样,不一样就是设置不一样,比如字体等,wince一般配的lcd才16bit,显示颜色不多,所以效果上很多都别太强求了。
------解决思路----------------------
wince6平台的GDI字体渲染有问题,无法实现反锯齿。
即使打开所谓的cleartype也无法实现字体的圆滑,可以考虑移植开源的freetype来实现字体渲染,绕过CE的GDI渲染机制
  相关解决方案