Fundamental Properties of a Control
|
Introduction
|
As mentioned already, in Microsoft Windows, to create
a control, you can call either the CreateWindow() or the
CreateWindowEx() function. In a VCL application, you can get a control
from the Tool Palette, you can dynamically create a control, or you can
use one of the above Win32 functions.
|
To access the handle to a control, when creating it,
make sure you return its HWND value. Once you have the return value
of a control, you can access that value any way you see fit in your program.
When creating a VCL application, you will mostly use the
properties, methods, and events defined by that library. Because the VCL
implements the Windows controls through a class called TWinControl,
it makes sure it provides you with an HWND handle that allows you to
directly access the properties or messages of the control as defined in the
Win32 library. The handle to a Windows control is (simply) called Handle.
If you are using the Win32's CreateWindow() or
CreateWindowEx() function, you can either use one of the existing names
of controls or you are create a control with a custom name. The Win32
library provides already defined names of classes you can use to create a
control. The standard controls use the following class names:
Microsoft Windows added a few more class names for
objects referred to as common controls. Fortunately, whether you want to use
standard or common controls, the VCL provides friendlier implementations of
all of them with even more Windows controls than the Win32 provides. The
names of classes of controls are available in both the Tool Palette and the
help file. To examine a class in the online help, first locate the package
in which it is defined. Expand that node, then click the name of the class
you want. Here is an example:
You can then use that name to dynamically create a
control or to check its documentation.
To use one of the Win32 classes, pass its name as string
to the lpszClassName argument of the CreateWindow() or the
CreateWindowEx() functions.
If the control has been created already and you want to
find its class name, the Win32 library provides the GetClassName()
function. The hWnd argument is the handle of the control whose
class name you want to find out. The lpClassName is the string that
will be returned by this function. This means that you must first declare a
string and pass it to this function. After the function has been called, the
variable will carry the sought class name. The nMaxCount is the
length of the lpClassName string.
Whether you are using the VCL or the Win32 libraries,
although you can change the name of a control at runtime, refrain from doing
it.
To create a control, the primary piece of information
you must provide is its name. This allows you and the compiler to know what
control you are referring to when the program is running. Specifying the
name of a control may depend on the technique you decide to use to create
the control.
In the CreateWindow() or
CreateWindowEx() function, the control's name is primarily created
as the lpWindowName argument. In the VCL, to let
you get the name of a control, the TComponent class is
equipped with a property named Name:
property Name: TComponentName read FName write SetName;
This Name property is inherited by all
other classes that derive directly or indirectly from TComponent.
After adding a control to a form, it automatically
receives a name. In the Object Inspector, the control's name displays in the
Name field:
A newly added control reflects the name of its icon from
the Tool Palette and adds an incremental number. For example, if you click
the TEdit icon in the Tool Palette and click the form, the control would be
named Edit1. If you add a second TEdit control, it would be named Edit2.
This causes the default names to be incremental. Since a program usually
consists of many controls, it is usually a good idea to rename your controls
and give them meaningful and friendlier names. The name should help you
identify what the button is used for.
To change the name of a control, on the Object
Inspector, click the word Name and type a valid Pascal.
Some controls are text-based. This means that they are
meant to display or sometimes request text from the user. For such controls,
this text is referred to as caption while it is simply called text for some
other controls. This property is not available for all controls.
If you are using the Win32 approach, the text of a
text-based control is passed as the lpWindowName argument of the
CreateWindow() or the CreateWindowEx() functions. In the VCL, to
support the caption, the TControl class is equipped with a
property named Caption:
property Caption: TCaption read GetText write SetText;
The TControl class is also equipped
with another property named Text:
property Text: TCaption read GetText write SetText;
As mentioned already, not all controls display text.
Those that do inherit the appropriate property from TControl.
If a control displays text, it then has a Text or a Caption
property in the Object Inspector. Here is an example:
After adding such a control to a form, its Caption
or its Text field would hold the same text as its name. At design
time, to change the text of the control, click either its Caption or
its Text field and type the desired value. For most controls, there
are no strict rules to follow for this text. Therefore, it is your
responsibility to type the right value.
The text provided in a Caption or Text
fields of a text-based control can only be set "as is" during design. If you
want the text to change while the application is running, you can format it.
For example, a control can display the current time or the name of the user
who is logged in. These format attributes cannot be set at deign time.
To change the text of a text-based control at run time,
either assign a simple string or provide a formatted string to either the
Caption or the Text property. As we will see when studying
messages and events, you can also change the text of a control using the
SendMessage() function with the message set as WM_SETTEXT.
|
When it comes to Microsoft Windows controls, a style is
a characteristic that defines how the object
looks and behaves with regards
to the other objects of the same application or objects of the other
applications on the same computer. The styles are varied from one control to
another although they
share some of the characteristics common to most
Windows controls.
The Win32 library defines a certain number of styles
that were released with Microsoft Windows 95.
Additional styles were created
later and were named extended styles. If you programmatically create
a
window using either the CreateWindow() or the
CreateWindowEx() function, specify its style(s)
as the dwStyle
argument.
As mentioned already, in the Win32, you can specify a
style when creating it using CreateWindow() or
CreateWindowEx(). If the control has been created already and you
want to change its style, you can
call the SetWindowLongPtr()
function.
The hWnd argument represents the handle of the
control whose style you want to change.
The nIndex argument is the byt value that
represents the type of change you want to make. For a control,
it can be
GWL_STYLE to indicate that you want to change a style, or
GWL_EXSTYLE to indicate that
you want to change an extended
style.
The dwNewLong represents the new style you want
to apply.
If a control exists already, to find out the style(s) it
is currently using, you can call the GetWindowLongPtr()
function.
The arguments are the same first two of the
SetWindowLongPtr() function.
In the VCL, the styles are defined as properties of the
TControl (for all visual and non-visual controls)
and the
TWinControl (for visual controls) classes. To specify or
change the property of a control, if the
property is read-write, you can
access it from its class and assign the desired value. To get the value of a
property, get its write accessor.
All of the controls you will create need to be hosted by
another control. During design, once you position
a control on a form, it
(the control) automatically gets the status of child.
If you are creating a control using the
CreateWindow() or the CreateWindowEx() function, to specify that
the control is a child, add the WS_CHILD flag to the dwStyle
argument. When designing an application, once
you add it to a form, it
becomes that form's child.
The controls added to a form are confined to the area of
the body offered by that window. After adding it to
a window, the control is
positioned in the body of the form using a Cartesian coordinate system whose
origin
is located on the top-left corner
of the parent window. The
horizontal measurements move from the origin to the right. The vertical
measurements
move from the origin to the bottom.
If you are using the CreateWindow() or the
CreateWindowEx() functions, to set the left distance, pass the
desired
value as the X argument. On the other hand, to specify the top
distance, pass the desired value for the
Y argument.
In the VCL, the distance from the control's left border
to the parent's left border is represented by the Left
property
of the TControl class:
__property int Left = {read=FLeft,write=SetLeft};
The distance from the control's top border to the
parent's top border is called the Top property of the
TControl class:
property Top: Integer read FTop write SetTop;
The Left and Top
values are known as the control's location. This can be illustrated as
follows:
When you click a control on the Tool Palette and click
its parent window, the Left and Top values
are set where
the mouse landed. To change the location of a control, as we
saw already, you can click and drag it to the new
desired location.
Alternatively, you
can type the desired value in either the Left
or the Top fields on the Object Inspector. At design time,
if you drag
a control to move it,
Embarcadero RAD Studio updates the values
of its location. If you save the project, the compiler would also save
the
locations
of all objects, including the form, so that the next time you run
the application, the compiler would remember to display
the form where it
was last positioned at design time.
To programmatically move a control, which is equivalent
to changing the values of the Left or the Top
properties
at run time, assign the desired respective values. If you set a
negative value for the Left field, the left border of the
control would be hidden. In the same way, a negative Top
value would hide the top border of the control. Make sure
you use valid
integer values; otherwise you would receive an error when you compile the
project.
The width of a control is the distance from its left to
its right borders. The height of a control is the distance from
its top to
its bottom borders.
If you are creating the control using the
CreateWindow() or the CreateWindowEx() functions, specify the
value for the
distance from the left border of the parent window to the left
border of the control as the nWidth argument. In the same
way, pass
the
desired value for the distance from the top border of the parent to the
top border of the control as the nHeight argument.
If you specify
negative values for the left and top distances, either the left or the top
borders, respectively, will be hidden.
In the VCL, the distance from the left border to the
right border of a control is represented by the Width
property
of the TControl class:
property Width: Integer read FWidth write SetWidth;
In the same way, the height of a control is represented
by the Height property of the TControl
class:
property Height: Integer read FHeight write SetHeight;
The size of a control can be illustrated as follows:
If you click a control's button on the Tool Palette and
click its parent window, the control assumes some default
dimensions in the
body of the parent. As we saw in the previous lesson, to change the
dimensions of a control,
you can drag one of its borders or corners.
Alternatively, on the Object Inspector, you can type the desired values
in
either or both the Height and the Width fields.
If the control has already been created, you can resize
it at run time. To change the dimensions programmatically,
simply assign the
desired value to the Height and/or Width
property of your choice. If the value you give to a
property is not allowed,
the
program would throw an error.
If you are creating a graphical application for a touch
screen, you should use as much space for each control as
possible. This
means that you should use a with and a height larger than the values used
for a regular program.
There are two main categories of windows you will need
to create for your application: parents and children:
A child window can be a parent of another control. For
example, the Standard toolbar of the RAD Studio is the parent
of the buttons
on it. If you close or hide the toolbar, its children disappear. At the same
time, the toolbar is a child of
the application's frame. If you close the
application, the toolbar disappears, along with its own children. In this
example,
the toolbar is a child of the frame but is a parent to its buttons.
If you create a control using either the
CreateWindow() or the CreateWndowEx() function, to
specify its parenth,
pass the parent's handle as the hWndParent
argument. If the control has been created already, to specify or
change its
parent at run time, you can call the SetParent() function.
The hWndChild argument is the handle of the
control whose parent you want to change. The hWndNewParent
argument
must be the handle of the new parent. To find out what object acts as the
parent of a control, you
can call the GetParent() function.
The hWnd argument is the handle of the control whose parent you
want to find out.
In the VCL, the parent of a control is also referred to
as the owner. To support it, the TComponent class is
equipped with the Owner property:
property Owner: TComponent read FOwner;
If you decide to dynamically create a control, you must
specify its owner. The owner will be responsible for hosting
or carrying the
child control. The name of the owner is passed to the constructor of the
control. After specifying the
owner, you must also
specify the parent of the
control. The parent is responsible for destroying the child control when it
(the parent)
is destroyed. To support
this, the TControl
class is equipped with a property named Parent:
property Parent: TWinControl read FParent write SetParent;
All classes of visual controls inherit this property.
Therefore, to specify the parent of a control, access its Parent
property and assign it the name of the parent. Normally, the name of the
parent is the same as the owner.
If you declare and completely create a control in an
event or a method, the control would be available only in
that member
function and cannot be accessed outside. To make such a control available to
other events or
controls owned by the same
parent, you should declare it in
the header file of its parent. After declaring the variable, you can
sepecify its
parent and owner in the constructor of the form.
If the control has already been created and you want to
know "who" its parent is, you can assign its Parent
property to a
TWinControl variable.
Alternatively, to find out what object acts as a
control's parent, call the Win32 API's GetParent()
function.
The hWnd argument must be a handle to the control whose
parent you want to find out.
We have reviewed the fundamental pieces of information
necessary to create a simple or normal
control by calling either the
CreateWindow() or the CreateWidowEx() function:
|
No comments:
Post a Comment