看了一天的VCL源代码,竟然没有发现哪句代码是画TRadioButton左边的圆圈的(100分)

  • 主题发起人 主题发起人 donkey
  • 开始时间 开始时间
D

donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
看了一天的VCL源代码,竟然没有发现哪句代码是画TRadioButton左边的圆圈的,
而且在checkbutton,Buttuon等等的源代码中也没有发现,难道是不图形作在资源里了?
 
TRadioButton,checkbutton,Buttuon,
都是Windows标准部件它们的绘制过程是由Windows完成的,
VCL通过API:CreateWindow创建出的这些部件,可以跟踪到。
 
这个是WINDOWS画的,你不用管,不像TStringGrid
 
应该不是windows画的,比较一下Vc和delphi写的程序,VC写的在winXp下能出winxp的效果,
但是delphi写的只有Form是Xp效果,其他的Button,RadioButtion,CheckButton,CheckBox,
ComBoBox等等,没有一项出得了XP效果的
 
而且,在delphi里有一条BS_FLAT的常量,在createwindow的Style里是找不到的,但是在
delphi的CreateParam里设置这个常量,你就会看到效果
 
你看看它有没有载入图形之类的,我认为画个图形在前面会比程序画它容易的多!
 
是WINDOWS画的吧.
 

procedure TRadioButton.CreateParams(var Params: TCreateParams);
const
Alignments: array[Boolean, TLeftRight] of DWORD =
((BS_LEFTTEXT, 0), (0, BS_LEFTTEXT));
begin
inherited CreateParams(Params);
CreateSubClass(Params, 'BUTTON');
with Params do
Style := Style or BS_RADIOBUTTON or //BS_RADIOBUTTON 就是实现圆圈的参数,去掉它就会画出一个button。
Alignments[UseRightToLeftAlignment, FAlignment];
end;
 
我也研究到这里,替换成bsflat可以画出一个平面,真是奇怪了,如果是windows画的,为
什么在XP下还是土头土脑的,但是VC写的东东就不会!如果是自己画的,具体画的代码在
哪里?
 
研究其他的控件,界面控件都是自己画的,可以找到具体的做图代码的
 
是 标准 Windows 组件,就是 Windows 的一个标准子窗口,
当然 Windows 就会有绘制过程。

不过,你可以看一下 CreateWindow(Ex),有一个参数是子类
化参数比如:Edit, Button, etc. RedioButton 也是其中之一。

既然 TRedioButton 是子类化窗口,当然需要 BS_RADIOBUTTON
来明确子类化实例了。
 
应该是Windows画的
The RADIOBUTTON statement creates a radio-button control. The control is a small circle that has the given text displayed next to it, typically to its right. The control highlights the circle and sends a message to its parent window when the user selects the button. The control removes the highlight and sends a message when the button is next selected.
Syntax

RADIOBUTTON text, id, x, y, width, height [, style [, extended-style]]

Parameters

style

Specifies styles for the radio button, which can be a combination of BUTTON-class styles and the following styles: WS_TABSTOP, WS_DISABLED, and WS_GROUP.
The default style for RADIOBUTTON is BS_RADIOBUTTON and WS_TABSTOP.

For more information on the text, id, x, y, width, height, style, and extended-style parameters, see
Common Statement Parameters.

Example

The following example demonstrates the use of the RADIOBUTTON statement:

RADIOBUTTON "Italic", 100, 10, 10, 40, 10
 
xp下出不来效果,我猜是因为xp绘制特殊效果的时候,根据类名来绘制不同的效果,
这个类名当然只能是windows标准的类名才能识别,比如Button,Edit...delphi里面
因为用VCL包装过,类名已经变成了TButton,TEdit,所以xp不能识别了。
 
在CreateParams里实现的都是由windows自己画的。
 
是的,windows画的,自己要画可以调用DrawFrameControl函数
 
to 一个过客:在radiobutton的原代码里面,他的类注册为button,而不是你说的TButton。
在界面控件Theme系列里面(在www.playicq.com有下载,界面是XP效果的),我发现TButton
的代码和VCL的几乎一样,但是重载了wm_paint消息,然后通过他的绘图引擎来绘制表面
(很多界面控件都有自己的绘图引擎),其实我认为在Delphi里面使用CreateParams是
申请了一个表面(而不是你们说的直接就是Button,Radiobutton等),这个表面是用来
由子类说了算,也就是说,BS_RADIOBUTTON这些东西都是用来标示的
procedure TRadioButton.CreateParams(var Params: TCreateParams);
const
Alignments: array[Boolean, TLeftRight] of DWORD =
((BS_LEFTTEXT, 0), (0, BS_LEFTTEXT));
begin
inherited CreateParams(Params);
CreateSubClass(Params, 'BUTTON');
with Params do
Style := Style or BS_RADIOBUTTON or //BS_RADIOBUTTON 就是实现圆圈的参数,去掉它就会画出一个button。
Alignments[UseRightToLeftAlignment, FAlignment];
end;

问题在于,我要创建自己的特定形状按钮,难道是在这里绘制表面吗?
 
DrawFrameControl是winapi的还是delphi的,在哪里调用才有效?
 
donkey: 别和我争,你用spy++看看就知道类名是Button还是TButton了
 
是API函数
可以在
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
中调用重绘
可以参考TBitbtn的源代码。
 
>>>>>可以在
>>>>>procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
>>>>>中调用重绘可以参考TBitbtn的源代码。
我就是这样干的,但是有两个问题:
在快速点击的情况的下
1.图像和点击无法同步显示
2.有闪烁现象
另外,我用invalidate无法让控件更新显示,奇怪了,也就是说:
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;没有触发
 
后退
顶部