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);
}
}
我写的这个可以实现,不过,我想知道更快,更有效率,或者更简单的方法。
你补充的代码我看了,看来不是我想要的。不过还是给你分吧,这问题也就这样了。
展开
 我来答
Idealsoft
2009-03-25 · TA获得超过639个赞
知道小有建树答主
回答量:461
采纳率:0%
帮助的人:290万
展开全部
自己画好了,不就是个矩形吗?四条边而已啊,加上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);
}
何处淬吴钩
2009-03-25 · TA获得超过5045个赞
知道大有可为答主
回答量:2947
采纳率:50%
帮助的人:2410万
展开全部
别的不知道,openGL与DirectX肯定行!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式