Paip.提升用户体验------在C++ Builder 不规则图片按钮实现总结

本文介绍了使用C++ Builder创建不规则形状按钮的方法,包括利用图像组件、CreateRectRgn结合SetWindowsRgn等技术,并详细阐述了这些方法的具体实现过程及原理。

Paip.提升用户体验------C++ Builder 不规则图片按钮实现总结

 

1.使用图像组件(简单的) 1

2.使用默认按钮设置mask以及背景(不行).. 1

CreateRectRgn+CombineRgn +SetWindowsRgn法(常用) 1

CreatePolygonRgn+SetWindowsRgn 2

///////////使用gdi+ 2

///////////原理 2

已经有了按钮的修理(隐藏按钮,加图片) 3

参考: 3

 

 Xpsp3+C++ Builder 2009

 

作者Attilax ,  EMAIL:1466519819@qq.com 

来源:attilax的专栏

地址:http://blog.youkuaiyun.com/attilax

 

 

1.使用图像组件(简单的)

使用图像创建按钮不仅可以使按钮的颜色和形状变化更加灵活,而且不需编写过多的代码

但是,图片只是绘出来的的,没有handle,没有focus...

 

2.使用默认按钮设置mask以及背景(不行)..

但是,vcl好像没设置mask, 背景只能bmp格式..放弃..

 

 

CreateRectRgn+CombineRgn +SetWindowsRgn法(常用)

这个ms常使用.

C++Builder5编制不规则界面精美媒体播放器 计算机理论 道客巴巴.htm

Image shaped forms.htm   by Andy Walker

 

 

 

CreatePolygonRgn+SetWindowsRgn

扫描图片轮扩...SetWindowsRgn

 

 ///////////使用gdi+

 GDI+功能强大,处理图片更是轻松多了,直接支持RGBA色彩。

 

 

 

 

 

///////////原理

---- 由于Window 95增加了对窗口区域概念的支持,使得窗口区域就是所定义的窗口看上去的形状,窗口区域作为窗口的实际边界区域,这样窗口区域不仅定义了窗口的可画区域,而且定义了窗口下隐含区域和响应鼠标击键事件的响应窗口区域。  

 

---- 按钮的各种形状是在运行时设置的而不是在设计时设置。设计时按钮的形状仍然是长方形或正方形。 

 

---- 按钮形状的设计分成两个步骤。 

 

---- 第一步创建按钮的外形,即定义窗口区域。使用API的区域创建函数就可达到目的。区域创建函数很多,主要有CreateEllipticRgn CreatePolygonRgn、 CreateRectRgn、 CreateRoundRectRgn,用于创建不同类型的区域显示。如果需要一个复杂区域形状,那么可以分别使用不同的区域函数创建不同的区域,然后调用CombineRgn API函数把它们组合起来。所以说,不仅可以创建出园形、三角形的按钮,而且还可以创建出其它各种形状的按钮。 

 

---- 第二步将区域显示应用到窗口上。一旦使用区域函数创建了一个新的区域显示,就可以使用SetWindowsRgn函数将这个区域应用到窗口上。 

 

 

实现窗口区域的最佳时机是在窗体首次创建时,所以将处理程序放在OnCreate事件中。 

 

 

 

 非规则窗体的制作关键是要得到一个表示这个不规则区域的数据结构,MFC里由CRgn类来表示。要通过图片来获得按钮区域,只需要检测相关的点生成这个类的实例即可。

 

 

 如下所示,直接检测象素点的A分量是否为0,不为0则该点就是窗体区域的一部分。

 

 

已经有了按钮的修理(隐藏按钮,加图片)

不个按钮不显示加个图片,加事件,调用按钮的event..

 

参考:

如何用c++builder做不规则外形的按钮? - 优快云论坛 - youkuaiyun.com.htm

通过检测png图片透明区实现不规则按钮 - Enin的专栏 博客频道 - youkuaiyun.com.htm

C++Builder5编制不规则界面精美媒体播放器 计算机理论 道客巴巴.htm

 

### PAIP编程珠玑中的示例代码解释 PAIP(Paradigms of Artificial Intelligence Programming)是一本深入探讨人工智能编程范式的书籍,其中包含了大量 Lisp 编写的程序实例。这些例子不仅展示了如何实现特定的人工智能算法,还提供了关于良好软件工程实践的重要见解。 #### 示例:通用求解器框架 书中介绍了一个名为 `defun` 的宏来定义函数,在构建通用问题解决器时非常有用[^1]: ```lisp (defun solve (problem) "Find a solution to the given problem." (let ((solution nil)) ;; Attempt to find a solution using backtracking. (labels ((try-next-option () (when (not solution) (if (no-more-options-p ()) (return-from try-next-option nil) (let* ((option (next-option))) (cond ((goal-reached-p option) (setf solution option)) (t (push-state option) (solve problem) (pop-state)))))))) (try-next-option) solution))) ``` 这段代码实现了回溯法解决问题的一般模式。通过递归调用自身并尝试不同的选项直到找到解决方案为止。如果当前路径无法通向目标,则会恢复之前的状态继续探索其他可能性。 此方法能够有效地处理许多复杂的组合优化类问题,并且由于其灵活性可以很容易地适应各种具体应用场景下的需求变化。 #### 示例:自然语言理解模块 另一个重要的部分涉及到了自然语言处理技术的应用案例——基于语法分析树结构来进行语义解析: ```lisp (defun parse-sentence (sentence) "Parse SENTENCE into its constituent parts and build an interpretation tree." (multiple-value-bind (subject verb-object) (split sentence 'verb) `(sentence :subject ,(parse-noun-phrase subject) :action ,verb-object))) (defun parse-noun-phrase (np-string) "Interpret NP-STRING as either a simple noun or compound phrase." ...) ``` 上述片段演示了如何将输入字符串分割成主谓宾成分,并进一步解析名词短语的具体含义。这种层次化的表示方式有助于后续更高级别的推理操作以及对话管理等功能的设计与实现。 #### 示例:专家系统规则引擎 最后值得一提的是书中对于专家系统的讨论,特别是有关于事实库管理和匹配机制的部分: ```lisp (defstruct fact id pattern bindings) (defun match-patterns (pattern facts) "Return all FACTS that unify with PATTERN, along with their BINDINGS." ...) (defun add-fact (kb new-fact) "Add NEW-FACT to knowledge base KB after checking consistency against existing rules." ...) ``` 这里展示了一种简单而有效的知识表达形式及其相应的查询接口设计思路。通过对模式进行统一化计算从而快速定位符合条件的事实条目;而在更新数据库前则需确保新加入的信息不会引起逻辑矛盾等问题的发生。 以上仅是从《Programming Pearls》一书摘取的一些精彩片段,实际上该著作涵盖了更为广泛的内容领域和技术细节等待读者去发掘学习。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值