要求:绘制一矩形,并实现下图效果。用gdi或者gdi+都行,不能用directx或者opengl.
解决方案 »
- 请问怎么获取其他程序的COMBOBOX句柄?
- 有关CTabCtrl控件的问题
- 谁能告诉我对话框编辑器里的custom control是怎么用的
- MSSQL 出现“多行数据更新”问题,怎么解决?
- 高手哪里去了!!!
- 关于this的迷惑问题
- 《mfc深入浅出》所带的光盘中的例子,在vc和c++下运行不了呀,怎么样才能运行呀,请个位大侠年指点,小弟深表感谢谢!!!事后必拱手献10
- 高手请进,一个极其简单的问题
- 如何在对话框程序中处理字符消息?????????
- 小弟正在开发一种PtoP远程控制软件,邀请调试开发伙伴,公开一切资料及源码!!!
- 技术讨论 如何实现一个回滚动的文字,或者控件滚动
- 安装时,如何通过对话框与服务器通信?
GDI+很方便,
GDI+中的定义
Color(IN BYTE a,//透明度 0- 255 0表示空 255最重
IN BYTE r,//红
IN BYTE g,//绿
IN BYTE b)//兰黑色的RGB值(0,0,0)
阴影效果(黑色+透明度):
Color(0,0,0,0): 等于没画,底色完全
Color(100,0,0,0): 可以看到底色上有一层模糊层
Color(255,0,0,0): 看不到底色了,就是黑色//实现
//得到DC
//得到底色//原来的颜色,绿,白,黑
//在DC上画底色
//得到阴影宽度nWidth;和要画的2条边,比如画(下和右)2个边
//准备画1条边
//根据nWidth,45度角得到连续的nWidth条线坐标,透明度各不相同,自己实践
//画线
Pen myPen(Color(???,0,0,0), 1/*线宽*/);//透明度自己实践,每条都不一样,淅变的
gdiObj.DrawLine(&myPen, x1, y1, x2, y2);
COLORREF lighten(float f,COLORREF ref){
int a = ref&0xff000000;
int r = (ref&0xff0000)>>16;
int g = (ref&0xff00)>>8;
int b = (ref&0xff);
int r = (int)(r*f);
int g = (int)(g*f);
int b = (int)(b*f);
if(r>255)r=255;
if(g>255)g=255;
if(b>255)b=255;
if(r<0)r=0;
if(g<0)g=0;
if(b<0)b=0;
return a|(r<<16)|(g<<8)|b;
}
这样生成两个颜色
COLORREF dark = lighten(0.5f,bgColor);
COLORREF light = lighten(1.5f,bgColor);
然后开始画按钮,架设斜边都是5,长宽w,h,用light生成一个solid CPen(在这里要判断如果按钮是按下状态要选择dark),宽度为1开始画画顶部线
int rx=0,lx=w;
for(int i = 0;i<5;i++){
MoveTo(rx,i);
LineTo(lx,i);
rx++;lx--;
}
画左边线
int ty=0,by=h;
for(int i = 0;i<5;i++){
MoveTo(i,ty);
LineTo(i,by);
ty++;by--;
}
另两边如法炮制!再加上按钮文字,大功告成!
ps.不建议直接输出按钮文字,处理文字部分直接拷贝mfc的源代码。
2:设置渐变色.
3:然后DeflateRect( 1, 1 ).
循环,回到第1步,直到画完
COLORREF crTopLeft = RGB( 0xFF, 0xFF, 0xFF );
WORD r, g, b;
r = g = b = 196;
COLORREF crBottomRight = RGB( r, g, b );
pDC->Rectangle( &rc );
rc.DeflateRect( 1, 1 );for( int i = 0; i < 20; ++ i ){
pDC->Draw3dRect( &rc, crTopLeft, crBottomRight );
rc.DeflateRect( 1, 1 );
r += 8; g += 8; b += 8;
if( r > 255 )
break;
crBottomRight = RGB( r, g, b );
}效果: