做自绘按钮的时候遇到一个奇怪的问题

边城狂人 2006-09-23 01:16:33
我做的自绘按钮一般情况下正常,但是如果在按钮上按下鼠标,然后再把鼠标拖到外面,按钮就会变成默认按钮的样子,谁知道是怎么回事吗?

我是直接截的 WM_PAINT 消息,不过后来试了用了 BS_OWNERDRAW 样式和 WM_DRAWITEM 消息也没用。

如果谁能给我一个自绘按钮的示例最好,那就太感谢了!
...全文
207 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
madbo 2006-09-23
  • 打赏
  • 举报
回复
起床啦!看到楼主的问题,又仔细看了下TControl源码.
注意到这几个变量是用来描绘控件边框的.
FBevelEdges: TBevelEdges;
FBevelInner: TBevelCut;
FBevelOuter: TBevelCut;
FBevelKind: TBevelKind;
FBevelWidth: TBevelWidth;
FBorderWidth: TBorderWidth;
简单试了一下,在新控件中把这几个相关的属性都设成None(如:bsNone,bvNone...),似乎就可以解决楼主的问题了.
边城狂人 2006-09-23
  • 打赏
  • 举报
回复
我按 madbo(风轻扬{十年磨一剑}) 的意见,处理了 CM_MOUSEENTER, CM_MOUSELEAVE, WM_LBUTTONDOWN, WM_LBUTTONUP 等消息之后,上面的问题似乎已经解决了。
但是,如果我不给按钮 CLICK 事件,不断的点这个按钮,有时候还是会发现这个按钮显示原型,所以我觉得可能没从根本上去解决这个问题。不知道 Windows 的按钮是在哪里画的,这么顽固
王集鹄 2006-09-23
  • 打赏
  • 举报
回复
如果不是从TWinControl继承,控件不会有句柄和焦点

第2个问题可以参考TLabel的实现
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;

procedure TCustomLabel.CMDialogChar(var Message: TCMDialogChar);
begin
if (FFocusControl <> nil) and Enabled and ShowAccelChar and
IsAccel(Message.CharCode, Caption) then
with FFocusControl do
if CanFocus then
begin
SetFocus;
Message.Result := 1;
end;
end;
边城狂人 2006-09-23
  • 打赏
  • 举报
回复
多谢,我试试先。顺便问一下,如果不是从 TButton 继承,而是从 TControl 或者 TImage 等组件继承,那么怎么实现如下这些按钮特性:
1. 设置为 Default 或者 Cancel
2. &Caption 这种 caption 在窗体中按 Alt+C 的时候,激活按钮(我可以画,但不知道怎么接受热键)
3. 获取焦点
madbo 2006-09-23
  • 打赏
  • 举报
回复
个人意见,截获这两个消息:
//鼠标移动到控件
Procedure MouseMove(Shift: TShiftState; X, Y: Integer);Override;
//鼠标离开控件
Procedure MouseLeave(Var Msg: TMessage); Message CM_MOUSELEAVE;// Uses Controls;
相信具体的代码楼主会写。
边城狂人 2006-09-23
  • 打赏
  • 举报
回复
谢谢,试了那个个控制边框的东西,没用。
最后我发现,原来是双击的时候会显示原形,原来我说的连续点击,里面其实就是触发了好多次双击。所以我把 WM_LBUTTONDBLCLK 也给它截了,就 OK 了。

再次感谢!

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧