CDC 画矩形边框,连接处的问题
我想写一个类似与CDC::Draw3DRect()画3D矩形的函数,CDC的这个函数只能画像素为1的边框,我的函数我想让它可以画任意大小的边框。但是,用CPen画边框时,...
我想写一个类似与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);
}
}
我写的这个可以实现,不过,我想知道更快,更有效率,或者更简单的方法。
你补充的代码我看了,看来不是我想要的。不过还是给你分吧,这问题也就这样了。 展开
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->bottom - 1);
pDC->LineTo(pRect->left, pRect->top);
pDC->LineTo(pRect->right, pRect->top);
// Light gray line
pDC->SelectObject(&pen3dLight);
pDC->MoveTo(pRect->left + 1, pRect->bottom - 1);
pDC->LineTo(pRect->left + 1, pRect->top + 1);
pDC->LineTo(pRect->right, pRect->top + 1);
// Draw bottom-right borders
// Black line
pDC->SelectObject(&pen3DDKShadow);
pDC->MoveTo(pRect->left, pRect->bottom - 1);
pDC->LineTo(pRect->right - 1, pRect->bottom - 1);
pDC->LineTo(pRect->right - 1, pRect->top - 1);
// Dark gray line
pDC->SelectObject(&penShadow);
pDC->MoveTo(pRect->left + 1, pRect->bottom - 2);
pDC->LineTo(pRect->right - 2, pRect->bottom - 2);
pDC->LineTo(pRect->right - 2, pRect->top);
// Restore the old object.
pDC->SelectObject(ppenOld);
}
--------------------------------------- 补充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->bottom - 1);
pDC->LineTo(pRect->left, pRect->top);
pDC->LineTo(pRect->right, pRect->top);
// Light gray line
pDC->SelectObject(&pen3dLight);
pDC->MoveTo(pRect->left + 1, pRect->bottom - 1);
pDC->LineTo(pRect->left + 1, pRect->top + 1);
pDC->LineTo(pRect->right, pRect->top + 1);
// Draw bottom-right borders
// Black line
pDC->SelectObject(&pen3DDKShadow);
pDC->MoveTo(pRect->left, pRect->bottom - 1);
pDC->LineTo(pRect->right - 1, pRect->bottom - 1);
pDC->LineTo(pRect->right - 1, pRect->top - 1);
// Dark gray line
pDC->SelectObject(&penShadow);
pDC->MoveTo(pRect->left + 1, pRect->bottom - 2);
pDC->LineTo(pRect->right - 2, pRect->bottom - 2);
pDC->LineTo(pRect->right - 2, pRect->top);
// Restore the old object.
pDC->SelectObject(ppenOld);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询