CDC 画矩形边框,连接处的问题

来源:百度知道 编辑:UC知道 时间:2024/07/03 13:47:04
我想写一个类似与CDC::Draw3DRect()画3D矩形的函数,
CDC的这个函数只能画像素为1的边框,我的函数我想让它可以画任意大小的边框。但是,用CPen画边框时,连接处不理想,总是错开来错开去的。

可以看看微软的扫雷程序。(用放大镜看)你会发现它矩形连接很好,而且右上角和左下角的连接处是斜交的,并且颜色是采用两线颜色的平均值。

怎么样实现这样的功能呢?

CDC::DrawEdge很复杂,我也不知道可以实现不。
Idealsoft,请注意:
右上角和左下角的连接处是斜交的,并且颜色是采用两线颜色的平均值。

void CMyDC::DrawEdgePic(int x,int y,int nWidth,int nHeight, int nBorderWidth, COLORREF clrTopLeft , COLORREF clrBottomRight ) //以最边框最外围为宽和高
{
int nRClr=((clrTopLeft & 0xff)+(clrBottomRight & 0xff))/2;
int nGClr=((clrTopLeft>>8 & 0xff)+(clrBottomRight>>8 & 0xff))/2;
int nBClr=((clrTopLeft>>16 & 0xff)+(clrBottomRight>>16 & 0xff))/2;
COLORREF clrMid = RGB(nRClr,nGClr,nBClr);
for(int i=0;i<nBorderWidth;i++)
{
Draw3dRect(x+i,y+i, nWidth-2*i, nHeight-2*i,clrTopLeft,clrBottomRight);
SetPixel(x-i+nWidth-1,y+i,clrMid);
SetPixel(x+i,y-i+nHeight-1,clrMid);
}
}

自己画好了,不就是个矩形吗?四条边而已啊,加上3D效果也就是,2个明暗的矩形错位重叠,CButtonST中有类似的动作。

--------------------------------------- 补充1
__m_colorBtnHilight = GetSysColor(COLOR_BTNHILIGHT);
__m_color3dLight = GetSysColor(COLOR_3DLIGHT);
__m_colorBtnBtnShadow = GetSysColor(COLOR_BTNSHADOW);
__m_color3ddkShadow = GetSysColor(COLOR_3DDKSHADOW);

CPen penHiLight(PS_SOLID, 0, __m_colorBtnHilight); // White
CPen pen3dLight(PS_SOLID, 0, __m_color3dLight); // Light gray
CPen penShadow(PS_SOLID, 0, __m_colorBtnBtnShadow); // Dark gray
CPen pen3DDKShadow(PS_SOLID, 0, __m_color3ddkShadow); // Black
if( _m_bFlat )
{
if( _m_bMouseOver && _m_bDrawBorder )
{
pDC->Draw3dRect(pRect, WHITE, __m_colorBtnBtnShadow);
}
}
else
{
// Draw top-left borders
// White line
CPen* ppenOld = pDC->SelectObject(&penHiLight);
pDC->MoveTo(pRect->left, pRect->b