版本2.04
网上目前现有的很多个法子都是定义若干个文本去坐标偏移造成描边的效果.
那样确实可以.不过会凭空多很多对象出来.
如果是那些比较复杂的文字那数量级还是很多的.
于是我就想能不能换个方式.在底层就已经实现了描边的效果.
也就是在贴图生成的同时已经进行了描边.
于是一路跟踪.在CCIMAGE下边找到了这个函数.
int drawText(const char * pszText, SIZE& tSize, CCImage::ETextAlign eAlign)
// draw text
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText, dwFmt);
显然这就是贴图生成前的步骤了.
其中的rcText就代表那个文字的空间位置.
于是在这段代码前面添加描边色的文字绘制.(必须在代码前.应为主文字必须最后绘制才能是描边效果)
int dix=1;
{
SetTextColor(m_hDC, RGB(0, 0, 255)); // red color
RECT rcText2 = {rcText.left-dix,rcText.top,rcText.right-dix,rcText.bottom};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText2, dwFmt);
RECT rcText3 = {rcText.left+dix,rcText.top,rcText.right+dix,rcText.bottom};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText3, dwFmt);
RECT rcText4 = {rcText.left,rcText.top+dix,rcText.right,rcText.bottom+dix};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText4, dwFmt);
RECT rcText5 = {rcText.left,rcText.top-dix,rcText.right,rcText.bottom-dix};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText5, dwFmt);
RECT rcText6 = {rcText.left-dix,rcText.top+dix,rcText.right-dix,rcText.bottom+dix};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText6, dwFmt);
RECT rcText7 = {rcText.left-dix,rcText.top-dix,rcText.right-dix,rcText.bottom-dix};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText7, dwFmt);
RECT rcText8 = {rcText.left+dix,rcText.top-dix,rcText.right+dix,rcText.bottom-dix};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText8, dwFmt);
RECT rcText9 = {rcText.left+dix,rcText.top+dix,rcText.right+dix,rcText.bottom+dix};
nRet = DrawTextW(m_hDC, pwszBuffer, nLen, &rcText9, dwFmt);
}
我在八个方向都进行了坐标单像素偏移.
之后重新编译.描边效果不错~.
并且是单对象内部实现的描边.
缺点当然也有.就是生成之后描边色不可再次修改.
至于生成前的颜色就不需要我再去多写什么了.
写个函数在更前的地方去判定描边与否以及描边颜色即可.
需要注意的是.底层的颜色并不是RGB.尽管那里写着RGB.
而是BGR.顺序不同的.
附上代码效果.