WinCE6 GDI写文本锯齿问题

弓人水 2015-07-31 03:56:47

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); 写出的文本是没有锯齿的。
...全文
275 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangchangwen83 2015-08-18
  • 打赏
  • 举报
回复
wince6平台的GDI字体渲染有问题,无法实现反锯齿。 即使打开所谓的cleartype也无法实现字体的圆滑,可以考虑移植开源的freetype来实现字体渲染,绕过CE的GDI渲染机制
91program 2015-08-10
  • 打赏
  • 举报
回复
如果写到内存中也是调用 DrawText,那么也不应该出现锯齿才对。 如果出现问题,可能是因为颜色(透明)等的设置有问题。 因为你绘制到内存中,字体的笔画就与内存中的背景色融合在一起了。再将内存绘制到 DC 上时,就可能出现问题。
弓人水 2015-08-10
  • 打赏
  • 举报
回复
引用 2 楼 91program 的回复:
文本显示没有锯齿,是因为文本在显示时有一定的过滤颜色 但这个是你直接画直线不可能有的效果 由于 WinCE 不是支持 GDI+,所以反锯齿比较难实现:因为系统没有支持的函数,所以反锯齿需要自己实现算法。或者,接受现在默认的效果。
谢谢您的回答,我不太理解的是,直接写到屏幕的字体无锯齿,但是CreateDIBSection写到内存中,再绘到屏幕就有锯齿了,原理不是很清楚。。。
91program 2015-08-10
  • 打赏
  • 举报
回复
文本显示没有锯齿,是因为文本在显示时有一定的过滤颜色 但这个是你直接画直线不可能有的效果 由于 WinCE 不是支持 GDI+,所以反锯齿比较难实现:因为系统没有支持的函数,所以反锯齿需要自己实现算法。或者,接受现在默认的效果。
弓人水 2015-08-10
  • 打赏
  • 举报
回复
自己顶一下吧。怎么没大神帮帮忙啊。
  • 打赏
  • 举报
回复
绘制到内存和屏幕效果一样,不一样就是设置不一样,比如字体等,wince一般配的lcd才16bit,显示颜色不多,所以效果上很多都别太强求了。

19,497

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧