不许用控件实现这样的功能!!!(50分)

  • 主题发起人 主题发起人 烂泥
  • 开始时间 开始时间

烂泥

Unregistered / Unconfirmed
GUEST, unregistred user!
如何改变button的按钮的背景颜色,
看Delphi的帮助中关于 WM_CTLCOLORBTN 消息的部分,越看越糊。

如何实现帮助中说的那样。
The WM_CTLCOLORBTN message is sent to the parent window of a button when
the button is about to be drawn. By responding to this message, the parent
window can set a button's text and background colors.
------------------------------------
the button is about to be drawn <------不懂

!!!不要告诉我有什么控件比较好。
 
;烂泥的问题令我很感兴趣,目前为止,我所取得的进展只是在 Button 上画了一个方框,
而且必须是用鼠标把按钮按下去再动一动才能看见这个方框,其他还不太清楚,按照 API Help
的说明返回刷子句柄也没有用。
TForm1 = class(TForm)
Button1: TButton;
Shape1: TShape;
private
procedure WMCTLCOLORBTN(var Msg: TMessage); message WM_CTLCOLORBTN;
end;
procedure TForm1.WMCTLCOLORBTN(var Msg: TMessage);
begin
Rectangle(Msg.wParam,0,0,10,10);// 必须是用鼠标把按钮按下去再动一动才能看见这个方框
Msg.Result := Shape1.Brush.Handle;// 这句话没有作用,Shape1 是另外一个控件 TShape,
// Shape1.Brush.Color = clRed,借用它的 Brush 用一下,
// 我希望按钮的背景会变红,但是没有
end;
 
这个问题是很有意思,我也研究了很久,但还没有眉目。
the button is about to be drawn 应该是说这个按钮已经被画,所以这个消息应该是在
按钮被画之后才有的,所以BaKuBaKu的代码只有在按下鼠标再动一动才会起作用,是不是
这时已经失去了自己画按钮的机会呢?还有我想可能要改变Msg.Result。
有点意思,继续研究!
 
the button is about to be drawn 是说这个按钮即将被画。
 
找个有源代码的并符合你的要求的控件,然后看看它是怎么实现的吧!这是一个很好的
学习方法。
 
the button is about to be drawn
english当然知道什么意思,但是我不理解button的自画是指什么。
继续研究

TO:郭镇松
看了你的帖子,原来还是老乡,难得。我高中在四中,你呢?
 
大家试一下以下的代码就会发现,在按钮被单击的一刹那,WM_CTLCOLORBTN消息
已经发生,只是它绘制出的图象被按钮的标准绘制过程绘制的图象所覆盖,不能
看到而已。而且每次“用鼠标把按钮按下去再动一动”都会激发WM_CTLCOLORBTN,
这时控件已经不再绘制按钮的外观(通过在source目录中查找不到消息
WM_CTLCOLORBTN的处理过程可以得知),所以这时的矩形才能被我们看到。
另外,在鼠标点击按钮抬起的一瞬间,WM_CTLCOLORBTN也会被发出。
TForm1 = class(TForm)
Button1: TButton;
Shape1: TShape;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
procedure WMCTLCOLORBTN(var Msg: TMessage); message WM_CTLCOLORBTN;
end;

procedure TForm1.WMCTLCOLORBTN(var Msg: TMessage);
begin
Rectangle(Msg.wParam,0,0,10,10);// 必须是用鼠标把按钮按下去再动一动才能看见这个方框
Listbox1.Items.Add('draw rect');
Msg.Result := Shape1.Brush.Handle;// 这句话没有作用,Shape1 是另外一个控件 TShape,
// Shape1.Brush.Color = clRed,借用它的 Brush 用一下,
// 我希望按钮的背景会变红,但是没有
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Listbox1.Items.Add('button clicks');
end;
我想这个东西是用来统一窗体上的按钮的风格的吧,因为窗体上所有的按钮在被绘制时都会触发
这个消息,除此之外我想不出他的其他用途:
WM_CTLCOLORBTN
hdcButton = (HDC) wParam; // handle of button display context
hwndButton = (HWND) lParam; // handle of button
 
看看 TBitButton 的源代码,他怎么画的图。
 
to 烂泥: 我在镇中,你在哪儿工作?
 
TBitButton 的源码我不知道看了几遍,和这个无关。
这个消息肯定是用于自绘按钮的,只是不知道怎样同其他消息协作。
 
多人接受答案了。
 
后退
顶部