彩色圆形按钮我已经作出来了,但因为我是用VC的画圆函数画的,边缘非常粗糙,请问各位大虾如何是好
解决方案 »
- CEdit的ocx控件,屏蔽了粘贴,ctrl+v有奇怪现象
- 送分啦
- 求助:VC如何实现类似QQ界面左侧的一竖列按钮的界面
- 谁能告诉我内存映射到底是怎么回事????
- CPropertySheet做的属性页对话框........................................................如何才能获取page1的信息
- 一个关于重绘的问题?进来看看啊
- 加急---怎么在自己的ocx里面使用别人的ocx控件
- 请问 VC中 可以不让自己定义的类显示在 类视图 上吗?
- winsock 的问题?
- vc++状态栏的问题
- 有关图形、图象,opengl较好的网站和论坛!请推荐
- 我怎么将一个备份文件*.bak转化为SQLServer数据库?详细点,谢谢!
m_rgn.DeleteObject();
SetWindowRgn(NULL, FALSE);
m_rgn.CreateEllipticRgnIndirect(rect);
SetWindowRgn(m_rgn, TRUE);
之类,和DrawItem()之类都不用我说了吧。
在绘制圆形的时候确实发现了Vc下面的Ellipse好像象素比较粗糙,常用的方法是:
1,加粗画线的线宽,这样会使效果看上去强些
2,根据计算机图形学自己编写一个椭圆的生成算法,并把椭圆的平滑算法加进去(这个比较麻烦)
3,不知道你是否还记得Vc中的贝赛尔曲线函数pDC->PolyBezierTo,呵呵用一个圆形方程式取得圆的边界上的点,然后利用贝赛尔曲线来画圆,因为贝赛尔曲线本身就有了平滑处理,因此这样绘制出来的圆形还不错。
void DrawEllipse(CDC* pDC, CPoint p, LONG lHorizontalRadius,LONG lVerticalRadius, COLORREF crColour, BOOL bDashed)
{
const int nDashLength = 1;
LONG lXoffset, lYoffset;
int nDash = 0;
BOOL bDashOn = TRUE; //Check to see that the coordinates are valid
ASSERT( (p.x + lHorizontalRadius <= LONG_MAX) && (p.y + lVerticalRadius <= LONG_MAX) );
ASSERT( (p.x - lHorizontalRadius >= LONG_MIN) && (p.y - lVerticalRadius >= LONG_MIN) ); long d1,d2;
long t1,t2,t3,t4,t5,t6,t7,t8,t9;
lXoffset = lHorizontalRadius;
lYoffset= 0;
t1 = lHorizontalRadius*lHorizontalRadius; t2 = 4*t1; t3 = 2*t2;
t4 = lVerticalRadius*lVerticalRadius;
t5 = 4*t4;
t6 = 2*t5;
t7 = lHorizontalRadius*t5; t8 = 2*t7;
t9 = 0; d1 = t2 - t7 + t4;
d2 = t1 - t8 + t5;
while (d2 < 0)
{/* region 1 of ellipse*/
if (bDashOn) {
pDC->SetPixelV(p.x + lXoffset, p.y + lYoffset, crColour);
pDC->SetPixelV(p.x + lXoffset, p.y - lYoffset, crColour);
pDC->SetPixelV(p.x - lXoffset, p.y + lYoffset, crColour);
pDC->SetPixelV(p.x - lXoffset, p.y - lYoffset, crColour);
} //Advance the error term and the constant X axis step
lYoffset++;
t9 = t9 + t3;
if (d1 < 0) { d1 = d1 + t9 + t2; d2 = d2 + t9; }
else
{ lXoffset --; t8 = t8 - t6; d1 = d1 - t8 + t9 + t2; d2 = d2 - t8 + t9 + t5;
}
if (bDashed && (++nDash == nDashLength)) {
nDash = 0;
bDashOn = !bDashOn;
} }
do
{
if (bDashOn)
{
pDC->SetPixelV(p.x + lXoffset, p.y + lYoffset, crColour);
pDC->SetPixelV(p.x + lXoffset, p.y - lYoffset, crColour);
pDC->SetPixelV(p.x - lXoffset, p.y + lYoffset, crColour);
pDC->SetPixelV(p.x - lXoffset, p.y - lYoffset, crColour);
} lXoffset--;
t8 = t8 - t6;
if (d2 < 0)
{
lYoffset ++; t9 = t9 + t3; d2 = d2 - t8 + t5 + t9;
}
else
d2 = d2 - t8 + t5;
if (bDashed && (++nDash == nDashLength)) {
nDash = 0;
bDashOn = !bDashOn;
} } while (lXoffset>=0); //Continue until halfwaX point}
其实背景的改变不是问题,可以自绘背景,背景颜色统一由程序控制就可以了!记得VC知识库(http://www.vckbase.com/)上有一个仿XP的界面代码,值得借鉴。