返回首页

简介
我曾想过创建一个按钮,以取代多年来的CBitmapButton的
昨天,我克服了我的懒惰习惯,并开始创建按钮。
此按钮,在我看来,是远远高于CBitmapButton的更好,因为以下几个原因:只需要一个正常的图像
其他图像或按钮请求自动生成
CBitmapButton的需要4个图像:正常,按下,重点,并禁用图像。图片背景是透明的。
透明功能是为CToolBar相同。支持资源位图和图像文件(如位图,GIF,JPG,)
因此,该按钮可以显示丰富的彩色图像,因为我们网站上,这是好得多看到。 支持工具提示。更多的选项。
以下是资源计划的接口。{S0}
中间的5个按钮的手笔。他们的前2使用资源位图 - 背景颜色是灰色的。底部3使用位图,GIF和JPG文件分别 - 背景颜色是黑色。
JPG文件的背景颜色不能被转移到正确COLOR_BTNFACE - 我会谈谈为什么后来
工具提示与每个按钮相关联。。如果您运行的源程序和移动鼠标到按钮,你可以看到他们在运行时工具提示。禁用的按钮

,如果您按一下右边的按钮quot;启用或disablequot;,按钮将启用/禁用禁用的按钮看起来像:
如果你仔细看,前2个按钮,您可能会发现其残疾的图像略有不同(见下文)。募集较弱
这是一个有趣的选项,它允许改变按钮的边框

加强边境绘制边界两次,实力较弱的吸引只有一次弱。的一点点。您可以点击右边的按钮quot;募集较弱或Strongerquot;更改选项。较弱的边界看起来像:
你能找到边界上面的第一张图片之间的差异呢?
XP使用不同的颜色来绘制按钮的边框,如RGB(241239226),RGB(113111100),我只用黑色和白色 - 简单或者懒惰。
XP操作系统失去,因为它的默认对话框颜色比95/98/NT的3D效果。焦点
如果一个按钮获得焦点,点线只是沿着边界内绘制。
选项允许隐藏的点线,所以这些点线不会被绘制的按钮,即使获得焦点
您可以尝试点击右键quot;显示或隐藏Focusquot;看到的功能。
我不喜欢的重点线,所以我为自己的选择添加 - 有另一个程序员谁不喜欢在世界的焦点边界?禁用策略
选项允许以不同的方式产生的残疾人形象:
左边是正常的 - 禁用Windows的图像,移动白影下来,右侧1个像素。正确的动作白影1个像素的顶部和左侧。
左边那个看起来像quot; sunkenquot,右一个看起来像quot; raisedquot;文件,类,使用和功能文件和类
有2个文件目录quot; libquot;源程序:ButtonMine(H和CPP)
该文件只包含一个类:ButtonMine,这是从CButton的继承。使用
静态的方式添加一个按钮,从VC对话框编辑器"对话框,然后更改所有者绘制。
从MFC类向导按钮添加一个成员变量的按钮样式。
转到对话框的头文件,改变按钮类型从CButton的ButtonMine。
上面的步骤完全相同,为CBitmapButton的,所以你知道他们已经。动态的方式
您可以调用Create()函数动态创建按钮。
昨天,后,我公司开发的按钮,我改变了我目前的商业应用程序从CBitmapButton的ButtonMine所有图像按钮,他们的工作完美,没有任何问题 - 但所有这些都是在静态的方式。
不幸的是,我没有尝试过一个动态的方式来创建一个按钮,到目前为止,因为我没有时间做多余的东西,除了我的应用需求。我想动态的方式应确定。
有2个原因我花时间写的文章:首先,我已经使用了几个源从CodeProject上下载的程序,他们是真正有用的,我提出一个公平交换的文章。第二,我希望我们的网站有更多的专业的交通,所以,请不要忘了访问我们的网站,仔细阅读DOC或下载我的源程序。功能

BOOL SetImage(int iBmpID,COLORREF clrBkgnd=RGB(192,192,192),

	BOOL bAutoSize=TRUE,BOOL bNormalDisable=TRUE);

BOOL SetImage(LPCSTR pszFile,COLORREF clrBkgnd,

	BOOL bAutoSize=TRUE,BOOL bNormalDisable=TRUE);

第一个函数加载图像从资源 - iBmpID确定
第二个函数从文件加载的形象 - pszFile确定
bAutoSize:如果调整按钮的大小是根据图像的大小。
bNormalDisable:残疾人士的形象是在quot; sunkenquot;(正常)或"raisedquot;风格 - 参考上面的图片
2功能,可称为任何地方 - 比如,在对话框的构造函数或OnInitDialog中()。{C}
可选功能必须调用已初始化对话框后 - 通常在OnInitDialog() - 因为刀尖需要有效的对话框窗口句柄

还有其他2 SetImage (...)函数的版本涉及的工具提示,所以他们必须对话框已经初始化后调用。
void SetWeaker(BOOL bWeaker)
可选功能
如果bWeaker是TRUE(默认值为false),按钮的边框只有一次 - 参考上面的图片。
void SetShowFocus(BOOL bShowFocus)
可选功能
,如果bShowFocus是FALSE(默认为TRUE),重点线不会得出 - 参考上面的图片。里面的代码
最重要的代码是在功能SetImage (...).
当一个资源位图的ID或图像文件传递到函数,模板缓冲区来读取图像的位,模板缓冲区被删除后,在函数内部使用。
有2永久的图像缓冲(类成员),一个是正常的影像,另外一个是适合残疾人士的形象。这2个缓冲区大于模板缓冲区 - 换句话说,2图像的2x2像素的大小比源图像的,因为残疾人的形象需要一个像素的边框,使残疾人的效果白影。
2缓冲器和内部类TheBitmap的实例bmp_Nml bmp_Dis举行。
当源图像复制到bmp_Nml,背景颜色转移到COLOR_BTNFACE,这就是为什么看一下按钮图像透明。
JPG图片不透的原因有2:
首先,我不知道如何使用Photoshop,所以我不知道如果背景颜色的图像文件(IMG \ img.jpg )是真正的黑
二,JPG文件加载功能:OleLoadPicturePath (...),谁知道什么功能不内?如果真的转让黑色到黑色,从JPG位图格式,图像应该是透明的。2006年8月,26:战后初期

回答

评论会员:z 时间:2