minigui网站上有开源的eDillo浏览器下载。但需要1.6.8版本的minigui支持。而1.6版本的开源版很简单,不能实用。于是看能不能用1.33版的minigui库编译eDillo。
编译时指定1.33库,发现只少了DrawTextEx2函数,参考1.6版的开源代码在1.33版中实现DrawTextEx2函数。很快编译通过。
直接运行simple-edillo会显示程序中的默认页面。但导航到google主页会异常。不知道是什么原因。
参考DrawTextEx添加到minigui库中。代码可以跑,肯定有问题,但至少可以显示eDillo中的默认网页
int DrawTextEx2(HDC hdc, const char* pText, int nCount,
RECT* pRect, int indent, UINT nFormat,DTFIRSTLINE *firstline)
{
PDC pdc;
int n, nLines = 0, width = 0;
BOOL bOutput = TRUE;
int x, y;
RECT rcDraw, rcOutput;
int nTabWidth, tabs;
SIZE size;
int line_height;
firstline = NULL;
pdc = dc_HDC2PDC(hdc);
if (nCount == -1)
nCount = strlen (pText);
line_height = pdc->pLogFont->size + pdc->alExtra + pdc->blExtra;
if (nFormat & DT_TABSTOP)
nTabWidth = HIWORD (nFormat) *
(*pdc->pLogFont->sbc_devfont->font_ops->get_ave_width)
(pdc->pLogFont, pdc->pLogFont->sbc_devfont);
else
nTabWidth = pdc->tabstop *
(*pdc->pLogFont->sbc_devfont->font_ops->get_ave_width)
(pdc->pLogFont, pdc->pLogFont->sbc_devfont);
// Transfer logical to device to screen here.
rcDraw = *pRect;
coor_LP2SP(pdc, &rcDraw.left, &rcDraw.top);
coor_LP2SP(pdc, &rcDraw.right, &rcDraw.bottom);
NormalizeRect (&rcDraw);
if (dc_IsGeneralDC (pdc)) {
LOCK (&pdc->pGCRInfo->lock);
if (!dc_GenerateECRgn (pdc, FALSE))
bOutput = FALSE;
}
#ifdef _LITE_VERSION
if (CHECK_DRAWING (pdc)) bOutput = FALSE;
#endif
// Draw text here.
if (nFormat & DT_CALCRECT || firstline)
bOutput = FALSE;
y = rcDraw.top;
if (nFormat & DT_SINGLELINE) {
if (nFormat & DT_BOTTOM)
y = rcDraw.bottom - pdc->pLogFont->size;
else if (nFormat & DT_VCENTER)
y = rcDraw.top + ((RECTH (rcDraw) - pdc->pLogFont->size) >> 1);
}
while (nCount != 0) {
int nOutput;
int maxwidth;
if (nLines == 0) {
maxwidth = rcDraw.right - rcDraw.left - indent;
if (maxwidth <= 0) {
// new line
y += pdc->pLogFont->size;
nLines ++;
continue;
}
}
else
maxwidth = rcDraw.right - rcDraw.left;
gdi_start_new_line (pdc->pLogFont);
tabs = txtGetOneLine (pdc, pText, nCount, nTabWidth, maxwidth, nFormat, &n);
gdi_get_TextOut_extent (pdc, pdc->pLogFont, pText, n, &size);
width = size.cx + tabs * nTabWidth;
n += tabs;
if ( (pText[n-1] == '\n' || pText[n-1] == '\r')
&& !(nFormat & DT_SINGLELINE) ) {
int tmpx = 0, tmpy = 0;
nOutput = n - 1;
width -= gdi_width_one_char (pdc->pLogFont, pdc->pLogFont->sbc_devfont,
pText + n - 1, 1, &tmpx, &tmpy);
}
else
nOutput = n;
if (nFormat & DT_RIGHT)
x = rcDraw.right - width;
else if (nFormat & DT_CENTER)
x = rcDraw.left + ((RECTW (rcDraw) - width) >> 1);
else
x = rcDraw.left;
x += (nLines ? 0 : indent);
if (firstline) {
firstline->nr_chars = nOutput;
firstline->startx = x;
firstline->starty = y;
firstline->width = width;
firstline->height = line_height;
break;
}
rcOutput.left = x;
rcOutput.top = y;
rcOutput.right = rcOutput.left + width;
rcOutput.bottom = rcOutput.top + line_height;
if (nFormat & DT_CALCRECT) {
if (nLines == 0)
*pRect = rcOutput;
else
GetBoundRect (pRect, pRect, &rcOutput);
}
// draw one line
if (bOutput && width > 0) {
if (nFormat & DT_NOCLIP)
txtDrawOneLine (pdc, pText, nOutput, x, y,
&rcOutput, nFormat, nTabWidth);
else {
RECT rcClip;
IntersectRect (&rcClip, &rcOutput, &rcDraw);
txtDrawOneLine (pdc, pText, nOutput, x, y,
&rcClip, nFormat, nTabWidth);
}
}
pText += n;
// new line
y += line_height;
nLines ++;
// left characters
nCount = nCount - n;
}
/* we are done, so release global clipping region */
UNLOCK_GCRINFO (pdc);
if (firstline) {
coor_SP2LP (pdc, &firstline->startx, &firstline->starty);
return 0;
}
if (nFormat & DT_CALCRECT) {
coor_SP2LP (pdc, &pRect->left, &pRect->top);
coor_SP2LP (pdc, &pRect->right, &pRect->bottom);
}
if (!(nFormat & DT_CALCRECT)) {
// update text out position
x += width;
y -= line_height;
coor_SP2LP (pdc, &x, &y);
pdc->CurTextPos.x = x;
pdc->CurTextPos.y = y;
}
return line_height * nLines;
}
posted on 2008-04-25 11:18 zgf的blog 阅读(836)
评论(2) 编辑 收藏