Documentos de Académico
Documentos de Profesional
Documentos de Cultura
[grupo Danysoft]
www.danypress.com
III
Dedicatoria
John Ayres
Quiero dedicar este libro a las siguientes personas y divinidades, que han ejercido una
profunda influencia en mi vida. Ante todo, a Dios, de quien he estado mucho ms cerca
en los ltimos aos, por haberme dado la inteligencia necesaria para navegar a travs
de la confusa y a veces desquiciante documentacin del API de Windows y sacar
sentido de ella; en segundo lugar, a mi familia, que ha tenido que soportar mi ausencia
de las actividades familiares durante el tiempo que ha durado este proyecto; y
finalmente, pero de forma muy especial, a mi esposa y compaera del alma, Marci. Ella
me dio aliento en los momentos en los que el peso del proyecto se haca insostenible, y
por eso es responsable directa de que este trabajo se haya finalizado. No merezco una
esposa tan devota y amante, y agradezco a Dios cada da por haberme dado tan perfecta
compaera. Cario, te lo dedico a t!
David Bowden
Las personas que se enumeran a continuacin han dejado una profunda marca en mi
vida. De todos ellos he recibido enseanza, estmulo y retos interesantes. Puedo
honestamente decir que sin el impacto y la influencia que ellos han causado en mi vida
no habra sido capaz de llegar a ninguna parte. Por eso les estar eternamente
agradecidos: Don y Ethel AllRed, Richard y Susie Azar, Ken Blystone, Lori Bruns,
Larry Bujanda, E. Davis Chauviere, Sandra Crow, Alfonso Daz, Larry F. Diehl III,
Wade Driver, Charles Evans, Jerry W. Francis II, Glen Hill, Patrick Smith, Ann
Stewart, Dan Stiles, Volker Thein, Ryan y Desi. Finalmente, el ms importante, Henry
J. Dipietro de InterGraph Corporation. De no ser por su visin y deseo de ofrecerme
una oportunidad, no estara hoy donde estoy. Las palabras no pueden expresar mi
gratitud por la oportunidad, el estmulo y el apoyo que me has dado. Nunca olvidar lo
que hiciste por mi carrera. Gracias, Hank, eres un gran hombre!
Larry Diehl
Dedico mi trabajo en este libro al pasado y al futuro. Desde el fondo de mi alma,
agradezco a mi esposa, padres y hermano por su apoyo constante durante estos aos.
Ese apoyo me ha permitido llegar a un punto en mi vida en el que me siento todo lo
feliz que un hombre puede serlo. En relacin con el futuro, deseo que nuestro trabajo
en este libro contribuya a hacer un mundo mejor, en el que mi primer hijo pronto
nacer. En cuanto al presente, es lo que uno obtiene de l...
IV
Phil Dorcas
A mis hijas, Jennifer y Amanda, que son la luz de mi vida.
Ken Harrison
Quiero dedicar este libro a mis padres, Melvin y Judith Harrison, por todos los
sacrificios que han tenido que hacer para darnos a m y a mis hermanos un entorno
seguro en el que crecer, e inculcarnos la idea de que podemos hacer cualquier cosa que
nos propongamos. Tambin deseo agradecer a Daniel Roberts y Stethman Grayson por
todo el conocimiento sobre Windows que me han aportado y por ser tan buenos
amigos.
Rod Mathes
Deseara agradecer a todos los coautores de este libro haberme ofrecido la oportunidad
de contribuir a esta pequea obra maestra, y muy en especial a John Ayres. Tambin
deseo dar las gracias a mi esposa, Sherry, y a mis tres hijos, Keith, Kimberly y Amber,
que tuvieron que hacer su vida sin m durante meses, pero al final lo hemos superado
todoahora tenemos una vida!
Ovais Reza
Dedico este libro a mi familia y amigos.
Mike Tobin
A mi esposa, Lisa, por haber comprendido mi trabajo nocturno en el libro en fechas tan
cercanas a nuestra boda, y a mis cuatro gatos, que me hicieron compaa durante esas
noches.
Contenido
Sobre los autores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIX
Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXI
Prlogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXIII
Introduccin . . . . . . . . . . . . . . . . . . . . . .
Descripcin de los captulos . . . . . . . . . . . . . . . .
Convenios . . . . . . . . . . . . . . . . . . . . . . . . . .
Descripciones de funciones . . . . . . . . . . . . . . . .
Cdigo fuente de los ejemplos . . . . . . . . . . . . . . .
A quin est orientado este libro . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. XXV
. XXVI
XXVIII
. XXIX
. XXIX
. XXIX
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
4
4
4
5
5
6
7
7
. . 9
. . 10
. . 10
. . 11
. . 13
. . 14
. . 15
. . 16
. . 20
. . 20
. . 21
. . 26
VI
Captulo 3
CreateCompatibleDC .
DeleteDC . . . . . . .
DPtoLP . . . . . . . .
EnumDisplaySettings .
GetDC . . . . . . . . .
GetDCOrgEx . . . . .
GetDeviceCaps . . . .
GetMapMode . . . . .
GetSystemMetrics . . .
GetViewportExtEx . .
GetViewportOrgEx . .
GetWindowDC . . . .
GetWindowExtEx . . .
GetWindowOrgEx. . .
LPtoDP . . . . . . . .
MapWindowPoints . .
OffsetViewportOrgEx .
OffsetWindowOrgEx .
ReleaseDC. . . . . . .
RestoreDC . . . . . . .
SaveDC . . . . . . . .
ScaleViewportExtEx .
ScaleWindowExtEx . .
ScreenToClient . . . .
ScrollDC. . . . . . . .
SetMapMode . . . . .
SetViewportExtEx. . .
SetViewportOrgEx . .
SetWindowExtEx . . .
SetWindowOrgEx . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
28
31
32
32
35
37
37
46
48
53
54
55
56
57
58
59
61
62
63
64
64
65
70
71
71
74
76
77
78
78
Funciones de dibujo . . .
Objetos grficos . . . . . . .
Plumas y Brochas . . . . .
Funciones de dibujo . . . . .
Arc. . . . . . . . . . .
BeginPaint . . . . . . .
Chord . . . . . . . . .
CreateBrushIndirect . .
CreateHatchBrush . . .
CreatePatternBrush . .
CreatePen . . . . . . .
CreatePenIndirect . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
81
81
82
83
85
87
89
91
94
96
97
99
VII
CreateSolidBrush . .
DeleteObject . . . . .
DrawCaption . . . . .
DrawEdge . . . . . .
DrawFocusRect . . .
DrawFrameControl .
DrawState . . . . . .
Ellipse . . . . . . . .
EndPaint . . . . . . .
EnumObjects . . . . .
ExtCreatePen. . . . .
ExtFloodFill . . . . .
FillPath . . . . . . . .
FillRect . . . . . . . .
FillRgn . . . . . . . .
FrameRect . . . . . .
FrameRgn . . . . . .
GetBkColor . . . . .
GetBkMode . . . . .
GetBoundsRect . . .
GetBrushOrgEx . . .
GetCurrentObject . .
GetCurrentPositionEx
GetMiterLimit . . . .
GetObject . . . . . .
GetObjectType . . . .
GetPixel . . . . . . .
GetPolyFillMode. . .
GetROP2 . . . . . . .
GetStockObject . . .
GetUpdateRect . . . .
GetUpdateRgn . . . .
GrayString . . . . . .
InvalidateRect . . . .
InvalidateRgn . . . .
LineDDA. . . . . . .
LineTo . . . . . . . .
LockWindowUpdate .
MoveToEx . . . . . .
PaintDesktop . . . . .
PaintRgn . . . . . . .
Pie . . . . . . . . . .
PolyBezier . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
102
103
103
105
108
109
114
117
119
120
123
127
128
129
131
132
133
135
136
136
138
139
140
141
142
147
148
148
150
152
154
155
156
159
161
163
165
166
167
168
168
170
172
VIII
PolyBezierTo. . .
Polygon . . . . .
Polyline . . . . .
PolylineTo . . . .
PolyPolygon . . .
PolyPolyline . . .
Rectangle. . . . .
RoundRect . . . .
SelectObject . . .
SetBkColor. . . .
SetBkMode. . . .
SetBoundsRect . .
SetBrushOrgEx .
SetMiterLimit . .
SetPixel . . . . .
SetPixelV. . . . .
SetPolyFillMode .
SetROP2 . . . . .
StrokeAndFillPath
StrokePath . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
173
175
175
177
178
179
181
183
185
186
187
187
189
190
191
192
193
195
196
197
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 199
. . . . 199
. . . . 199
. . . . 202
. . . . 202
. . . . 205
. . . . 206
. . . . 207
. . . . 208
. . . . 210
. . . . 213
. . . . 214
. . . . 215
. . . . 216
. . . . 219
. . . . 222
. . . . 223
. . . . 224
. . . . 226
. . . . 226
. . . . 227
. . . . 228
IX
ExtCreateRegion .
ExtSelectClipRgn
FlattenPath . . . .
GetClipBox . . .
GetClipRgn . . .
GetPath . . . . . .
GetRegionData. .
GetRgnBox. . . .
InflateRect . . . .
IntersectRect . . .
InvertRect . . . .
InvertRgn. . . . .
IsRectEmpty . . .
OffsetClipRgn . .
OffsetRect . . . .
OffsetRgn . . . .
PathToRegion . .
PtInRect . . . . .
PtInRegion . . . .
PtVisible . . . . .
RectInRegion. . .
RectVisible . . . .
SelectClipPath . .
SelectClipRgn . .
SetRect . . . . . .
SetRectEmpty . .
SetRectRgn. . . .
SetWindowRgn .
SubtractRect . . .
UnionRect . . . .
WidenPath . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
231
234
235
236
237
238
241
242
243
244
244
246
246
247
249
253
255
257
258
259
260
260
261
266
269
270
271
272
275
276
277
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 279
. . . . 279
. . . . 280
. . . . 280
. . . . 280
. . . . 287
. . . . 288
. . . . 288
. . . . 290
. . . . 292
. . . . 293
CopyImage . . . . . . . . . .
CreateBitmap. . . . . . . . .
CreateBitmapIndirect . . . .
CreateCompatibleBitmap . .
CreateDIBitmap . . . . . . .
CreateDIBSection . . . . . .
CreateEnhMetaFile . . . . .
DeleteEnhMetaFile . . . . .
EnumEnhMetaFile . . . . . .
GetBitmapBits . . . . . . . .
GetBitmapDimensionEx . . .
GetDIBits . . . . . . . . . .
GetEnhMetaFile . . . . . . .
GetEnhMetaFileDescription .
GetEnhMetaFileHeader . . .
GetStretchBltMode . . . . .
LoadBitmap . . . . . . . . .
LoadImage . . . . . . . . . .
PatBlt. . . . . . . . . . . . .
PlayEnhMetaFile. . . . . . .
PlayEnhMetaFileRecord . . .
SetBitmapBits . . . . . . . .
SetBitmapDimensionEx . . .
SetDIBits . . . . . . . . . . .
SetDIBitsToDevice . . . . .
SetStretchBltMode . . . . . .
StretchBlt. . . . . . . . . . .
StretchDIBits. . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
293
296
299
302
304
308
316
319
320
323
325
325
329
332
333
335
336
340
343
345
346
347
350
351
355
358
359
362
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 367
. . . . 367
. . . . 368
. . . . 369
. . . . 372
. . . . 373
. . . . 374
. . . . 376
. . . . 379
. . . . 382
. . . . 384
. . . . 386
. . . . 388
. . . . 389
XI
DestroyIcon . . . . . . . . . . .
DrawIcon. . . . . . . . . . . . .
DrawIconEx . . . . . . . . . . .
ExtractAssociatedIcon . . . . . .
ExtractIcon . . . . . . . . . . . .
ExtractIconEx . . . . . . . . . .
GetCursor . . . . . . . . . . . .
GetIconInfo . . . . . . . . . . .
HideCaret . . . . . . . . . . . .
LoadCursor. . . . . . . . . . . .
LoadCursorFromFile. . . . . . .
LoadIcon . . . . . . . . . . . . .
LookupIconIdFromDirectory . .
LookupIconIdFromDirectoryEx .
SetCursor. . . . . . . . . . . . .
SetSystemCursor . . . . . . . . .
ShowCaret . . . . . . . . . . . .
ShowCursor . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
390
390
391
393
394
396
399
399
403
403
405
406
407
408
409
410
412
413
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 415
. . . . 415
. . . . 416
. . . . 416
. . . . 419
. . . . 420
. . . . 424
. . . . 427
. . . . 432
. . . . 433
. . . . 437
. . . . 440
. . . . 441
. . . . 442
. . . . 445
. . . . 447
. . . . 447
. . . . 450
. . . . 454
. . . . 455
. . . . 455
. . . . 456
. . . . 458
. . . . 461
XII
SelectPalette . . . . .
SetDIBColorTable . .
SetPaletteEntries . . .
SetSysColors . . . . .
SetSystemPaletteUse.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
461
463
465
466
468
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 473
. . . . 473
. . . . 473
. . . . 474
. . . . 475
. . . . 476
. . . . 477
. . . . 482
. . . . 484
. . . . 484
. . . . 492
. . . . 499
. . . . 502
. . . . 506
. . . . 511
. . . . 516
. . . . 523
. . . . 525
. . . . 526
. . . . 527
. . . . 532
. . . . 534
. . . . 551
. . . . 552
. . . . 553
. . . . 555
. . . . 555
. . . . 556
. . . . 559
. . . . 560
. . . . 561
. . . . 567
. . . . 568
. . . . 572
. . . . 572
. . . . 573
. . . . 574
XIII
TextOut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 579
. . . . 579
. . . . 580
. . . . 580
. . . . 581
. . . . 582
. . . . 584
. . . . 584
. . . . 589
. . . . 591
. . . . 595
. . . . 597
. . . . 599
. . . . 599
. . . . 601
. . . . 602
. . . . 604
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 607
. . . . 607
. . . . 608
. . . . 610
. . . . 610
. . . . 612
. . . . 614
. . . . 616
. . . . 617
. . . . 618
. . . . 619
. . . . 622
. . . . 623
. . . . 624
. . . . 625
. . . . 626
. . . . 629
. . . . 632
. . . . 634
. . . . 636
. . . . 638
XIV
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
641
645
646
649
650
652
653
654
655
658
659
665
670
671
675
680
683
686
687
691
691
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 695
. . . . 695
. . . . 696
. . . . 696
. . . . 697
. . . . 700
. . . . 701
. . . . 704
. . . . 705
. . . . 707
. . . . 709
. . . . 712
. . . . 713
. . . . 714
. . . . 716
. . . . 718
. . . . 719
. . . . 719
. . . . 720
. . . . 724
. . . . 725
XV
GetMenuString . . . .
GetSubMenu . . . . .
GetSystemMenu . . .
HiliteMenuItem . . .
InsertMenu . . . . . .
InsertMenuItem . . .
IsMenu . . . . . . . .
ModifyMenu . . . . .
RemoveMenu . . . .
SetMenu . . . . . . .
SetMenuDefaultItem .
SetMenuItemBitmaps
SetMenuItemInfo . .
TrackPopupMenu . .
TrackPopupMenuEx .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
727
728
729
730
731
734
735
736
739
740
741
743
745
747
748
Apndice A Mensajes . . . . . . . . . . . . . . . .
WM_ACTIVATE . . . . . . . . . . .
WM_ACTIVATEAPP . . . . . . . . .
WM_ASKCBFORMATNAME . . . .
WM_CANCELMODE. . . . . . . . .
WM_CHANGECBCHAIN . . . . . .
WM_CHAR . . . . . . . . . . . . . .
WM_CHARTOITEM . . . . . . . . .
WM_CHILDACTIVATE . . . . . . .
WM_CLEAR . . . . . . . . . . . . .
WM_CLOSE. . . . . . . . . . . . . .
WM_COMMAND . . . . . . . . . . .
WM_COMPACTING . . . . . . . . .
WM_COMPAREITEM . . . . . . . .
WM_COPY . . . . . . . . . . . . . .
WM_COPYDATA . . . . . . . . . . .
WM_CREATE . . . . . . . . . . . . .
WM_CTLCOLORBTN . . . . . . . .
WM_CTLCOLOREDIT . . . . . . . .
WM_CTLCOLORLISTBOX . . . . .
WM_CTLCOLORMSGBOX . . . . .
WM_CTLCOLORSCROLLBAR . . .
WM_CTLCOLORSTATIC . . . . . .
WM_CUT . . . . . . . . . . . . . . .
WM_DEADCHAR . . . . . . . . . .
WM_DELETEITEM. . . . . . . . . .
WM_DESTROY . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . 753
. . . . 753
. . . . 754
. . . . 755
. . . . 756
. . . . 756
. . . . 757
. . . . 758
. . . . 759
. . . . 760
. . . . 760
. . . . 761
. . . . 762
. . . . 762
. . . . 764
. . . . 765
. . . . 766
. . . . 767
. . . . 767
. . . . 768
. . . . 769
. . . . 770
. . . . 770
. . . . 771
. . . . 772
. . . . 773
. . . . 774
XVI
WM_DESTROYCLIPBOARD
WM_DEVMODECHANGE. .
WM_DISPLAYCHANGE . . .
WM_DRAWCLIPBOARD . .
WM_DRAWITEM. . . . . . .
WM_DROPFILES . . . . . . .
WM_ENABLE. . . . . . . . .
WM_ENDSESSION . . . . . .
WM_ENTERIDLE . . . . . .
WM_ENTERMENULOOP . .
WM_ERASEBKGND . . . . .
WM_EXITMENULOOP . . .
WM_FONTCHANGE . . . . .
WM_GETFONT . . . . . . . .
WM_GETHOTKEY . . . . . .
WM_GETICON . . . . . . . .
WM_GETMINMAXINFO . .
WM_GETTEXT . . . . . . . .
WM_GETTEXTLENGTH . .
WM_HELP . . . . . . . . . .
WM_HSCROLL . . . . . . . .
WM_HSCROLLCLIPBOARD
WM_ICONERASEBKGND. .
WM_INITMENU . . . . . . .
WM_INITMENUPOPUP . . .
WM_KEYDOWN . . . . . . .
WM_KEYUP . . . . . . . . .
WM_KILLFOCUS . . . . . .
WM_LBUTTONDBLCLK . .
WM_LBUTTONDOWN . . .
WM_LBUTTONUP . . . . . .
WM_MBUTTONDBLCLK . .
WM_MBUTTONDOWN . . .
WM_MBUTTONUP. . . . . .
WM_MDIACTIVATE . . . . .
WM_MDICASCADE . . . . .
WM_MDICREATE . . . . . .
WM_MDIDESTROY . . . . .
WM_MDIGETACTIVE . . . .
WM_MDIICONARRANGE .
WM_MDIMAXIMIZE . . . .
WM_MDINEXT . . . . . . . .
WM_MDIREFRESHMENU .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
775
775
776
777
777
780
780
781
782
783
783
784
784
785
786
786
787
788
789
790
791
792
794
794
795
796
797
798
799
800
801
802
803
804
805
806
807
809
809
810
810
811
812
XVII
WM_MDIRESTORE . . . . . .
WM_MDISETMENU . . . . . .
WM_MDITILE . . . . . . . . .
WM_MEASUREITEM . . . . .
WM_MENUCHAR . . . . . . .
WM_MENUSELECT . . . . . .
WM_MOUSEACTIVATE . . . .
WM_MOUSEMOVE . . . . . .
WM_MOVE . . . . . . . . . . .
WM_NCACTIVATE. . . . . . .
WM_NCCALCSIZE. . . . . . .
WM_NCCREATE . . . . . . . .
WM_NCDESTROY . . . . . . .
WM_NCHITTEST. . . . . . . .
WM_NCLBUTTONDBLCLK .
WM_NCLBUTTONDOWN. . .
WM_NCLBUTTONUP . . . . .
WM_NCMBUTTONDBLCLK .
WM_NCMBUTTONDOWN . .
WM_NCMBUTTONUP . . . . .
WM_NCMOUSEMOVE . . . .
WM_NCPAINT . . . . . . . . .
WM_NCRBUTTONDBLCLK .
WM_NCRBUTTONDOWN. . .
WM_NCRBUTTONUP . . . . .
WM_NEXTDLGCTRL . . . . .
WM_NOTIFY . . . . . . . . . .
WM_NOTIFYFORMAT . . . .
WM_PAINT . . . . . . . . . . .
WM_PAINTCLIPBOARD . . .
WM_PALETTECHANGED. . .
WM_PALETTEISCHANGING .
WM_PARENTNOTIFY . . . . .
WM_PASTE . . . . . . . . . . .
WM_QUERYDRAGICON . . .
WM_QUERYENDSESSION . .
WM_QUERYNEWPALETTE. .
WM_QUERYOPEN . . . . . . .
WM_QUIT . . . . . . . . . . . .
WM_RBUTTONDBLCLK . . .
WM_RBUTTONDOWN . . . .
WM_RBUTTONUP . . . . . . .
WM_RENDERALLFORMATS .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
812
813
814
815
816
817
818
819
820
821
822
826
827
827
829
830
830
831
832
833
834
834
835
836
837
838
838
840
841
842
843
844
844
846
847
847
848
849
849
850
851
852
853
XVIII
WM_RENDERFORMAT . . . . .
WM_SETCURSOR . . . . . . . .
WM_SETFOCUS . . . . . . . . .
WM_SETFONT . . . . . . . . . .
WM_SETHOTKEY . . . . . . . .
WM_SETICON . . . . . . . . . .
WM_SETREDRAW . . . . . . . .
WM_SETTEXT . . . . . . . . . .
WM_SHOWWINDOW . . . . . .
WM_SIZE . . . . . . . . . . . . .
WM_SIZECLIPBOARD . . . . .
WM_SPOOLERSTATUS . . . . .
WM_STYLECHANGED . . . . .
WM_STYLECHANGING. . . . .
WM_SYSCHAR . . . . . . . . . .
WM_SYSCOLORCHANGE . . .
WM_SYSCOMMAND . . . . . .
WM_SYSDEADCHAR . . . . . .
WM_SYSKEYDOWN . . . . . .
WM_SYSKEYUP . . . . . . . . .
WM_TIMECHANGE . . . . . . .
WM_TIMER . . . . . . . . . . . .
WM_UNDO . . . . . . . . . . . .
WM_VKEYTOITEM . . . . . . .
WM_VSCROLL . . . . . . . . . .
WM_VSCROLLCLIPBOARD . .
WM_WINDOWPOSCHANGED .
WM_WINDOWPOSCHANGING
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
854
855
856
856
857
858
859
860
861
862
863
863
864
865
866
868
868
870
872
873
874
875
875
876
877
878
879
880
XIX
David Bowden
Dave Bowden comenz a escribir programas en 1982, en un ordenador Sinclair.
Despus de graduarse en Arquitectura en la Universidad Texas Tech, comenz a
practicar su profesin y a desarrollar paralelamente sistemas CAD. Eventualmente
decide abandonar la arquitectura y dedicarse a lo que ms le apasionaba, el desarrollo
de software. Esto le llev a aceptar una posicin en InterGraph Corporation. Como
desarrollador profesional, comenz creando Puzzled Software. De ah Dave pas a ser
Director de DemoShield Corporation (una divisin de InstallShield) donde diriga el
diseo, desarrollo, planificacin y estrategia comercial de la empresa. Bowden tiene
ms de diez aos de experiencia profesional en el diseo y desarrollo de software, y 12
en el tratamiento digital de imgenes y el diseo de interfaces de usuario. Despus de
utilizar varios lenguajes de progamacin durante aos, Delphi se ha convertido en el
nico lenguaje que utiliza en la actualidad.
Larry Diehl
Larry Diehl se ha incorporado recientemente a American Airlines como ingeniero
Web, donde formar parte de un equipo altamente cualificado de desarrolladores que
XX
utiliza Delphi para producir aplicaciones que sern usadas en todo el mundo.
Anteriormente fue ingeniero de control de calidad en InstallShield Corporation. En el
transcurso de quince aos, Diehl ha utilizado varios lenguajes de programacin, pero
actualmente utiliza exclusivamente Delphi para desarrollar tanto las utilidades que su
trabajo le exige como las aplicaciones shareware que desarrolla en su tiempo libre.
Phil Dorcas
Phil Dorcas obtuvo el grado de Master en Ciencias Fsicas de Texas Tech en 1969, y
desde entonces ha estado relacionado con la ingeniera elctrica y la informtica. Fue
co-propietario y director de la segunda tienda de productos informticos de Texas. Ha
trabajado como consultor y diseador de numerosos proyectos de hardware y software.
Es autor de diversos textos de informtica que se utilizan en centros de formacin de
Texas, y artculos para las revistas del sector. Phil ha utilizado Turbo Pascal desde su
primera versin para CP/M, y ahora Delphi es su herramienta de desarrollo favorita.
Ken Harrison
Kenneth Harrison es Desarrollador Certificado de Delphi especializado en soluciones
cliente/servidor. Actualmente trabaja para Rent Roll como miembro del Grupo de
Tecnologa Avanzada, desarrollando productos de contabilidad y anlisis financiero.
Kenneth ha trabajado con un amplio rango de sistemas de desarrollo, entre ellos
dBase, Pascal, Delphi, Visual Basic y SQL. Kenneth es el webmaster del Grupo de
Usuarios Delphi de Dallas.
Rod Mathes
Rod Mathes ha programado en lenguajes tan diversos como Cobol, RPGII, dBase,
RBase, Pascal y C++ durante los ltimos doce aos. Actualmente es programador de
Delphi para The Thomas Group Interactive Technologies, creando una amplia gama de
productos software. Ha sido miembro de la Junta de Directores del Grupo de Usuarios
Delphi de Dallas durante los ltimos dos aos.
Ovais Reza
Ovais Reza es un analista/programador de First American. Tiene mucha experiencia
con C/C++ y Delphi, graduado de la Western Michigan University y miembro activo
del Grupo de Usuarios Delphi de Dallas. Adems de la programacin y la filosofa oriental, Ovais es aficionado a Los Simpsons y los episodios viejos de Star Trek.
Mike Tobin
Mike Tobin ha estado programando en Delphi desde la versin 1.0. Mike comenz
estudios de criminologa, pero al darse cuenta de que prefera ser un hacker, los
abandon para entrar en la industria del software. Actualmente es ingeniero de
sistemas para American General en Dallas y es Director de Comunicaciones del Grupo
de Usuarios Delphi de Dallas. Le gusta disfrutar de su tiempo libre en compaa de su
novia Lisa y de sus cuatro gatos, Elisabeth, Alexander, Einstein y Copernicus.
XXI
Agradecimientos
El trabajo en equipo. Este concepto nos lleva a pensar en otros conceptos abstractos
como victoria, logro y conquista. El trabajo en equipo es el ingrediente secreto detrs
de innumerables triunfos a travs de la historia, y as ha sido en el caso de este libro.
Los ocho autores hemos empleado muchas horas largas y duras en este proyecto, pero
ste no podra haber llegado a buen final sin la ayuda y generosidad de muchas otras
personas. Para dar mayor importancia a aquellos que merecen mucho ms, los autores
desean colectivamente agradecer a las siguientes personas su contribucin al libro:
Marian Broussard, nuestra redactora. Incansable, nos indic todos los errores
gramaticales y ayud a corregir diversas inconsistencias en el libro. Sin escatimar su
tiempo, contribuy voluntariamente a ayudar a un grupo de escritores noveles a llevar
de forma clara y correcta sus ideas al papel.
Joe Hecht, nuestro mentor e dolo. Joe siempre respondi amablemente a todas las
preguntas que le hicimos, hurg en nuestro cdigo y seal nuestros errores cuando
tenamos problemas, y nos indic la direccin correcta cuando la documentacin del
API de Microsoft era algo confusa.
Jim Hill y todos los amigos de Wordware Publishing, que se arriesgaron con un grupo
de escritores entusiastas aunque sin experiencia. Jim nos puso al tanto de todos los
detalles, nos indic el camino a seguir, y hasta nos llev a comer a todos
peridicamente.
Marci Ayres, que verific gran cantidad de cdigo, conversin de formato de imgenes,
formateo de documentos y otras labores de soporte.
Lisa Tobin, que realiz tareas adicionales de verificacin.
Damon Tomlinson, de quien tomamos numerosas ideas para el libro, y que adems nos
ayud en la revisin del texto cuando nadie ms estaba disponible.
Marco Cocco, de D3K Artisan of Ware, que ide el ejemplo de utilizacin de la
funcin GetGlyphOutline que se incluye en el captulo Funciones de salida de texto.
Y por supuesto, los agradecimientos no estaran completos sin mencionar al equipo de
desarrollo de Delphi de Inprise Corp., por ofrecernos tan maravilloso entorno de
desarrollo.
Adicionalmente, John Ayres quisiera agradecer a todo el equipo editorial el esfuerzo
dedicado a producir algo de lo que podemos estar orgullosos. A Rusty Cornet, por
engancharme a este maravilloso entorno de desarrollo que es Delphi; Debbie Vilbig y
XXII
Darla Corley, por haberme permitido aprender Delphi y desarrollar una aplicacin de
seguimiento de llamadas cuando deba haber estado trabajando; Sarah Miles, por
prestarme el dinero para comprar el equipo en el que se ha escrito este libro; y Suzie
Weaver y Brian Donahoo, que confiaron en un antiguo empleado y me ofrecieron un
lugar tranquilo en el que trabajar los fines de semana.
XXIII
Prlogo
El API de Windows es la base sobre la cual se implementa la mayora de las
aplicaciones modernas. Es el corazn y el alma de las aplicaciones de bases de datos,
multimedia, e incluso de muchas aplicaciones para redes. Todas las aplicaciones
Windows se apoyan en el API para llevar a cabo desde la tarea ms simple hasta la ms
esotrica.
Todos los buenos programadores que conozco tienen un conocimiento slido del API
de Windows. Es el lenguaje en el que se expresa ms elocuentemente la arquitectura de
Windows como sistema operativo, y que guarda los secretos que los programadores
necesitan conocer si desean construir aplicaciones potentes y eficientes.
Puedo mencionar al menos tres razones por las que cualquier programador serio debe
conocer el API de Windows:
1.
Es ocasionalmente posible crear una aplicacin robusta sin tener un buen dominio del
API de Windows. Sin embargo, llega el momento en el transcurso del desarrollo de la
mayora de los proyectos en el que se hace sencillamente imprescindible hacer uso de
los recursos del API de Windows para resolver un problema especfico. Normalmente
so se produce porque la herramienta que se est utilizando no ofrece cierta
caracterstica o posibilidad que se necesita, o porque la caracterstica no est
implementada adecuadamente. En tales casos, se hace necesario utilizar el API de
Windows para implementar por s mismo la funcionalidad necesaria.
2.
Otra razn para utilizar el API de Windows se hace evidente cuando se desea crear un
componente o utilidad que otros puedan luego utilizar. Si Ud. desea crear un
componente, control ActiveX o una simple utilidad que pueda ser necesaria a otros
desarrolladores, probablemente necesitar utilizar los recursos del API de Windows.
Sin recurrir al API de Windows, tales proyectos, por lo general, no pueden ser llevados
a cabo.
3.
XXIV
Armado de tales conocimientos, Ud. puede utilizar las herramientas de alto nivel a su
disposicin de una manera ms juiciosa y efectiva.
Me produce especial placer escribir el prlogo para esta serie de libros sobre el API de
Windows porque est orientada a su utilizacin desde la mejor herramienta de
desarrollo disponible en el mundo: Delphi. Delphi ofrece al programador acceso total
al API de Windows. Es una herramienta diseada para permitir el uso de todas aquellas
posibilidades que han hecho de Windows el sistema operativo predominante en el
mundo.
Equipado con estos libros sobre el API de Windows y una copia de Delphi, Ud. podr
desarrollar cualquier tipo de aplicacin que desee, y estar seguro de que la est
desarrollando de una manera ptima. Ningn otro compilador puede llevarle ms cerca
del sistema operativo, ni permitirle explotar al mximo sus posibilidades. Por su parte,
estos libros constituyen el puente entre Delphi y el API de Windows. Los lectores
podrn utilizarlos para crear las aplicaciones ms potentes soportadas por el sistema
operativo. Me quito el sombrero ante los autores, que al crear estos libros han ofrecido
un gran servicio a la comunidad de programadores.
Charlie Calvert
Director de Relaciones con los Desarrolladores
Inprise Corporation
XXV
Introduccin
Ningn otro sistema operativo en la historia ha causado tanta controversia o confusin
en la industria del software como Windows. Por supuesto, tampoco ningn otro
sistema operativo en la historia ha hecho millonarios a tantos. Nos guste o no,
Windows es hoy el sistema operativo predominante. Es difcil ignorar una base de
usuarios tan amplia, y cada vez son menos las ofertas de empleo en las que no se exige
que el programador tenga conocimientos de la programacin para Windows.
En los comienzos, la nica opcin que tena el programador para desarrollar
aplicaciones para Windows era C/C++. La era del predominio de este lenguaje nos dej
toneladas de documentacin sobre el API de Windows, llenas de informacin abstracta
e incompleta, y de ejemplos tan arcaicos y esotricos como el lenguaje C en s mismo.
Y entonces apareci Delphi. Con l naci una nueva era de la programacin para
Windows, que hizo posible crear aplicaciones complejas en plazos inconcebibles hasta
ese momento. Aunque Delphi intenta aislar al programador de la arquitectura de
Windows subyacente, los programadores de Delphi se han dado cuenta de que algunos
obstculos de programacin no pueden ser salvados sin acudir a las funciones de bajo
nivel del API de Windows. Y aunque algunos libros han tocado el tema de la
utilizacin del API de Windows desde Delphi, ninguno se ha dedicado a presentar el
tema en profundidad. Por eso surgi la idea de escribir esta serie.
Este libro (junto a los restantes tomos de la serie) constituye un manual de referencia
sobre cmo utilizar las funciones del API Win32 desde Delphi. Como tal, no es un
libro introductorio acerca de la programacin en Windows o en Delphi, ni tampoco una
coleccin de trucos para resolver problemas especficos en Delphi. Hasta la fecha, este
libro es la referencia ms completa y exacta del API de Windows para el programador
de Delphi. No es una referencia completa, ya que el API de Windows incluye miles de
funciones que llenaran varios volmenes de mayores dimensiones que el que Ud. tiene
ahora en sus manos. Sin embargo, cubre las reas ms comunes e importantes del API
de Windows. Adicionalmente, todas las funciones que se describen en este libro estn
disponibles bajo Windows 95, 98 y NT 4.0, y lo estarn en futuras versiones de
Windows.
XXVI
XXVII
XXVIII
Apndice A: Mensajes
Los mensajes son el flujo sanguneo de Windows, y la arquitectura basada en mensajes
ofrece la base necesaria para la programacin dirigida por eventos utilizada
comnmente hoy en da. Aunque el conocimiento de muchos mensajes de Windows no
es imprescindible para aprender a programar en Delphi, es difcil realizar tareas
complicadas sin conocer al menos algunos de los mensajes de Windows. Este apndice
documenta muchos de los mensajes de Windows para los cuales Delphi ofrece
estructuras de datos especficas.
Convenios
A lo largo de todo el libro se hace uso de ciertos convenios de escritura. Por ejemplo,
todo el cdigo de los ejemplos aparece en un tipo de letra ms pequeo y de ancho fijo:
function HelloThere(Info: String): Integer;
begin
ShowMessage(Info);
end;
Para ser consistentes con otras publicaciones sobre Delphi, los ejemplos utilizan los
convenios de escritura de Inprise, que incluye el uso de maysculas y minsculas
mezclados en los identificadores, minsculas y negritas para las palabras claves, y dos
espacios de indentacin por cada nivel. Las constantes que aparecen en el cdigo estn
en maysculas, como por ejemplo TRUE y FALSE. Ntese adems que en la misma
lnea en que se describe el nombre de una funcin se ofrece el nombre de la unidad en
la que la funcin est situada. El nombre de esta unidad deber incluirse en la clusula
uses de cualquier mdulo en el que se desee utilizar esta funcin. Sin embargo, la
mayora de las funciones de este libro estn declaradas en el fichero Windows.Pas, que
es aadido automticamente a las clusulas uses por Delphi.
XXIX
Descripciones de funciones
Las descripciones de las funciones del API de Windows han sido colocadas de modo
que se ofrezca una cantidad de informacin creciente al lector. Esto debe permitir al
lector dar un vistazo rpido para ver la descripcin de la funcin y el significado de sus
parmetros, o continuar leyendo la explicacin detallada de la funcin, un ejemplo de
su utilizacin, y los valores aceptables para los parmetros.
Cada descripcin de funcin incluye la sintaxis exacta incluida en el cdigo fuente de
Delphi, una descripcin de qu hace la funcin, una descripcin detallada de sus
parmetros, el valor que devuelve, una lista de funciones relacionadas con sta, y un
ejemplo de su utilizacin. Las constantes que se utilizan en los parmetros de la
funcin se describen en tablas situadas a continuacin del ejemplo.
XXX
Captulo 1
Captulo
Captulo 1
Tipo
Object Pascal
PAnsiChar
PAnsiChar
LongWord
LongBool
^BOOL
^Byte
^Integer
^Single
^Word
^DWORD
PDWORD
Byte
^Byte
Smallint
LongWord
^UINT
Cardinal
^ULONG
^Longint
^Integer
^Smallint
^Double
DWORD
Word
Descripcin
Puntero a cadena de caracteres.
Puntero a cadena de caracteres.
Nmero entero sin signo.
Valor booleano.
Puntero a valor booleano.
Puntero a valor byte.
Puntero a valor entero.
Puntero a nmero de coma flotante de precisin simple.
Puntero a valor de 16 bits.
Puntero a valor de 32 bits.
Puntero a valor de 32 bits.
Valor de 8 bits (puede representar un carcter).
Puntero a valor de 8 bits.
Nmero entero de 16 bits.
Nmero entero de 32 bits (sin signo).
Puntero a entero de 32 bits.
Nmero entero de 32 bits (sin signo).
Puntero a entero de 32 bits.
Puntero a valor de 32 bits.
Puntero a valor de 32 bits.
Puntero a valor de 16 bits.
Puntero a nmero de coma flotante de doble precisin.
Identificador local.
Identificador de lenguaje.
Tipo
Windows
THandle
Tipo
Descripcin
Object Pascal
Integer
Identificador (manejador) de objeto. Muchas funciones del
API de Windows devuelven un valor de este tipo, que
identifica a un objeto dentro de las tablas internas de objetos
de Windows.
PHandle
^THandle
Puntero a manejador.
WPARAM Longint
Parmetro de mensaje de 32 bits. En versiones anteriores de
Windows era un tipo de datos de 16 bits.
LPARAM
Longint
Parmetro de mensaje de 32 bits.
LRESULT
Longint
Valor de retorno de funcin de 32 bits.
HWND
Integer
Manejador de ventana. Todos los controles, ventanas
principales o hijas, etc. tienen su manejador de ventana
correspondiente, que les identifica dentro de las tablas
internas de Windows.
HHOOK
Integer
Manejador de un gancho (hook) de sistema instalado.
ATOM
Word
ndice de una cadena de caracteres dentro de la tabla de
tomos locales o globales.
HGLOBAL THandle
Manejador que identifica un bloque de memoria global
reservado dinmicamente. En las versiones de Windows de
32 bits, no hay distincin entre la memoria dinmica
reservada global o localmente.
HLOCAL
THandle
Manejador que identifica un bloque de memoria local
reservado dinmicamente. En las versiones de Windows de
32 bits, no hay distincin entre la memoria dinmica
reservada global o localmente.
FARPROC Pointer
Puntero a procedimiento. Se utiliza normalmente como tipo
de parmetro en funciones que requieren que se suministre
la direccin de una funcin de respuesta (callback function).
HGDIOBJ Integer
Manejador de objeto grfico. Los contextos de dispositivo,
plumas, brochas, etc. tienen un manejador de este tipo que
los identifica dentro de las tablas internas de Windows.
HBITMAP Integer
Manejador de objeto de mapa de bits de Windows.
HBRUSH
Integer
Manejador de objeto de brocha de Windows.
HPEN
Integer
Manejador de objeto de pluma de Windows.
HDC
Integer
Manejador de contexto de dispositivo de Windows.
HPALETTE Integer
Manejador de objeto de paleta de colores de Windows.
HFONT
Integer
Manejador de objeto de fuente lgica de Windows.
HICON
Integer
Manejador de objeto de icono de Windows.
HMENU
Integer
Manejador de objeto de men de Windows.
HMETAFILE Integer
Manejador de objeto de metafichero de Windows.
HENHMET Integer
Manejador de objeto de metafichero mejorado de Windows.
AFILE
HRGN
Integer
Manejador de objeto de regin de Windows.
1
Captulo
Captulo 1
Tipo
Windows
HINST
HMODULE
HRSRC
HKL
HFILE
HCURSOR
COLORREF
Tipo
Object Pascal
Integer
HINST
Integer
Integer
Integer
HICON
DWORD
Descripcin
Manejador de objeto de instancia.
Manejador de objeto de un mdulo.
Manejador de objeto de recurso de Windows.
Manejador de configuracin de teclado.
Manejador de fichero abierto.
Manejador de objeto de cursor de Windows.
Valor de referencia de color de Windows, que contiene
valores para los componentes rojo, verde y azul de un color.
Manejadores
Un concepto fundamental de la programacin Windows es el de manejador de objeto.
Muchas funciones devuelven un manejador de objeto que la funcin crea o carga desde
un recurso. Funciones como CreateWindow y CreateWindowEx devuelven un
manejador de ventana. Otras funciones devuelven un manejador de fichero abierto,
como CreateFile, o un manejador de un heap recin reservado en memoria, como
HeapCreate. Internamente, Windows mantiene la informacin necesaria sobre todos
esos objetos, y los manejadores sirven como enlace a travs del sistema operativo entre
el objeto y la aplicacin. ste es el mecanismo que permite que una aplicacin se
comunique con el sistema operativo. A travs de los manejadores, una aplicacin puede
fcilmente referirse a cualquiera de esos objetos, y el sistema operativo sabr
instantneamente qu objeto desea manipular la aplicacin.
Constantes
Las funciones del API de Windows declaran miles de constantes diferentes para que
sean utilizadas como valores de parmetros. En el fichero Windows.PAS se definen
constantes para todo tipo de usos, desde valores de colores hasta valores de retorno.
Las constantes definidas para cada funcin del API se listan junto con la funcin en
cuestin dentro de ese fichero. Sin embargo, Windows.PAS puede ofrecer ms
informacin con relacin a las constantes asociadas a cualquier funcin particular; por
ello, una buena regla a tener siempre en cuenta es la de comprobar este fichero al
utilizar funciones complejas.
Cadenas de caracteres
Todas las funciones del API de Windows que utilizan cadenas requieren un puntero a
un array de caracteres terminados en nulo. Windows ha sido escrito en C, que no
ofrece el tipo de cadena de Pascal. Las versiones iniciales de Delphi exigan que la
aplicacin reservara un buffer para la cadena y convirtiera la variable de tipo String a
PChar. Sin embargo, a partir de Delphi 3 el formato interno de las cadenas y un nuevo
mecanismo de conversin permiten utilizar una cadena como un PChar mediante una
simple conversin de tipo (por ejemplo, PChar(MiCadena), donde MiCadena es una
variable declarada como MiCadena: String). En la mayora de los casos, esta
conversin podr utilizarse al llamar a una funcin del API de Windows que requiera
un parmetro de tipo cadena de caracteres.
Siempre que se conozcan los tipos de los parmetros exigidos por la funcin y el
nombre de la DLL que contiene la funcin, cualquier funcin del API de Windows
puede ser importada y utilizada por una aplicacin Delphi. Es importante destacar que
la directiva stdcall debe aadirse siempre al prototipo de la funcin, ya que ste es el
mecanismo estndar mediante el cual Windows pasa los parmetros a la funcin a
travs de la pila.
1
Captulo
Captulo 1
Delphi, algunas funciones de este tipo han sido importadas con parmetros definidos
como var o const. Estos tipos de parmetros aceptan un puntero a un buffer, pero
nunca pueden recibir nil, limitando de este modo la utilizacin de la funcin dentro de
Delphi. Como ocurre casi siempre con Delphi, el problema es muy fcil de resolver.
Simplemente vuelva a importar la funcin, segn hemos descrito antes. Las funciones
que han sido importadas incorrectamente se identifican en el libro en las descripciones
individuales de cada funcin.
Funciones de respuesta
Otro concepto muy importante de la programacin Windows es el de funcin de
respuesta (callback function). Una funcin de respuesta es una funcin dentro de la
aplicacin que no es llamada directamente por ninguna otra funcin o procedimiento de
la aplicacin, sino que es llamada por el sistema operativo. Esto le permite a Windows
comunicarse directamente con la aplicacin, pasndole los parmetros requeridos por la
funcin de respuesta en cuestin. La mayora de las funciones de enumeracin
requieren algn tipo de funcin de respuesta definida por la aplicacin que reciba la
informacin que se enumera.
Las funciones de respuesta individuales tienen parmetros especficos que deben ser
declarados exactamente por la aplicacin. Esto es necesario para que Windows pase a
la funcin la informacin correcta en el orden correcto. Un buen ejemplo de funcin
que utiliza una funcin de respuesta es EnumWindows. Esta funcin recorre todas las
ventanas de nivel superior en la pantalla, pasando el manejador de cada ventana a la
funcin de respuesta definida por la aplicacin. El proceso contina hasta que todas las
ventanas hayan sido enumeradas o la funcin de respuesta devuelva FALSE. La
funcin de respuesta utilizada por EnumWindows se define como:
EnumWindowsProc(
hWnd: HWND;
lParam: LPARAM
): BOOL;
Una funcin con este prototipo deber definirse dentro de la aplicacin, y un puntero a
ella deber pasarse como parmetro a la funcin EnumWindows. El sistema operativo
llamar a la funcin de respuesta una vez por cada ventana de nivel superior en la
pantalla, pasando cada vez el manejador de una de ellas como parmetro. Es importante
destacar que la directiva stdcall debe ser aadida al prototipo de la funcin de
respuesta, ya que ste es el mecanismo estndar de traspaso de parmetros que utiliza
Windows. Por ejemplo, la funcin de respuesta anterior deber tener el siguiente
prototipo:
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
Windows y que de otro modo sera totalmente inalcanzable. Para ver un ejemplo
completo de utilizacin de funciones de respuesta, consulte la funcin EnumWindows,
y muchas otras funciones a lo largo del libro.
Parmetros de funciones
La gran mayora de las funciones del API de Windows simplemente reciben los
parmetros estticos que se le envan y realizan cierta tarea en base a los valores de los
parmetros. Sin embargo, ciertas funciones devuelven valores que debern ser
almacenados en un buffer, y este buffer deber pasarse a la funcin en forma de
puntero. En la mayora de los casos en que la descripcin de una funcin especifica que
sta devuelve algn valor a travs de un buffer de cadena terminada en carcter nulo o
de una estructura de datos, estos buffers y estructuras debern ser reservados por la
aplicacin antes de llamar a la funcin.
En muchos casos, la documentacin de un parmetro puede especificar que ste puede
contener uno o ms valores de una tabla. Esos valores se definen en forma de
constantes, y pueden combinarse utilizando el operador or. Un valor concreto de ese
parmetro generalmente identifica una mscara de bits, donde el estado de cada bit
tiene un significado concreto para la funcin. Es por eso que las constantes pueden
combinarse mediante operaciones de manipulacin de bits. Por ejemplo, la funcin
CreateWindow tiene un parmetro llamado dwStyle que puede aceptar un nmero
variable de constantes combinadas mediante el operador or. Para pasar ms de una
constante a la funcin, al parmetro deber asignrsele un valor como
WS_CAPTION or WS_CHILD or WS_CLIPCHILDREN. Esto har que se cree una
ventana hija que tendr una barra de ttulo y no dibujar en el rea ocupada por sus
ventanas hijas al redibujarse.
A la inversa, cuando la documentacin de una funcin especifica que sta devuelve uno
o ms valores definidos como constantes, el valor devuelto puede combinarse con
cualquiera de las constantes utilizando el operador and para determinar si la constante
est incluida en el valor de retorno. Si el resultado de la combinacin es igual a la
constante (por ejemplo, if (Result and WS_CHILD) = WS_CHILD then ), la
constante est incluida en el valor devuelto por la funcin.
Unicode
Originalmente, el software necesitaba nicamente un byte para definir un carcter de
un conjunto de caracteres. Esto permita hasta 256 caracteres diferentes, lo que era ms
que suficiente para el alfabeto, los dgitos, los signos de puntuacin y los smbolos
matemticos comunes. Sin embargo, debido al desarrollo de la comunidad global y la
subsiguiente internacionalizacin de Windows y el software para Windows, se
necesitaba un nuevo mtodo para identificar caracteres. Muchos idiomas utilizan ms
de 256 caracteres diferentes en su escritura, mucho ms de lo que puede describirse con
un byte. Por todo ello surgi Unicode. Un caracter Unicode ocupa 16 bits, lo que
1
Captulo
Captulo 1
Captulo 2
Las funciones de la Interfaz del Dispositivo Grfico (Graphics Device Interface - GDI)
forman el corazn del sistema de presentacin grfica de Windows 95/98 y Windows
NT. Este sistema grfico ofrece acceso a la pantalla, la impresora y el plotter a travs
de un amplio grupo de funciones del API.
Cualquier programa que interacta con un dispositivo de salida tiene que hacerlo a
travs de dos niveles de abstraccin: el ncleo del GDI de Windows y el controlador
del dispositivo (device driver) suministrado por el fabricante. El controlador de
dispositivo es una interfaz de software especfica para un dispositivo concreto, y el GDI
ofrece a las aplicaciones Windows la interfaz de acceso al controlador. El GDI est
capacitado para conectarse a una variedad de dispositivos, incluso aquellos que no
ofrecen las posibilidades sofisticadas de los dispositivos ms avanzados. En algunas
reas el GDI debe tomar el control cuando el controlador no ofrece soporte de alto
nivel para cierta operacin.
El GDI puede soportar varios tipos de dispositivos simultneamente, al tiempo que
mantiene una interfaz consistente con las aplicaciones. El GDI, por lo tanto, tiene que
ser capaz de manejar un grupo de controladores de dispositivos con diferentes
capacidades, y relacionarse con ellos de acuerdo a la funcionalidad que ofrece cada
uno. Y tiene que hacer sto al mismo tiempo que presenta a la aplicacin un conjunto
consistente de funciones del API, lo que libera al programador de la necesidad de tratar
directamente con el dispositivo.
Las funciones del GDI operan a diferentes niveles, dependiendo de lo especfica que
necesite ser la aplicacin con respecto a la salida grfica. A bajo nivel, una aplicacin
puede manipular una imagen pxel a pxel. A un nivel ms alto, la aplicacin puede
emitir comandos tales como dibujar elipses u otras primitivas grficas, de forma
totalmente independiente del dispositivo. Los comandos del GDI son inicialmente
procesados por el componente del ncleo de Windows GDI.EXE a nivel de sistema y
luego pasados al controlador del dispositivo correspondiente, para que ste produzca la
salida grfica de acuerdo con sus capacidades. Delphi encapsula la mayora de las
2
Captulo
10
Captulo 2
funciones del GDI en el objeto TCanvas. No obstante, a veces es necesario hacer uso
de las funciones de bajo nivel del GDI para llevar a cabo tareas tales como dibujar en
reas no clientes de ventanas o cambiar el modo de mapeado de una ventana. Este
captulo describe las funciones que se utilizan para manipular contextos de dispositivos
y modificar coordenadas del sistema.
Contextos de dispositivo
Windows almacena un registro interno asociado a las imgenes que son visualizables o
imprimibles. Este registro interno es conocido como contexto de dispositivo (device
context) y contiene informacin acerca de cmo la imagen ser mostrada. Las
funciones del GDI necesitan un manejador de contexto de dispositivo porque este
registro contiene la informacin sobre los atributos de presentacin, el sistema de
coordenadas, el recorte, objetos grficos y modos de visualizacin. Los objetos grficos
pueden incluir plumas, brochas, mapas de bits, paletas, regiones y rutas. Una aplicacin
11
CS_CLASSDC
Descripcin
Un nuevo contexto de dispositivo tiene que obtenerse cada vez
que se necesite. El nuevo contexto es creado con valores por
defecto. El rea de recorte por defecto es el rea cliente de la
ventana. Este es un contexto de dispositivo comn y es
reservado en el espacio de la pila de la aplicacin. No hay lmites
prcticos al nmero de contextos de dispositivo comunes que
pueden ser creados, salvo las limitaciones de la memoria
disponible, pero es una buena prctica liberar la memoria
asociada a un contexto de dispositivo comn llamando a la
funcin ReleaseDC cuando ste deje de ser necesario.
Un nico contexto de visualizacin es compartido por todas las
ventanas de la misma clase. Los cambios hechos a un contexto de
visualizacin afectarn a todas las ventanas que pertenezcan a esa
clase. El uso de contextos de dispositivo de clase no se
recomienda.
2
Captulo
12
Captulo 2
CS_OWNDC
implementation
{$R *.DFM}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
{Inicializar el parmetro con los valores por defecto}
inherited CreateParams(Params);
{Indicar que esta ventana debe tener su propio contexto de dispositivo.
Comente esta lnea para observar los efectos}
Params.WindowClass.style := Params.WindowClass.Style or CS_OWNDC;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
TempDC: HDC;
// manejador temporal de un contexto de dispositivo
begin
{Recuperar un manejador del contexto de dispositivo privado para esta ventana}
TempDC := GetDC(Form1.Handle);
{Crear una nueva brocha y seleccionarla dentro del contexto de dispositivo}
NewBrush := CreateHatchBrush(HS_DIAGCROSS, clRed);
OldBrush := SelectObject(TempDC, NewBrush);
{Liberar el contexto de dispositivo. Observe que como estamos tratando con un
13
{Dibujar un rectngulo. Observe que no estamos creando una nueva brocha, por lo
que el rectngulo ser rellenado con la brocha por defecto seleccionada en el
contexto de dispositivo. Como se trata de un contexto de dispositivo privado,
usar la brocha anteriormente seleccionada para rellenar el rectngulo}
Rectangle(TempDC, 0, 0, ClientWidth, ClientHeight);
{Liberar el contexto de dispositivo}
ReleaseDC(Form1.Handle, TempDC);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Borrar la brocha}
SelectObject(GetDC(Form1.Handle), OldBrush);
DeleteObject(NewBrush);
end;
2
Captulo
14
Captulo 2
Sistemas de Coordenadas
Windows ofrece varios sistemas de coordenadas diferentes para producir salida grfica
en la pantalla o impresoras. El sistema de coordenadas puede estar basado en unidades
del dispositivo, como los pxeles, o puede estarlo en un sistema de medidas lgicas,
donde una unidad lgica puede ser convertida en uno o ms pxeles segn el modo en
que estas unidades sean mapeadas. Un sistema lgico o relativo de coordenadas
permitir a una aplicacin tener un conjunto comn de comandos que producirn los
mismos efectos en diferentes dispositivos, an cuando stos tengan diferentes
propiedades.
La salida grfica es ejecutada sobre una pantalla o impresora que tiene sus propias
unidades de medida. Los dispositivos de salida operan en pxeles. El pxel es la unidad
de medida del dispositivo de salida. Por eso, a veces se le llama la unidad del
dispositivo (device unit). El sistema de coordenadas en el dispositivo mide las
distancias en pxeles (unidades del dispositivo). Muchas de las funciones grficas del
API usan las unidades del dispositivo como referencia.
La ubicacin de los pxeles en la pantalla o la impresora es generalmente relativa al
origen en la esquina superior izquierda del papel, la pantalla, la ventana o el rea
cliente de una ventana. En la mayora de los casos, los valores se incrementan en la
medida en que el punto se desplaza a la derecha o hacia abajo a partir del origen. El
sistema de coordenadas del dispositivo mide las distancias en pxeles reales, de manera
que si el dispositivo tiene 100 pxeles por pulgada, un punto que se encuentre una
pulgada debajo del origen tendr 100 como coordenada vertical.
El GDI ofrece algunas funciones de alto nivel que utilizan el sistema de coordenadas
lgicas. Tal sistema puede ofrecer a la aplicacin una representacin lgica del rea de
dibujo que posee unas medidas independientes de la resolucin del dispositivo. Las
funciones del GDI que usan coordenadas lgicas efectuarn una conversin de dichas
coordenadas y emitirn comandos al controlador del dispositivo en el sistema de
coordenadas de ste. Esta conversin de medidas entre coordenadas lgicas y
coordenadas del dispositivo es soportado por un amplio conjunto de funciones del API.
Algunas funciones del GDI soportan coordenadas lgicas de alto nivel y otras slo
operaciones con pxeles. Las funciones del GDI que utilizan coordenadas lgicas son
generalmente comandos de dibujo que no ofrecen posibilidades de mapeado, y que
parecen, en efecto, ser aplicados directamente a medidas en pxeles. Para obtener un
mapeado de coordenadas lgicas independiente del dispositivo, la aplicacin tiene que
establecer un modo de mapeado y utilizar las capacidades de desplazamiento y
escalamiento que se describen a continuacin.
Cada contexto de dispositivo mantiene un registro que contiene la informacin
necesaria para mapear las coordenadas lgicas a coordenadas del dispositivo. El
contexto de dispositivo para una pantalla conoce las caractersticas del hardware lo
suficientemente bien como para soportar las llamadas del GDI que ejecutan el mapeado
de coordenadas. La conversin es ejecutada al nivel de contexto de dispositivo, y cada
15
2
Captulo
16
Captulo 2
Modos de mapeado
El modo de mapeado por defecto en el contexto de un dispositivo es MM_TEXT, que
consiste en una conversin 1:1, razn por la cual ninguna transformacin tiene lugar.
Las funciones del GDI cuyos parmetros se expresan en unidades lgicas estn tambin
en unidades del dispositivo cuando el modo MM_TEXT est activo. Para que una
aplicacin utilice verdaderamente coordenadas lgicas hay que cambiar el modo de
mapeado. La funcin SetMapMode se usa para este propsito. El modo
MM_ANISOTROPIC ofrece una completa flexibilidad para programar el origen del
desplazamiento y escalamiento. Con este modo (y otros, excepto MM_TEXT y
MM_ISOTROPIC) es posible escalar factores horizontales y verticales de forma
diferenciada, lo que permite generar imgenes oblicuas. La unidad bsica de medida
parte del pxel a nivel de dispositivo, con el escalamiento y desplazamiento definidos
por el programador. MM_ISOTROPIC es similar a MM_ANISOTROPIC, con la
excepcin de que se asegura que el escalamiento horizontal y vertical sean los mismos.
El resto de modos de mapeado tienen factores de escala iniciales implcitos, basados en
la resolucin del dispositivo, y son inicializados para unidades de medida especficas
de las coordenadas lgicas. Una aplicacin puede ubicar coordenadas en un rea de
dibujo basndose en las medidas fsicas actuales, dejndole al GDI el trabajo de
calcular cuntos pxeles sern necesarios para producir tal medida.
El Listado 2-2 ilustra cmo mover el origen y aplicar un factor de escala a la
transformacin de coordenadas. Permite al usuario seleccionar un modo de mapeado,
aplicar un desplazamiento al sistema lgico (ventana) y al sistema de dispositivo
(puerto de visualizacin) y factores de escala a los sistemas lgico y del dispositivo. El
ejemplo muestra los valores org y ext que se encuentran en uso. El valor org
puede ser modificado con las funciones SetWindowOrgEx, SetViewportOrgEx,
OffsetWindowOrgEx y OffsetViewportOrgEx. El valor de escalado y la extensin ext
pueden ser modificados mediante las funciones SetWindowExtEx, SetViewportExtEx,
ScaleWindowExtEx y ScaleViewportExtEx.
Listado 2-2: Modificando las dimensiones y origen del puerto de visualizacin y la ventana
var
Form1: TForm1;
WOrigin: TPoint;
VOrigin: TPoint;
WExt: TPoint;
VExt: TPoint;
MyDisplayDC: HDC;
MyMapMode: Integer;
implementation
{$R *.DFM}
//
//
//
//
//
//
almacena
almacena
almacena
almacena
almacena
almacena
el
el
la
la
el
el
origen de la ventana
origen del puerto de visualizacin
dimensin de la ventana
dimensin del puerto de visualizacin
contexto de dispositivo
modo de mapeado
17
2;
2;
2;
2;
2;
2;
2;
2;
procedure TForm1.ReportPosition;
var
ReturnValue: Tpoint;
// almacena orgenes de la ventana y del puerto de
// visualizacin
ReturnSize: Tsize;
// almacena dimensiones de la ventana y del puerto
// de visualizacin
ReadMapMode: Integer;
// almacena el modo de mapeado
ReadFinalOrigin: TPoint;
// almacena el origen del dispositivo
begin
{Mostrar el origen de la ventana}
GetWindowOrgEx(MyDisplayDC, ReturnValue);
Label9.Caption := IntToStr(ReturnValue.x)
+ ', ' + IntToStr(ReturnValue.y);
{Mostrar el origen del puerto de visualizacin}
GetViewportOrgEx(MyDisplayDC,ReturnValue);
Label10.Caption := IntToStr(ReturnValue.x)
+ ', ' + IntToStr(ReturnValue.y);
{Mostrar la dimensin de la ventana}
GetWindowExtEx(MyDisplayDC, ReturnSize);
Label11.Caption := IntToStr(ReturnSize.cx)
+ ', ' + IntToStr(ReturnSize.cy);
{Mostrar la dimensin del puerto de visualizacin}
GetViewportExtEx(MyDisplayDC,ReturnSize);
Label12.Caption := IntToStr(ReturnSize.cx)
+ ', ' + IntToStr(ReturnSize.cy);
{Mostrar el modo de mapeado actual}
ReadMapMode := GetMapMode(MyDisplayDC);
case ReadMapMode of
MM_TEXT:
LabelGMMresult.Caption := 'MM_TEXT';
MM_ANISOTROPIC:LabelGMMresult.Caption := 'MM_ANISOTROPIC';
MM_ISOTROPIC: LabelGMMresult.Caption := 'MM_ISOTROPIC';
2
Captulo
{Inicializar el selector
TrackbarSWOX.Position :=
TrackbarSWOY.Position :=
TrackbarSVOX.Position :=
TrackbarSVOY.Position :=
TrackbarSWEX.Position :=
TrackbarSWEY.Position :=
TrackbarSVEX.Position :=
TrackbarSVEY.Position :=
end;
18
Captulo 2
MM_HIENGLISH:
MM_HIMETRIC:
MM_LOENGLISH:
MM_LOMETRIC:
MM_TWIPS:
end;
LabelGMMresult.Caption
LabelGMMresult.Caption
LabelGMMresult.Caption
LabelGMMresult.Caption
LabelGMMresult.Caption
:=
:=
:=
:=
:=
'MM_HIENGLISH';
'MM_HIMETRIC';
'MM_LOENGLISH';
'MM_LOMETRIC';
'MM_TWIPS';
procedure TForm1.PaintImage;
begin
{Recuperar un contexto de dispositivo para el panel}
MyDisplayDC := GetDC(Panel1.Handle);
{Borrar la imagen actual}
Panel1.Repaint;
{Recuperar los valores definidos por el usuario}
ReadUserRequest;
{Asignar los valores seleccionados para el modo de mapeado}
SetMapMode(MyDisplayDC, MyMapMode);
if Checkbox1.Checked
then SetWindowOrgEx(MyDisplayDC, WOrigin.x, WOrigin.y, nil);
if Checkbox2.Checked
19
Figura 2-1: El
programa de
prueba de la
ventana y el
puerto de
visualizacin
en accin
2
Captulo
20
Captulo 2
2.
Las coordenadas pueden estar fuera de rango. En la medida de lo posible mantenga las
coordenadas lgicas y del dispositivo dentro de valores de 16 bits. La transformacin
soporta hasta un tamao de 27 bits, pero algunas funciones de visualizacin slo
soportan coordenadas de 16 bits.
3.
La imagen pudo ser recortada (del rea de visualizacin) o no ser visible por ser
demasiado pequea o grande.
4.
5.
6.
Descripcin
Cambia el modo de visualizacin.
Convierte coordenadas del cliente a coordenadas de
pantalla.
Crea un contexto de dispositivo en memoria.
Elimina un contexto de dispositivo.
Convierte puntos del dispositivo a puntos lgicos.
Enumera los modos disponibles de visualizacin.
Recupera un manejador de un contexto de dispositivo.
Recupera la conversin final del origen del contexto de
dispositivo indicado.
Recupera las capacidades del dispositivo.
Recupera el modo de mapeado actual.
Funcin
GetSystemMetrics
GetViewportExtEx
GetViewportOrgEx
GetWindowDC
21
Descripcin
Recupera las medidas de los elementos del sistema.
Recupera la extensin del puerto de visualizacin.
Recupera el origen del puerto de visualizacin.
Recupera un manejador de un contexto de dispositivo de
ventana.
Recupera la extensin de una ventana.
Recupera el origen de una ventana.
Convierte puntos lgicos a puntos del dispositivo.
Convierte mltiples coordenadas del sistema de
coordenadas de una ventana a otro.
Desplaza el origen del puerto de visualizacin.
Desplaza el origen de una ventana.
Libera un contexto de dispositivo.
Restaura el estado almacenado de un contexto de
dispositivo.
Almacena el estado de un contexto de dispositivo.
Escala la extensin del puerto de visualizacin.
Escala la extensin de la ventana.
Convierte coordenadas de pantalla en coordenadas de
rea cliente.
Desplaza un rea de un contexto de dispositivo.
Establece el modo de mapeado.
Establece la extensin del puerto de visualizacin.
Establece el origen del puerto de visualizacin.
Establece la extensin de la ventana.
Establece el origen de la ventana.
GetWindowExtEx
GetWindowOrgEx
LPtoDP
MapWindowPoints
OffsetViewportOrgEx
OffsetWindowOrgEx
ReleaseDC
RestoreDC
SaveDC
ScaleViewportExtEx
ScaleWindowExtEx
ScreenToClient
ScrollDC
SetMapMode
SetViewportExtEx
SetViewportOrgEx
SetWindowExtEx
SetWindowOrgEx
ChangeDisplaySettings
Windows.Pas
Sintaxis
ChangeDisplaySettings(
lpDevMode: PDeviceMode;
dwFlags: DWORD
): Longint;
Descripcin
Esta funcin cambia el modo grfico del sistema de visualizacin. Los nuevos valores
del dispositivo estn contenidos en el registro TDeviceMode pasado como primer
parmetro a la funcin. Es comn hacer una llamada a EnumDisplaySettings antes de
llamar a ChangeDisplaySettings para obtener un registro TDeviceMode vlido. Esto
2
Captulo
22
Captulo 2
Parmetros
lpDevMode: Un puntero al registro TDeviceMode que contiene la informacin a utilizar
para inicializar el nuevo modo grfico. Si a este parmetro se le asigna nil, el valor del
modo de visualizacin actualmente almacenado en el registro ser usado para el nuevo
modo de visualizacin. De todos los campos del registro TDeviceMode slo dmSize,
dmBitsPerPel, dmFields, dmPelsWidth, dmPelsHeight, dmDisplayFlags, y
dmDisplayFrequency son usados por esta funcin. El registro TDeviceMode se define
de la siguiente forma:
TDeviceMode = packed record
dmDeviceName: array[0..CCHDEVICENAME - 1]
of AnsiChar;
{no se utiliza}
dmSpecVersion: Word;
{no se utiliza}
dmDriverVersion: Word;
{no se utiliza}
dmSize: Word;
{tamao del registro}
dmDriverExtra: Word;
{no se utiliza}
dmFields: DWORD;
{campos vlidos}
dmOrientation: SHORT;
{no se utiliza}
dmPaperSize: SHORT;
{no se utiliza}
dmPaperLength: SHORT;
{no se utiliza}
dmPaperWidth: SHORT;
{no se utiliza}
dmScale: SHORT;
{no se utiliza}
dmCopies: SHORT;
{no se utiliza}
dmDefaultSource: SHORT;
{no se utiliza}
dmPrintQuality: SHORT;
{no se utiliza}
dmColor: SHORT;
{no se utiliza}
dmDuplex: SHORT;
{no se utiliza}
dmYResolution: SHORT;
{no se utiliza}
dmTTOption: SHORT;
{no se utiliza}
dmCollate: SHORT;
{no se utiliza}
dmFormName: array[0..CCHFORMNAME - 1]
of AnsiChar;
{no se utiliza}
dmLogPixels: Word;
{no se utiliza}
dmBitsPerPel: DWORD;
{profundidad de color}
dmPelsWidth: DWORD;
{ancho de pantalla}
dmPelsHeight: DWORD;
{alto de pantalla}
dmDisplayFlags: DWORD;
{modo de visualizacin}
dmDisplayFrequency: DWORD;
{frecuencia}
dmICMMethod: DWORD;
dmICMIntent: DWORD;
dmMediaType: DWORD;
dmDitherType: DWORD;
dmICCManufacturer: DWORD;
dmICCModel: DWORD;
dmPanningWidth: DWORD;
dmPanningHeight: DWORD;
23
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
end;
Slo los siguientes campos del registro son usados por esta funcin:
dmSize: Especifica el tamao del registro TDeviceMode. Debe asignrsele
SizeOf(TDeviceMode).
dmFields: Un conjunto de opciones que indican qu otros campos del registro
contienen informacin vlida. A este campo puede asignrsele uno o ms valores de la
Tabla 2-3.
dmBitsPerPel: Indica el nmero de bits requeridos para describir el color de un pxel
(por ejemplo, 4 bits para visualizar 16 colores, 8 bits para 256, etc.).
dmPelsWidth: Especifica el ancho de la pantalla, en pxeles.
dmPelsHeight: Especifica la altura de la pantalla, en pxeles.
dmDisplayFlags: Una opcin que indica el modo de visualizacin. A este campo se le
puede asignar uno de los valores de la Tabla 2-4.
dmDisplayFrequency: Especifica la frecuencia de refresco vertical, en Hertzios. Un
valor cero o uno representa la frecuencia de refresco por defecto del hardware.
dwFlags: Una opcin que especifica cmo ser modificado el modo grfico. A este
parmetro puede asignrsele un valor de la Tabla 2-5. Si la opcin
CDS_UPDATEREGISTRY es especificada, el sistema trata de hacer un cambio
dinmico del modo grfico y actualizar el registro sin reiniciar. Si es necesario
reiniciar, la funcin devuelve el valor DISP_CHANGE_RESTART y la aplicacin es
responsable de reiniciar Windows. El modo CDS_TEST puede ser usado para
determinar qu modos grficos estn disponibles sin ejecutar los cambios.
Vase adems
EnumDisplaySettings, WM_DISPLAYCHANGE
2
Captulo
24
Captulo 2
Ejemplo
Listado 2-3: Cambio del modo de visualizacin
{OJO! Delphi importa esta funcin incorrectamente, debemos hacerlo manualmente}
function ChangeDisplaySettings(lpDevMode: PDeviceMode;
dwFlags: DWORD): Longint; stdcall;
var
Form1: TForm1;
DevModeArray: TList;
// almacena una lista de registros con
informacin de los modos de los dispositivos
implementation
uses Math;
{$R *.DFM}
{La funcin importada}
function ChangeDisplaySettings; external user32 name 'ChangeDisplaySettingsA';
procedure TForm1.FormCreate(Sender: TObject);
var
DevModeCount: Integer;
// cantidad de modos grficos
DevModeInfo: ^TDevMode;
// puntero a info del modo grfico
begin
{Crear la lista que almacenar registros con la informacin de los modos}
DevModeArray := TList.Create;
{Inicializar el contador}
DevModeCount := 0;
{Reservar memoria dinmica para almacenar la informacin sobre un modo}
GetMem(DevModeInfo, SizeOf(TDevMode));
{Enumerar los modos de visualizacin}
while EnumDisplaySettings(nil, DevModeCount, DevModeInfo^) do
begin
{Aadir la informacin a la lista}
DevModeArray.Add(DevModeInfo);
{Incrementar el contador}
Inc(DevModeCount);
{Mostrar la resolucin de los modos de visualizacin enumerados}
ListBox1.Items.Add(IntToStr(DevModeInfo^.dmPelsWidth) + 'x' +
IntToStr(DevModeInfo^.dmPelsHeight) + ', ' +
IntToStr(Trunc(IntPower(2, DevModeInfo^.dmBitsPerPel))) +
' colors');
{Reservar otro espacio para informacin sobre el siguiente modo}
GetMem(DevModeInfo, SizeOf(TDevMode));
end;
25
{El bucle anterior siempre reserva un bloque de memoria extra innecesario, por lo
tanto lo borramos}
FreeMem(DevModeInfo, SizeOf(TDevMode));
{Seleccionar el primer elemento en la lista}
ListBox1.ItemIndex := 0;
end;
{Liberar la lista}
DevModeArray.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ModeChange: Longint;
// indica si es necesario reiniciar Windows
begin
{Cambiar el modo de visualizacin}
ModeChange := ChangeDisplaySettings(DevModeArray[ListBox1.ItemIndex],
CDS_UPDATEREGISTRY);
{Indicar si el cambio dinmico tuvo xito o si es necesario reiniciar Windows}
if ModeChange = DISP_CHANGE_SUCCESSFUL then
ShowMessage('Dynamic display mode change successful.');
if ModeChange = DISP_CHANGE_RESTART then
ShowMessage('Change successful; Windows must be restarted for the changes ' +
'to take effect');
end;
Descripcin
El campo dmBitsPerPel contiene nuevos datos.
El campo dmPelsWidth contiene nuevos datos.
El campo dmPelsHeight contiene nuevos datos.
El campo dmDisplayFlags contiene nuevos datos.
El campo dmDisplayFrequency contiene nuevos datos.
Descripcin
Indica un monitor en blanco y negro.
Indica un monitor entrelazado.
2
Captulo
26
Captulo 2
Descripcin
El cambio ser hecho dinmicamente.
El cambio es hecho dinmicamente y el registro ser
actualizado para reflejar el nuevo modo grfico bajo la
entrada USER.
El cambio no es realizado, pero se verifica el sistema para
comprobar si soporta ese modo. La funcin devuelve el
mismo valor que devolvera si el cambio fuera hecho.
CDS_TEST
ClientToScreen
Descripcin
La funcin tuvo xito.
Windows tiene que ser reiniciado para que los
cambios tengan efecto.
Se pasaron valores de opcin no vlidos a la funcin.
El controlador de visualizacin no acepta el nuevo
modo grfico.
El modo grfico especificado no es soportado.
Slo Windows NT: Imposible escribir los nuevos
valores al registro.
Windows.Pas
Sintaxis
ClientToScreen(
hWnd: HWND;
var lpPoint: TPoint
): BOOL;
{manejador de ventana}
{puntero a un registro TPoint}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin convierte las coordenadas de un punto (dadas en coordenadas de rea
cliente) a coordenadas de pantalla. El punto a ser convertido se recibe a travs de un
registro TPoint al que apunta el parmetro lpPoint. La funcin toma las coordenadas a
las que apunta el parmetro lpPoint y las convierte en coordenadas de pantalla. El
resultado es depositado en el mismo registro TPoint. Las coordenadas del punto toman
como origen la esquina superior izquierda del rea cliente de la ventana especificada.
Las coordenadas resultantes toman como origen la esquina superior izquierda de la
pantalla.
27
Parmetros
hWnd: Manejador de la ventana que contiene el punto. La esquina superior izquierda
del rea cliente de esta ventana es el origen del sistema de coordenadas que define las
coordenadas del punto a ser convertido.
lpPoint: Un puntero al registro TPoint que contiene el punto a ser convertido. Este
registro TPoint recibe el punto convertido cuando la funcin retorna.
Si la funcin tiene xito, devuelve TRUE; en caso contrario, devuelve FALSE. Para
obtener informacin ms amplia sobre posibles errores, se debe llamar a GetLastError.
Vase adems
MapWindowPoints, ScreenToClient
Ejemplo
Listado 2-4: Convirtiendo Coordenadas entre Sistemas de Coordenadas
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Coords: TPoint;
// almacena el punto que ser convertido
begin
{Mostrar las coordenadas sealadas relativas a la ventana hija}
Label1.Caption := 'Memo Coordinates: ' + IntToStr(X) + ', ' + IntToStr(Y);
{Convertir estas coordenadas a coordenadas de pantalla}
Coords := Point(X, Y);
Windows.ClientToScreen(Memo1.Handle, Coords);
{Mostrar las coordenadas sealadas relativas a la pantalla}
Label2.Caption := 'Screen Coordinates: ' + IntToStr(Coords.X) + ', ' +
IntToStr(Coords.Y);
{Convertir las coordenadas a coordenadas de la ventana cliente}
Windows.ScreenToClient(Form1.Handle, Coords);
{Mostrar las coordenadas sealadas relativas al rea cliente de la ventana}
Label3.Caption := 'Form Coordinates: ' + IntToStr(Coords.X) + ', ' +
IntToStr(Coords.Y);
end;
2
Captulo
28
Captulo 2
Figura 2-2:
Las
coordenadas
convertidas
CreateCompatibleDC
Windows.Pas
Sintaxis
CreateCompatibleDC(
DC: HDC
): HDC;
Descripcin
Esta funcin crea un contexto de dispositivo en memoria que es compatible con el
contexto de dispositivo especificado. Esto puede utilizarse para preparar imgenes que
luego sern copiadas a la pantalla o a la impresora. Un mapa de bits tiene que ser
seleccionado en el contexto de dispositivo devuelto por esta funcin, antes de que el
contexto de dispositivo pueda ser usado en operaciones de dibujo. Cuando una
aplicacin termina de utilizar un contexto de dispositivo en memoria deber eliminarlo
llamando a la funcin DeleteDC.
Parmetros
DC: Especifica un manejador de contexto de dispositivo con el cual el nuevo contexto
de dispositivo ser compatible. Este contexto deber soportar operaciones sobre mapas
de bits. La aplicacin puede llamar a la funcin GetDeviceCaps para determinar si el
contexto de dispositivo cumple este requisito. Si a este parmetro se le asigna cero, la
funcin crea un contexto de dispositivo compatible con la pantalla.
Vase adems
CreateCompatibleBitmap, DeleteDC, GetDeviceCaps
29
Ejemplo
Listado 2-5: Usando un contexto de dispositivo en memoria para animacin
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
var
ScreenDC,
// manejador de contexto de dispositivo de pantalla
WorkDC: HDC;
// manejador de contexto de dispositivo temporal
OldBitmap: HBITMAP;
// almacena el mapa de bits anterior
begin
{Recuperar manejador al contexto de dispositivo para la pantalla}
ScreenDC := GetDC(0);
{Crear contexto de dispositivo en memoria}
WorkDC := CreateCompatibleDC(Canvas.Handle);
{Restaurar el fondo de pantalla anterior}
BitBlt(ScreenDC, BallXCoord, Form1.Top, 40, 40, OffscreenDC, 0, 0, SRCCOPY);
{Incrementar la coordenada horizontal del crculo}
Inc(BallXCoord);
{Rotar el crculo alrededor de la pantalla si se va ms all de los lmites}
if BallXCoord > GetSystemMetrics(SM_CXSCREEN) then
BallXCoord := -40;
{Almacenar el fondo de la pantalla donde est ubicado el crculo}
BitBlt(OffscreenDC, 0, 0, 40, 40, ScreenDC, BallXCoord, Form1.Top, SRCCOPY);
{Seleccionar la mscara AND del crculo en el contexto de dispositivo en
memoria y copiar ste en la pantalla}
OldBitmap := SelectObject(WorkDC, ANDMaskBitmap);
BitBlt(ScreenDC, BallXCoord, Form1.Top, 40, 40, WorkDC, 0, 0, SRCAND);
{Seleccionar la mscara OR del crculo en el contexto de dispositivo en
memoria y copiar ste en la pantalla}
SelectObject(WorkDC, ORMaskBitmap);
BitBlt(ScreenDC, BallXCoord, Form1.Top, 40, 40, WorkDC, 0, 0, SRCPAINT);
{Seleccionar el antiguo mapa de bits en el contexto de dispositivo en memoria
y borrar o liberar los objetos innecesarios}
SelectObject(WorkDC, OldBitmap);
2
Captulo
var
Form1: TForm1;
OffscreenDC: HDC;
ANDMaskBitmap,
ORMaskBitmap,
BackgroundBitmap,
OldBitmap: HBITMAP;
BallXCoord: Integer;
30
Captulo 2
ReleaseDC(0, ScreenDC);
DeleteDC(WorkDC);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
TempBrush: HBRUSH;
// un manejador de una brocha
begin
{Crear un contexto de dispositivo en memoria}
OffscreenDC := CreateCompatibleDC(Canvas.Handle);
{Una gran cantidad de atributos del contexto de dispositivo cambiarn, por lo
tanto se debe almacenar su estado original para no tener que reseleccionar de
nuevo el objeto original dentro del contexto de dispositivo}
SaveDC(OffscreenDC);
{Crear un mapa de bits para la mscara AND del crculo}
AndMaskBitmap := CreateCompatibleBitmap(Canvas.Handle, 40, 40);
{Seleccionar el mapa de bits en el contexto de dispositivo en memoria
y dibujar un crculo negro sobre un fondo blanco}
SelectObject(OffscreenDC, AndMaskBitmap);
SelectObject(OffscreenDC, GetStockObject(WHITE_BRUSH));
SelectObject(OffscreenDC, GetStockObject(NULL_PEN));
Rectangle(OffscreenDC, 0, 0, 41, 41);
SelectObject(OffscreenDC, GetStockObject(BLACK_BRUSH));
Ellipse(OffscreenDC, 0, 0, 40, 40);
{Crear un mapa de bits para la mscara or del crculo}
ORMaskBitmap := CreateCompatibleBitmap(Canvas.Handle, 40, 40);
{Seleccionar el mapa de bits en el contexto de dispositivo en memoria
y dibujar un crculo sombreado sobre un fondo negro}
SelectObject(OffscreenDC, ORMaskBitmap);
SelectObject(OffscreenDC, GetStockObject(BLACK_BRUSH));
Rectangle(OffscreenDC, 0, 0, 41, 41);
TempBrush := CreateHatchBrush(HS_DIAGCROSS, clRed);
SelectObject(OffscreenDC, GetStockObject(BLACK_PEN));
SelectObject(OffscreenDC, TempBrush);
Ellipse(OffscreenDC, 0, 0, 40, 40);
{Restaurar los valores originales del contexto de dispositivo. Esto elimina la
necesidad de reseleccionar objetos cuando hayamos avanzado}
RestoreDC(OffscreenDC, -1);
{Eliminar la brocha}
DeleteObject(TempBrush);
{Finalmente, crear un mapa de bits que almacena el fondo de la pantalla. Esto
evita que el crculo deje un rastro tras de s}
BackgroundBitmap := CreateCompatibleBitmap(Canvas.Handle, 40, 40);
{Seleccionar el mapa de bits del fondo en el contexto en memoria}
SelectObject(OffscreenDC, BackgroundBitmap);
31
Figura 2-3: El
crculo
animado
DeleteDC
Windows.Pas
Sintaxis
DeleteDC(
DC: HDC
): BOOL;
Descripcin
La funcin DeleteDC elimina el contexto de dispositivo especificado. Cuando una
aplicacin utiliza CreateCompatibleDC, deber siempre llamar a DeleteDC cuando
termine de utilizar el manejador.
Parmetros
DC: Manejador del contexto de dispositivo a eliminar.
Vase adems
CreateCompatibleDC, GetDC, ReleaseDC
Ejemplo
Vea el Listado 2-5 bajo CreateCompatibleDC.
2
Captulo
32
Captulo 2
DPtoLP
Windows.Pas
Sintaxis
DPtoLP(
DC: HDC;
var Points;
Count: Integer
): BOOL;
Descripcin
La funcin DPtoLP convierte uno o ms pares de coordenadas de dispositivo a
coordenadas lgicas. El parmetro Points apunta a un array de registros TPoint que
contiene los pares de coordenadas que sern convertidas. Estos registros TPoint
recibirn las coordenadas convertidas cuando la funcin retorne. La transformacin de
las coordenadas se basa en los valores asignados por las funciones SetWindowOrgEx,
SetViewportOrgEx, SetWindowExtEx y SetViewportExtEx. La funcin DPtoLP fallar
si alguno de los puntos en el registro TPoint especifica un valor mayor de 27 bits.
Tambin esta funcin fallar si la transformacin de alguno de los puntos produce un
valor mayor de 32 bits. En el caso de que se produzca un error, todos los valores del
array quedarn indefinidos.
Parmetros
DC: Manejador del contexto de dispositivo para el cual ser realizada la conversin de
las coordenadas.
Points: Puntero a un array de registros TPoint que contiene los pares de coordenadas
que sern convertidas.
Count: Especifica el nmero de entradas en el array al que apunta el parmetro Points.
Vase adems
LPtoDP, SetWindowOrgEx, SetViewportOrgEx, SetWindowExtEx, SetViewportExtEx
Ejemplo
Vea el Listado 2-12 bajo ScaleViewportExtEx.
EnumDisplaySettings
Windows.Pas
Sintaxis
EnumDisplaySettings(
lpszDeviceName: PChar;
33
iModeNum: DWORD;
{el modo grfico}
var lpDevMode: TDeviceMode {puntero a un registro que recibe los valores
del dispositivo}
): BOOL;
{devuelve TRUE o FALSE}
Descripcin
Parmetros
lpszDeviceName: El nombre del dispositivo acerca del cual se recupera la informacin.
Si a este parmetro se le asigna nil, la funcin enumerar los modos de visualizacin
para la pantalla actual. La cadena a la que apunta este parmetro debe ser de la forma
\\.\Display1, \\.\Display2, \\.\Display3. Bajo Windows 95/98 a este parmetro debe
asignrsele siempre nil.
iModeNum: El valor del ndice del modo grfico para el que se recuperar la
informacin. Este valor tiene que ser menor que el ndice del ltimo modo grfico de la
pantalla. Si el parmetro iModeNum est fuera de rango, la funcin devolver un error.
lpDevMode: Puntero a un registro TDeviceMode que recibe informacin sobre el modo
especfico de pantalla. De todos los campos del registro TDeviceMode solo dmSize,
dmBitsPerPel, dmFields, dmPelsWidth, dmPelsHeight, dmDisplayFlags y
dmDisplayFrequency son usados por esta funcin. El registro TDeviceMode se define
de la siguiente forma:
TDeviceMode = packed record
dmDeviceName: array[0..CCHDEVICENAME - 1]
of AnsiChar;
{no se utiliza}
dmSpecVersion: Word;
{no se utiliza}
dmDriverVersion: Word;
{no se utiliza}
dmSize: Word;
{tamao del registro}
dmDriverExtra: Word;
{no se utiliza}
dmFields: DWORD;
{campos vlidos}
dmOrientation: SHORT;
{no se utiliza}
dmPaperSize: SHORT;
{no se utiliza}
dmPaperLength: SHORT;
{no se utiliza}
dmPaperWidth: SHORT;
{no se utiliza}
dmScale: SHORT;
{no se utiliza}
dmCopies: SHORT;
{no se utiliza}
dmDefaultSource: SHORT;
{no se utiliza}
dmPrintQuality: SHORT;
{no se utiliza}
dmColor: SHORT;
{no se utiliza}
2
Captulo
34
Captulo 2
dmDuplex: SHORT;
dmYResolution: SHORT;
dmTTOption: SHORT;
dmCollate: SHORT;
dmFormName: array[0..CCHFORMNAME - 1]
of AnsiChar;
dmLogPixels: Word;
dmBitsPerPel: DWORD;
dmPelsWidth: DWORD;
dmPelsHeight: DWORD;
dmDisplayFlags: DWORD;
dmDisplayFrequency: DWORD;
dmICMMethod: DWORD;
dmICMIntent: DWORD;
dmMediaType: DWORD;
dmDitherType: DWORD;
dmICCManufacturer: DWORD;
dmICCModel: DWORD;
dmPanningWidth: DWORD;
dmPanningHeight: DWORD;
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{profundidad de color}
{ancho de pantalla}
{alto de pantalla}
{modo de pantalla}
{frecuencia}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
{no se utiliza}
end;
Consulte la funcin ChangeDisplaySettings para ver una descripcin de esta estructura
de datos.
Vase adems
ChangeDisplaySettings
Ejemplo
Listado 2-6: Enumerando todos los modos de visualizacin disponibles para la pantalla
actual
procedure TForm1.Button1Click(Sender: TObject);
var
DeviceInfo: TDevMode;
// almacena informacin del dispositivo
DeviceCount: Integer;
// cantidad de modos de visualizacin
begin
{Inicializar contador}
DeviceCount := 0;
{Enumerar los modos de visualizacin del dispositivo de visualizacin en uso}
while EnumDisplaySettings(nil, DeviceCount, DeviceInfo) do
begin
35
Figura 2-4: La
informacin
sobre el modo
de
visualizacin
accesible
GetDC
Windows.Pas
Sintaxis
GetDC(
hWnd: HWND
): HDC;
{manejador de ventana}
{devuelve contexto de dispositivo}
Descripcin
La funcin GetDC recupera un contexto de dispositivo para el rea cliente de la
ventana especificada en el parmetro hWnd. El contexto de dispositivo recuperado ser
2
Captulo
36
Captulo 2
Parmetros
hWnd: Manejador de la ventana para la cual el contexto de dispositivo es recuperado.
Si se le asigna cero a este parmetro, la funcin recupera un contexto de dispositivo
para la pantalla.
Vase adems
ReleaseDC, GetWindowDC
Ejemplo
Listado 2-7: Recuperando un contexto de dispositivo comn para una ventana
procedure TForm1.FormPaint(Sender: TObject);
var
FormDC: HDC;
// almacena el contexto de dispositivo
OldFont: HFONT;
// almacena las fuentes originales
begin
{Recuperar contexto de dispositivo comn para el formulario}
FormDC := GetDC(Form1.Handle);
{Seleccionar la fuente del formulario en el contexto de dispositivo}
OldFont := SelectObject(FormDC, Form1.Font.Handle);
{Mostrar algn texto en el contexto de dispositivo}
SetBkMode(FormDC, TRANSPARENT);
TextOut(FormDC, 10, 10, 'Delphi Rocks!', Length('Delphi Rocks!'));
{Seleccionar la fuente original y liberar el contexto de dispositivo}
SelectObject(FormDC, OldFont);
ReleaseDC(Form1.Handle, FormDC);
end;
Figura 2-5:
Dibujando en
el dispositivo
GetDCOrgEx
37
Windows.Pas
Sintaxis
{manejador de contexto de dispositivo}
{puntero a registro TPoint}
{devuelve TRUE o FALSE}
Descripcin
La funcin GetDCOrgEx recupera la conversin final del origen para el contexto de
dispositivo especificado. Esta ubicacin es el desplazamiento final que Windows
utilizar cuando convierta las coordenadas del dispositivo en coordenadas de cliente.
Parmetros
DC: Manejador del contexto de dispositivo cuyo origen es recuperado.
Origin: Puntero al registro TPoint que recibir el origen de coordenadas. Las
coordenadas son relativas al origen fsico de la pantalla y son dadas en unidades del
dispositivo.
Vase adems
GetWindowOrgEx, GetViewportOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin de este captulo.
GetDeviceCaps
Windows.Pas
Sintaxis
GetDeviceCaps(
DC: HDC;
Index: Integer
): Integer;
Descripcin
La funcin GetDeviceCaps obtiene informacin de una capacidad particular del
contexto de dispositivo especificado. Se puede solicitar una amplia variedad de
capacidades, como se muestra en la Tabla 2-7.
2
Captulo
GetDCOrgEx(
DC: HDC;
var Origin: TPoint
): BOOL;
38
Captulo 2
Parmetros
DC: Manejador del contexto de dispositivo cuya capacidad se desea obtener.
Index: Una opcin indicando la capacidad especfica que se solicita. A este parmetro
se le puede asignar un valor de la Tabla 2-7.
Vase adems
CreateEnhMetaFile, GetDIBits, GetObjectType, GetSystemMetrics, SetDIBits,
SetDIBitsToDevice, StretchBlt, StretchDIBits
Ejemplo
Listado 2-8: Recuperando las capacidades del dispositivo
procedure TForm1.Button1Click(Sender: TObject);
begin
with ListBox1.Items do
begin
{Mostrar la versin del controlador}
Add('Display Driver Version: ' + IntToStr(GetDeviceCaps(Canvas.Handle,
DRIVERVERSION)));
{Mostrar las caractersticas tecnolgicas}
case GetDeviceCaps(Canvas.Handle, TECHNOLOGY) of
DT_PLOTTER:
Add('Driver Type: Vector Plotter');
DT_RASDISPLAY: Add('Driver Type: Raster Display');
DT_RASPRINTER: Add('Driver Type: Raster Printer');
DT_RASCAMERA: Add('Driver Type: Raster Camera');
DT_CHARSTREAM: Add('Driver Type: Character Stream');
DT_METAFILE:
Add('Driver Type: Metafile');
DT_DISPFILE:
Add('Driver Type: Display File');
end;
{Mostrar el tamao de la pantalla}
Add('Screen Size: ' + IntToStr(GetDeviceCaps(Canvas.Handle, HORZSIZE)) + ' X '
+ IntToStr(GetDeviceCaps(Canvas.Handle, VERTSIZE)) + ' millimeters');
Add('Screen Resolution: ' + IntToStr(GetDeviceCaps(Canvas.Handle, HORZRES))
+ ' X ' + IntToStr(GetDeviceCaps(Canvas.Handle, VERTRES)) + ' pixels');
{Mostrar los pxeles por pulgada lgica}
Add('Pixels/Logical Inch - Horizontal: ' +
IntToStr(GetDeviceCaps(Canvas.Handle, LOGPIXELSX)));
Add('Pixels/Logical Inch - Vertical: ' +
IntToStr(GetDeviceCaps(Canvas.Handle, LOGPIXELSY)));
{Mostrar la profundidad de color y el nmero de objetos grficos comunes}
Add('Bits/Pixel: ' + IntToStr(GetDeviceCaps(Canvas.Handle, BITSPIXEL)));
Add('Brushes: ' + IntToStr(GetDeviceCaps(Canvas.Handle, NUMBRUSHES)));
39
2
Captulo
40
Captulo 2
41
then Add('
Supports Alternate Fill Polygons');
if (GetDeviceCaps(Canvas.Handle, POLYGONALCAPS)
and PC_RECTANGLE)=PC_RECTANGLE then
Add('
Supports Rectangles');
if (GetDeviceCaps(Canvas.Handle, POLYGONALCAPS)
and PC_WINDPOLYGON)=PC_WINDPOLYGON then
Add('
Supports Winding Fill Polygons');
if (GetDeviceCaps(Canvas.Handle, POLYGONALCAPS) and PC_SCANLINE)=PC_SCANLINE
then Add('
Supports Single Scanlines');
if (GetDeviceCaps(Canvas.Handle, POLYGONALCAPS) and PC_WIDE)=PC_WIDE then
Add('
Supports Wide Borders');
if (GetDeviceCaps(Canvas.Handle, POLYGONALCAPS) and PC_STYLED)=PC_STYLED then
Add('
Supports Styled Borders');
if (GetDeviceCaps(Canvas.Handle, POLYGONALCAPS)
and PC_WIDESTYLED)=PC_WIDESTYLED then
Add('
Supports Wide And Styled Borders');
if (GetDeviceCaps(Canvas.Handle, POLYGONALCAPS)
and PC_INTERIORS)=PC_INTERIORS then
Add('
Supports Interiors');
end;
{Mostrar las capacidades para texto}
Add('Text Capabilities -');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_OP_CHARACTER)=TC_OP_CHARACTER then
Add('
Capable of Character Output Precision');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_OP_STROKE)=TC_OP_STROKE then
Add('
Capable of Stroke Output Precision');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_CP_STROKE)=TC_CP_STROKE then
Add('
Capable of Stroke Clip Precision');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS) and TC_CR_90)=TC_CR_90 then
Add('
Supports 90 Degree Character Rotation');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS) and TC_CR_ANY)=TC_CR_ANY then
Add('
Supports Character Rotation to Any Angle');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_SF_X_YINDEP)=TC_SF_X_YINDEP then
Add('
X And Y Scale Independent');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_SA_DOUBLE)=TC_SA_DOUBLE then
Add('
Supports Doubled Character Scaling');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_SA_INTEGER)=TC_SA_INTEGER then
Add('
Supports Integer Mltiples Only When Scaling');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_SA_CONTIN)=TC_SA_CONTIN then
Add('
Supports Any Mltiples For Exact Character Scaling');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS)
and TC_EA_DOUBLE)=TC_EA_DOUBLE then
Add('
Supports Double Weight Characters');
if (GetDeviceCaps(Canvas.Handle, TEXTCAPS) and TC_IA_ABLE)=TC_IA_ABLE then
Add('
Supports Italics');
2
Captulo
42
Captulo 2
TC_UA_ABLE)=TC_UA_ABLE then
TC_SO_ABLE)=TC_SO_ABLE then
TC_RA_ABLE)=TC_RA_ABLE then
TC_VA_ABLE)=TC_VA_ABLE then
TC_SCROLLBLT)=TC_SCROLLBLT then
Figura 2-6:
Las
capacidades
del dispositivo
HORZSIZE
VERTSIZE
HORZRES
VERTRES
LOGPIXELSX
LOGPIXELSY
BITSPIXEL
PLANES
NUMBRUSHES
NUMPENS
Descripcin
La versin del controlador.
Tipo de tecnologa del dispositivo. Esta opcin devuelve un
valor de la Tabla 2-8. El parmetro DC puede referirse a un
metafichero mejorado, en cuyo caso la tecnologa devuelta
ser la del dispositivo referido en el metafichero. Utilice la
funcin GetObjectType para determinar si el contexto de
dispositivo se refiere a un dispositivo en un metafichero
mejorado.
Ancho de la pantalla fsica en milmetros.
Altura de la pantalla fsica en milmetros.
Ancho de la pantalla en pxeles.
Altura de la pantalla en lneas de barrido.
Nmero de pxeles horizontales por pulgada lgica.
Nmero de pxeles verticales por pulgada lgica.
Nmero de bits de colores adyacentes por pxel.
Nmero de planos de colores.
Nmero de brochas especficas del dispositivo.
Nmero de plumas especficas del dispositivo.
Valor
NUMFONTS
NUMCOLORS
ASPECTX
ASPECTY
ASPECTXY
CLIPCAPS
SIZEPALETTE
NUMRESERVED
COLORRES
PHYSICALWIDTH
PHYSICALHEIGHT
PHYSICALOFFSETX
PHYSICALOFFSETY
VREFRESH
43
Descripcin
Nmero de fuentes especficas del dispositivo.
Nmero de entradas en la tabla de colores del dispositivo, si
el dispositivo tiene una profundidad de color de 8 bits o
menos. Devuelve -1 para profundidades de color superiores.
Ancho relativo del pxel del dispositivo para dibujar lneas.
Altura relativa del pxel del dispositivo para dibujar lneas.
Ancho de la diagonal del pxel del dispositivo para dibujar
lneas.
Indicador de las capacidades de recorte del dispositivo. Si el
dispositivo puede recortar un rectngulo, este valor es 1; en
caso contrario, es 0.
Nmero de entradas en la paleta del sistema. Este resultado
es vlido solo en Windows 3.0 controladores posteriores y
solo si el controlador del dispositivo selecciona el bit
RC_PALETTE en el ndice RASTERCAPS.
Nmero de entradas reservadas en la paleta del sistema.
Este ndice es vlido solamente en controladores para
Windows 3.0 superiores, y slo si el controlador del
dispositivo tiene seleccionado el bit RC_PALETTE en el
ndice RASTERCAPS.
Resolucin de color del dispositivo en bits por pxel. Este
ndice es vlido solamente en controladores para Windows
3.0 superiores, y slo si el controlador del dispositivo tiene
seleccionado el bit RC_PALETTE en el ndice RASTERCAPS.
Ancho fsico de una pgina impresa para dispositivos de
impresin, en unidades del dispositivo. Este nmero es
generalmente ms grande que el ancho imprimible en
pxeles, debido a los mrgenes no imprimibles.
Altura fsica de una pgina impresa para dispositivos de
impresin, en unidades del dispositivo. Este nmero es
generalmente ms grande que la altura imprimible en
pxeles, debido a los mrgenes no imprimibles.
Margen izquierdo de la impresora. Esta es la distancia desde
el borde izquierdo de la pgina fsica al borde izquierdo del
rea de impresin en unidades del dispositivo.
Margen superior de la impresora. Esta es la distancia del
borde superior de la pgina fsica al borde superior del rea
de impresin en unidades del dispositivo.
Slo Windows NT: La frecuencia de refresco vertical del
monitor en Hz. Un valor de 0 1 representa la frecuencia
por defecto del monitor, generalmente seleccionable
mediante interruptores en la tarjeta de vdeo o en la placa
base del ordenador, o mediante un programa de
configuracin, que no es compatible con las funciones de
Win32 tales como ChangeDisplaySettings.
2
Captulo
44
Captulo 2
Valor
DESKTOPHORZRES
DESKTOPVERTRES
BLTALIGNMENT
RASTERCAPS
CURVECAPS
LINECAPS
POLYGONALCAPS
TEXTCAPS
Descripcin
Slo Windows NT: ancho del escritorio virtual en pxeles.
Este valor puede ser mayor que HORZRES si el dispositivo
soporta un escritorio virtual o mltiples monitores.
Slo Windows NT: Altura del escritorio virtual en pxeles.
Este valor puede ser mayor que VERTRES si el dispositivo
soporta un escritorio virtual o mltiples monitores.
Slo Windows NT: Alineamiento preferido para el dibujo
horizontal, expresado como un mltiplo de pxeles. Para
mejor ejecucin del dibujo, las ventanas deben ser alineadas
horizontalmente a un mltiplo de este valor. Un valor cero
indica que el dispositivo ofrece aceleracin por hardware y
cualquier tipo de alineamiento puede ser usado.
Indica las capacidades de barrido del dispositivo. Devuelve
uno o ms valores de la Tabla 2-9.
Indica las capacidades para curvas del dispositivo. Devuelve
uno o ms valores de la Tabla 2-10.
Indica las capacidades para lneas del dispositivo. Devuelve
uno o ms valores de la Tabla 2-11.
Indica las capacidades para polgonos del dispositivo.
Devuelve uno o ms valores de la Tabla 2-12.
Indica las capacidades para texto del dispositivo. Devuelve
uno o ms valores de la Tabla 2-13.
Descripcin
Un plotter vectorial.
Un monitor de barrido.
Una impresora de barrido.
Una cmara de barrido.
Un flujo de caracteres.
Un metafichero.
Un fichero de monitor.
Descripcin
El dispositivo requiere soporte de bandas.
El dispositivo es capaz de transferir mapas de bits.
El dispositivo soporta mapas de bits mayores de 64K.
El dispositivo soporta las funciones SetDIBits y GetDIBits.
El dispositivo soporta la funcin SetDIBitsToDevice.
El dispositivo puede realizar relleno de interiores.
45
Descripcin
El dispositivo soporta caractersticas de Windows 2.0.
El dispositivo est basado en paleta.
El dispositivo es escalable.
El dispositivo soporta la funcin StretchBlt.
El dispositivo soporta la funcin StretchDIBits.
Descripcin
El dispositivo no soporta el dibujo de curvas.
El dispositivo puede dibujar crculos.
El dispositivo puede dibujar trozos de tarta.
El dispositivo puede dibujar arcos de cuerda.
El dispositivo puede dibujar elipses.
El dispositivo puede dibujar bordes anchos.
El dispositivo puede dibujar bordes con estilo.
El dispositivo puede dibujar bordes anchos y con estilo.
El dispositivo puede dibujar interiores.
El dispositivo puede dibujar rectngulos redondeados.
Descripcin
El dispositivo no soporta el dibujo de lneas.
El dispositivo puede dibujar polgonos.
El dispositivo puede dibujar marcadores.
El dispositivo puede dibujar mltiples marcadores.
El dispositivo puede dibujar lneas anchas.
El dispositivo puede dibujar lneas con estilo.
El dispositivo puede dibujar lneas anchas y con estilo.
El dispositivo puede dibujar interiores.
Descripcin
El dispositivo no soporta el dibujo de polgonos.
El dispositivo puede dibujar polgonos de relleno
alternativo.
El dispositivo puede dibujar rectngulos.
El dispositivo puede dibujar polgonos con relleno Winding.
El dispositivo puede dibujar una lnea de barrido sencilla.
2
Captulo
Valor
RC_GDI20_OUTPUT
RC_PALETTE
RC_SCALING
RC_STRETCHBLT
RC_STRETCHDIB
46
Captulo 2
Valor
PC_WIDE
PC_STYLED
PC_WIDESTYLED
PC_INTERIORS
Descripcin
El dispositivo puede dibujar bordes anchos.
El dispositivo puede dibujar bordes con estilo.
El dispositivo puede dibujar bordes anchos y con estilo.
El dispositivo puede dibujar interiores.
GetMapMode
Descripcin
El dispositivo soporta la impresin precisa de caracteres.
El dispositivo soporta la impresin precisa de trazos.
El dispositivo soporta recorte de precisin.
El dispositivo puede hacer rotacin de caracteres de 90
grados.
El dispositivo puede hacer cualquier rotacin de
caracteres.
El dispositivo puede escalar tanto en la direccin horizontal
como en la vertical.
El dispositivo soporta carcter de doble tamao para
escalar.
El dispositivo utiliza slo mltiplos enteros para escalar
caracteres.
El dispositivo soporta cualquier mltiplo para un exacto
escalamiento de caracteres.
El dispositivo puede dibujar caracteres en negrita.
El dispositivo soporta itlica.
El dispositivo soporta subrayado.
El dispositivo puede dibujar tachado.
El dispositivo puede dibujar fuentes de barrido.
El dispositivo puede dibujar fuentes vectoriales.
El dispositivo no puede hacer scroll usando transferencias
de bloques de bits.
Windows.Pas
Sintaxis
GetMapMode(
DC: HDC
): Integer;
47
Descripcin
La funcin GetMapMode recupera el modo actual de mapeado del contexto de
dispositivo especificado.
Parmetros
DC: Manejador del contexto de dispositivo cuyo modo de mapeado se desea obtener.
Si la funcin tiene xito, devuelve una opcin indicando el modo actual de mapeado,
que puede ser un valor de la Tabla 2-14; en caso contrario, devuelve cero.
Vase adems
SetMapMode, SetWindowExtEx, SetViewportExtEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
Tabla 2-14: Valores que devuelve GetMapMode
Valor
MM_ANISOTROPIC
MM_HIENGLISH
MM_HIMETRIC
MM_ISOTROPIC
MM_LOENGLISH
MM_LOMETRIC
Descripcin
Las unidades, el escalamiento y la orientacin son asignados
por SetWindowExtEx y SetViewportExtEx. Los ejes de
escalamiento x e y son tratados de forma independiente y
los valores correspondientes no tienen que que coincidir.
Mapeado de alta resolucin en unidades inglesas. Cada
unidad tiene 0,001 pulgadas. Las x crecen hacia la derecha
y las y hacia arriba.
Mapeado de alta resolucin en unidades mtricas
decimales. Cada unidad tiene 0,01 milmetros. Las x crecen
hacia la derecha y las y hacia arriba.
Las unidades, el escalamiento y la orientacin son asignados
por SetWindowExtEx y SetViewportExtEx con las unidades
verticales y horizontales iguales. Las unidades y orientacin
pueden ser elegidos por el programador, pero las unidades
para los ejes x e y estn obligadas por el GDI a ser las
mismas. Esto asegura un relacin de aspecto 1:1.
Mapeado de baja resolucin en unidades inglesas. Cada
unidad tiene 0,01 de pulgada. Las x crecen hacia la derecha
y las y hacia arriba.
Mapeado de baja resolucin en unidades mtricas
decimales. Cada unidad tiene 0,1 de pulgada. Las x crecen
hacia la derecha y las y hacia arriba.
2
Captulo
48
Captulo 2
Valor
MM_TEXT
MM_TWIPS
GetSystemMetrics
Descripcin
Cada unidad es mapeada a un pxel del dispositivo. Este no
es un mapeado independiente del dispositivo. Dispositivos
con diferentes resoluciones o escalamientos producirn
diferentes resultados de las funciones grficas. Las x crecen
hacia la derecha y las y hacia abajo. Este es el modo de
mapeado por defecto.
Cada unidad es mapeada a 1/1440 de pulgada, que
corresponde a un veinteavo de un punto de impresora. Las
x crecen hacia la derecha y las y hacia arriba.
Windows.Pas
Sintaxis
GetSystemMetrics(
nIndex: Integer
): Integer;
Descripcin
La funcin GetSystemMetrics recupera las dimensiones, en pxeles, de un elemento
especfico de visualizacin de Windows. Una gran variedad de parmetros pueden ser
solicitados dependiendo del valor del parmetro nIndex. Todos los resultados se
expresan en valores numricos o pxeles, excepto para la opcin SM_ARRANGE, que
devuelve una combinacin de valores de la Tabla 2-15.
Parmetros
nIndex: Una opcin que indica el elemento de visualizacin de Windows cuya medida
ser recuperada. A este parmetro se le puede asignar un valor de la Tabla 2-16.
Vase adems
GetDeviceCaps
Ejemplo
Listado 2-9: Recuperando las dimensiones especficas de un elemento
procedure TForm1.Button1Click(Sender: TObject);
begin
with ListBox1.Items do
begin
{Mostrar la distribucin de la ventana minimizada}
Add('Minimized Window Arrangement -');
49
Figura 2-7:
Dimensiones
especficas del
elemento
2
Captulo
50
Captulo 2
Descripcin
La posicin inicial por defecto para situar las ventanas
minimizadas es la esquina inferior izquierda de la pantalla.
La posicin inicial por defecto para situar las ventanas
minimizadas es la esquina inferior derecha de la pantalla.
Colocar las ventanas minimizadas fuera de la pantalla, en una
zona invisible.
La posicin inicial por defecto para situar las ventanas
minimizadas es la esquina superior izquierda de la pantalla.
La posicin inicial por defecto para situar las ventanas
minimizadas es la esquina superior derecha de la pantalla.
Coloca verticalmente las ventanas minimizadas, de arriba a
abajo.
Coloca horizontalmente las ventanas minimizadas, de izquierda
a derecha.
Coloca horizontalmente las ventanas minimizadas, de derecha
a izquierda.
Coloca verticalmente las ventanas minimizadas, de abajo a
arriba.
SM_CLEANBOOT
SM_CMOUSEBUTTONS
SM_CXBORDER,
SM_CYBORDER
SM_CXCURSOR,
SM_CYCURSOR
Descripcin
Devuelve una combinacin de valores de la Tabla 2-15 que
especifica cmo el sistema distribuye las ventanas
minimizadas.
Devuelve un valor que especifica cmo el sistema ha sido
iniciado:
0 = Inicio normal.
1 = Inicio en modo seguro.
2 = Inicio en modo seguro con soporte para redes.
Devuelve el nmero de botones del ratn o cero si no hay
ratn instalado.
Ancho y altura del borde de la ventana. Estos son los
mismos valores de SM_CXEDGE y SM_CYEDGE para
ventanas con apariencia 3-D.
Ancho y altura del cursor. Estas son las dimensiones
soportadas por el controlador de pantalla en uso. Debido
a los requerimientos del controlador de pantalla, el
sistema no puede crear cursores de otras dimensiones.
Valor
SM_CXDOUBLECLK,
SM_CYDOUBLECLK
SM_CXDRAG, SM_CYDRAG
SM_CXEDGE, SM_CYEDGE
SM_CXFIXEDFRAME,
SM_CYFIXEDFRAME
SM_CXFULLSCREEN,
SM_CYFULLSCREEN
SM_CXHSCROLL,
SM_CYHSCROLL
SM_CXHTHUMB
SM_CXICON, SM_CYICON
SM_CXICONSPACING,
SM_CYICONSPACING
SM_CXMAXIMIZED,
SM_CYMAXIMIZED
SM_CXMAXTRACK,
SM_CYMAXTRACK
SM_CXMENUCHECK,
SM_CYMENUCHECK
51
Descripcin
Ancho y altura del rectngulo alrededor de la zona del
primer clic en una operacin de doble clic. El segundo clic
debe ocurrir dentro de ese rectngulo para que el sistema
considere los dos clics como un doble clic. Para que se
genere un doble clic, el segundo clic debe ocurrir adems
en un tiempo determinado.
Ancho y altura de un rectngulo centrado en un punto de
arrastre que permite movimientos limitados del puntero
del ratn antes de que el arrastre comience. Esto permite
al usuario ciertos movimientos del ratn sin comenzar
inadvertidamente la operacin de arrastre.
Dimensiones de un borde 3-D. Equivalentes a
SM_CXBORDER y SM_CYBORDER.
Grosor del marco que rodea una ventana que tiene una
barra de ttulo, pero que no es redimensionable.
SM_CXFIXEDFRAME es el ancho del borde horizontal y
SM_CYFIXEDFRAME es la altura del borde vertical.
Ancho y altura del rea cliente de una ventana a pantalla
completa. El tamao de la ventana mxima que no se
solape con la barra de tareas puede obtenerse llamando a
la funcin SystemParametersInfo con el valor
SPI_GETWORKAREA.
Ancho del mapa de bits de la flecha en una barra de
desplazamiento horizontal y altura de la barra de
desplazamiento horizontal.
Ancho del botn en una barra de desplazamiento
horizontal.
Ancho y altura por defecto de un icono. Normalmente es
32x32, pero puede depender del hardware instalado. La
funcin LoadIcon est limitada a cargar solamente iconos
de esas dimensiones.
Dimensiones de una celda de la rejilla para elementos en
una vista de iconos grandes. La pantalla es mapeada en
rectngulos de este tamao, con cada elemento llenando
un rectngulo. Estos valores son siempre mayores o
iguales que los de SM_CXICON y SM_CYICON.
Tamao por defecto de una ventana de nivel superior
maximizada.
Tamao mximo por defecto de una ventana que tiene
una barra de ttulo y bordes redimensionables. El sistema
no permitir al usuario arrastrar el borde de la ventana a
un tamao superior. Una aplicacin puede superar estos
lmites procesando el mensaje WM_GETMINMAXINFO.
Tamao por defecto del mapa de bits de la marca de
verificacin de elementos de un men.
2
Captulo
52
Captulo 2
Valor
SM_CXMENUSIZE,
SM_CYMENUSIZE
SM_CXMIN, SM_CYMIN
SM_CXMINIMIZED,
SM_CYMINIMIZED
SM_CXMINSPACING,
SM_CYMINSPACING
SM_CXMINTRACK,
SM_CYMINTRACK
SM_CXSCREEN,
SM_CYSCREEN
SM_CXSIZE, SM_CYSIZE
SM_CXSIZEFRAME,
SM_CYSIZEFRAME
SM_CXSMICON,
SM_CYSMICON
SM_CXSMSIZE,
SM_CYSMSIZE
SM_CXVSCROLL,
SM_CYVSCROLL
SM_CYCAPTION
SM_CYKANJIWINDOW
SM_CYMENU
SM_CYSMCAPTION
SM_CYVTHUMB
SM_DBCSENABLED
SM_DEBUG
Descripcin
Tamao de los botones de la barra de men.
Ancho y altura mnimos de una ventana.
Tamao de una ventana normal minimizada.
Tamao de una celda de la rejilla para ventanas
minimizadas. Consulte SM_CXICONSPACING y
SM_CYICONSPACING. Las ventanas minimizadas son
distribuidas dentro de rectngulos de este tamao. Estos
valores son siempre mayores o iguales que
SM_CXMINIMIZED y SM_CYMINIMIZED.
Ancho y altura mnimos de una ventana. El sistema no
permitir arrastrar el borde de la ventana a un tamao
inferior a ste. Una aplicacin puede superar estos lmites
procesando el mensaje WM_GETMINMAXINFO.
Ancho y altura de la pantalla.
Ancho y altura de los botones de la barra de ttulo de una
ventana.
Grosor del borde de una ventana redimensionable.
SM_CXSIZEFRAME es el ancho del borde horizontal y
SM_CYSIZEFRAME la altura del borde vertical. Estos
valores son los mismos que SM_CXFRAME y
SM_CYFRAME.
Tamao recomendado de un icono pequeo.
Generalmente los iconos pequeos se utilizan en la barra
de ttulo de las ventanas y en vistas de iconos pequeos.
Tamao de los botones pequeos de la barra de ttulo.
Ancho de la barra de desplazamiento vertical y altura del
mapa de bits de la flecha de la barra de desplazamiento
vertical.
Altura del rea de la barra de ttulo normal.
La altura de la ventana Kanji en la parte inferior de la
pantalla para sistemas que usan el conjunto de caracteres
de doble byte.
Altura de la barra de men de una sola lnea.
Altura de una barra de ttulo pequea.
Altura del botn en una barra de desplazamiento vertical.
Valor distinto de cero si la versin de doble byte del
conjunto de caracteres de USER.EXE est instalada; cero
si DBCS no est instalada.
Distinto de cero si la versin de depuracin de USER.EXE
est instalada; cero en caso contrario.
53
Valor
Descripcin
SM_MENUDROPALIGNMENT Distinto de cero si los mens desplegables se alinean a la
derecha respecto a la opcin en la barra de men; cero si
se alinean a la izquierda.
SM_MIDEASTENABLED
Distinto de cero si el sistema tiene habilitados los idiomas
rabe y hebreo; cero si no los tiene.
SM_MOUSEPRESENT
Distinto de cero si hay un ratn instalado; cero si no lo
hay.
SM_MOUSEWHEELPRESENT Slo Windows NT: Distinto de cero si hay instalado un
ratn con rueda; cero en caso contrario.
SM_NETWORK
Si existe una red se activa el bit menos significativo; en
caso contrario, se deja en cero. Los otros bits estn
reservados.
SM_PENWINDOWS
Distinto de cero si la extensin de Windows para pantallas
tctiles (pen computing) est instalada; cero en caso
contrario.
SM_SECURE
Distinto de cero si hay seguridad instalada; cero si no la
hay.
SM_SHOWSOUNDS
Distinto de cero si el usuario especifica que las
presentaciones de audio tienen tambin una
representacin visual; cero si no la tienen.
SM_SLOWMACHINE
Distinto de cero si la computadora tiene un procesador de
bajas prestaciones; cero en caso contrario.
SM_SWAPBUTTON
Distinto de cero si los botones izquierdo y derecho del
ratn han sido configurados para intercambiarse; cero en
caso contrario.
GetViewportExtEx
Windows.Pas
Sintaxis
GetViewportExtEx(
DC: HDC;
var Size: TSize
): BOOL;
Descripcin
La funcin GetViewportExtEx recupera las dimensiones horizontal y vertical del puerto
de visualizacin asociadas con el manejador del contexto de dispositivo especificado.
Parmetros
DC: El manejador del contexto de dispositivo del cual van a ser recuperadas las
dimensiones del puerto de visualizacin.
2
Captulo
54
Captulo 2
Size: Puntero a un registro TSize que recibe las dimensiones horizontal y vertical del
puerto de visualizacin asociado con el contexto de dispositivo especificado.
Vase adems
GetViewportOrgEx, GetWindowExtEx, GetWindowOrgEx, SetViewportExtEx,
SetViewportOrgEx, SetWindowExtEx, SetWindowOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
GetViewportOrgEx
Windows.Pas
Sintaxis
GetViewportOrgEx(
DC: HDC;
var Point: TPoint
): BOOL;
Descripcin
La funcin GetViewportOrgEx recupera el origen del sistema de coordenadas del
puerto de visualizacin asociado con el contexto de dispositivo especificado.
Parmetros
DC: El manejador del contexto de dispositivo cuyo origen del sistema de coordenadas
del puerto de visualizacin ser recuperado.
Point: Puntero a un registro TPoint que recibe los valores x e y del origen del sistema
de coordenadas del puerto de visualizacin.
Vase adems
GetViewportExtEx, GetWindowExtEx, GetWindowOrgEx, SetViewportExtEx,
SetViewportOrgEx, SetWindowExtEx, SetWindowOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
GetWindowDC
55
Windows.Pas
Sintaxis
{manejador de ventana}
{devuelve un contexto de dispositivo de la ventana}
Descripcin
La funcin GetWindowDC devuelve un contexto de dispositivo para la ventana
especificada por el parmetro hWnd. El contexto de dispositivo recuperado se refiere a
toda la ventana, incluyendo reas no cliente, tales como la barra de ttulo, el men, las
barras de desplazamiento y los marcos. Esto le permite a una aplicacin implementar
grficos a la medida en reas no cliente como la barra de ttulo o los bordes. Cuando el
contexto de dispositivo deje de ser necesario deber ser liberado llamando a la funcin
ReleaseDC. Observe que esta funcin recupera slo un contexto de dispositivo comn
y cualquier atributo modificado en este contexto de dispositivo no se reflejar en
ningn contexto del dispositivo de clase o privado de la ventana, si los hubiera.
Parmetros
hWnd: Manejador de la ventana de la que se recuperar el contexto de dispositivo.
Vase adems
BeginPaint, GetDC, GetSystemMetrics, ReleaseDC
Ejemplo
Listado 2-10: Pintando una barra de ttulo a la medida
procedure TForm1.WMNCPaint(var Msg: TMessage);
var
WinDC: HDC;
// almacena el contexto de dispositivo de la ventana
OldFont: HFONT;
// almacena la fuente anterior
begin
{Llamar al manejador heredado}
inherited;
{Recuperar un manejador para el contexto de dispositivo de la ventana}
WinDC := GetWindowDC(Form1.Handle);
{Inicializar la fuente}
Canvas.Font.Height := GetSystemMetrics(SM_CYCAPTION) - 4;
Canvas.Font.Name := 'Times New Roman';
Canvas.Font.Style := [fsBold, fsItalic];
2
Captulo
GetWindowDC(
hWnd: HWND
): HDC;
56
Captulo 2
Figura 2-8:
Una barra de
ttulo a la
medida
GetWindowExtEx
Windows.Pas
Sintaxis
GetWindowExtEx(
DC: HDC;
var Size: TSize
): BOOL;
57
Descripcin
La funcin GetWindowExtEx recupera las dimensiones horizontal y vertical de la
ventana asociada con el contexto de dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo para el cual se recuperan las dimensiones
horizontal y vertical de la ventana.
Vase adems
GetViewportExtEx, GetViewportOrgEx, GetWindowOrgEx, SetViewportExtEx,
SetViewportOrgEx, SetWindowExtEx, SetWindowOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
GetWindowOrgEx
Windows.Pas
Sintaxis
GetWindowOrgEx(
DC: HDC;
var Point: TPoint
): BOOL;
Descripcin
La funcin GetWindowOrgEx recupera el origen de la ventana asociada con el contexto
de dispositivo especificado.
Parmetros
DC: Manejador del contexto de dispositivo para el cual se recuperan las coordenadas x
e y del origen del sistema de coordenadas de la ventana asociada.
Point: Puntero al registro TPoint que recibe los valores x e y del origen del sistema de
coordenadas de la ventana.
2
Captulo
Size: Puntero al registro TSize que recibe las dimensiones horizontal y vertical de la
ventana asociada con el contexto de dispositivo especificado.
58
Captulo 2
Vase adems
GetViewportExtEx, GetViewportOrgEx, GetWindowExtEx, SetViewportExtEx,
SetViewportOrgEx, SetWindowExtEx, SetWindowOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
LPtoDP
Windows.Pas
Sintaxis
LPtoDP(
DC: HDC;
var Points;
Count: Integer
): BOOL;
Descripcin
La funcin LPtoDP convierte puntos en coordenadas lgicas a sus respectivos valores
en coordenadas de dispositivo. El parmetro Points apunta a un array de registros
TPoint que contiene las coordenadas que sern convertidas. Estos mismos registros
TPoint contendrn las coordenadas convertidas cuando la funcin retorne. La
transformacin de las coordenadas es ejecutada basndose en los valores asignados por
las funciones SetWindowOrgEx, SetViewportOrgEx, SetWindowExtEx y
SetViewportExtEx. La funcin LPtoDP fallar si alguno de los puntos en el array
especifica un valor mayor de 27 bits. Tambin fallar si alguna coordenada de alguno
de los puntos transformados es superior a 32 bits en tamao. En caso de fallo, los
valores de todo el array Points sern indefinidos.
Parmetros
DC: El contexto de dispositivo para el cual se har la transformacin de coordenadas.
Points: Puntero a un array de registros TPoint que contiene las coordenadas de puntos
que sern convertidas.
Count: Especifica el nmero de elementos que contiene el array al que apunta el
parmetro Points.
Vase adems
DPtoLP, SetWindowOrgEx, SetViewportOrgEx, SetWindowExtEx, SetViewportExtEx
59
Ejemplo
Vea el Listado 2-12 bajo ScaleViewportExtEx.
MapWindowPoints
Windows.Pas
Sintaxis
{manejador de la ventana fuente}
{manejador de la ventana destino}
{puntero a un array de puntos}
{el tamao del array}
{devuelve desplazamientos de pxeles}
Descripcin
La funcin MapWindowPoints convierte un grupo de puntos de un sistema de
coordenadas relativo a una ventana al sistema de coordenadas de otra ventana.
Cualquier cantidad de puntos puede ser transformada con una sola llamada a esta
funcin.
Parmetros
hWndFrom: Manejador de la ventana de la cual los puntos sern traducidos. Los puntos
listados en el parmetro lpPoints tienen coordenadas relativas a esta ventana. Si a este
parmetro se le asigna nil o HWND_DESKTOP, los puntos sern relativos a la
pantalla.
hWndTo: Manejador de la ventana para la cual los puntos sern traducidos. Si a este
parmetro se le asigna nil o HWND_DESKTOP, los puntos sern relativos a la
pantalla.
lpPoints: Un puntero a un array de registros TPoint que contiene las coordenadas de
puntos a convertir. Cada registro TPoint recibe las coordenadas convertidas cuando la
funcin retorna.
cPoints: Especifica el nmero de elementos en el array al que apunta el parmetro
lpPoints.
Vase adems
ClientToScreen, ScreenToClient
2
Captulo
MapWindowPoints(
hWndFrom: HWND;
hWndTo: HWND;
var lpPoints:UINT;
cPoints: UINT
): Integer;
60
Captulo 2
Ejemplo
Listado 2-11: Convirtiendo mltiples coordenadas de un sistema a otro
var
Form1: TForm1;
DrawnRect: TRect;
Drawing: Boolean;
implementation
{$R *.DFM}
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
{Indicar que una operacin de dibujo ha comenzado e inicializar las coordenadas
del rectngulo}
Drawing := TRUE;
DrawnRect := Rect(X, Y, X, Y);
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
{Si estamos redibujando...}
if Drawing then
with PaintBox1.Canvas do begin
{Inicializar la brocha y la pluma del rea de dibujo}
Pen.Mode := pmNot;
Pen.Width := 2;
Brush.Style := bsClear;
{Dibujar un rectngulo sobre el anterior para borrarlo}
Rectangle(DrawnRect.Left, DrawnRect.Top, DrawnRect.Right, DrawnRect.Bottom);
{Colocar el rectngulo en las coordenadas actuales}
DrawnRect := Rect(DrawnRect.Left, DrawnRect.Top, X, Y);
{Dibujar el nuevo rectngulo}
Rectangle(DrawnRect.Left, DrawnRect.Top, DrawnRect.Right, DrawnRect.Bottom);
end;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
{No dibujaremos ms}
Drawing := FALSE;
{Mostrar las coordenadas relativas al panel}
Label2.Caption := 'Panel coordinates - L:' + IntToStr(DrawnRect.Left) + ', T: ' +
IntToStr(DrawnRect.Top) + ', R: ' + IntToStr(DrawnRect.Right) +
', B: ' + IntToStr(DrawnRect.Bottom);
61
Captulo
Figura 2-9:
Los puntos
trasladados
OffsetViewportOrgEx
Windows.Pas
Sintaxis
OffsetViewportOrgEx(
DC: HDC;
X: Integer;
Y: Integer;
Points: Pointer
): BOOL;
Descripcin
La funcin OffsetViewportOrgEx modifica el origen del puerto de visualizacin
aadindole un valor a su ubicacin actual. Los parmetros pueden especificar
desplazamientos positivos o negativos en las direcciones horizontal o vertical. La
ubicacin del origen anterior es devuelto a travs del parmetro Points.
OffsetViewportOrgEx desplaza el origen del puerto de visualizacin a una nueva
ubicacin relativa a las coordenadas actuales. Para ubicar el origen en una posicin
absoluta independiente de la actual utilice SetViewportOrgEx.
Parmetros
DC: Manejador del contexto de dispositivo cuyo origen del puerto de visualizacin ser
modificado.
62
Captulo 2
Vase adems
GetViewportOrgEx, OffsetWindowOrgEx, ScaleViewportExtEx, SetViewportOrgEx
Ejemplo
Vea el Listado 2-12 bajo ScaleViewportExtEx.
OffsetWindowOrgEx
Windows.Pas
Sintaxis
OffsetWindowOrgEx(
DC: HDC;
X: Integer;
Y: Integer;
Points: Pointer
): BOOL;
Descripcin
La funcin OffsetWindowOrgEx modifica el origen de la ventana aadindole un valor
a su ubicacin actual. Los parmetros pueden especificar desplazamientos positivos o
negativos en las direcciones horizontal o vertical. La ubicacin del origen anterior es
devuelta a travs del parmetro Points. OffsetWindowOrgEx mueve el origen a un
nuevo valor relativo a las coordenadas existentes. Para ubicar el origen en una posicin
absoluta, independiente de la actual, utilice SetWindowOrgEx.
Parmetros
DC: Manejador del contexto de dispositivo asociado a la ventana cuyo origen ser
modificado.
X: El desplazamiento horizontal que se aadir o sustraer del valor actual de x en el
origen.
Y: El desplazamiento vertical que se aadir o sustraer del valor actual de y en el
origen.
63
Points: Puntero a un registro TPoint que recibir la ubicacin anterior del origen. A
este parmetro se le puede asignar nil si el origen de coordenadas anterior se necesita.
Vase adems
Ejemplo
Vea el Listado 2-12 bajo ScaleViewportExtEx.
ReleaseDC
Windows.Pas
Sintaxis
ReleaseDC(
hWnd: HWND;
hDC: HDC
): Integer;
{manejador de ventana}
{contexto de dispositivo}
{devuelve cero o uno}
Descripcin
La funcin ReleaseDC libera el contexto de dispositivo recuperado por las funciones
GetDC o GetWindowDC, devolviendo esos recursos a Windows. La funcin
ReleaseDC afecta slo a contextos de dispositivo comunes. ReleaseDC no tiene efecto
alguno en caso de contextos de dispositivo de clase o privados.
Parmetros
hWnd: Manejador de la ventana cuyo contexto de dispositivo ser liberado.
hDC: Manejador del contexto de dispositivo que ser liberado.
Vase adems
CreateCompatibleDC, DeleteDC, GetDC, GetWindowDC
Ejemplo
Vea el Listado 2-5 bajo CreateCompatibleDC y otras funciones en este captulo.
2
Captulo
64
Captulo 2
RestoreDC
Windows.Pas
Sintaxis
RestoreDC(
DC: HDC;
SavedDC: Integer
): BOOL;
Descripcin
La funcin RestoreDC restaura el estado, anteriormente almacenado, de un contexto de
dispositivo. El estado de un contexto puede almacenarse llamando a la funcin
SaveDC. La funcin SaveDC devuelve un valor que identifica al contexto de
dispositivo almacenado; este valor debe utilizarse en el parmetro SavedDC para
restaurar un estado requerido.
Parmetros
DC: Manejador de un contexto de dispositivo cuyo estado ser restaurado. El contexto
de dispositivo debe existir previamente y tener estados anteriormente almacenados con
la funcin SaveDC.
SavedDC: Especifica el nmero de instancia del estado que ser restaurado. Este valor
es devuelto por la funcin SaveDC cuando el estado es originalmente almacenado.
Puede utilizarse un valor negativo para restaurar un estado relativo al actual (por
ejemplo, -1 recupera el estado ms recientemente almacenado). Si el estado restaurado
no es el ms recientemente almacenado, todos los otros estados entre el ms
recientemente almacenado y el especificado son descartados.
Vase adems
CreateCompatibleDC, GetDC, GetWindowDC, SaveDC
Ejemplo
Vea el Listado 2-5 bajo CreateCompatibleDC.
SaveDC
Windows.Pas
Sintaxis
SaveDC(
DC: HDC
): Integer;
65
Descripcin
Esta funcin almacena el estado actual del contexto de dispositivo especificado en una
pila interna mantenida por Windows. Este estado incluye la informacin y los objetos
grficos asociados con el contexto de dispositivo, tales como mapas de bits, brochas,
paletas, fuentes, el modo de dibujo, el modo de mapeado, etc. El estado puede ser
recuperado utilizando la funcin RestoreDC.
Vase adems
CreateCompatibleDC, GetDC, GetWindowDC, RestoreDC
Ejemplo
Vea el Listado 2-5 bajo CreateCompatibleDC.
ScaleViewportExtEx
Windows.Pas
Sintaxis
ScaleViewportExtEx(
DC: HDC;
XM: Integer;
XD: Integer;
YM: Integer;
YD: Integer;
Size: PSize
): BOOL;
Descripcin
La funcin ScaleViewportExtEx modifica las dimensiones del puerto de visualizacin
asociado con el contexto de dispositivo especificado en correspondencia con los
factores de escala especificados. Para las dimensiones horizontal y vertical, se puede
especificar un parmetro divisor y otro multiplicador para hacer las dimensiones ms
grandes o ms pequeas en esas direcciones. A los parmetros que no se utilicen se les
deber asignar el valor 1. Por ejemplo, para hacer la dimensin horizontal la mitad de
su valor actual es necesario asignar 2 al parmetro XD. Todos los dems parmetros
debern ser 1. Para hacer la dimensin horizontal tres cuartos de su valor actual, el
parmetro XM debe valer 3 y el parmetro XD debe valer 4.
2
Captulo
Parmetros
66
Captulo 2
Parmetros
DC: Manejador del contexto de dispositivo para cuyo puerto de visualizacin asociado
sern escaladas las dimensiones.
XM: El multiplicador de la dimensin horizontal.
XD: El divisor de la dimensin horizontal.
YM: El multiplicador de la dimensin vertical.
YD: El divisor de la dimensin vertical.
Size: Puntero a un registro TSize que recibe los valores previos de las dimensiones.
Vase adems
GetViewportExtEx, ScaleWindowExtEx
Ejemplo
Listado 2-12: Escalando puertos de visualizacin y ventanas
{OJO! Delphi importa estas funciones incorrectamente; las importamos manualmente}
function OffsetViewportOrgEx(DC: HDC; X, Y: Integer;
Points: Pointer): BOOL; stdcall;
function OffsetWindowOrgEx(DC: HDC; X, Y: Integer;
Points: Pointer): BOOL; stdcall;
var
Form1: TForm1;
MyDisplayDC: HDC;
MyMapMode: Integer;
PrevWindowSize: TSize;
PrevViewportSize: TSize;
PrevWindowPoint: TPoint;
PrevViewportPoint: TPoint;
//
//
//
//
//
//
implementation
{$R *.DFM}
67
2
Captulo
68
Captulo 2
69
end;
end;
{Chequeo de errores}
if not LPtoDP(MyDisplayDC, MyPoint, 1) then
ShowMessage('Error in logical coordinates')
else begin
{MyPoint ahora contiene coordenadas de dispositivo convertidas}
EditDevX.Text := IntToStr(MyPoint.X);
EditDevY.Text := IntToStr(MyPoint.Y);
end;
end;
Figura 2-10:
La imagen
escalada
2
Captulo
70
Captulo 2
ScaleWindowExtEx
Windows.Pas
Sintaxis
ScaleWindowExtEx(
DC: HDC;
XM: Integer;
XD: Integer;
YM: Integer;
YD: Integer;
Size: PSize
): BOOL;
Descripcin
La funcin ScaleWindowExtEx modifica las dimensiones de la ventana asociada con el
contexto de dispositivo especificado, de acuerdo a los factores de escala especificados.
Para las dimensiones horizontal y vertical, se puede especificar un parmetro
multiplicador y uno divisor para hacer la dimensin ms grande o ms pequea en esas
direcciones. A los parmetros que no sean utilizados se les debe asignar el valor 1. Por
ejemplo, para hacer la dimensin horizontal la mitad de su valor actual es necesario
asignar 2 al parmetro XD. Todos los dems parmetros debern valer 1. Para hacer la
dimensin horizontal tres cuartos de su valor actual, al parmetro XM se le debe
asignar 3 y al parmetro XD 4.
Parmetros
DC: Manejador del contexto de dispositivo para cuya ventana asociada sern escaladas
las dimensiones.
XM: El multiplicador de la dimensin horizontal.
XD: El divisor de la dimensin horizontal.
YM: El multiplicador de la dimensin vertical.
YD: El divisor de la dimensin vertical.
Size: Puntero al registro TSize que recibir los valores anteriores de las dimensiones.
Vase adems
GetWindowExtEx, ScaleViewportExtEx
Ejemplo
Vea el Listado 2-12 bajo ScaleViewportExtEx.
ScreenToClient
71
Windows.Pas
Sintaxis
{manejador de ventana}
{puntero a registro TPoint}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin convierte las coordenadas de un punto en coordenadas de pantalla a
coordenadas de rea cliente. El punto a convertir se suministra en un registro TPoint al
que apunta el parmetro lpPoint. La funcin toma las coordenadas a las que apunta el
parmetro lpPoint y las convierte en coordenadas relativas al rea cliente de la ventana
especificada. El resultado es ubicado en el mismo registro TPoint. Las coordenadas del
punto original utilizan como origen la esquina superior izquierda de la pantalla. Las
coordenadas del resultado utilizan como origen la esquina superior izquierda del rea
cliente de la ventana.
Parmetros
hWnd: Manejador de la ventana a cuyas coordenadas se convierte el punto. Cuando la
funcin retorne, el punto ser relativo a la esquina superior izquierda del rea cliente de
la ventana.
lpPoint: Puntero a un registro TPoint que contiene el punto que ser convertido. Este
mismo registro TPoint recibe el punto convertido cuando la funcin retorna.
Vase adems
ClientToScreen, MapWindowPoints
Ejemplo
Vea el Listado 2-4 bajo ClientToScreen.
ScrollDC
Windows.Pas
Sintaxis
ScrollDC(
DC: HDC;
DX: Integer;
DY: Integer;
var Scroll: TRect;
Clip: TRect;
Rgn: HRGN;
2
Captulo
ScreenToClient(
hWnd: HWND;
var lpPoint: TPoint
): BOOL;
72
Captulo 2
Update: PRect
): BOOL;
Descripcin
La funcin ScrollDC desplaza (scrolls) un rectngulo de bits horizontal y
verticalmente. El desplazamiento est dado en unidades del dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo que contiene el rectngulo cuyos bits sern
desplazados.
DX: El nmero de unidades de dispositivo horizontales que sern desplazados. Este
valor es positivo para el desplazamiento a la derecha y negativo para el desplazamiento
a la izquierda.
DY: El nmero de unidades del dispositivo verticales que sern desplazadas. Este valor
es positivo para el desplazamiento hacia abajo y negativo para el desplazamiento hacia
arriba.
Scroll: Especifica un registro TRect que contiene la ubicacin del rectngulo que ser
desplazado.
Clip: Especifica un registro TRect que contiene la ubicacin del rectngulo de recorte.
Rgn: Especifica el manejador de la regin que el desplazamiento descubrir. Esta
regin no tiene necesariamente que ser un rectngulo. A este parmetro se le puede
asignar cero si la regin de actualizacin no es necesaria.
Update: Un puntero a un registro TRect que recibir la ubicacin del rectngulo
descubierto por el rea desplazada. Las coordenadas de este rectngulo estn dadas en
coordenadas de cliente, independientemente del modo de mapeado actual del contexto
de dispositivo. A este parmetro se le puede asignar nil si el rectngulo de
actualizacin no se necesita.
Vase adems
InvalidateRect, InvalidateRgn, BitBlt
Ejemplo
Listado 2-13: Desplazando una imagen dentro de un rea de visualizacin
var
Form1: TForm1;
PreviousX, PreviousY: Integer;
implementation
// desplazamiento anterior
73
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Inicializar la barra de desplazamiento}
ScrollBar1.Max := Image1.Picture.Bitmap.Width - Image1.Width;
ScrollBar2.Max := Image1.Picture.Bitmap.Height - Image1.Height;
2
Captulo
74
Captulo 2
Rect(ScrollBar1.Position, (UpdateRect.Top-Image1.Top) +
ScrollBar2.Position, Image1.Width + ScrollBar1.Position,
(UpdateRect.Top - Image1.Top) + ScrollBar2.Position +
(UpdateRect.Bottom - UpdateRect.Top)));
{Registrar la posicin actual}
PreviousY := ScrollBar2.Position;
end;
Figura 2-11:
La imagen
desplazada
SetMapMode
Windows.Pas
Sintaxis
SetMapMode(
DC: HDC;
p2: Integer
): Integer;
Descripcin
Esta funcin asigna un nuevo modo de mapeado de unidades grficas en el contexto de
dispositivo especificado. Las unidades pueden ser medidas en pxeles, pulgadas,
milmetros o unidades de impresora. La orientacin de los ejes x e y tambin puede ser
seleccionada. Esta funcin se utiliza para determinar cmo las unidades de medida
definidas por software son mapeadas a dispositivos grficos fsicos.
Parmetros
DC: Manejador del contexto de dispositivo al que se le asignar un nuevo modo de
mapeado.
p2: Opcin que indica el nuevo modo de mapeado. Este parmetro puede tomar un
valor de la Tabla 2-17.
75
Vase adems
GetMapMode, SetViewportExtEx, SetViewportOrgEx, SetWindowExtEx,
SetWindowOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
Valor
MM_ANISOTROPIC
MM_HIENGLISH
MM_HIMETRIC
MM_ISOTROPIC
MM_LOENGLISH
MM_LOMETRIC
MM_TEXT
MM_TWIPS
Descripcin
Las unidades, escala y orientacin son seleccionados por
SetWindowExtEx y SetViewportExtEx. Los ejes de
escalamiento x e y son tratados de forma independiente y
los valores correspondientes no tienen que coincidir.
Mapeado de alta resolucin en unidades inglesas. Cada
unidad tiene 0,001 pulgadas. Las x crecen hacia la derecha
y las y hacia arriba.
Mapeado de alta resolucin en unidades mtricas
decimales. Cada unidad tiene 0,01 milmetros. Las x crecen
hacia la derecha y las y hacia arriba.
Las unidades, escala y orientacin son asignados por
SetWindowExtEx y SetViewportExtEx con las unidades
verticales y horizontales iguales. Las unidades y orientacin
pueden ser elegidos por el programador, pero las unidades
para los ejes x e y estn obligadas por el GDI a ser las
mismas. Esto asegura una relacin de aspecto 1:1.
Mapeado de baja resolucin en unidades inglesas. Cada
unidad tiene 0,01 de pulgada. Las x crecen hacia la derecha
y las y hacia arriba.
Mapeado de baja resolucin en unidades mtricas
decimales. Cada unidad tiene 0,1 de pulgada. Las x crecen
hacia la derecha y las y hacia arriba.
Cada unidad es mapeada a un pxel del dispositivo. Este no
es un mapeado independiente del dispositivo. Dispositivos
con diferentes resoluciones o escalamientos producirn
diferentes resultados de las funciones grficas. Las x crecen
hacia la derecha y las y hacia abajo. Este es el modo de
mapeado por defecto.
Cada unidad es mapeada a 1/1440 de pulgada, que
corresponde a un veinteavo de un punto de impresora. Las
x crecen hacia la derecha y las y hacia arriba.
2
Captulo
76
Captulo 2
SetViewportExtEx
Windows.Pas
Sintaxis
SetViewportExtEx(
DC: HDC;
XExt: Integer;
YExt: Integer;
Size: PSize
): BOOL;
Descripcin
Esta funcin establece un nuevo tamao para el puerto de visualizacin asociado con el
contexto de dispositivo especificado. Las llamadas a esta funcin son vlidas solamente
cuando la funcin SetMapMode ha asignado el modo de mapeado del contexto de
dispositivo a MM_ANISOTROPIC o MM_ISOTROPIC. Las llamadas a
SetViewportExtEx son ignoradas para cualquier otro modo de mapeado. En el caso de
MM_ISOTROPIC, una llamada a la funcin SetWindowExtEx tiene que realizarse antes
de que la funcin SetViewportExtEx sea usada.
Parmetros
DC: Manejador del contexto de dispositivo cuyo tamao del puerto de visualizacin
asociado ser modificado.
XExt: El nuevo tamao horizontal del puerto de visualizacin en unidades del
dispositivo.
YExt: El nuevo tamao vertical del puerto de visualizacin en unidades del dispositivo.
Size: Puntero a un registro TSize que recibir el tamao anterior del puerto de
visualizacin. Si las dimensiones anteriores no se necesitan, a este parmetro se le
puede asignar nil.
Vase adems
GetMapMode, GetViewportExtEx, SetMapMode, SetWindowExtEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
SetViewportOrgEx
77
Windows.Pas
Sintaxis
SetViewportOrgEx(
DC: HDC;
X: Integer;
Y: Integer;
Point: PPoint
): BOOL;
Parmetros
DC: Manejador del contexto de dispositivo a cuyo puerto de visualizacin le ser
modificado el origen.
X: La ubicacin horizontal del nuevo origen en unidades del dispositivo.
Y: La ubicacin vertical del nuevo origen en unidades del dispositivo.
Point: Puntero a un registro TPoint que recibir la ubicacin del origen previo en
unidades del dispositivo. Si la ubicacin anterior del origen no se necesita, a este
parmetro se le puede asignar nil.
Vase adems
GetViewportOrgEx, SetWindowOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
Captulo
Descripcin
78
Captulo 2
SetWindowExtEx
Windows.Pas
Sintaxis
SetWindowExtEx(
DC: HDC;
XExt: Integer;
YExt: Integer;
Size: PSize
): BOOL;
Descripcin
Esta funcin establece un nuevo tamao para la ventana asociada con el contexto de
dispositivo especificado. La llamada a esta funcin slo es vlida cuando SetMapMode
ha asignado el modo de mapeado del dispositivo a MM_ANISOTROPIC o
MM_ISOTROPIC. Las llamadas a SetWindowExtEx son ignoradas para otros modos de
mapeado. En el caso de MM_ISOTROPIC, una llamada a SetWindowExtEx tiene que
ser efectuada antes de que la funcin SetViewportExtEx sea usada.
Parmetros
DC: Manejador del contexto de dispositivo a cuya ventana asociada se le modificar el
tamao.
XExt: El nuevo tamao horizontal de la ventana, en unidades del dispositivo.
YExt: El nuevo tamao vertical de la ventana, en unidades del dispositivo
Size: Puntero a un registro TSize que recibe el tamao previo de la ventana. Si las
dimensiones anteriores no se necesitan, a este parmetro se le puede asignar nil.
Vase adems
GetViewportExtEx, GetViewportOrgEx, GetWindowExtEx, GetWindowOrgEx,
SetViewportExtEx, SetViewportOrgEx, SetWindowOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
SetWindowOrgEx
Windows.Pas
Sintaxis
SetWindowOrgEx(
DC: HDC;
X: Integer;
Y: Integer;
Point: PPoint
): BOOL;
79
Descripcin
Parmetros
DC: Manejador del contexto de dispositivo a cuya ventana asociada le ser modificado
el origen.
X: La ubicacin horizontal del nuevo origen, en unidades del dispositivo.
Y: La ubicacin vertical del nuevo origen, en unidades del dispositivo.
Point: Puntero a un registro TPoint que recibir la ubicacin anterior del origen, en
unidades del dispositivo. Si las coordenadas de origen anteriores no se necesitan, a este
parmetro se le puede asignar nil.
Vase adems
GetViewportOrgEx, GetWindowOrgEx, SetViewportOrgEx
Ejemplo
Vea el Listado 2-2 en la introduccin.
2
Captulo
Funciones de dibujo
81
Captulo 3
Funciones de dibujo
Objetos grficos
Con vistas a dibujar sobre un contexto de dispositivo, Windows necesita un mtodo
para saber qu se supone que debe dibujar: de qu color ser el objeto, sus
dimensiones, etc. Estos atributos estn encapsulados en un objeto grfico. Todas las
funciones del tipo CreateXXX, tales como CreateBrush, CreateBitmap o CreatePen,
devuelven un manejador de un objeto grfico. Internamente, este manejador hace
referencia a una estructura que contiene los valores actuales de los atributos del objeto.
Para utilizar la mayora de los objetos grficos, stos necesitan ser seleccionados dentro
de un contexto de dispositivo mediante la funcin SelectObject. Una vez que un objeto
ha sido seleccionado en el contexto de dispositivo, es automticamente utilizado por
aquellas funciones que necesitan ese objeto especficamente. Por ejemplo, es posible
crear una nueva pluma llamando a la funcin CreatePen y seleccionarla dentro de un
contexto de dispositivo. De ah en adelante, cualquier funcin de dibujo aplicada a ese
contexto que necesite una pluma utilizar automticamente la pluma seleccionada.
Solamente un objeto de un tipo dado puede estar seleccionado en un contexto de
dispositivo en un momento dado.
3
Captulo
Windows ofrece una amplia gama de funciones para dibujar grficos simples y
primitivas grficas. Windows es muy potente a la hora de efectuar manipulacin de
grficos de alto nivel, como resulta evidente dada la cantidad de programas para la
manipulacin de imgenes digitales que hay en el mercado. Sin embargo, dibujar un
simple grfico es a veces la forma ms eficiente de comunicarse con el usuario. Por
ejemplo, se puede trazar un simple rectngulo alrededor de una zona de una imagen
para indicar que sta ha sido seleccionada. El propio Windows hace un uso extensivo
de las funciones que se describen en este captulo a la hora de dibujar los elementos
estndar de interfaz de usuario y los controles comunes. Delphi encapsula una buena
parte de las funciones presentadas en este captulo en forma de mtodos y propiedades
de la clase TCanvas. No obstante, la complejidad de la VCL a veces se interpone en el
camino y en esos casos, descender hasta el nivel del API de Windows es el nico modo
de seguir adelante. Este captulo describe las funciones ms comunes que pueden
utilizarse para dibujar grficos simples sobre un contexto de dispositivo.
82
Captulo 3
Plumas y Brochas
Los objetos ms utilizados en las funciones de dibujo de Windows son probablemente
las plumas y brochas. Una brocha define un color y un patrn que se usarn al rellenar
el interior de figuras cerradas, como polgonos, rectngulos, rutas y regiones. Una
pluma define un color y patrn usado para delinear figuras, abiertas o cerradas. Estos
dos objetos grficos son encapsulados por Delphi como las propiedades Pen y Brush
de la clase TCanvas. Delphi abarca toda la funcionalidad ofrecida por las funciones de
brocha de Windows. Sin embargo, Windows ofrece dos estilos de pluma, cosmtico y
geomtrico, y Delphi no encapsula actualmente toda la funcionalidad de estos objetos.
Plumas cosmticas Una pluma cosmtica se mide en unidades del dispositivo y no
puede ser escalada. Actualmente, Windows soporta plumas cosmticas de un solo pxel
de ancho. El estilo de pluma se puede seleccionar entre varios patrones diferentes, que
van desde el slido hasta una amplia variedad de diferentes combinaciones de guiones
y puntos. Las plumas cosmticas son mucho ms rpidas que las plumas geomtricas.
Plumas Geomtricas Una pluma geomtrica se mide en unidades lgicas y puede ser
escalada. Soporta los mismos estilos de plumas disponibles para las plumas cosmticas,
pero adems permite estilos definidos por el usuario y estilos normalmente accesibles
nicamente a las brochas. Adicionalmente, las plumas geomtricas pueden aplicar un
estilo de punto final a los finales de lneas y un estilo de unin donde dos lneas se
unen. Los posibles estilos de punto final y de unin se ilustran en las figuras 3-1 y 3-2.
Tenga en cuenta que bajo Windows 95/98, las plumas geomtricas no soportan estilos
de plumas definidos por el usuario, no pueden usar la mayora de los estilos de las
plumas cosmticas y pueden ser usadas solamente para dibujar rutas.
Figura 3-1:
Estilo de
terminacin
de lineas
geomtricas
Redondo
Cuadrado
Plano
Funciones de dibujo
Figura 3-2:
Estilo de unin
de lineas
geomtricas
Biselado
Inglete
83
Redondo
Funciones de dibujo
En el siguiente captulo se describen las siguientes funciones de dibujo:
Tabla 3-1: Funciones de dibujo
Descripcin
Dibuja un arco.
Comienza una operacin de dibujo.
Dibuja una cuerda.
Crea una brocha a partir de un registro de datos.
Crea una brocha de patrn basada en una trama.
Crea una brocha de patrn.
Crea una pluma.
Crea una pluma a partir de un registro de datos.
Crea una brocha de color slido.
Elimina un objeto grfico.
Dibuja una barra de ttulo.
Dibuja lneas tridimensionales.
Dibuja un rectngulo de foco.
Dibuja botones estndar de la interfaz de usuario.
Dibuja texto o grficos deshabilitados.
Dibuja una elipse.
Termina una operacin de pintura.
Enumera objetos.
Crea plumas cosmticas o geomtricas.
Rellena un rea con un color.
Rellena una ruta con un color.
Rellena un rectngulo con un color.
Rellena una regin con un color.
Dibuja el permetro de un rectngulo.
Dibuja el permetro de una regin.
Recupera el color de fondo de un contexto de dispositivo.
Recupera el modo de fondo de un contexto de dispositivo.
3
Captulo
Funcin
Arc
BeginPaint
Chord
CreateBrushIndirect
CreateHatchBrush
CreatePatternBrush
CreatePen
CreatePenIndirect
CreateSolidBrush
DeleteObject
DrawCaption
DrawEdge
DrawFocusRect
DrawFrameControl
DrawState
Ellipse
EndPaint
EnumObjects
ExtCreatePen
ExtFloodFill
FillPath
FillRect
FillRgn
FrameRect
FrameRgn
GetBkColor
GetBkMode
84
Captulo 3
Funcin
GetBoundsRect
GetBrushOrgEx
GetCurrentObject
GetCurrentPositionEx
GetMiterLimit
GetObject
GetObjectType
GetPixel
GetPolyFillMode
GetROP2
GetStockObject
GetUpdateRect
GetUpdateRgn
GrayString
InvalidateRect
InvalidateRgn
LineDDA
LineTo
LockWindowUpdate
MoveToEx
PaintDesktop
PaintRgn
Pie
PolyBezier
PolyBezierTo
Polygon
Polyline
PolylineTo
PolyPolygon
PolyPolyline
Rectangle
RoundRect
SelectObject
Descripcin
Recupera el rectngulo lmite acumulado de un contexto de
dispositivo.
Recupera el origen de un patrn de brocha.
Recupera el objeto seleccionado en un contexto de
dispositivo.
Recupera la posicin actual de dibujo de un contexto de
dispositivo.
Recupera el lmite del inglete en lneas unidas mediante
inglete.
Recupera informacin sobre un objeto grfico.
Determina el tipo de un objeto grfico.
Recupera el color de un pxel.
Recupera el modo de relleno actual de un polgono.
Recupera el modo de mezcla del primer plano de un
contexto de dispositivo.
Recupera un manejador de un objeto grfico predefinido.
Recupera el rectngulo lmite de la regin de actualizacin
actual.
Recupera la regin de actualizacin actual.
Dibuja una cadena con un color convertido.
Invalida un rea rectangular.
Invalida una regin.
Dibuja una lnea a la medida.
Dibuja una lnea.
Deshabilita el redibujado de una ventana.
Mueve la posicin actual del contexto de dispositivo.
Pinta el papel tapiz del fondo del escritorio sobre un
contexto de dispositivo.
Rellena una regin con la brocha en uso.
Dibuja una cua de tarta.
Dibuja una curva de Bzier.
Dibuja mltiples curvas de Bzier.
Dibuja un polgono relleno.
Dibuja un polgono.
Dibuja un polgono, actualizando la posicin actual.
Dibuja mltiples polgonos rellenos.
Dibuja mltiples polgonos.
Dibuja un rectngulo.
Dibuja un rectngulo redondeado.
Selecciona un objeto grfico en un contexto de dispositivo.
Funciones de dibujo
Funcin
SetBkColor
SetBkMode
SetBoundsRect
SetBrushOrgEx
SetMiterLimit
SetPixel
SetPixelV
SetPolyFillMode
SetROP2
StrokeAndFillPath
StrokePath
85
Descripcin
Establece el color de fondo de un contexto de dispositivo.
Establece el modo de fondo de un contexto de dispositivo.
Establece el comportamiento del rectngulo lmite.
Establece el origen de un patrn de brocha.
Establece el lmite del inglete en lneas unidas mediante
inglete.
Establece el color de un pxel en un contexto de dispositivo.
Establece el color de un pxel en un contexto de dispositivo
(generalmente ms rpido que SetPixel).
Establece el modo de relleno de polgonos.
Establece el modo de mezcla del primer plano del contexto
de dispositivo.
Dibuja y rellena una ruta.
Dibuja una ruta.
Windows.Pas
Sintaxis
Arc(
hDC: HDC;
left: Integer;
top: Integer;
right: Integer;
bottom: Integer;
startX: Integer;
startY: Integer;
endX: Integer;
endY: Integer
): BOOL;
3
Captulo
Arc
Descripcin
Esta funcin dibuja un arco elptico. El arco ser dibujado utilizando la pluma
seleccionada y no usar ni actualizar la posicin actual. El rectngulo lmite definido
por los parmetros left, top, right y bottom define la curva del arco. Los parmetros
startX y startY definen los puntos finales de una lnea que comienza en el centro del
rectngulo lmite y que identifica la posicin de inicio del arco. Los parmetros endX y
endY definen los puntos finales de una lnea que comienza en el centro del rectngulo
lmite y que identifica la posicin final del arco.
86
Captulo 3
X final
X sup. izq.
Y final
Y sup. izq.
Y inf. der.
Y inic.
Figura 3-3:
Coordenadas
del arco
X inic.
X inf. der.
Parmetros
hDC: Especifica el contexto de dispositivo sobre el cual el arco es dibujado.
left: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo
lmite, en unidades lgicas. Bajo Windows 95/98, la suma de los parmetros left y
right tiene que ser menor que 32.767.
top: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo
lmite, en unidades lgicas. Bajo Windows 95/98, la suma de los parmetros top y
bottom tiene que ser menor que 32.767.
right: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo
lmite, en unidades lgicas.
bottom: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo
lmite, en unidades lgicas.
startX: Especifica la coordenada horizontal, en unidades lgicas, del punto final de la
lnea radial que define el punto de inicio del arco.
startY: Especifica la coordenada vertical, en unidades lgicas, del punto final de la
lnea radial que define el punto de inicio del arco.
endX: Especifica la coordenada horizontal, en unidades lgicas, del punto final de la
lnea radial que define el punto final del arco.
endY: Especifica la coordenada vertical, en unidades lgicas, del punto final de la lnea
radial que define el punto final del arco.
Vase adems
Chord, Ellipse, Pie
Funciones de dibujo
87
Ejemplo
Listado 3-1: Dibujando un arco iris
procedure TForm1.Button1Click(Sender: TObject);
var
iCount: Integer;
// variable de control para un bucle general
ArcBounds: TRect;
// rectngulo lmite del arco
begin
{Inicializar el rectngulo lmite}
ArcBounds := PaintBox1.BoundsRect;
{Inicializar la pluma usada para dibujar los arcos}
PaintBox1.Canvas.Pen.Width := 2;
Figura 3-4:
Un arco iris
dibujado con
arcos
BeginPaint
Windows.Pas
Sintaxis
BeginPaint(
hWnd: HWND;
var lpPaint: TPaintStruct
): HDC
{manejador de ventana}
{puntero a un registro TPaintStruct}
{devuelve un manejador de contexto de dispositivo}
3
Captulo
{Dibujar 5 arcos}
for iCount := 1 to 5 do begin
{Dibujar el arco}
Arc(PaintBox1.Canvas.Handle, ArcBounds.Left, ArcBounds.Top, ArcBounds.Right,
ArcBounds.Bottom,ArcBounds.Right, (ArcBounds.Bottom-ArcBounds.Top) div 2,
ArcBounds.Left, (ArcBounds.Bottom-ArcBounds.Top) div 2);
88
Captulo 3
Descripcin
Esta funcin prepara para el redibujado (painting) a la ventana especfica y rellena el
registro TPaintStruct, al que apunta el parmetro lpPaint, con informacin relacionada
con la operacin de pintura. La funcin BeginPaint excluye cualquier rea fuera de la
regin de actualizacin, estableciendo la regin de recorte del contexto de dispositivo.
La regin de actualizacin se asigna llamando a las funciones InvalidateRect o
InvalidateRgn, o mediante una accin que afecte al rea cliente de la ventana, como por
ejemplo redimensionarla, moverla, hacer scroll sobre ella, etc. BeginPaint enva un
mensaje WM_ERASEBKGND a la ventana si se indica que la regin a actualizar debe
ser borrada. La funcin BeginPaint debe ser llamada conjuntamente con EndPaint y
nicamente en respuesta a un mensaje WM_PAINT.
Parmetros
hWnd: Especifica el manejador de la ventana que ser redibujada.
lpPaint: Especifica un puntero a un registro TPaintStruct que recibe informacin sobre
la operacin de pintura. El registro TPaintStruct se define de la siguiente forma:
TPaintStruct = packed record
hdc: HDC;
fErase: BOOL;
rcPaint: TRect;
fRestore: BOOL;
fIncUpdate: BOOL;
rgbReserved: array[0..31] of Byte;
end;
Funciones de dibujo
89
Vase adems
EndPaint, InvalidateRect, InvalidateRgn
Ejemplo
Vea el Listado 3-29 bajo InvalidateRect y el Listado 3-30 bajo InvalidateRgn.
Chord
Windows.Pas
Sintaxis
{manejador de contexto de dispositivo}
{coordenada x de la esquina superior izquierda}
{coordenada y de la esquina superior izquierda}
{coordenada x de la esquina inferior derecha}
{coordenada y de la esquina inferior derecha}
{coordenada x del extremo del primer radio}
{coordenada y del extremo del primer radio}
{coordenada x del extremo del segundo radio}
{coordenada y del extremo del segundo radio}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin dibuja una cuerda utilizando la pluma actual y rellena el interior de la
cuerda utilizando la brocha actual. Una cuerda es una regin limitada por una elipse y
un segmento de lnea. La dimensin de la cuerda est definida por el rectngulo lmite.
La curva est definida por una lnea identificada por los parmetros X3, Y3, X4 e Y4.
Se extender, en sentido contrario a las manecillas del reloj, desde el primer punto de
interseccin de la lnea con el rectngulo lmite hasta el segundo punto de interseccin
de la lnea con el rectngulo lmite. Si estos dos puntos coinciden, una elipse completa
es dibujada. Esta funcin no modifica la posicin actual.
Fin X4
Sup. izq. X1
Fin Y4
Sup. izq. Y1
Figura 3-5:
Coordenadas
del arco
Inf. der. Y2
Inicio Y3
Inicio X3
Inf. der. X2
3
Captulo
Chord(
DC: HDC;
X1: Integer;
Y1: Integer;
X2: Integer;
Y2: Integer;
X3: Integer;
Y3: Integer;
X4: Integer;
Y4: Integer
): BOOL;
90
Captulo 3
Parmetros
DC: Especifica el contexto de dispositivo sobre el cual se dibujar la cuerda.
X1: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo
lmite, en unidades lgicas. Bajo Windows 95/98, la suma de los parmetros X1 y X2
tiene que ser menor que 32.767.
Y1: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo
lmite, en unidades lgicas. Bajo Windows 95/98, la suma de los parmetros Y1 e Y2
tiene que ser menor que 32.767.
X2: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo
lmite, en unidades lgicas.
Y2: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo
lmite, en unidades lgicas.
X3: Especifica la coordenada horizontal, en unidades lgicas, del punto final de la lnea
que define el punto de inicio de la cuerda.
Y3: Especifica la coordenada vertical, en unidades lgicas, del punto final de la lnea
que define el punto de inicio de la cuerda.
X4: Especifica la coordenada horizontal, en unidades lgicas, del punto final de la lnea
que define el punto final de la cuerda.
Y4: Especifica la coordenada vertical, en unidades lgicas, del punto final de la lnea
que define el punto final de la cuerda.
Vase adems
Arc, Ellipse, Pie
Ejemplo
Listado 3-2: Dibujando una cuerda
procedure TForm1.Button1Click(Sender: TObject);
begin
{Inicializar la brocha y la pluma usadas para dibujar la cuerda}
Canvas.Brush.Color := clLime;
Canvas.Brush.Style := bsCross;
Canvas.Pen.Color := clRed;
{Dibujar una cuerda}
Chord(Canvas.Handle, 10, 10, 110, 110, 110, 85, 10, 85);
end;
Funciones de dibujo
91
Figura 3-6: La
cuerda
CreateBrushIndirect
Windows.Pas
Sintaxis
{puntero a registro TLogBrush}
{devuelve un manejador de brocha}
Descripcin
Esta funcin crea una nueva brocha basada en los valores del registro TLogBrush al
que apunta el parmetro p1. Si el patrn de la brocha es un mapa de bits monocromo,
los pxeles negros son dibujados usando el color de texto actual y los pxeles blancos
son dibujados usando el color de fondo actual. Cuando la brocha deje de ser necesaria,
deber ser eliminada llamando a la funcin DeleteObject.
Parmetros
p1: Un puntero al registro TLogBrush que define la nueva brocha. El registro
TLogBrush se define de la siguiente forma:
TLogBrush = packed record
lbStyle: UINT;
lbColor: COLORREF;
lbHatch: Longint;
end;
lbStyle: Una opcin especificando el estilo de la brocha. Este campo puede tomar
un valor de la Tabla 3-2.
lbColor: Especifica un indicador de color que define el color de la brocha. Este
campo es ignorado si al campo lbStyle se le asigna BS_HOLLOW o
BS_PATTERN. Si al campo lbStyle se le asigna BS_DIBPATTERN o
BS_DIBPATTERNBT, la palabra menos significativa de este campo contendr una
opcin que indica la paleta de colores usada por el mapa de bits independiente del
dispositivo (DIB). Esta opcin puede ser DIB_PAL_COLORS, que indica que la
paleta del DIB es un array de ndices dentro de la paleta lgica actualmente
activa, o DIB_RGB_COLORS , que indica que la paleta es un array de valores
literales RGB.
3
Captulo
CreateBrushIndirect(
const p1: TLogBrush
): HBRUSH;
92
Captulo 3
lbHatch: Especifica una opcin que indica el tipo de trama utilizada por la
brocha. Si al campo lbStyle se le asigna BS_HATCHED, este campo contendr
una opcin de la Tabla 3-3 que especifica la orientacin de las lneas usadas para
dibujar la trama. Si al campo lbStyle se le asigna BS_DIBPATTERN, este campo
contendr un manejador de un DIB empaquetado. Si al campo lbStyle se le
asigna BS_DIBPATTERNPT, este campo contendr un puntero a un DIB
empaquetado. Si al campo lbStyle se le asigna BS_PATTERN, este campo
contendr un manejador de un mapa de bits. Este manejador de mapa de bits no
puede ser un manejador de un DIB. Si al campo lbStyle se le asigna BS_SOLID o
BS_HOLLOW, este campo ser ignorado.
Vase adems
CreateDIBSection, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush,
DeleteObject, GetBrushOrgEx, SelectObject, SetBrushOrgEx
Ejemplo
Listado 3-3: Creando y usando una nueva brocha
procedure TForm1.Button1Click(Sender: TObject);
var
Region: HRGN;
// manejador de una regin
LogBrush: TLogBrush;
// almacena informacin de la brocha lgica
NewBrush: HBrush;
// manejador de la nueva brocha
begin
{Definir los atributos de la nueva brocha}
with LogBrush do
begin
lbStyle := BS_HATCHED;
lbColor := clBlue;
lbHatch := HS_CROSS;
end;
{Crear la brocha}
NewBrush := CreateBrushIndirect(LogBrush);
{Crea la regin a rellenar}
Region := CreateEllipticRgnIndirect(PaintBox1.BoundsRect);
{Rellenar la regin con la nueva brocha}
FillRgn(PaintBox1.Canvas.Handle, Region, NewBrush);
{Borrar la regin y la brocha}
DeleteObject(NewBrush);
Funciones de dibujo
93
DeleteObject(Region);
end;
Figura 3-7: El
nuevo patrn
de la brocha
BS_DIBPATTERNPT
BS_HATCHED
BS_HOLLOW
BS_PATTERN
BS_SOLID
Descripcin
Indica que el patrn de la brocha est definido mediante un
mapa de bits independiente del dispositivo. El campo lbHatch
contendr un manejador de DIB empaquetado que se utilizar
como patrn de la brocha. Bajo Windows 95/98, un patrn de
brocha DIB no puede ser superior en rea a ocho pxeles
cuadrados. Si se especifica un DIB ms grande como patrn,
slo se utilizar una porcin de ocho pxeles cuadrados.
Indica que el patrn de la brocha est definido mediante un
mapa de bits independiente del dispositivo. El campo lbHatch
contendr un manejador de DIB empaquetado que se utilizar
como patrn de la brocha. Bajo Windows 95/98, un patrn de
brocha DIB no puede ser superior en rea a ocho pxeles
cuadrados. Si se especifica un DIB ms grande como patrn,
slo se utilizar una porcin de ocho pxeles cuadrados.
Indica una brocha con trama.
Indica una brocha vaca.
Indica que el patrn de la brocha est definido mediante un
mapa de bits dependiente del dispositivo. El campo lbHatch
contendr un manejador del mapa de bits que ser usado como
patrn de la brocha. Bajo Windows 95/98, un patrn de brocha
no puede ser superior en rea a ocho pxeles cuadrados. Si se
especifica un mapa de bits ms grande como patrn, slo se
utilizar una porcin de ocho pxeles cuadrados.
Indica una brocha slida.
Descripcin
Trama compuesta por lneas a 45 grados hacia arriba, de
izquierda a derecha.
Trama compuesta por lneas cruzadas horizontales y verticales.
3
Captulo
Valor
BS_DIBPATTERN
94
Captulo 3
Valor
HS_DIAGCROSS
HS_FDIAGONAL
HS_HORIZONTAL
HS_VERTICAL
CreateHatchBrush
Descripcin
Equivalente a HS_CROSS, pero rotado 45 grados.
Trama compuesta por lneas a 45 grados hacia abajo, de
izquierda a derecha.
Trama compuesta por lneas horizontales.
Trama compuesta por lneas verticales.
Windows.Pas
Sintaxis
CreateHatchBrush(
p1: Integer;
p2: COLORREF
): HBRUSH;
{estilo de trama}
{indicador de color}
{devuelve un manejador de brocha}
Descripcin
Esta funcin crea una nueva brocha con el color y patrn de trama especificados. Los
patrones accesibles para esta funcin se ilustran en la figura 3-8. Si una brocha de
trama con el mismo patrn y color es utilizada para pintar el fondo de una ventana hija
y su ventana madre, podra ser necesario llamar a la funcin SetBrushOrgEx para
alinear el patrn de la brocha antes de pintar el fondo de la ventana hija. Cuando la
brocha deje de ser necesaria, deber ser eliminada llamando a la funcin DeleteObject.
HS_FDIAGONAL
HS_BDIAGONAL
HS_DIAGCROSS
HS_HORIZONTAL
Figura 3-8:
Patrones de
tramas
HS_CROSS
HS_VERTICAL
Parmetros
p1: Una opcin que especifica el patrn de trama de la brocha. A este parmetro se le
puede asignar un valor de la Tabla 3-4.
p2: Un indicador de color que indica el color de primer plano utilizado para dibujar las
lneas de la trama.
Funciones de dibujo
95
Vase adems
CreateBrushIndirect, CreatePatternBrush, CreateSolidBrush, DeleteObject,
GetBrushOrgEx, SelectObject, SetBrushOrgEx
Ejemplo
Listado 3-4: Creando una brocha sombreada
Figura 3-9: La
brocha de
sombreado
Descripcin
Trama compuesta por lneas a 45 grados hacia arriba, de
izquierda a derecha.
Trama compuesta por lneas cruzadas horizontales y verticales.
Equivalente a HS_CROSS, pero rotado 45 grados.
Trama compuesta por lneas a 45 grados hacia abajo, de
izquierda a derecha.
3
Captulo
96
Captulo 3
Valor
HS_HORIZONTAL
HS_VERTICAL
CreatePatternBrush
Descripcin
Trama compuesta por lneas horizontales.
Trama compuesta por lneas verticales.
Windows.Pas
Sintaxis
CreatePatternBrush(
Bitmap: HBITMAP
): HBRUSH;
Descripcin
Esta funcin crea una nueva brocha con el patrn del mapa de bits especificado. Si el
patrn de la brocha es un mapa de bits monocromo, los pxeles negros sern dibujados
utilizando el color de texto actual y los pxeles blancos sern dibujados utilizando el
color de fondo actual. Cuando la brocha deje de ser necesaria, deber ser eliminada
llamando a la funcin DeleteObject. Observe que al eliminar la brocha no se elimina el
mapa de bits que define el patrn de la brocha.
Parmetros
Bitmap: Especifica el manejador del mapa de bits que define el patrn de la brocha.
Este no puede ser un manejador de un DIB creado mediante una llamada a la funcin
CreateDIBSection. Bajo Windows 95/98, un patrn de una brocha de mapa de bits no
puede ser superior a ocho pxeles cuadrados. Si un mapa de bits ms grande es
especificado como patrn, slo ser utilizada una porcin de ocho pxeles cuadrados de
ese mapa de bits.
Vase adems
CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBSection,
CreateHatchBrush, DeleteObject, GetBrushOrgEx, LoadBitmap, SelectObject,
SetBrushOrgEx
Ejemplo
Listado 3-5: Usando un mapa de bits como patrn de una brocha
implementation
{$R *.DFM}
{$R BrushPatterns.Res}
Funciones de dibujo
97
Captulo
Figura 3-10:
El patrn de la
brocha
CreatePen
Windows.Pas
Sintaxis
CreatePen(
Style: Integer;
Width: Integer;
Color: COLORREF
): HPEN;
Descripcin
Esta funcin crea una nueva pluma con el estilo, ancho y color especificados. Cuando
la pluma deje de ser necesaria, deber ser eliminada mediante una llamada a la funcin
DeleteObject.
Parmetros
Style: Una opcin que indica el estilo de la pluma. A este parmetro se le puede asignar
un valor de la Tabla 3-5.
Width: Ancho de la pluma en unidades lgicas. Un ancho cero crear una pluma de un
pxel de ancho, independientemente de cualquier transformacin activa. Si a este
parmetro se le asigna un valor mayor que uno, al parmetro Style se le tiene que
asignar una de las opciones PS_NULL, PS_SOLID o PS_INSIDEFRAME. Si este
98
Captulo 3
Vase adems
CreatePenIndirect, DeleteObject, ExtCreatePen, GetObject, SelectObject
Ejemplo
Listado 3-6: Creando una nueva pluma
procedure TForm1.Button1Click(Sender: TObject);
var
Style: Integer;
// almacena los estilos de la pluma
PenHandle: HPen;
// manejador de la pluma
begin
{Borrar cualquier imagen anterior}
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(Rect(10, 10, 111, 111));
{Determinar el estilo de la pluma}
case RadioGroup1.ItemIndex of
0: Style := PS_SOLID;
1: Style := PS_DASH;
2: Style := PS_DOT;
3: Style := PS_DASHDOT;
4: Style := PS_DASHDOTDOT;
5: Style := PS_NULL;
6: Style := PS_INSIDEFRAME;
end;
{Crear la pluma}
PenHandle := CreatePen(Style, 1, 0);
{Indicar al rea de dibujo que utilice la nueva pluma}
Canvas.Pen.Handle := PenHandle;
{Dibujar un cuadrado con la pluma}
Canvas.MoveTo(10, 10);
Canvas.LineTo(110, 10);
Canvas.LineTo(110, 110);
Canvas.LineTo(10, 110);
Canvas.LineTo(10, 10);
{Eliminar la pluma}
DeleteObject(PenHandle);
end;
Funciones de dibujo
99
Figura 3-11:
La nueva
pluma
PS_DOT
PS_DASHDOT
PS_DASHDOTDOT
PS_NULL
PS_INSIDEFRAME
Descripcin
Especifica una pluma slida.
Especifica una pluma de lneas discontinuas. Esta opcin puede
ser usada slo cuando el ancho de la pluma es uno o menos.
Especifica una pluma de lnea de puntos. Esta opcin puede ser
usada solamente cuando el ancho de la pluma es uno o menos.
Especifica una pluma que alterna combinaciones de un guin y
un punto. Esta opcin puede ser usada solamente cuando el
ancho de la pluma es uno o menos.
Especifica una pluma que alterna combinaciones de un guin y
dos puntos. Esta opcin puede ser usada solamente cuando el
ancho de la pluma es uno o menos.
Especifica una pluma invisible.
Especifica una pluma slida. Cuando esta pluma es usada con
funciones de dibujo que requieren un rectngulo lmite, las
dimensiones de la figura son comprimidas, de manera que llenen
el rectngulo con respecto al ancho de la pluma.
CreatePenIndirect
Windows.Pas
Sintaxis
CreatePenIndirect(
const LogPen: TLogPen
): HPEN;
Descripcin
Esta funcin crea una nueva pluma con el estilo, ancho y color especificados en el
registro TLogPen, a la cual apunta el parmetro LogPen. Cuando la pluma deje de ser
necesaria, deber ser eliminada mediante una llamada a la funcin DeleteObject.
3
Captulo
Valor
PS_SOLID
PS_DASH
100
Captulo 3
Parmetros
LogPen: Puntero al registro TLogPen que define los atributos de la nueva pluma. El
registro TLogPen se define de la siguiente forma:
TLogPen = packed record
lopnStyle: UINT;
lopnWidth: TPoint;
lopnColor: COLORREF;
end;
{estilo de la pluma}
{ancho de la pluma}
{color de la pluma}
Vase adems
CreatePen, DeleteObject, ExtCreatePen, GetObject, SelectObject
Ejemplo
Listado 3-7: Creando una pluma indirectamente
procedure TForm1.Button1Click(Sender: TObject);
var
Pen: TLogPen;
// registro lgico para la pluma
PenHandle: HPen;
// manejador de una pluma
begin
{Borrar cualquier imagen previa}
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(Rect(10, 10, 111, 111));
{Inicializar el registro lgico de la pluma}
with Pen do begin
{Determinar el estilo de la pluma}
case RadioGroup1.ItemIndex of
0: lopnStyle := PS_SOLID;
1: lopnStyle := PS_DASH;
Funciones de dibujo
2: lopnStyle
3: lopnStyle
4: lopnStyle
5: lopnStyle
6: lopnStyle
end;
:=
:=
:=
:=
:=
101
PS_DOT;
PS_DASHDOT;
PS_DASHDOTDOT;
PS_NULL;
PS_INSIDEFRAME;
PS_DOT
PS_DASHDOT
PS_DASHDOTDOT
PS_NULL
PS_INSIDEFRAME
Descripcin
Especifica una pluma slida.
Especifica una pluma de lneas discontinuas. Esta opcin puede
ser usada solamente cuando el ancho de la pluma es uno o
menos.
Especifica una pluma de lnea de puntos. Esta opcin puede ser
usada solamente cuando el ancho de la pluma es uno o menos.
Especifica una pluma que alterna combinaciones de un guin y
un punto. Esta opcin puede ser usada solamente cuando el
ancho de la pluma es uno o menos.
Especifica una pluma que alterna combinaciones de un guin y
dos puntos. Esta opcin puede ser usada solamente cuando el
ancho de la pluma es uno o menos.
Especifica una pluma invisible.
Especifica una pluma slida. Cuando esta pluma es usada con
funciones de dibujo que requieren un rectngulo lmite, las
dimensiones de la figura son comprimidas, de manera que llenen
el rectngulo con respecto al ancho de la pluma.
3
Captulo
102
Captulo 3
CreateSolidBrush
Windows.Pas
Sintaxis
CreateSolidBrush(
p1: COLORREF
): HBRUSH;
{color de la brocha}
{devuelve un manejador de la nueva brocha}
Descripcin
Esta funcin crea una nueva brocha slida con el color especificado. Una vez que la
brocha deje de ser necesaria, deber ser eliminada mediante una llamada a la funcin
DeleteObject.
Parmetros
P1: Un especificador de color que indica el color de una brocha.
Vase adems
CreateHatchBrush, CreatePatternBrush, DeleteObject, SelectObject
Ejemplo
Listado 3-8: Creando una brocha slida
procedure TForm1.Button1Click(Sender: TObject);
var
NewBrush: HBrush;
// manejador de brocha
OldBrush: HBrush;
// manejador de la brocha original del contexto
FormDC: HDC;
// manejador del contexto de dispositivo del formulario
begin
{Crear la brocha}
NewBrush := CreateSolidBrush(clGreen);
{Obtener el contexto de dispositivo del formulario}
FormDC := GetDC(Form1.Handle);
{Obtener manejador de la brocha del contexto de dispositivo del formulario}
OldBrush := SelectObject(FormDC, NewBrush);
{Rellenar el rectngulo con la brocha}
FillRect(FormDC, Rect(10, 10, 170, 110), NewBrush);
{Limpiar la memoria}
SelectObject(FormDC, OldBrush);
DeleteObject(NewBrush);
end;
Funciones de dibujo
103
Figura 3-12:
La brocha
slida
DeleteObject
Windows.Pas
Sintaxis
{manejador de objeto del GDI}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin elimina una pluma, una brocha, una fuente, un mapa de bits, una regin, o
una paleta lgicas, liberando sus recursos asociados. El manejador del objeto es
invalidado cuando esta funcin retorna. Esta funcin fallar si se intenta eliminar un
objeto que est seleccionado dentro de algn contexto de dispositivo. Nota: Eliminar
una brocha de patrn de mapa de bits no afecta a su mapa de bits. El mapa de bits
asociado a la brocha deber ser eliminado independientemente.
Parmetros
P1: Especifica el manejador del objeto que ser eliminado.
Vase adems
GetObject, SelectObject
Ejemplo
Vea el Listado 3-3 bajo CreateBrushIndirect y otros ejemplos a lo largo del libro.
DrawCaption
Windows.Pas
Sintaxis
DrawCaption(
p1: HWND;
{manejador de ventana}
3
Captulo
DeleteObject(
p1: HGDIOBJ
): BOOL;
104
Captulo 3
p2: HDC;
const p3: TRect;
p4: UINT
): BOOL;
Descripcin
Esta funcin dibuja una barra de ttulo en el rea rectangular identificada por el
parmetro p3. La barra de ttulo recupera su texto y su icono desde la ventana
identificada por el parmetro p1.
Parmetros
p1: Manejador de la ventana que contiene el texto y el icono usados para dibujar la
barra de ttulo.
p2: Manejador de contexto de dispositivo sobre el cual se dibujar la barra de ttulo.
p3: Especifica las coordenadas del rectngulo dentro de las cuales se dibujar la barra
de ttulo.
p4: Especifica una combinacin de valores que definen opciones de dibujo. A este
parmetro se le puede asignar un valor de la Tabla 3-7.
Vase adems
DrawEdge, DrawFocusRect, DrawFrameControl, DrawState, SetWindowRgn
Ejemplo
Listado 3-9: Dibujando por programa una barra de ttulo
procedure TForm1.FormPaint(Sender: TObject);
begin
DrawCaption(Handle, Canvas.Handle, Rect(16, 40, 288, 60),
DC_ACTIVE or DC_ICON or DC_TEXT);
end;
Figura 3-13:
La barra de
ttulo
Funciones de dibujo
105
DrawEdge
Descripcin
La barra de ttulo es dibujada utilizando el color activo para
barras de ttulo.
El icono de la ventana es dibujado en la barra de ttulo.
La barra de ttulo es dibujada en estado hundido.
El texto de la barra de ttulo es dibujado usando la fuente
pequea para barras de ttulo activa.
El texto de la ventana es dibujado en la barra de ttulo.
Windows.Pas
Sintaxis
{contexto de dispositivo}
{coordenadas del rectngulo}
{opciones de tipo de bordes}
{opciones de tipo de bordes}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin dibuja una lnea o un rectngulo usando el efecto tridimensional de
borde especificado.
Parmetros
hdc: Especifica un manejador de un contexto de dispositivo sobre el cual se dibuja el
borde.
qrc: Un puntero a un registro TRect que contiene las coordenadas del rectngulo, en
unidades lgicas, que definen el borde.
edge: Una combinacin de opciones que indican el tipo de borde a dibujar. A este
parmetro se le tiene que asignar una combinacin de valores, uno tomado de la tabla
de opciones para el borde interior (Tabla 3-8) y otro de la tabla de opciones para el
borde exterior (Tabla 3-9). Tambin puede utilizarse un nico valor de la tabla de
opciones de combinacin de bordes (Tabla 3-10) en lugar de los valores combinados.
grfFlags: Una combinacin de opciones que indican el tipo de borde a dibujar. A este
parmetro se le puede asignar una combinacin de opciones de la Tabla 3-11.
3
Captulo
DrawEdge(
hdc: HDC;
var qrc: TRect;
edge: UINT;
grfFlags: UINT
): BOOL;
106
Captulo 3
Vase adems
MoveToEx, LineDDA, LineTo, Rectangle
Ejemplo
Listado 3-10: Dibujando bordes tridimensionales
type
TFlagsArray = array[0..18] of UINT;
const
{Inicializar el array de opciones de bordes}
BorderFlags: TFlagsArray = (BF_ADJUST, BF_BOTTOM, BF_BOTTOMLEFT,
BF_BOTTOMRIGHT, BF_DIAGONAL,
BF_DIAGONAL_ENDBOTTOMLEFT,
BF_DIAGONAL_ENDBOTTOMRIGHT,
BF_DIAGONAL_ENDTOPLEFT, BF_DIAGONAL_ENDTOPRIGHT,
BF_FLAT, BF_LEFT, BF_MIDDLE, BF_MONO, BF_RECT,
BF_RIGHT, BF_SOFT, BF_TOP, BF_TOPLEFT,
BF_TOPRIGHT);
procedure TForm1.Button1Click(Sender: TObject);
var
TheRect: TRect;
// define el rectngulo del borde
Edge, Border: UINT;
// almacena los valores de las opciones del borde
iCount: Integer;
// contador general para bucle
begin
{Definir el rectngulo para el borde}
TheRect := Rect(21, 200, 216, 300);
{Borrar el ltimo borde dibujado}
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(TheRect);
{Definir el tipo de borde}
case RadioGroup_Additional.ItemIndex of
0: Edge := EDGE_BUMP;
// Combinacin
1: Edge := EDGE_ETCHED; // Combinacin
2: Edge := EDGE_RAISED; // Combinacin
3: Edge := EDGE_SUNKEN; // Combinacin
end;
BDR_RAISEDOUTER
BDR_SUNKENOUTER
BDR_RAISEDOUTER
BDR_SUNKENOUTER
and
and
and
and
BDR_SUNKENINNER
BDR_RAISEDINNER
BDR_RAISEDINNER
BDR_SUNKENINNER
Funciones de dibujo
107
Tabla 3-8: Valores de opciones de bordes internos para el parmetro Flags de DrawEdge
Valor
BDR_RAISEDINNER
BDR_SUNKENINNER
Descripcin
Indica un borde interior realzado.
Indica un borde interior rehundido.
Tabla 3-9: Valores de opciones de bordes externos para el parmetro Flags de DrawEdge
Valor
BDR_RAISEDOUTER
BDR_SUNKENOUTER
Descripcin
Indica un borde exterior realzado.
Indica un borde exterior rehundido.
Descripcin
Combinacin de BDR_RAISEDOUTER y BDR_SUNKENINNER.
Combinacin de BDR_SUNKENOUTER y BDR_RAISEDINNER.
Combinacin de BDR_RAISEDOUTER y BDR_RAISEDINNER.
Combinacin de BDR_SUNKENOUTER y BDR_SUNKENINNER.
Descripcin
Las coordenadas del rectngulo son
decrementadas para tener en cuenta el ancho de
las lneas del borde.
Captulo
Figur 3-14: Un
rectngulo
grabado
108
Captulo 3
BF_BOTTOM
BF_BOTTOMLEFT
DrawFocusRect
Windows.Pas
Sintaxis
DrawFocusRect(
hDC: HDC;
const lprc: TRect
): BOOL;
{contexto de dispositivo}
{coordenadas del rectngulo}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin dibuja un rectngulo en un estilo que indica que tiene el foco. El
rectngulo es dibujado utilizando una operacin booleana xor. Debido a sto, si la
Funciones de dibujo
109
funcin es llamada por segunda vez con las mismas coordenadas, se borrar el
rectngulo.
Parmetros
hDC: Manejador de contexto de dispositivo sobre el cual se dibujar el rectngulo.
lprc: Especifica las coordenadas del rectngulo que define los bordes del rectngulo a
dibujar.
Vase adems
DrawCaption, DrawEdge, DrawFrameControl, FrameRect, Rectangle, RoundRect
Figura 3-15:
El rectngulo
que tiene el
foco
DrawFrameControl
Windows.Pas
Sintaxis
DrawFrameControl(
DC: HDC;
const Rect: TRect;
uType: UINT;
uState: UINT
3
Captulo
Ejemplo
110
Captulo 3
): BOOL;
Descripcin
Esta funcin dibuja varios botones definidos por el sistema, con el estilo y estado
especificados.
Parmetros
DC: Manejador del contexto del dispositivo sobre el que se dibujar el control.
Rect: Especifica las coordenadas del rectngulo que definen el tamao del control.
uType: Una combinacin de opciones que indican el tipo de control que ser dibujado.
A este parmetro se le puede asignar un valor de la Tabla 3-12.
uState: Una combinacin de opciones que indican el estado del control que ser
dibujado. A este parmetro se le puede asignar un valor de las Tablas 3-13 a 3-16
dependiendo del valor del parmetro uType. Se cuenta con una tabla separada para cada
posible valor del parmetro uType. Tambin se puede tomar un valor apropiado para
uType y combinarlo con uno o ms valores de la tabla de opciones de estado generales
(Tabla 3-17).
Vase adems
DrawCaption, DrawEdge, DrawFocusRect, DrawState
Ejemplo
Listado 3-12: Dibujando varios controles de marco.
procedure TForm1.Button1Click(Sender: TObject);
var
TheRect: TRect;
// el rectngulo lmite para la imagen de control
TheType: UINT;
// almacena el tipo de control
TheState: UINT;
// almacena el estado del control
begin
{Inicializar las opciones de tipo y de estado}
TheType := 0;
TheState := 0;
{Definir el rectngulo lmite}
TheRect := Rect(10, 10, 50, 50);
{Elegir el tipo de control}
case RadioGroup_ButtonType.ItemIndex of
0:
begin
{Indicar que estamos dibujando un botn}
TheType := DFC_BUTTON;
Funciones de dibujo
111
3
Captulo
112
Captulo 3
Figura 3-16:
El programa
de ejemplo
Frame
Control
Descripcin
Dibuja un botn estndar.
Dibuja un botn de barra de ttulo.
Dibuja imgenes utilizadas en mens.
Dibuja un botn de barra de desplazamiento.
Funciones de dibujo
113
Descripcin
Dibuja un botn de tres estados.
Dibuja una casilla de verificacin.
Dibuja un botn de pulsacin corriente.
Dibuja un botn de radio.
Dibuja la mscara xor del botn de radio.
Dibuja la mscara and del botn de radio.
Descripcin
Dibuja una flecha de submen.
Dibuja una vieta.
Dibuja un marca de verificacin.
Descripcin
Dibuja un botn de men desplegable de una caja de
seleccin mltiple.
Dibuja un botn hacia abajo de una barra de
desplazamiento.
Dibuja un botn hacia la izquierda de una barra de
desplazamiento.
Dibuja un botn hacia la derecha de una barra de
desplazamiento.
Dibuja una doble flecha de redimensionamiento.
Dibuja un botn hacia arriba de una barra de
desplazamiento.
3
Captulo
Valor
DFCS_CAPTIONCLOSE
DFCS_CAPTIONHELP
DFCS_CAPTIONMAX
DFCS_CAPTIONMIN
DFCS_CAPTIONRESTORE
114
Captulo 3
Descripcin
El rectngulo especificado es reducido para excluir el
borde alrededor del control.
Indica que el botn est pulsado o marcado.
Dibuja el botn con un borde plano.
Dibuja el botn como inactivo.
Dibuja el botn con un borde monocromo.
Indica que el botn est pulsado.
DFCS_CHECKED
DFCS_FLAT
DFCS_INACTIVE
DFCS_MONO
DFCS_PUSHED
DrawState
Windows.Pas
Sintaxis
DrawState(
DC: HDC;
p2: HBRUSH;
p3: TFNDrawStateProc;
p4: LPARAM;
p5: WPARAM;
p6: Integer;
p7: Integer;
p8: Integer;
p9: Integer;
p10: UINT
): BOOL;
Descripcin
Esta funcin muestra un icono, un mapa de bits o una cadena de texto, aplicando un
efecto visual para indicar su estado. Se pueden aplicar varios efectos de estado
utilizando las opciones vlidas para el parmetro p10, o se puede llamar a una funcin
de respuesta definida por la aplicacin para dibujar efectos de estado complejos
definidos por la aplicacin.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual la imagen es dibujada.
p2: Especifica un manejador de brocha. Esta brocha ser utilizada si el parmetro p10
contiene la opcin DSS_MONO. Si el parmetro p10 no contiene esa opcin, este
parmetro es ignorado.
p3: Especifica un puntero a una funcin de respuesta definida por la aplicacin. Esta
funcin es llamada para dibujar la imagen en un estado especfico cuando el parmetro
Funciones de dibujo
115
Descripcin
Esta funcin de respuesta es utilizada cuando el parmetro p10 contiene la opcin
DST_COMPLEX. Su propsito es proporcionar una imagen compleja de la manera
deseada. Esta funcin de repuesta puede ejecutar cualquier accin deseada.
3
Captulo
116
Captulo 3
Parmetros
hDC: Manejador del contexto del dispositivo sobre el cual ser dibujada la imagen.
lData: Proporciona datos especficos de la aplicacin, que han sido pasados a la
funcin DrawState en el parmetro p4.
wData: Proporciona datos especficos de la aplicacin, que han sido pasados a la
funcin DrawState en el parmetro p5.
cx: Especifica el ancho de la imagen, en unidades de dispositivo, que han sido pasados
a la funcin DrawState en el parmetro p8.
cy: Especifica la altura de la imagen, en unidades de dispositivo, que han sido pasados
a la funcin DrawState en el parmetro p9.
Vase adems
DrawFocusRect, DrawText, TextOut, SetTextColor
Ejemplo
Listado 3-13: Dibujando imgenes en estado deshabilitado
procedure TForm1.FormPaint(Sender: TObject);
var
Text: PChar;
// almacena una cadena de texto
begin
{Inicializar la cadena de texto}
Text := 'A DISABLED ICON';
{Dibujar el texto en la pantalla en estado deshabilitado}
DrawState(Canvas.Handle, 0, nil, Integer(Text), 0, 20, 20, 0, 0,
DST_TEXT or DSS_DISABLED);
{Dibujar el icono de la aplicacin en estado deshabilitado}
DrawState(Canvas.Handle, 0, nil, Application.Icon.Handle, 0, 50, 50, 0, 0,
DST_ICON or DSS_DISABLED);
end;
Figura 3-17:
Las imgenes
deshabilitadas
Funciones de dibujo
117
DST_COMPLEX
DST_ICON
DST_PREFIXTEXT
DST_TEXT
Descripcin
Indica una imagen de mapa de bits. La palabra menos
significativa del parmetro p4 contiene el manejador del mapa
de bits.
Indica una imagen compleja definida por la aplicacin. La
funcin de respuesta, identificada por el parmetro p3, es
llamada para producir la imagen.
Indica una imagen de un icono. La palabra menos significativa
del parmetro p4 contiene el manejador del icono.
Indica que la imagen es texto y que puede contener un
smbolo acelerador. Cualquier carcter ampersand (&) es
convertido en un guin bajo en el siguiente carcter. El
parmetro p4 contiene un puntero a la cadena y el parmetro
p5 contiene la longitud de la cadena.
Indica que la imagen es texto. El parmetro p4 contiene un
puntero a la cadena y el parmetro p5 la longitud de la
cadena.
Tabla 3-19: Valores del estado de la imagen para el parmetro p10 de DrawState
Valor
DSS_NORMAL
DSS_UNION
DSS_DISABLED
DSS_MONO
Ellipse
Descripcin
Dibuja la imagen en su forma original.
Dibuja la imagen en forma difuminada.
Dibuja la imagen en forma de relieve.
Dibuja la imagen utilizando la brocha especificada en el
parmetro p2.
Windows.Pas
Sintaxis
Ellipse(
DC: HDC;
X1: Integer;
Y1: Integer;
X2: Integer;
Y2: Integer
): BOOL;
Descripcin
Esta funcin dibuja una elipse dentro del rectngulo lmite definido por los parmetros
X1, Y1, X2 e Y2. El centro del rectngulo lmite define el centro de la elipse. La elipse
3
Captulo
Valor
DST_BITMAP
118
Captulo 3
es rellenada con la brocha actual y dibujada con la pluma actual. La posicin actual no
es utilizada ni actualizada por esta funcin.
X sup. izq.
Y sup. izq.
Y inf. der.
Figura 3-18:
Coordenadas
de la elipse
Rectngulo lmite
X inf. der.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual ser dibujada la elipse.
X1: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo
lmite que define la forma de la elipse. Bajo Windows 95/98, la suma de los parmetros
X1 y X2 tiene que ser menor que 32.767.
Y1: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo
lmite que define la forma de la elipse. Bajo Windows 95/98, la suma de los parmetros
Y1 e Y2 tiene que ser menor que 32.767.
X2: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo
lmite que define la forma de la elipse.
Y2: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo
lmite que define la forma de la elipse.
Vase adems
Arc, Chord, CreateEllipticRgn, CreateEllipticRgnIndirect
Ejemplo
Listado 3-14: Dibujando elipses
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Asignar a la brocha del rea de dibujo un color aleatorio}
Canvas.Brush.Color := $01000000 or Random(10);
Funciones de dibujo
119
Figura 3-19:
Elipses
aleatorias
EndPaint
Captulo
3
Windows.Pas
Sintaxis
EndPaint(
hWnd: HWND;
const lpPaint: TPaintStruct
): BOOL;
{manejador de ventana}
{puntero a un registro TPaintStruct}
{esta funcin siempre devuelve TRUE}
Descripcin
Esta funcin es usada conjuntamente con la funcin BeginPaint para marcar el fin de
la operacin de pintado de la ventana especificada. Cualquier cursor de edicin
ocultado por la funcin BeginPaint ser restaurado.
Parmetros
hWnd: Especifica el manejador de la ventana a redibujar.
lpPaint: Especifica un puntero a un registro TPaintStruct que contiene informacin
sobre el redibujado. El registro TPaintStruct se define de la siguiente forma:
TPaintStruct = packed record
hdc: HDC;
fErase: BOOL;
rcPaint: TRect;
fRestore: BOOL;
fIncUpdate: BOOL;
120
Captulo 3
{reservado}
end;
Consulte la funcin BeginPaint para ver una descripcin de esta estructura de datos.
Vase adems
BeginPaint
Ejemplo
Vea el Listado 3-29 bajo InvalidateRect y el Listado 3-30 bajo InvalidateRgn.
EnumObjects
Windows.Pas
Sintaxis
EnumObjects(
DC: HDC;
p2: Integer;
p3: TFNGObjEnumProc;
p4: LPARAM
): Integer;
Descripcin
Esta funcin enumera todas la plumas o brochas accesibles en el contexto de
dispositivo especificado. La informacin relativa a cada brocha o pluma es pasada a la
funcin de respuesta definida por la aplicacin a la que apunta el parmetro p3. Este
proceso contina hasta que todos los objetos hayan sido enumerados o la funcin de
respuesta devuelva cero.
Parmetros
DC: Manejador de contexto de dispositivo que contiene los objetos que sern
enumerados.
p2: Opcin que indica el tipo de objetos que se desea enumerar. Si al parmetro se le
asigna OBJ_BRUSH, todas las brochas sern enumeradas. Si se le asigna OBJ_PEN,
sern enumeradas todas las plumas.
p3: Puntero a la funcin de respuesta definida por la aplicacin.
p4: Especifica un valor de 32 bits definido por la aplicacin que es pasado a la funcin
de respuesta.
Funciones de dibujo
121
Descripcin
Esta funcin es llamada una vez para cada objeto del tipo especificado asociado al
contexto de dispositivo. En ella se puede ejecutar cualquier accin deseada.
Vase adems
GetObject, GetObjectType
Ejemplo
Listado 3-15: Enumerando todas las plumas en un contexto de dispositivo
{El prototipo de la funcin de respuesta}
function EnumObjProc(ObjType: PLogPen; lData: lParam): Integer; stdcall;
var
Form1: TForm1;
implementation
{$R *.DFM}
function EnumObjProc(ObjType: PLogPen; lData: lParam): Integer;
var
LocalObjType: TLogPen;
// almacena informacin de la pluma lgica
3
Captulo
Parmetros
122
Captulo 3
PenDescription: String;
// almacena una descripcin de una pluma
begin
{Obtener la informacin de la pluma}
LocalObjType := ObjType^;
{Determinar el tipo de pluma}
case LocalObjType.lopnStyle of
PS_SOLID:
PenDescription
PS_DASH:
PenDescription
PS_DOT:
PenDescription
PS_DASHDOT:
PenDescription
PS_DASHDOTDOT: PenDescription
PS_NULL:
PenDescription
PS_INSIDEFRAME: PenDescription
end;
:=
:=
:=
:=
:=
:=
:=
'PS_SOLID';
'PS_DASH';
'PS_DOT';
'PS_DASHDOT';
'PS_DASHDOTDOT';
'PS_NULL';
'PS_INSIDEFRAME';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
Color:
clBlack';
clMaroon';
clGreen';
clOlive';
clNavy';
clPurple';
clTeal';
clGray';
clSilver';
clRed';
clLime';
clYellow';
clBlue';
clFuchsia';
clAqua';
clWhite';
Funciones de dibujo
123
Figura 3-20:
Listando todas
las plumas en
el contexto de
dispositivo
ExtCreatePen
Windows.Pas
Sintaxis
{tipo, estilo, terminacin y opcin de unin de la pluma}
{ancho de la pluma}
{puntero a registro TLogBrush}
{cantidad de entradas en el array de entradas a la medida}
{puntero a array de longitudes de guiones y espacios}
{devuelve un manejador de pluma}
Descripcin
Esta funcin crea una nueva pluma geomtrica o cosmtica con los atributos
especificados. Las plumas geomtricas pueden ser de cualquier ancho y tienen los
mismos atributos que las brochas. Las plumas cosmticas tienen que ser siempre de un
pxel de ancho, pero se dibujan ms rpidamente que las geomtricas. Adicionalmente,
bajo Windows NT, esta funcin permite crear una pluma con un patrn definido por el
usuario. Cuando la aplicacin deje de necesitar la pluma, sta deber ser eliminada
llamando a la funcin DeleteObject.
Parmetros
PenStyle: Una combinacin de opciones que definen el tipo, estilo, terminacin y
unin de la pluma. Este parmetro puede contener una combinacin de valores, donde
un valor es tomado de la Tabla 3-20 y otro de la Tabla 3-21. Si este parmetro contiene
la opcin de estilo PS_GEOMETRIC, puede contener una combinacin adicional, con
un valor tomado de la Tabla 3-22 y otro de la Tabla 3-23. Ntese que bajo Windows
95/98, los estilos del extremo y unin son soportados slo para plumas geomtricas
cuando stas son utilizadas para dibujar una ruta.
Width: Especifica el ancho de la pluma, en unidades lgicas. Si el parmetro PenStyle
contiene la opcin PS_COSMETIC, a este parmetro se le debe asignar uno (1).
Brush: Un puntero al registro TLogBrush que define los atributos adicionales de la
pluma. Si el parmetro PenStyle contiene la opcin PS_COSMETIC, el campo lbColor
de este registro especifica el color de la pluma y al campo lbStyle hay que asignarle
3
Captulo
ExtCreatePen(
PenStyle: DWORD;
Width: DWORD;
const Brush: TLogBrush;
StyleCount: DWORD;
Style: Pointer
): HPEN;
124
Captulo 3
Observe que si el campo lbHatch apunta a un mapa de bits, este mapa de bits no puede
haber sido creado con la funcin CreateDIBSection. Consulte la funcin
CreateBrushIndirect para ver una descripcin de esta estructura de datos.
StyleCount: Especifica la cantidad de entradas en el array de estilos de pluma definidos
por el usuario al que apunta el parmetro Style. Si el parmetro PenStyle no contiene la
opcin PS_USERSTYLE, este parmetro es ignorado.
Style: Un puntero a un array de valores que definen el patrn de los guiones y espacios
para un estilo de pluma definido por el usuario. La primera entrada en el array
especifica la longitud del primer guin, en unidades lgicas. La segunda entrada
especifica la longitud del primer espacio, en unidades lgicas. Esto contina hasta que
el patrn est completamente definido. El patrn se repetir tantas veces como sea
necesario cuando se dibuje una lnea utilizando la pluma. Si el parmetro PenStyle no
contiene la opcin PS_USERSTYLE, este parmetro es ignorado.
Vase adems
CreateBrushIndirect, CreatePen, CreatePenIndirect, DeleteObject, GetObject,
SelectObject, SetMiterLimit
Ejemplo
Listado 3-16: Dibujando rutas con plumas geomtricas
procedure TForm1.Button1Click(Sender: TObject);
var
NewPen, OldPen: HPen;
// las plumas vieja y nueva
FormDC: HDC;
// manejador del contexto de dispositivo del formulario
BrushInfo: TLogBrush;
// el registro lgico de la brocha
MiterLimit: Single;
// el lmite del inglete
begin
{Obtener el contexto de dispositivo del formulario}
FormDC := GetDC(Form1.Handle);
{Definir la brocha}
with BrushInfo do begin
Funciones de dibujo
125
lbStyle := BS_SOLID;
lbColor := clBlue;
lbHatch := 0;
end;
{Crear pluma geomtrica con terminacin cuadrada y uniones en forma de inglete,
de 20 unidades de ancho}
NewPen := ExtCreatePen(PS_GEOMETRIC or PS_ENDCAP_SQUARE or PS_JOIN_MITER, 20,
BrushInfo, 0, nil);
{Seleccionar la pluma dentro del contexto de dispositivo del formulario}
OldPen := SelectObject(FormDC, NewPen);
{Comenzar definicin de la ruta}
BeginPath(FormDC);
Figura 3-21:
La pluma
geomtrica en
accin
3
Captulo
126
Captulo 3
Descripcin
Indica una pluma geomtrica.
Indica una pluma cosmtica.
PS_DASHDOTDOT
PS_NULL
PS_USERSTYLE
PS_INSIDEFRAME
Descripcin
Slo Windows NT: Asigna todos los dems pxeles cuando
se dibuja una lnea (slo para plumas cosmticas).
Crea una pluma slida.
Crea una pluma de guiones. Slo Windows 95/98: Este
estilo no est soportado para plumas geomtricas.
Crea una pluma de puntos. Slo Windows 95/98: Este
estilo no est soportado para plumas geomtricas
Crea una pluma que alterna guiones y puntos. Slo
Windows 95/98: Este estilo no est soportado para
plumas geomtricas.
Crea una pluma que alterna un guin y dos puntos. Slo
Windows 95/98: Este estilo no est soportado para
plumas geomtricas.
Crea una pluma invisible.
Slo Windows NT: Crea una pluma de estilo definido por
el usuario. El parmetro Style apunta a un array de valores
DWORD que especifica los guiones y espacios de la
pluma.
Crea una pluma slida. Cuando esta pluma es usada con
una funcin que especifica un rectngulo lmite, las
dimensiones de la figura son reducidas de manera que
toda la figura, cuando sea dibujada, quepa dentro del
rectngulo lmite (slo para plumas geomtricas).
Tabla 3-22: Estilos de punto final en el parmetro PenStyle de ExtCreatePen (slo para
plumas geomtricas)
Valor
PS_ENDCAP_ROUND
PS_ENDCAP_SQUARE
PS_ENDCAP_FLAT
Descripcin
Los extremos de las lneas son redondeados.
Los extremos de las lneas son cuadrados.
Los extremos de las lneas son planos.
Tabla 3-23: Estilos de unin de lneas en el parmetro PenStyle de ExtCreatePen (slo para
plumas geomtricas)
Valor
PS_JOIN_BEVEL
Descripcin
Las uniones de lnea son biseladas.
Funciones de dibujo
Valor
PS_JOIN_MITER
PS_JOIN_ROUND
ExtFloodFill
127
Descripcin
Las uniones de lnea tienen estilo de inglete cuando estn
dentro de los lmites actuales asignados por la funcin
SetMiterLimit. Si exceden esos lmites, la unin es
biselada.
Las uniones de lneas son redondeadas.
Windows.Pas
Sintaxis
{manejador del contexto de dispositivo}
{coordenada horizontal del origen del relleno}
{coordenada vertical del origen del relleno}
{color de relleno}
{opcin de tipo de relleno}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin rellena un rea del contexto de dispositivo especificado con la brocha
actual.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el relleno se dibujar.
X: Especifica la coordenada horizontal, en unidades lgicas, del origen del relleno.
Y: Especifica la coordenada vertical, en unidades lgicas, del origen del relleno.
Color: Un especificador de color que indica el color que delimita el borde del rea que
ser rellenada. El significado de este parmetro depende del valor del parmetro
FillType.
FillType: Una opcin que indica el tipo de relleno a ejecutar. A este parmetro se le
puede asignar un valor de la Tabla 3-24.
Vase adems
FillPath, FillRect, FillRgn, GetDeviceCaps
3
Captulo
ExtFloodFill(
DC: HDC;
X: Integer;
Y: Integer;
Color: COLORREF;
FillType: UINT
): BOOL;
128
Captulo 3
Ejemplo
Listado 3-17: Rellenando un rea
procedure TForm1.Button1Click(Sender: TObject);
begin
{Asignar el color de la brocha usada para el flujo de relleno}
Canvas.Brush.Color := clLime;
{Rellenar el cuadrado rojo con el nuevo color de la brocha}
ExtFloodFill(Canvas.Handle, 20, 20, clRed, FLOODFILLSURFACE);
end;
FLOODFILLSURFACE
FillPath
Descripcin
Indica que el rea que ser rellenada est rodeada por
pxeles del color especificado en el parmetro Color. La
funcin rellena pxeles en todas direcciones a partir del
origen con el color de la brocha hasta que el color
especificado por el parmetro Color es encontrado.
Indica que el rea que ser rellenada est definida por un
color slido. La funcin rellena pxeles en todas direcciones
a partir del origen con el color de la brocha mientras el
color especificado por el parmetro Color es encontrado.
Windows.Pas
Sintaxis
FillPath(
DC: HDC
): BOOL;
Descripcin
Esta funcin cierra cualquier ruta abierta en el contexto de dispositivo especificado y
rellena su interior con la brocha actual. La ruta es rellenada de acuerdo al modo de
relleno de polgono actual. Observe que cuando esta funcin retorne, la ruta habr sido
descartada del contexto de dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo que contiene la ruta vlida que ser
rellenada.
Funciones de dibujo
129
Vase adems
BeginPath, ExtFloodFill, FillRgn, SetPolyFillMode, StrokeAndFillPath, StrokePath
Ejemplo
Listado 3-18: Rellenando el interior de una ruta
procedure TForm1.FormPaint(Sender: TObject);
begin
{Iniciar definicin de ruta}
BeginPath(Canvas.Handle);
Figura 3-22:
La ruta
rellenada
FillRect
Windows.Pas
Sintaxis
FillRect(
hDC: HDC;
const lprc: TRect;
hbr: HBRUSH
): Integer;
3
Captulo
130
Captulo 3
Descripcin
Esta funcin rellena el rea del rectngulo especificado en el contexto de dispositivo,
utilizando la brocha indicada. Los bordes superior e izquierdo del rectngulo son
incluidos en el relleno, pero los bordes inferior y derecho son excluidos.
Parmetros
hDC: Manejador del contexto de dispositivo sobre el cual se dibujar el rectngulo
rellenado.
lprc: Un puntero al registro TRect que define las coordenadas del rectngulo, en
unidades lgicas, del rea que ser rellenada.
hbr: Especifica el manejador de la brocha que ser usada para rellenar el rectngulo.
Opcionalmente, puede utilizarse un color del sistema para rellenar el rectngulo,
asignndole a este parmetro un valor de la Tabla 3-25. Observe que cuando se utilice
un color del sistema, deber aadirse uno (1) al valor (por ejemplo,
COLOR_ACTIVEBORDER + 1).
Vase adems
CreateHatchBrush, CreatePatternBrush, CreateSolidBrush, GetStockObject,
ExtFloodFill, FrameRect, FillPath, FillRgn
Ejemplo
Vea el Listado 3-5 bajo CreatePatternBrush.
Tabla 3-25: Valores de color para el parmetro hbr de FillRect
Valor
COLOR_3DDKSHADOW
COLOR_3DLIGHT
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNHIGHLIGHT
COLOR_BTNSHADOW
Descripcin
El color de sombra oscura para elementos de
visualizacin tridimensionales.
El color de borde iluminado para elementos de
visualizacin tridimensionales.
El color del borde de las ventanas activas.
El color de las barras de ttulo de la ventana activa.
El color de fondo usado en aplicaciones que siguen
la Interfaz de Documentos Mltiples (MDI).
El color del escritorio.
El color de la superficie de los botones.
El color de un botn resaltado.
El color del borde oscuro de los botones.
Funciones de dibujo
131
Valor
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
FillRgn
Windows.Pas
Sintaxis
FillRgn(
DC: HDC;
p2: HRGN;
p3: HBRUSH
): BOOL;
Descripcin
Esta funcin rellena la regin especificada con la brocha identificada por el parmetro
p3.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual se dibujar la regin rellenada.
3
Captulo
Descripcin
El color del texto de los botones.
El color del texto usado en las barras de ttulo, cajas
de redimensionamiento y controles de flechas de las
barras de desplazamiento.
COLOR_GRAYTEXT
El color de un texto deshabilitado. Este valor ser
cero si el manipulador del dispositivo de
visualizacin no soporta gris slido.
COLOR_HIGHLIGHT
El color usado para los elementos seleccionados en
un control.
COLOR_HIGHLIGHTTEXT
El color usado para el texto de los elementos
seleccionados en un control.
COLOR_INACTIVEBORDER
El color del borde de las ventanas inactivas.
COLOR_INACTIVECAPTION
El color de la barra de ttulo de las ventanas
inactivas.
COLOR_INACTIVECAPTIONTEXT El color del texto de una barra de ttulo inactiva.
COLOR_INFOBK
El color del fondo para las indicaciones.
COLOR_INFOTEXT
El color del texto para las indicaciones.
COLOR_MENU
El color del fondo de los mens.
COLOR_MENUTEXT
El color del texto de los mens.
COLOR_SCROLLBAR
El color del rea gris de las barras de
desplazamiento.
COLOR_WINDOW
El color de fondo de las ventanas.
COLOR_WINDOWFRAME
El color del marco de las ventanas.
COLOR_WINDOWTEXT
El color del texto usado en las ventanas.
132
Captulo 3
Vase adems
CreateBrushIndirect, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush,
FrameRgn, FillPath, FillRect, PaintRgn
Ejemplo
Vea el listado 3-3 bajo CreateBrushIndirect.
FrameRect
Windows.Pas
Sintaxis
FrameRect(
hDC: HDC;
const lprc: TRect;
hbr: HBRUSH
): Integer;
Descripcin
Esta funcin dibuja un borde alrededor del rectngulo indicado en el contexto de
dispositivo especificado, utilizando la brocha identificada mediante el parmetro hbr.
Este borde siempre tiene el ancho de una unidad lgica.
Parmetros
hDC: Manejador del contexto de dispositivo sobre el cual el marco rectangular ser
dibujado.
lprc: Puntero al registro TRect que contiene las coordenadas del rectngulo que define
el recuadro.
hbr: El manejador de la brocha utilizada para dibujar el recuadro rectangular.
Vase adems
CreateHatchBrush, CreatePatternBrush, CreateSolidBrush, FillRect, FrameRgn,
GetStockObject, Rectangle
Funciones de dibujo
133
Ejemplo
Listado 3-19: Dibujando un marco rectangular
procedure TForm1.Button1Click(Sender: TObject);
var
TheRect: TRect;
// las coordenadas del rectngulo
begin
{Definir el rectngulo}
TheRect := Rect(10, 10, 110, 110);
{Inicializar la brocha}
Canvas.Brush.Color := clRed;
Canvas.Brush.Style := bsCross;
{Enmarcar el rectngulo}
FrameRect(Canvas.Handle, TheRect, Canvas.Brush.Handle);
end;
Captulo
3
Figura 3-23:
El rectngulo
enmarcado
FrameRgn
Windows.Pas
Sintaxis
FrameRgn(
DC: HDC;
p2: HRGN;
p3: HBRUSH;
p4: Integer;
p5: Integer
): BOOL;
Descripcin
Esta funcin dibuja el permetro de la regin especificada, utilizando la brocha
identificada por el parmetro p3.
Parmetros
DC: Manejador para un contexto de dispositivo sobre el cual la regin enmarcada es
dibujada.
p2: Manejador de la regin cuyo permetro est siendo dibujado.
134
Captulo 3
Vase adems
CreateHatchBrush, CreatePatternBrush, CreateSolidBrush, FrameRect, FillRgn,
PaintRgn
Ejemplo
Listado 3-20: Enmarcando una regin
procedure TForm1.Button1Click(Sender: TObject);
var
RegionHandle: HRGN;
// manejador de la regin
PointsArray: array[0..5] of TPoint; // puntos que definen la regin
begin
{Definir y crear la regin poligonal}
PointsArray[0].x := 50;
PointsArray[0].y := 50;
PointsArray[1].x := 100; PointsArray[1].y := 50;
PointsArray[2].x := 125; PointsArray[2].y := 75;
PointsArray[3].x := 100; PointsArray[3].y := 100;
PointsArray[4].x := 50;
PointsArray[4].y := 100;
PointsArray[5].x := 25;
PointsArray[5].y := 75;
{Crear la regin}
RegionHandle := CreatePolygonRgn(PointsArray, 6, ALTERNATE);
{Enmarcar la regin en negro}
Canvas.Brush.Color := clBlack;
FrameRgn(Canvas.Handle, RegionHandle, Canvas.Brush.Handle, 2, 2);
end;
Figura 3-24:
La regin
dentro del
marco
Funciones de dibujo
GetBkColor
135
Windows.Pas
Sintaxis
GetBkColor(
hDC: HDC
): COLORREF;
Descripcin
Esta funcin recupera el color de fondo del contexto de dispositivo especificado.
Parmetros
hDC: Manejador del contexto de dispositivo cuyo color de fondo ser recuperado.
Vase adems
GetBkMode, SetBkColor
Ejemplo
Listado 3-21: Dibujando texto con y sin color de fondo
procedure TForm1.Button1Click(Sender: TObject);
begin
{Si el color de fondo no es rojo, hacerlo rojo}
if GetBkColor(Canvas.Handle) <> clRed then
SetBkColor(Canvas.Handle, clRed);
{Mostrar algn texto; el color de fondo ser usado}
Canvas.TextOut(20, 20, 'Text with a background color');
{Si el modo del fondo no es transparente, hacerlo transparente}
if GetBkMode(Canvas.Handle) <> TRANSPARENT then
SetBkMode(Canvas.Handle, TRANSPARENT);
{Dibujar algn texto; el color de fondo no ser usado}
Canvas.TextOut(20, 40, 'Text drawn with a transparent background');
end;
Figura 3-25:
Texto con y sin
color de fondo
3
Captulo
136
Captulo 3
GetBkMode
Windows.Pas
Sintaxis
GetBkMode(
hDC: HDC
): Integer;
Descripcin
Esta funcin recupera el modo de mezcla actual del fondo para el contexto de
dispositivo especificado.
Parmetros
hDC: Manejador del contexto de dispositivo cuyo modo de mezcla actual del fondo
ser recuperado.
Vase adems
GetBkColor, SetBkMode
Ejemplo
Vea el Listado 3-21 bajo GetBkColor.
GetBoundsRect
Windows.Pas
Sintaxis
GetBoundsRect(
DC: HDC;
var p2: TRect;
p3: UINT
): UINT;
Descripcin
Esta funcin recupera el rectngulo lmite actual para el contexto de dispositivo
especificado. Windows mantiene un rectngulo lmite acumulativo para cada contexto
de dispositivo, el cual identifica las dimensiones de la salida producida por las
funciones de dibujo. Cuando una funcin de dibujo sobrepasa estas fronteras, el
rectngulo lmite es extendido. De esta manera, el rectngulo lmite es el rectngulo
Funciones de dibujo
137
ms pequeo que puede ser trazado alrededor del rea afectada por las operaciones de
dibujo efectuadas sobre el contexto de dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo cuyo rectngulo lmite acumulativo ser
recuperado.
p2: Puntero a un registro TRect que recibe las coordenadas del rectngulo lmite del
contexto de dispositivo.
p3: Opcin que indica si el rectngulo lmite ser borrado. Si a este parmetro se le
asigna cero, el rectngulo lmite no ser modificado. Si se le asigna DCB_RESET, el
rectngulo lmite es borrado.
Vase adems
GetUpdateRect, SetBoundsRect
Ejemplo
Listado 3-22: Asignando y recuperando el rectngulo lmite del contexto de dispositivo
procedure TForm1.Button1Click(Sender: TObject);
var
TheRect: TRect;
// recibe el rectngulo lmite
FormDC: HDC;
// manejador del contexto de dispositivo del formulario
BoundRectState: UINT;
// almacena el estado del rectngulo lmite
begin
{Obtener el contexto de dispositivo del formulario}
FormDC := GetDC(Form1.Handle);
{Inicializar y asignar el rectngulo lmite}
TheRect := Rect(10, 10, 110, 110);
SetBoundsRect(FormDC, @TheRect, DCB_ENABLE);
{Recuperar el rectngulo lmite}
BoundRectState := GetBoundsRect(FormDC, TheRect, 0);
{Liberar el contexto de dispositivo}
ReleaseDC(Form1.Handle, FormDC);
{Mostrar las coordenadas del rectngulo lmite}
with TheRect do
begin
Label1.Caption := 'Top: ' + IntToStr(Top) + ' Left: ' + IntToStr(Left) +
' Bottom: ' + IntToStr(Bottom) + ' Right: ' + IntToStr(Right);
end;
3
Captulo
Esta funcin devuelve un cdigo que indica el estado del rectngulo lmite; ser una
combinacin de uno o ms valores de la Tabla 3-26. En caso de fallo, la funcin
devuelve una condicin de error.
138
Captulo 3
lmite}
'State:
'State:
'State:
'State:
DCB_DISABLE';
DCB_ENABLE';
DCB_RESET';
DCB_SET';
Figura 3-26:
El rectngulo
lmite actual
GetBrushOrgEx
Descripcin
Indica que ha ocurrido un error.
La acumulacin de lmite est desactivada.
La acumulacin de lmite est activada.
El rectngulo lmite est vaco.
El rectngulo lmite no est vaco.
Windows.Pas
Sintaxis
GetBrushOrgEx(
DC: HDC;
var p2: TPoint
): BOOL;
Descripcin
Esta funcin recupera el origen de la brocha para el contexto de dispositivo
especificado. El origen de la brocha es relativo a la trama o al mapa de bits que define
el patrn de la brocha. El origen por defecto de la brocha est situado en el punto (0,0).
El patrn de una brocha no puede ser mayor de ocho pxeles cuadrados. Por eso, las
coordenadas del origen pueden variar entre 0 y 7, vertical y horizontalmente. Cuando el
origen es movido, el patrn de la brocha es desplazado en la cantidad especificada. Si
una aplicacin est utilizando un patrn de brocha para dibujar el fondo de ventanas
hijas y madres, puede ser necesario mover el origen de la brocha para alinear los
patrones. Observe que bajo Windows NT, el sistema mantiene automticamente el
origen de la brocha para que los patrones estn alineados.
Funciones de dibujo
139
Parmetros
DC: Manejador del contexto de dispositivo cuyo origen de brocha se desea recuperar.
P2: Puntero a registro TPoint que recibir las coordenadas del origen de la brocha, en
unidades del dispositivo.
Vase adems
CreateBrushIndirect, CreateHatchBrush, CreatePatternBrush, FillRect, FillRgn,
SelectObject, SetBrushOrgEx
GetCurrentObject
Windows.Pas
Sintaxis
GetCurrentObject(
DC: HDC;
p2: UINT
): HGDIOBJ;
Descripcin
Esta funcin devuelve un manejador del objeto del tipo especificado que est
actualmente seleccionado en el contexto de dispositivo identificado por el parmetro
DC.
Parmetros
DC: Manejador para el contexto de dispositivo cuyo objeto actualmente seleccionado
se desea recuperar.
p2: Opcin que especifica qu tipo de objeto se desea recuperar. A este parmetro se le
puede asignar un valor de la Tabla 3-27.
Vase adems
DeleteObject, GetObject, GetObjectType, SelectObject
3
Captulo
Ejemplo
140
Captulo 3
Ejemplo
Vea el Listado 3-24 bajo GetObject.
Tabla 3-27: Valores del parmetro p2 de GetCurrentObject
Valor
OBJ_PEN
OBJ_BRUSH
OBJ_PAL
OBJ_FONT
OBJ_BITMAP
GetCurrentPositionEx
Descripcin
Recupera un manejador de la pluma actualmente seleccionada.
Recupera un manejador de la brocha actualmente seleccionada.
Recupera un manejador de la paleta actualmente seleccionada.
Recupera un manejador de la fuente actualmente seleccionada.
Recupera un manejador del mapa de bits actualmente
seleccionado si el parmetro DC identifica un contexto de
dispositivo.
Windows.Pas
Sintaxis
GetCurrentPositionEx(
DC: HDC;
Point: PPoint
): BOOL;
Descripcin
Esta funcin recupera las coordenadas de la posicin actual en unidades lgicas.
Parmetros
DC: Manejador del contexto de dispositivo cuya posicin actual es recuperada.
Point: Puntero a un registro TPoint que recibe las coordenadas de la posicin actual, en
unidades lgicas.
Vase adems
LineTo, MoveToEx, PolyBezierTo, PolylineTo
Ejemplo
Listado 3-23: Mostrando la posicin actual
procedure TForm1.Button1Click(Sender: TObject);
var
CurPosPt: TPoint;
// almacena la posicin actual
begin
Funciones de dibujo
141
Figura 3-27:
Obteniendo la
posicin
actual
GetMiterLimit
Windows.Pas
Sintaxis
GetMiterLimit(
DC: HDC;
3
Captulo
142
Captulo 3
Descripcin
Esta funcin recupera el lmite del inglete para el contexto de dispositivo especificado.
El lmite del inglete es usado para lneas geomtricas que tienen uniones de inglete, y
es la relacin entre el largo del inglete y el ancho de la lnea. La longitud del inglete es
la distancia desde la interseccin de la pared interna con la pared externa.
Figura 3-28:
Dimensiones
del lmite del
inglete
Grosor de
lnea
Longitud inglete
Parmetros
DC: Un manejador para el contexto de dispositivo desde el cual el lmite del inglete
ser recuperado.
Limit: Un puntero a una variable de tipo Single que recibe el lmite del inglete del
contexto de dispositivo.
Vase adems
ExtCreatePen, SetMiterLimit
Ejemplo
Vea el Listado 3-16 bajo ExtCreatePen.
GetObject
Windows.Pas
Sintaxis
GetObject(
p1: HGDIOBJ;
p2: Integer;
p3: Pointer
): Integer;
Funciones de dibujo
143
Descripcin
Esta funcin recupera informacin sobre el objeto grfico identificado en el parmetro
p1. Dependiendo del tipo de objeto, el parmetro p3 debe apuntar a un buffer que
recibe un registro de tipo TBitmap, TDIBSection, TExtLogPen, TLogBrush, TLogFont o
TLogPen que contiene informacin sobre el objeto especificado. Nota: Si el parmetro
p1 contiene un manejador de un mapa de bits creado con una funcin distinta que
CreateDIBSection, el registro de datos devuelto en el buffer contiene slo el ancho, la
altura y el formato de colores del mapa de bits.
Parmetros
p1: Especifica un manejador del objeto grfico cuya informacin se desea recuperar.
Puede ser un manejador de un mapa de bits, una seccin DIB, una brocha, una fuente,
una pluma, o una paleta.
p2: Especifica el tamao del buffer al que apunta el parmetro p3.
3
Captulo
p3: Un puntero a un buffer que recibir un registro de datos que contiene informacin
acerca del objeto grfico especificado. El tipo de registro recibido depende del tipo del
objeto especificado en el parmetro p1. Si a este parmetro se le asigna nil, la funcin
devuelve el tamao requerido por el buffer para almacenar la informacin recuperada.
Si el parmetro p1 contiene un manejador de una paleta, el buffer al que apunta este
parmetro recibir un valor de 16 bits que indica el nmero de entradas en la paleta. Si
p1 contiene un manejador de un mapa de bits, una pluma, una brocha o una fuente, el
buffer al que apunta este parmetro recibir un registro de datos TBitmap, TLogPen,
TLogBrush, o TLogFont, respectivamente. Consulte las funciones
CreateBitmapIndirect, CreatePenIndirect, CreateBrushIndirect, o CreateFontIndirect
para ver las descripciones de estos registros. Si el parmetro p1 contiene un manejador
de un mapa de bits devuelto por la funcin CreateDIBSection, el buffer al que apunta
este parmetro recibir un registro de tipo TDIBSection. Si el parmetro p1 contiene un
manejador de una pluma devuelto por la funcin ExtCreatePen, el buffer al que apunta
este parmetro recibir un registro de tipo TExtLogPen.
144
Captulo 3
Funciones de dibujo
145
Vase adems
CreateBitmapIndirect, CreateBrushIndirect, CreateDIBSection, CreateFontIndirect,
CreatePenIndirect, ExtCreatePen, GetBitmapBits, GetDIBits, GetCurrentObject,
GetObjectType, GetPaletteEntries, GetRegionData, GetStockObject
Ejemplo
Listado 3-24: Recuperando informacin acerca de un objeto
3
Captulo
146
Captulo 3
Canvas.Brush.Color := clRed;
Canvas.Brush.Style := bsDiagCross;
hObject := GetCurrentObject(Canvas.Handle, OBJ_BRUSH);
{Recuperar informacin acerca del objeto}
GetObject(hObject, SizeOf(TLogBrush), @LogBrush);
{Indicar el tipo de objeto recuperado}
case GetObjectType(hObject) of
OBJ_BITMAP:
Edit4.Text := 'Bitmap';
OBJ_BRUSH:
Edit4.Text := 'Brush';
OBJ_FONT:
Edit4.Text := 'Font';
OBJ_PAL:
Edit4.Text := 'Palette';
OBJ_PEN:
Edit4.Text := 'Pen';
OBJ_EXTPEN:
Edit4.Text := 'Extended Pen';
OBJ_REGION:
Edit4.Text := 'Region';
OBJ_DC:
Edit4.Text := 'Device Context';
OBJ_MEMDC:
Edit4.Text := 'Memory Device Context';
OBJ_METAFILE:
Edit4.Text := 'Metafile';
OBJ_METADC:
Edit4.Text := 'Metafile Device Context';
OBJ_ENHMETAFILE: Edit4.Text := 'Enhanced Metafile';
OBJ_ENHMETADC:
Edit4.Text := 'Enhanced Metafile Device Context';
end;
{Mostrar la informacin del objeto}
with LogBrush do begin
Edit1.Text := GetStyle(lbStyle);
Edit2.Text := IntToHex(lbColor, 8);
Edit3.Text := GetHatch(lbHatch);
end;
{Seleccionar la brocha dentro del contexto de dispositivo del formulario}
SelectObject(FormDC, hObject);
{Dibujar una elipse con la brocha}
Ellipse(FormDC, 50, 10, 150, 110);
{Borrar el contexto de dispositivo}
ReleaseDC(Form1.Handle, FormDC);
end;
Figura 3-29:
La informacin
del objeto
Funciones de dibujo
GetObjectType
147
Windows.Pas
Sintaxis
GetObjectType(
h: HGDIOBJ
): DWORD;
Descripcin
Esta funcin devuelve un indicador que muestra el tipo de objeto al que hace referencia
el parmetro h.
Parmetros
h: Manejador de un objeto grfico cuyo tipo ser recuperado.
Vase adems
DeleteObject, GetCurrentObject, GetObject, GetStockObject, SelectObject
Ejemplo
Vea el Listado 3-24 bajo GetObject.
Tabla 3-28: Valores que devuelve GetObjectType
Valor
OBJ_BITMAP
OBJ_BRUSH
OBJ_FONT
OBJ_PAL
OBJ_PEN
OBJ_EXTPEN
OBJ_REGION
OBJ_DC
OBJ_MEMDC
OBJ_METAFILE
OBJ_METADC
OBJ_ENHMETAFILE
OBJ_ENHMETADC
Descripcin
Mapa de bits.
Brocha.
Fuente.
Paleta.
Pluma.
Pluma extendida.
Regin.
Contexto de dispositivo.
Contexto de dispositivo en memoria.
Metafichero.
Contexto de dispositivo de metafichero.
Metafichero mejorado.
Contexto de dispositivo de metafichero mejorado.
3
Captulo
Si la funcin tiene xito, devuelve una opcin que indica el tipo del objeto, que puede
ser un valor de la Tabla 3-28. Si falla, devuelve cero.
148
Captulo 3
GetPixel
Windows.Pas
Sintaxis
GetPixel(
DC: HDC;
X: Integer;
Y: Integer
): COLORREF;
Descripcin
Esta funcin recupera el color del pxel situado en las coordenadas especificadas en el
contexto de dispositivo indicado. La coordenada tiene que estar dentro de las fronteras
de la regin de recorte actual.
Parmetros
DC: Manejador del contexto de dispositivo al que pertenece el pxel cuyo color se
desea recuperar.
X: La coordenada horizontal del pxel dentro del contexto de dispositivo, en unidades
lgicas.
Y: La coordenada vertical del pxel dentro del contexto de dispositivo, en unidades
lgicas.
Vase adems
SetPixel, SetPixelV
Ejemplo
Vea el Listado 3-44 bajo SetPixel.
GetPolyFillMode
Windows.Pas
Sintaxis
GetPolyFillMode(
DC: HDC
): Integer;
Descripcin
Esta funcin recupera el modo actual del relleno de polgonos, para el contexto de
dispositivo especificado.
Funciones de dibujo
149
Parmetros
DC: Manejador del contexto de dispositivo cuyo modo actual de relleno de polgonos
se desea recuperar.
Vase adems
FillPath, Polygon, PolyPolygon, SetPolyFillMode
Ejemplo
3
Captulo
150
Captulo 3
Figura 3-30:
Un modo
especfico de
relleno de
polgono
GetROP2
Descripcin
Rellena el polgono usando el mtodo Alternate.
Rellena el polgono usando el mtodo Winding.
Windows.Pas
Sintaxis
GetROP2(
DC: HDC
): Integer;
Descripcin
Esta funcin recupera el modo de mezcla del primer plano para el contexto de
dispositivo especificado. El modo de mezcla del primer plano determina cmo el color
de la pluma utilizada en las operaciones de dibujo se combina con el color anterior de
los pxeles en el contexto de dispositivo especificado.
Parmetros
DC: Manejador del contexto de dispositivo cuyo modo de mezcla del primer plano se
desea recuperar.
Vase adems
LineTo, PolyBezier, Polyline, Rectangle, SetROP2
Funciones de dibujo
151
Ejemplo
Listado 3-26: Usando el modo de mezcla para dibujar un rectngulo arrastrable
var
Form1: TForm1;
RectDragging: Boolean;
OldRect: TRect;
implementation
{$R *.DFM}
3
Captulo
152
Captulo 3
Figura 3-31:
DIbujando el
rectngulo
arrastrable
GetStockObject
Descripcin
El pxel de destino siempre ser negro.
Al pxel de destino se le asigna el color de la pluma.
El pxel de destino es una combinacin de los colores comunes
a la pantalla y al inverso de la pluma.
El pxel de destino es una combinacin de los colores comunes
a la pantalla y a la pluma.
El pxel de destino es una combinacin de los colores comunes
a la pluma y al inverso de la pantalla.
El pxel de destino es una combinacin de la pantalla y el
inverso de la pluma.
El pxel de destino es una combinacin de la pluma y la pantalla
El pxel de destino es una combinacin de la pluma y el inverso
de la pantalla.
El pxel de destino no ser modificado.
El pxel de destino es el inverso de la pantalla.
El pxel de destino es el inverso de la pluma.
El pxel de destino es el inverso de la opcin R2_MASKPEN.
El pxel de destino es el inverso de la opcin R2_MERGEPEN.
El pxel de destino es el inverso de la opcin R2_XORPEN.
El pxel de destino siempre ser blanco.
El pxel de destino es una combinacin de los colores en la
pluma o en la pantalla, pero no ambos.
Windows.Pas
Sintaxis
GetStockObject(
Index: Integer
): HGDIOBJ;
Funciones de dibujo
153
Descripcin
Esta funcin recupera un manejador de una pluma, brocha, fuente, o paleta predefinida.
NO es necesario eliminar estos objetos cuando la aplicacin deja de necesitarlos.
Parmetros
Vase adems
DeleteObject, GetObject, GetObjectType, SelectObject
Ejemplo
Listado 3-27: Usando un objeto del almacn
procedure TForm1.Button1Click(Sender: TObject);
var
ARegion: HRGN;
// almacena una regin
begin
{Crear una regin que ser rellenada}
ARegion := CreateRectRgn(20, 20, 190, 110);
{Rellenar la regin con una brocha del almacn}
FillRgn(Canvas.Handle, ARegion, GetStockObject(BLACK_BRUSH));
end;
Descripcin
Recupera un manejador de una brocha negra.
Recupera un manejador de una brocha gris oscuro.
Recupera un manejador de una brocha gris.
Recupera un manejador de una brocha hueca.
Recupera un manejador de una brocha gris claro.
3
Captulo
Index: Opcin que indica el tipo de objeto del almacn que se desea recuperar. A este
parmetro se le puede asignar un valor de la Tabla 3-31.
154
Captulo 3
Valor
WHITE_BRUSH
BLACK_PEN
NULL_PEN
WHITE_PEN
ANSI_FIXED_FONT
Descripcin
Recupera un manejador de una brocha blanca.
Recupera un manejador de una pluma negra.
Recupera un manejador de una pluma nula.
Recupera un manejador de una pluma blanca.
Recupera un manejador de una fuente del sistema
de tamao fijo (fixed-pitch).
Recupera un manejador de una fuente del sistema
proporcional (variable-pitch).
Slo Windows NT: Recupera un manejador de una
fuente dependiente del dispositivo.
Slo Windows 95/98: Recupera un manejador de la
fuente por defecto utilizada en los objetos de
interfaz de usuario.
Recupera un manejador de una fuente fixed-pitch
del fabricante.
Recupera un manejador de la fuente del sistema.
Recupera un manejador de la fuente de sistema
fixed-pitch utilizada en versiones de Windows
anteriores a 3.0.
Recupera un manejador de la paleta por defecto
que contiene los colores estticos en la paleta del
sistema.
ANSI_VAR_FONT
DEVICE_DEFAULT_FONT
DEFAULT_GUI_FONT
OEM_FIXED_FONT
SYSTEM_FONT
SYSTEM_FIXED_FONT
DEFAULT_PALETTE
GetUpdateRect
Windows.Pas
Sintaxis
GetUpdateRect(
hWnd: HWND;
var lpRect: TRect;
bErase: BOOL
): BOOL;
{manejador de ventana}
{puntero a registro TRect}
{opcin de borrado del fondo}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin recupera las coordenadas del rectngulo ms pequeo que puede ser
dibujado alrededor de la regin no vlida (la regin de actualizacin) de la ventana
especificada. El rectngulo estar expresado en coordenadas de rea cliente, a menos
que la ventana haya sido creada con el estilo de clase CS_OWNDC y su modo de
mapeado sea distinto de MM_TEXT. En este caso, el rectngulo estar expresado en
coordenadas lgicas. Observe que esta funcin tiene que ser usada antes de que la
funcin BeginPaint sea llamada, ya que BeginPaint valida la regin a actualizar, lo que
provocara que esta funcin devolviese un rectngulo vaco.
Funciones de dibujo
155
Parmetros
hWnd: Manejador de la ventana cuyo rectngulo lmite de la regin de actualizacin
ser recuperado.
lpRect: Puntero a un registro TRect que recibir las coordenadas de la regin de
actualizacin.
bErase: Una opcin que indica si el fondo de la regin no vlida debe ser borrado. Si a
este parmetro se le asigna TRUE y la regin no est vaca, se enviar un mensaje
WM_ERASEBKGND a la ventana especificada.
Vase adems
Ejemplo
Vea el Listado 3-29 bajo InvalidateRect.
GetUpdateRgn
Windows.Pas
Sintaxis
GetUpdateRgn(
hWnd: HWND;
hRgn: HRGN;
bErase: BOOL
): Integer;
{manejador de ventana}
{manejador de regin}
{opcin de borrado del fondo}
{devuelve el tipo de regin no vlida}
Descripcin
Esta funcin recupera el manejador de la regin no vlida de la ventana especificada.
La regin es relativa al rea cliente de la ventana. Observe que esta funcin tiene que
ser usada antes de que la funcin BeginPaint sea llamada, ya que BeginPaint valida la
regin a actualizar, lo que provocara que esta funcin devolviera una regin vaca.
Parmetros
hWnd: Manejador de la ventana cuya regin a actualizar ser recuperada.
hRgn: Un manejador de la regin existente. Este manejador ser inicializado para que
apunte a la regin no vlida cuando la funcin retorne.
bErase: Una opcin que indica si el fondo de la regin no vlida debe ser borrado y las
reas no cliente de las ventanas hijas redibujadas. Si a este parmetro se le asigna
TRUE y la regin no est vaca, se enviar un mensaje WM_ERASEBKGND a la
ventana especificada y las reas no cliente de las ventanas hijas sern redibujadas.
3
Captulo
156
Captulo 3
Vase adems
GetUpdateRect, InvalidateRgn
Ejemplo
Vea el Listado 3-30 bajo InvalidateRgn.
Tabla 3-32: Valores que devuelve GetUpdateRgn
Valor
NULLREGION
SIMPLEREGION
COMPLEXREGION
ERROR
GrayString
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin con ms de un rectngulo.
Indica que ha ocurrido un error.
Windows.Pas
Sintaxis
GrayString(
hDC: HDC;
hBrush: HBRUSH;
lpOutputFunc: TFNGrayStringProc;
lpData: LPARAM;
nCount: Integer;
X: Integer;
Y: Integer;
nWidth: Integer;
nHeight: Integer
): BOOL;
Descripcin
Esta funcin dibuja texto en la localizacin especificada del contexto de dispositivo. El
texto es dibujado creando un mapa de bits fuera de pantalla, dibujando en el mapa de
bits, modificando su color con la brocha especificada o la brocha por defecto y
finalmente, copiando el mapa de bits en el rea de dibujo especificada en las
coordenadas indicadas. Para dibujar el texto se utiliza la fuente actualmente
seleccionada en el contexto de dispositivo. Si al parmetro lpOutputFunc se le asigna
nil, el parmetro lpData tiene que contener un puntero a una cadena y la funcin
TextOut es utilizada para dibujar la cadena sobre el mapa de bits fuera de pantalla. En
caso contrario, el parmetro lpData puede apuntar a cualquier tipo de datos definido
Funciones de dibujo
157
por el usuario, por ejemplo un mapa de bits, y la funcin de respuesta a la que apunta el
parmetro lpOutputFunc tiene que dibujar los datos en el mapa de bits fuera de
pantalla.
Parmetros:
hDC: Manejador del contexto de dispositivo sobre el cual la cadena es dibujada.
hBrush: Manejador de la brocha a utilizar para modificar el color del texto. Si a este
parmetro se le asigna cero, esta funcin utilizar la brocha por defecto para dibujar el
texto.
lpOutputFunc: Puntero a una funcin de respuesta que manejar la salida de texto. Si a
este parmetro se le asigna nil, la funcin utilizar TextOut para dibujar el texto en el
mapa de bits fuera de pantalla.
3
Captulo
158
Captulo 3
lpData: LPARAM;
cchData: Integer
): BOOL;
Descripcin
Esta funcin de respuesta es utilizada para dibujar la cadena especificada o los datos
definidos por el usuario, de la manera especfica definida por la aplicacin. El
parmetro hDC especifica un manejador de un contexto de dispositivo que representa
al mapa de bits fuera de pantalla creado por la funcin GrayString. La funcin de
respuesta tiene que dibujar los datos de la manera deseada en este contexto de
dispositivo, los cuales sern copiados, a su vez, en el contexto de dispositivo
especificado por el parmetro hDC de la funcin GrayString cuando la funcin de
respuesta retorne. Esta funcin de respuesta puede ejecutar cualquier accin deseada.
Parmetros
hdc: Manejador del contexto de dispositivo del mapa de bits fuera de pantalla sobre el
cual sern dibujados los datos o la cadena. El contexto de dispositivo tendr el mismo
ancho y altura que se especifica en los parmetros nWidth y nHeight de la funcin
GrayString.
lpData: Un puntero a los datos que sern dibujados; corresponde al parmetro lpData
de la funcin GrayString.
cchData: Especifica la longitud en caracteres de la cadena; corresponde al parmetro
nCount de la funcin GrayString.
Vase adems
DrawText, GetSysColor, SetTextColor, TabbedTextOut, TextOut
Ejemplo
Listado 3-28: Dibujando texto con GrayString
procedure TForm1.FormPaint(Sender: TObject);
var
Str: PChar;
// apunta a la cadena que ser dibujada
begin
{Inicializar el puntero a la cadena}
Str := 'Delphi Rocks!';
{Inicializar la brocha usada para dibujar la cadena}
Canvas.Brush.Color := clRed;
{Dibujar la cadena}
GrayString(Canvas.Handle, Canvas.Brush.Handle, nil, LPARAM(Str), Length(Str),
Funciones de dibujo
159
Figura 3-32:
Uso de
GrayString
InvalidateRect
Windows.Pas
Sintaxis
{manejador de ventana}
{puntero a las coordenadas del rectngulo}
{opcin de borrado del fondo}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin aade el rectngulo especificado a la regin no vlida de la ventana
indicada, haciendo que sta reciba un mensaje WM_PAINT.
Parmetros
hWnd: Manejador de la ventana que contiene la regin no vlida a la que se aadir el
rectngulo especificado. Si a este parmetro se le asigna cero, todas las ventanas son
invalidadas y recibirn los mensajes WM_ERASEBKGND y WM_NCPAINT antes de
que la funcin retorne.
lpRect: Puntero al registro TRect que contiene las coordenadas del rectngulo que ser
aadido a la regin no vlida. Si a este parmetro se le asigna nil, el rea cliente
completa ser aadida a la regin no vlida.
bErase: Una opcin que indica si el fondo en la regin no vlida debe ser borrado. Si a
este parmetro se le asigna TRUE y la regin no est vaca, el fondo completo de la
regin no vlida ser borrado cuando la funcin BeginPaint sea llamada.
Vase adems
BeginPaint, GetUpdateRect, InvalidateRgn
Ejemplo
Listado 3-29: Dibujando solo el rectngulo no vlido del rea de dibujo
procedure TForm1.Button2Click(Sender: TObject);
3
Captulo
InvalidateRect(
hWnd: HWND;
lpRect: PRect;
bErase: BOOL
): BOOL;
160
Captulo 3
var
InvalidRectangle: TRect; //rectngulo a invalidar
begin
{Definir el rectngulo}
InvalidRectangle := Rect(10, 10, 110, 110);
{Borrar solo el rea rectangular}
InvalidateRect(Form1.Handle, @InvalidRectangle, TRUE);
end;
procedure TForm1.WMPaint(var Msg: TWMPaint);
var
InvalidRect: TRect;
// almacena el rea rectangular no vlida
PaintStruct: TPaintStruct;
// almacena informacin de redibujado
begin
{Recuperar el rectngulo no vlido}
GetUpdateRect(Handle, InvalidRect, TRUE);
{Comenzar el proceso de repintado; sto valida la regin no vlida}
BeginPaint(Handle, PaintStruct);
{Si el rea cliente completa es no vlida...}
if EqualRect(InvalidRect, ClientRect) then
{...redibujar el mapa de bits que est en Image1}
Canvas.Draw(0, 0, Image1.Picture.Bitmap)
else
begin
{...en caso contrario, dibujar un rectngulo rojo en el rea del rectngulo
no vlido y lo etiqueta como un rea previamente invlida}
Canvas.Brush.Color := clRed;
Canvas.Rectangle(InvalidRect.Left, InvalidRect.Top, InvalidRect.Right,
InvalidRect.Bottom);
Canvas.TextOut(InvalidRect.Left+10, InvalidRect.Top + 10, 'Invalid Rect');
end;
{Finalizar la operacin de repintado}
EndPaint(Handle, PaintStruct);
end;
Figura 3-33:
El rectngulo
no vlido
Funciones de dibujo
InvalidateRgn
161
Windows.Pas
Sintaxis
InvalidateRgn(
hWnd: HWND;
hRgn: HRGN;
bErase: BOOL
): BOOL;
{manejador de ventana}
{manejador de regin}
{opcin de borrado del fondo}
{siempre devuelve TRUE}
Descripcin
Esta funcin aade la regin dada a la regin no vlida de la ventana especificada,
haciendo que sta reciba un mensaje WM_PAINT.
Vase adems
BeginPaint, GetUpdateRgn, InvalidateRect
Ejemplo
Listado 3-30: Dibujando solo la regin no vlida del rea de dibujo
procedure TForm1.Button2Click(Sender: TObject);
var
PointsArray: array[0..2] of TPoint; // array de puntos que define la regin
RegionHandle: HRGN;
// un manejador de la regin
begin
{Definir la regin}
PointsArray[0].x := 20;
PointsArray[0].y := 20;
PointsArray[1].x := 100; PointsArray[1].y := 65;
PointsArray[2].x := 20;
PointsArray[2].y := 120;
{Crear la regin}
RegionHandle := CreatePolygonRgn(PointsArray, 3, ALTERNATE);
3
Captulo
Parmetros
162
Captulo 3
{Invalidar la regin}
InvalidateRgn(Form1.Handle, RegionHandle, TRUE);
{La regin ya no es necesaria; la eliminamos}
DeleteObject(RegionHandle);
end;
procedure TForm1.WMPaint(var Msg: TWMPaint);
var
InvalidRgn: HRGN;
// un manejador de la regin no vlida
PaintStruct: TPaintStruct; // almacena informacin sobre el redibujado
begin
{GetUpdateRgn requiere un manejador de una regin preexistente, por lo que se
crea una}
InvalidRgn := CreateRectRgn(0, 0, 1, 1);
{Recuperar un manejador de la regin a actualizar}
GetUpdateRgn(Handle, InvalidRgn, FALSE);
{Comienza la operacin de redibujado}
BeginPaint(Handle, PaintStruct);
{Si la regin es igual al rea cliente completa...}
if EqualRgn(InvalidRgn, CreateRectRgnIndirect(ClientRect)) then
{...dibujar el mapa de bits Image1 en el rea de dibujo del formulario}
Canvas.Draw(0, 0, Image1.Picture.Bitmap)
else
begin
{...en caso contrario, rellenar la regin no vlida en rojo}
Canvas.Brush.Color := clRed;
FillRgn(Canvas.Handle, InvalidRgn, Canvas.Brush.Handle);
end;
{Finalizar la operacin de repintado}
EndPaint(Handle, PaintStruct);
{Borrar el objeto regin, ya que no es necesario}
DeleteObject(InvalidRgn);
end;
Figura 3-34:
La regin no
vlida
Funciones de dibujo
LineDDA
163
Windows.Pas
Sintaxis
LineDDA(
p1: Integer;
p2: Integer;
p3: Integer;
p4: Integer;
p5: TFNLineDDAProc;
p6: LPARAM
): BOOL;
Descripcin
Parmetros
p1: Especifica la coordenada horizontal del punto de inicio de la lnea.
p2: Especifica la coordenada vertical del punto de inicio de la lnea.
p3: Especifica la coordenada horizontal del punto de terminacin de la lnea.
p4: Especifica la coordenada vertical del punto de terminacin de la lnea.
p5: Puntero a la funcin de respuesta definida por la aplicacin.
p6: Especifica un valor definido por la aplicacin.
Descripcin
Este procedimiento es llamado para cada pxel de la lnea definida por la funcin
LineDDA. La funcin de respuesta puede ejecutar cualquier accin de dibujo basada en
estas coordenadas, tal como dibujar un pxel, copiar un mapa de bits, etc.
3
Captulo
Esta funcin dibuja una lnea pasando las coordenadas de cada punto que pertenece a la
lnea, exceptuando el punto de terminacin, a una funcin de respuesta definida por la
aplicacin. La funcin de respuesta determina como la lnea ser dibujada. Si los
modos de mapeado y de transformaciones por defecto estn activos, las coordenadas
pasadas a la funcin de respuesta se corresponden con pxeles en la pantalla.
164
Captulo 3
Parmetros
X: La coordenada horizontal actual a lo largo de la lnea.
Y: La coordenada vertical actual a lo largo de la lnea.
lpData: Especifica un valor de 32 bits definido por la aplicacin, correspondiente al
valor pasado a la funcin LineDDA en el parmetro p6. Este valor se utilizar para
propsitos especficos de la aplicacin.
Vase adems
ExtCreatePen, LineTo
Ejemplo
Listado 3-31: Dibujando un rectngulo de seleccin animado
{El prototipo de la funcin de respuesta}
procedure AnimLines(X, Y: Integer; lpData: lParam); stdcall;
var
Form1: TForm1;
Offset: Integer;
const
AL_HORIZONTAL = 1;
AL_VERTICAL = 2;
implementation
{$R *.DFM}
procedure AnimLines(X, Y: Integer; lpData: lParam);
var
Coord: Integer;
// almacena la coordenada utilizada en el clculo
begin
{Si la lnea es horizontal, usar la coordenada X; en caso contrario, usar Y}
if lpData = AL_HORIZONTAL then
Coord := X
else
Coord := Y;
{Determinar si el pxel de este punto debe ser negro o blanco}
if (Coord mod 5 = Offset) then
SetPixelV(Form1.Canvas.Handle, X, Y, clBlack)
else
SetPixelV(Form1.Canvas.Handle, X, Y, clWhite);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Funciones de dibujo
165
{Incrementar el desplazamiento}
Inc(Offset);
{Si el desplazamiento ha ido demasiado lejos, reinicializarlo}
if Offset>4 then Offset := 0;
{Dibujar un rectngulo con lneas animadas}
LineDDA(20, 20, 120, 20, @AnimLines, AL_HORIZONTAL);
LineDDA(120, 20, 120, 120, @AnimLines, AL_VERTICAL);
LineDDA(20, 20, 20, 120, @AnimLines, AL_VERTICAL);
LineDDA(20, 120, 120, 120, @AnimLines, AL_HORIZONTAL);
end;
3
Captulo
Figura 3-35:
El rectngulo
animado
LineTo
Windows.Pas
Sintaxis
LineTo(
DC: HDC;
X: Integer;
Y: Integer
): BOOL;
Descripcin
Esta funcin dibuja una lnea utilizando la pluma seleccionada en el contexto de
dispositivo especificado. La lnea es dibujada desde la posicin actual hasta la posicin
que indican las coordenadas X e Y. El punto con las coordenadas especificadas es
excluido de los pxeles dibujados en la lnea. La posicin actual ser actualizada a las
coordenadas especificadas en X e Y cuando la funcin retorne.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual la lnea ser dibujada.
X: Especifica la coordenada horizontal del punto de terminacin de la lnea, en
unidades lgicas.
166
Captulo 3
Vase adems
LineDDA, MoveToEx, PolyBezier, PolyBezierTo, Polyline, PolylineTo, PolyPolyline
Ejemplo
Vea el Listado 3-23 bajo GetCurrentPositionEx.
LockWindowUpdate
Windows.Pas
Sintaxis
LockWindowUpdate(
hWndLock: HWND
): BOOL;
{manejador de ventana}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin deshabilita o habilita todas las operaciones de dibujo y repintado en la
ventana especificada. Una ventana bloqueada fijada no puede ser movida y slo una
ventana puede estar bloqueada en un momento dado. Windows registra las reas de la
ventana bloqueada en las que se producen operaciones de dibujo o pintura. Cuando la
ventana es desbloqueada, el rea afectada por esas operaciones es invalidada, haciendo
que un mensaje WM_PAINT sea enviado a la ventana. Si las funciones GetDC o
BeginPaint son aplicadas a una ventana bloqueada, el contexto de dispositivo devuelto
contendr una regin vaca visible.
Parmetros
hWndLock: Manejador de la ventana para la cual las operaciones de dibujo sern
deshabilitadas. Si a este parmetro se le asigna cero, la ventana que est actualmente
bloqueada ser desbloqueada.
Vase adems
BeginPaint, GetDC
Ejemplo
Listado 3-32: Habilitando y deshabilitando la actualizacin de una ventana
procedure TForm1.Button1Click(Sender: TObject);
Funciones de dibujo
167
begin
{Deshabilitar actualizacin de la ventana}
LockWindowUpdate(Form1.Handle);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
{Habilitar el repintado de la ventana}
LockWindowUpdate(0);
end;
MoveToEx
Windows.Pas
Sintaxis
{manejador de contexto de dispositivo}
{coordenada horizontal}
{coordenada vertical}
{puntero a un registro TPoint}
{si tiene xito, devuelve TRUE}
Descripcin
Esta funcin mueve la posicin actual del contexto de dispositivo a las coordenadas
especificadas, devolviendo la posicin anterior. Esto afectar a todas las llamadas
posteriores a funciones de dibujo que utilizan la posicin actual como punto de inicio.
Parmetros
DC: Manejador de un contexto de dispositivo cuya posicin actual ser asignada.
p2: Especifica la coordenada horizontal de la nueva posicin actual, en unidades
lgicas.
p3: Especifica la coordenada vertical de la nueva posicin actual, en unidades lgicas.
p4: Puntero a un registro TPoint que recibir las coordenadas de la vieja posicin. A
este parmetro puede asignrsele nil, si las coordenadas de la antigua posicin actual
no son necesarias.
Vase adems
LineTo, PolyBezierTo, PolylineTo
Ejemplo
Vea el Listado 3-23 bajo GetCurrentPositionEx.
3
Captulo
MoveToEx(
DC: HDC;
p2: Integer;
p3: Integer;
p4: PPoint
): BOOL;
168
Captulo 3
PaintDesktop
Windows.Pas
Sintaxis
PaintDesktop(
hdc: HDC
): BOOL;
Descripcin
Esta funcin rellena la regin de recorte del contexto de dispositivo especificado con el
mapa de bits del papel tapiz o patrn del escritorio.
Parmetros
hdc: Manejador del contexto de dispositivo sobre el cual el papel tapiz o el patrn del
escritorio ser dibujado.
Vase adems
BitBlt, GetDC, SystemParametersInfo
Ejemplo
Listado 3-33: Dibujando el escritorio sobre un formulario
procedure TForm1.FormPaint(Sender: TObject);
begin
{Mostrar el papel del escritorio}
PaintDesktop(Canvas.Handle);
end;
procedure TForm1.WMMoving(var Msg: TMessage);
begin
{Mostrar el papel del escritorio cuando se mueve}
PaintDesktop(Canvas.Handle);
end;
PaintRgn
Windows.Pas
Sintaxis
PaintRgn(
DC: HDC;
RGN: HRGN
): BOOL;
Funciones de dibujo
169
Descripcin
Esta funcin rellena la regin especificada del contexto de dispositivo, utilizando la
brocha actualmente seleccionada.
Parmetros
DC: Manejador del contexto de dispositivo cuya regin ser rellenada.
RGN: Manejador de la regin que ser rellenada.
Vase adems
ExtFloodFill, FillPath, FillRect, FillRgn, FrameRect, FrameRgn
Figura 3-36:
La regin
rellenada
3
Captulo
Ejemplo
170
Captulo 3
Pie
Windows.Pas
Sintaxis
Pie(
DC: HDC;
X1: Integer;
Y1: Integer;
X2: Integer;
Y2: Integer;
X3: Integer;
Y3: Integer;
X4: Integer;
Y4: Integer
): BOOL;
Descripcin
Esta funcin dibuja una cua de tarta utilizando la pluma seleccionada y rellena esa
cua utilizando la brocha seleccionada. Una cua de tarta es una regin delimitada por
una elipse y dos segmentos de lnea radiales. Las dimensiones de la cua dependen del
rectngulo lmite que encierra la elipse. Los parmetros X3 e Y3 definen los puntos de
terminacin de la lnea radial, comenzando en el centro del rectngulo lmite, e
identifican la ubicacin del inicio del rea de sta. Los parmetros X4 e Y4 definen los
puntos de terminacin de la lnea radial, comenzando desde el centro del rectngulo
lmite, e identifican la ubicacin final del rea de la misma. La cua es dibujada en
sentido contrario a las manecillas del reloj. Esta funcin no afecta la posicin actual.
sup. izq. (X1)
fin (X4)
fin (Y4)
Figura 3-37:
Coordenadas
de la tarta
inicio (Y3)
inicio (X3)
inf. der.(X2)
Parmetros
DC: Especifica el contexto de dispositivo en el que la cua ser dibujada.
Funciones de dibujo
171
Vase adems
Arc, Chord, Ellipse
Ejemplo
Listado 3-35: Dibujando una cua de tarta
procedure TForm1.FormPaint(Sender: TObject);
begin
{Dibujar una cua de tarta}
Canvas.Brush.Color := clRed;
Canvas.Brush.Style := bsDiagCross;
Pie(Canvas.Handle, 10, 10, 110, 110, 10, 60, 60, 10);
end;
3
Captulo
172
Captulo 3
Figura 3-38:
La cua de la
tarta
PolyBezier
Windows.Pas
Sintaxis
PolyBezier(
DC: HDC;
const Points;
Count: DWORD
): BOOL;
Descripcin
Esta funcin dibuja una o ms curvas cbicas de Bzier en el contexto de dispositivo
especificado utilizando la pluma seleccionada. El parmetro Points apunta a un array
de registros de tipo TPoint que contienen el punto de inicio, los puntos de control y el
punto de terminacin de las curvas de Bzier. El primer punto del array define el punto
de inicio de la curva. Los dos prximos son usados como puntos de control, y el cuarto
define el punto de terminacin. Cada tro posterior define los dos puntos de control y el
punto de terminacin de otra curva de Bzier, utilizando el punto de terminacin de la
curva anterior como punto de inicio. Esta funcin no modifica la posicin actual.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual la curva de Bzier es dibujada.
Points: Puntero a un array de registros TPoint que contiene los puntos de control y los
puntos de terminacin de las curvas de Bzier.
Count: Especifica la cantidad de entradas en el array al que apunta el parmetro Points.
Vase adems
MoveToEx, PolyBezierTo
Funciones de dibujo
173
Ejemplo
Listado 3-36: Dibujando una curva de Bzier
procedure TForm1.FormPaint(Sender: TObject);
var
Points: array[0..6] of TPoint; // puntos que definen la curva de Bzier
begin
{Definir la curva de Bzier}
Points[0].X := 10;
Points[0].Y := 50;
Points[1].X := 40;
Points[1].Y := 90;
Points[2].X := 80;
Points[2].Y := 10;
Points[3].X := 110; Points[3].Y := 50;
Points[4].X := 140; Points[4].Y := 10;
Points[5].X := 180; Points[5].Y := 90;
Points[6].X := 210; Points[6].Y := 50;
3
Captulo
Figura 3-39:
La curva de
Bzier
PolyBezierTo
Windows.Pas
Sintaxis
PolyBezierTo(
DC: HDC;
const Points;
Count: DWORD
): BOOL;
Descripcin
Esta funcin dibuja una o ms curvas cbicas de Bzier en el contexto de dispositivo
especificado, utilizando la pluma seleccionada. El parmetro Points apunta a un array
de registros de tipo TPoint que contienen el punto de inicio, los puntos de control y los
puntos de terminacin de las curvas de Bzier. El primer punto del array define el
punto de inicio de la curva. Los dos prximos puntos son utilizados como puntos de
control, y el cuarto define el punto de terminacin. Cada tro de puntos siguiente
determina los dos puntos de control y el punto de terminacin de otra curva de Bzier,
que utilizar el punto de terminacin de la curva anterior como punto de inicio. La
posicin actual ser actualizada con el ltimo punto del array Points.
174
Captulo 3
Parmetros
DC: Manejador del contexto de dispositivo sobre el que la curva de Bzier ser
dibujada.
Points: Puntero a un array de registros TPoint que contiene los puntos de control y de
terminacin de las curvas de Bzier.
Count: Especifica la cantidad de entradas en el array al que apunta el parmetro Points.
Vase adems
MoveToEx, PolyBezier
Ejemplo
Listado 3-37: Dibujando una curva de Bzier y actualizando la posicin actual
procedure TForm1.FormPaint(Sender: TObject);
var
Points: array[0..2] of TPoint; // puntos que definen la curva de Bzier
begin
{Definir la curva de Bzier}
Points[0].X := 40;
Points[0].Y := 110;
Points[1].X := 80;
Points[1].Y := 30;
Points[2].X := 110; Points[2].Y := 70;
{Mover la posicin actual al punto de inicio correcto}
MoveToEx(Canvas.Handle, 10, 70, nil);
{Dibuja la curva de Bzier}
PolyBezierTo(Canvas.Handle, Points, 3);
{La posicin fue actualizada, podemos usarla para continuar dibujando la imagen}
LineTo(Canvas.Handle, 110, 10);
LineTo(Canvas.Handle, 10, 10);
LineTo(Canvas.Handle, 10, 70);
end;
Figura 3-40:
La curva de
Bzier
Funciones de dibujo
Polygon
175
Windows.Pas
Sintaxis
Polygon(
DC: HDC;
const Points;
Count: DWORD
): BOOL;
Descripcin
Parmetros
DC: Manejador del contexto de dispositivo sobre el que el polgono ser dibujado.
Points: Puntero a un array de registros de tipo TPoint que contienen los vrtices del
polgono. Este array tiene que contener al menos dos vrtices, o la funcin fallar.
Count: Especifica la cantidad de entradas en el array al que apunta el parmetro Points.
Vase adems
GetPolyFillMode, Polyline, PolylineTo, PolyPolygon, PolyPolyline, SetPolyFillMode
Ejemplo
Vea el Listado 3-25 bajo GetPolyFillMode.
Polyline
Windows.Pas
Sintaxis
Polyline(
DC: HDC;
const Points;
Count: DWORD
): BOOL;
3
Captulo
176
Captulo 3
Descripcin
Esta funcin dibuja un polgono en el contexto de dispositivo especificado utilizando la
pluma actual. El parmetro Points apunta a un array de registros de tipo TPoint que
definen los vrtices del polgono. Este es dibujado uniendo los puntos del array
mediante segmentos de lnea. Esta funcin no afecta la posicin actual.
Parmetros
DC: Manejador del contexto de dispositivo sobre el que el polgono ser dibujado.
Points: Puntero a un array de registros TPoint que contiene los vrtices del polgono.
Count: Especifica la cantidad de entradas en el array al que apunta el parmetro Points.
Vase adems
LineTo, MoveToEx, PolylineTo, PolyPolyline
Ejemplo
Listado 3-38: Dibujando un polgono delineado
procedure TForm1.FormPaint(Sender: TObject);
var
PointsArray: array[0..6] of TPoint;
// puntos que definen el polgono
begin
{Definir los vrtices del polgono}
PointsArray[0].X := 50;
PointsArray[0].y := 50;
PointsArray[1].x := 100; PointsArray[1].y := 50;
PointsArray[2].x := 125; PointsArray[2].y := 75;
PointsArray[3].x := 100; PointsArray[3].y := 100;
PointsArray[4].x := 50;
PointsArray[4].y := 100;
PointsArray[5].x := 25;
PointsArray[5].y := 75;
PointsArray[6].X := 50;
PointsArray[6].Y := 50;
{Dibujar el polgono}
Polyline(Canvas.Handle, PointsArray, 7);
end;
Figura 3-41:
El polgono
vaco
Funciones de dibujo
PolylineTo
177
Windows.Pas
Sintaxis
PolylineTo(
DC: HDC;
const Points;
Count: DWORD
): BOOL;
Descripcin
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el polgono ser dibujado.
Points: Puntero a un array de registros TPoint que contiene los vrtices del polgono.
Count: Especifica la cantidad de entradas en el array al que apunta el parmetro Points.
Vase adems
LineTo, MoveToEx, Polyline, PolyPolyline
Ejemplo
Listado 3-39: Dibujando un polgono no relleno comenzando desde la posicin actual
procedure TForm1.FormPaint(Sender: TObject);
var
PointsArray: array[0..5] of TPoint; // los puntos que definen el polgono
begin
{Mover la posicin actual al punto donde comienza el polgono}
MoveToEx(Canvas.Handle, 50, 50, nil);
{Definir el polgono}
PointsArray[0].x := 100;
PointsArray[1].x := 125;
PointsArray[2].x := 100;
PointsArray[3].x := 50;
PointsArray[4].x := 25;
PointsArray[5].X := 50;
PointsArray[0].y
PointsArray[1].y
PointsArray[2].y
PointsArray[3].y
PointsArray[4].y
PointsArray[5].Y
:=
:=
:=
:=
:=
:=
50;
75;
100;
100;
75;
50;
3
Captulo
178
Captulo 3
PolyPolygon
Windows.Pas
Sintaxis
PolyPolygon(
DC: HDC;
var Points;
var nPoints;
p4: Integer
): BOOL;
Descripcin
Esta funcin dibuja una serie de polgonos cerrados en el contexto de dispositivo
especificado utilizando la pluma seleccionada, y rellena los polgonos usando la brocha
seleccionada y el modo de relleno de polgono actual del contexto de dispositivo. El
parmetro Points apunta a un array de registros TPoint que definen los vrtices de cada
polgono. El parmetro nPoints apunta a un array de enteros, en el que cada entero
especifica la cantidad de elementos en el array Points que definen un polgono. Cada
uno ser automticamente cerrado con una lnea que va desde el ltimo vrtice hasta el
primero. Esta funcin no modifica la posicin actual.
Parmetros
DC: Manejador del contexto de dispositivo sobre el que los polgonos sern dibujados.
Points: Puntero a un array de registros de tipo TPoint que contiene los vrtices de los
polgonos. Todos los vrtices se utilizan en orden consecutivo y deben ser
especificados una vez. Los polgonos definidos por este array pueden solaparse.
nPoints: Puntero a un array de enteros, en el que cada entero especifica el nmero de
elementos del array Points que define cada polgono individual.
p4: Indica la cantidad total de polgonos que sern dibujados.
Vase adems
GetPolyFillMode, Polygon, Polyline, PolylineTo, PolyPolyline, SetPolyFillMode
Funciones de dibujo
179
Ejemplo
Listado 3-40: Dibujando mltiples polgonos
Figura 3-42:
Mltiples
polgonos
PolyPolyline
Windows.Pas
Sintaxis
PolyPolyline(
DC: HDC;
const PointStructs;
const Points;
p4: DWORD
): BOOL;
3
Captulo
180
Captulo 3
Descripcin
Esta funcin dibuja una serie de polgonos en el contexto de dispositivo especificado,
utilizando la pluma seleccionada. El parmetro PointStructs apunta a un array de
registros de tipo TPoint que contiene los vrtices de cada polgono. El parmetro Points
apunta a un array de enteros, donde cada entero especifica la cantidad de elementos del
array PointStructs que definen un polgono. Cada polgono es dibujado uniendo los
puntos del array mediante segmentos de lnea. Esta funcin no afecta a la posicin
actual.
Parmetros
DC: Manejador del contexto de dispositivo sobre el que los polgonos sern dibujados.
PointStructs: Puntero a un array de registros TPoint que contiene los vrtices de cada
polgono. Los vrtices son utilizados en orden consecutivo y deben ser especificados
una sola vez.
Points: Puntero a un array de enteros, donde cada entero especifica la cantidad de
elementos en el array PointStructs que definen cada polgono individual.
p4: Indica la cantidad total de polgonos que sern dibujados.
Vase adems
Polygon, Polyline, PolylineTo, PolyPolygon
Ejemplo
Listado 3-41: Dibujando mltiples polgonos sin rellenar
procedure TForm1.FormPaint(Sender: TObject);
var
PointsArray: array[0..11] of TPoint; // los vrtices que define el polgono
NPoints: array[0..1] of Integer;
// cantidad de vrtices en cada polgono
begin
{Definir los polgonos}
{primer polgono}
PointsArray[0].x := 50;
PointsArray[0].y := 50;
PointsArray[1].x := 100; PointsArray[1].y := 50;
PointsArray[2].x := 125; PointsArray[2].y := 75;
PointsArray[3].x := 100; PointsArray[3].y := 100;
PointsArray[4].x := 50;
PointsArray[4].y := 100;
PointsArray[5].x := 25;
PointsArray[5].y := 75;
PointsArray[6].X := 50;
PointsArray[6].Y := 50;
{segundo polgono}
PointsArray[7].X := 200; PointsArray[7].y := 25;
PointsArray[8].X := 300; PointsArray[8].Y := 25;
PointsArray[9].X := 300; PointsArray[9].Y := 125;
PointsArray[10].X := 200; PointsArray[10].Y := 125;
Funciones de dibujo
181
Rectangle
Windows.Pas
Sintaxis
Rectangle(
DC: HDC;
X1: Integer;
Y1: Integer;
X2: Integer;
Y2: Integer
): BOOL;
Descripcin
Esta funcin dibuja un rectngulo en las coordenadas indicadas del contexto de
dispositivo especificado utilizando la pluma seleccionada y rellenndolo con la brocha
seleccionada. Esta funcin no modifica la posicin actual.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el rectngulo es dibujado.
X1: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo,
en unidades lgicas.
Y1: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo,
en unidades lgicas.
X2: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo,
en unidades lgicas.
Y2: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo, en
unidades lgicas.
3
Captulo
Figura 3-43:
Mltiples
polgonos no
rellenados
182
Captulo 3
Vase adems
CreateRectRgn, CreateRectRgnIndirect, FillRect, FrameRect, Polygon, Polyline,
RoundRect
Ejemplo
Listado 3-42: Dibujando un rectngulo con un relleno animado
var
Form1: TForm1;
BrushOffset: Integer;
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
var
BrushPt: TPoint;
// almacena el origen de la brocha actual
BrushHndl, OldBrush: HBRUSH;
// manejadores para las brochas
FormDC: HDC;
// el contexto de dispositivo del formulario
begin
{Recuperar el contexto de dispositivo del formulario}
FormDC := GetDC(Form1.Handle);
{Incrementar el desplazamiento de la brocha}
Inc(BrushOffset);
{Crear una brocha con trama}
BrushHndl := CreateHatchBrush(HS_DIAGCROSS, clRed);
{Asignar el origen de la brocha}
SetBrushOrgEx(FormDC, BrushOffset, BrushOffset, nil);
{Seleccionar la brocha dentro del contexto de dispositivo}
OldBrush := SelectObject(FormDC, BrushHndl);
{Recuperar el origen de la brocha actual}
GetBrushOrgEx(FormDC, BrushPt);
{Si el origen de la brocha est ms all del lmite, inicializarlo}
if BrushPt.X > 7 then begin
BrushOffset := 0;
SetBrushOrgEx(FormDC, BrushOffset, BrushOffset, nil);
end;
{Dibujar el rectngulo}
Funciones de dibujo
183
Figura 3-44:
El rectngulo
animado
RoundRect
Windows.Pas
Sintaxis
RoundRect(
DC: HDC;
X1: Integer;
Y1: Integer;
X2: Integer;
Y2: Integer;
X3: Integer;
Y3: Integer
): BOOL;
Descripcin
Esta funcin dibuja un rectngulo en las coordenadas especificadas del contexto de
dispositivo indicado, utilizando la pluma seleccionada y rellenndolo con la brocha
seleccionada. Las esquinas del rectngulo sern redondeadas de acuerdo a los valores
de la elipse formada por los parmetros X3 e Y3. Esta funcin no modifica la posicin
actual.
Captulo
184
Captulo 3
X sup. izq.
Y sup. izq.
Altura
Y inf. der.
Figura 3-45:
Coordenadas
de RoundRect
Ancho
X inf. der.
Parmetros
DC: Manejador del contexto de dispositivo sobre el que se dibujar el rectngulo
redondeado.
X1: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo
redondeado, en unidades lgicas.
Y1: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo
redondeado, en unidades lgicas.
X2: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo
redondeado, en unidades lgicas.
Y2: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo
redondeado, en unidades lgicas.
X3: Indica el ancho de la elipse usada para dibujar las esquinas.
Y3: Indica la altura de la elipse usada para dibujar las esquinas.
Vase adems
CreateRoundRectRgn, FillRect, FrameRect, Polygon, Polyline, Rectangle
Ejemplo
Listado 3-43: Dibujando un rectngulo redondeado
procedure TForm1.FormPaint(Sender: TObject);
begin
{Crear un rectngulo redondeado}
RoundRect(Canvas.Handle, 10, 10, 110, 110, 20, 20);
end;
Funciones de dibujo
185
Figura 3-46:
El rectngulo
redondeado
SelectObject
Windows.Pas
Sintaxis
{manejador de contexto de dispositivo}
{manejador de objeto grfico}
{devuelve un manejador del anterior objeto seleccionado}
Descripcin
Esta funcin selecciona el objeto grfico especificado dentro del contexto de
dispositivo. La mayora de los objetos grficos tienen que ser seleccionados dentro de
un contexto de dispositivo antes de que puedan ser usados en funciones de dibujo. El
ltimo objeto seleccionado reemplaza al objeto del mismo tipo seleccionado
previamente. La aplicacin deber volver a seleccionar el objeto anterior en el contexto
de dispositivo cuando el nuevo objeto deje de ser necesario. Un objeto grfico no
puede ser destruido mientras est seleccionado dentro de un contexto de dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo en el que el objeto es seleccionado.
p2: Especifica un manejador del objeto grfico que ser seleccionado dentro del
contexto de dispositivo, y puede ser una brocha, una pluma, un mapa de bits, una
regin, o una fuente. Tenga en cuenta que los mapas de bits slo pueden estar
seleccionados dentro de un contexto de dispositivo a la vez.
Vase adems
CombineRgn, CreateBitmap, CreateBitmapIndirect, CreateBrushIndirect,
CreateCompatibleBitmap, CreateDIBitmap, CreateEllipticRgn,
3
Captulo
SelectObject(
DC: HDC;
p2: HGDIOBJ
): HGDIOBJ;
186
Captulo 3
Ejemplo
Vea el Listado 3-8 bajo CreateSolidBrush y otros ejemplos a lo largo de este libro.
Tabla 3-33: Valores que devuelve SelectObject
Valor
SIMPLEREGION
COMPLEXREGION
NULLREGION
SetBkColor
Descripcin
La regin es un rectngulo simple.
La regin consta de mltiples rectngulos.
La regin est vaca.
Windows.Pas
Sintaxis
SetBkColor(
DC: HDC;
Color: COLORREF
): COLORREF;
Descripcin
Esta funcin selecciona el color de fondo para el contexto de dispositivo especificado.
Si el dispositivo no puede representar el color especificado, utilizar el color disponible
ms cercano.
Parmetros
DC: Manejador del contexto de dispositivo cuyo color de fondo va a ser asignado.
Color: Un especificador de color que identifica el nuevo color de fondo.
Vase adems
CreatePen, ExtCreatePen, GetBkColor, GetBkMode, SetBkMode
Ejemplo
Vea el Listado 3-21 bajo GetBkColor.
Funciones de dibujo
SetBkMode
187
Windows.Pas
Sintaxis
SetBkMode(
DC: HDC;
BkMode: Integer
): Integer;
Descripcin
Esta funcin selecciona el modo de mezcla del fondo del contexto de dispositivo dado.
Parmetros
DC: Manejador del contexto de dispositivo cuyo modo de mezcla del fondo ser
modificado.
BkMode: Una opcin que indica el nuevo modo de mezcla del fondo. Este parmetro
puede tomar un valor de la Tabla 3-34.
Si la funcin tiene xito, devuelve el modo de mezcla previo del fondo; en caso
contrario, devuelve cero.
Vase adems
CreatePen, ExtCreatePen, GetBkColor, GetBkMode, SetBkColor
Ejemplo
Vea el Listado 3-21 bajo GetBkColor.
Tabla 3-34: Valores del parmetro BkMode de SetBkMode
Valor
OPAQUE
TRANSPARENT
SetBoundsRect
Descripcin
El color de fondo es usado para rellenar vacos en el texto, las
brochas con tramas y los patrones de plumas.
El color del contexto de dispositivo se dejar ver a travs de
los vacos en el texto, las brochas con tramas y los patrones
de plumas.
Windows.Pas
Sintaxis
SetBoundsRect(
DC: HDC;
p2: TRect;
p3: UINT
Captulo
188
Captulo 3
): UINT;
Descripcin
Esta funcin modifica el comportamiento de acumulacin del rectngulo lmite del
contexto de dispositivo dado. Para cada contexto de dispositivo, Windows mantiene un
rectngulo lmite acumulado que indica las dimensiones mximas de la salida
producida por las funciones de dibujo. Cuando una funcin de dibujo sobrepasa esas
fronteras, el rectngulo lmite es extendido. De esta manera, el rectngulo lmite es el
rectngulo ms pequeo que puede ser dibujado alrededor del rea afectada por todas
las operaciones de dibujo en el contexto de dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo cuyo comportamiento de acumulacin del
rectngulo lmite ser modificado.
p2: Puntero a un registro TRect que contiene las coordenadas de rectngulo, en
unidades lgicas, del nuevo rectngulo lmite. A este parmetro se le puede asignar nil
si no se necesita establecer el rectngulo lmite.
p3: Una combinacin de opciones que indican cmo el rectngulo especificado ser
combinado con el rectngulo lmite actual y si la acumulacin de rectngulo lmite est
habilitada. A este parmetro se le puede asignar una combinacin de valores de la Tabla
3-35.
Vase adems
GetBoundsRect, GetUpdateRect
Ejemplo
Vea el Listado 3-22 bajo GetBoundsRect.
Tabla 3-35: Valores del parmetro p3 de SetBoundsRect
Valor
DCB_ACCUMULATE
DCB_DISABLE
DCB_ENABLE
DCB_RESET
Descripcin
Aade el rectngulo especificado por el parmetro p2 al
rectngulo lmite actual mediante una unin. Si las opciones
DCB_RESET y DCB_ACCUMULATE son ambas
especificadas, el rectngulo lmite se iguala exactamente al
rectngulo especificado por el parmetro p2.
Deshabilita la acumulacin del rectngulo lmite. Este es el
estado por defecto.
Habilita la acumulacin del rectngulo lmite.
Borra el rectngulo lmite.
Funciones de dibujo
189
SetBrushOrgEx
Descripcin
Indica que ha ocurrido un error.
La acumulacin del rectngulo lmite est deshabilitada.
La acumulacin del rectngulo lmite est habilitada.
El rectngulo lmite est vaco.
El rectngulo lmite no est vaco.
Windows.Pas
Sintaxis
{manejador de contexto de dispositivo}
{coordenada horizontal del origen}
{coordenada vertical del origen}
{puntero a registro TPoint}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin asigna el origen de la prxima brocha que sea seleccionada en el contexto
de dispositivo especificado. El origen de la brocha es relativo a la trama o al mapa de
bits que definen el patrn de la brocha. El origen por defecto de la brocha es (0,0). Un
patrn de brocha no puede tener ms de ocho pxeles cuadrados. De esta manera, el
origen puede estar entre 0 y 7, tanto vertical como horizontalmente. Cuando el origen
es movido, el patrn de la brocha es desplazado en la cantidad indicada. Si una
aplicacin est usando un mismo patrn de brocha para dibujar el fondo de ventanas
madres e hijas, puede ser necesario mover el origen de la brocha para alinear los
patrones. Tenga en cuenta que, bajo Windows NT, el sistema ajusta automticamente el
origen de las brochas para que los patrones estn alineados.
Parmetros
DC: Manejador del contexto de dispositivo cuyo origen de brocha ser asignado.
X: Especifica la coordenada horizontal del origen de la brocha, en unidades del
dispositivo.
Y: Especifica la coordenada vertical del origen de la brocha, en unidades del
dispositivo.
PrevPt: Puntero a un registro TPoint que recibir las coordenadas del origen anterior de
la brocha. A este parmetro se le puede asignar nil, si las coordenadas previas no son
necesarias.
3
Captulo
SetBrushOrgEx(
DC: HDC;
X: Integer;
Y: Integer;
PrevPt: PPoint
): BOOL;
190
Captulo 3
Vase adems
CreateBrushIndirect, CreateHatchBrush, CreatePatternBrush, FillRect, FillRgn,
GetBrushOrgEx, SelectObject
Ejemplo
Vea el Listado 3-42 bajo Rectangle.
SetMiterLimit
Windows.Pas
Sintaxis
SetMiterLimit(
DC: HDC;
NewLimit: Single;
OldLimit: PSingle
): BOOL;
Descripcin
Esta funcin asigna el lmite del inglete para el contexto de dispositivo especificado. El
lmite del inglete es utilizado al trazar lneas geomtricas que tienen uniones a inglete,
y es la relacin mxima entre el largo del inglete y el ancho de la lnea. La longitud del
inglete es la distancia desde la interseccin de la pared interna hasta la interseccin de
la pared externa. El lmite del inglete por defecto es 10,0.
Parmetros
DC: Manejador del contexto de dispositivo cuyo lmite del inglete ser asignado.
NewLimit: Especifica el nuevo lmite del inglete para el contexto de dispositivo.
OldLimit: Puntero a una variable que recibir el lmite anterior del inglete. A este
parmetro se le puede asignar nil si el lmite anterior no se necesita.
Vase adems
ExtCreatePen, GetMiterLimit
Funciones de dibujo
191
Ejemplo
Vea el Listado 3-16 bajo ExtCreatePen.
SetPixel
Windows.Pas
Sintaxis
SetPixel(
DC: HDC;
X: Integer;
Y: Integer;
Color: COLORREF
): COLORREF;
Descripcin
Parmetros
DC: Manejador del contexto de dispositivo en el que se modifica el color de un pxel.
X: La coordenada horizontal del pxel dentro del contexto de dispositivo, en unidades
lgicas.
Y: La coordenada vertical del pxel dentro del contexto de dispositivo, en unidades
lgicas.
Color: Especifica el nuevo color del pxel.
Vase adems
GetPixel, SetPixelV
Ejemplo
Listado 3-44: Implementando un efecto sencillo de degradado de mapa de bits
procedure TForm1.Button1Click(Sender: TObject);
begin
{Borrar la imagen actual}
Canvas.Brush.Color := Color;
Canvas.FillRect(ClientRect);
3
Captulo
Esta funcin asigna el color del pxel situado en las coordenadas especificadas dentro
del contexto de dispositivo indicado. Las coordenadas tienen que estar dentro de las
fronteras de la regin de recorte actual.
192
Captulo 3
{Comenzar el efecto}
Timer1.Enabled := TRUE;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
X, Y: Integer;
// coordenadas del pxel
iCount: Integer;
// contador de bucle
begin
{Comenzar el efecto de degradado sencillo}
for iCount := 0 to 20000 do
begin
{Recuperar una coordenada aleatoria}
X := Random(Image1.Width - 1);
Y := Random(Image1.Height - 1);
{En un cuadrado de 4x4 pxeles a partir de este punto, recuperar los pxeles
de la imagen original, y asignarlos en el rea de dibujo del formulario}
SetPixel(Canvas.Handle, X+Image1.Left, Y+Image1.Top,
GetPixel(Image1.Picture.Bitmap.Canvas.Handle, X, Y));
SetPixel(Canvas.Handle, X+1+Image1.Left, Y+Image1.Top,
GetPixel(Image1.Picture.Bitmap.Canvas.Handle, X+1, Y));
SetPixel(Canvas.Handle, X+Image1.Left, Y+1+Image1.Top,
GetPixel(Image1.Picture.Bitmap.Canvas.Handle, X, Y+1));
SetPixel(Canvas.Handle, X+1+Image1.Left, Y+1+Image1.Top,
GetPixel(Image1.Picture.Bitmap.Canvas.Handle, X+1, Y+1));
end;
{Dibujar la imagen terminada de modo que no haya huecos a la izquierda}
Canvas.Draw(Image1.Left, Image1.Top, Image1.Picture.Bitmap);
{Deshabilitar temporizador}
Timer1.Enabled := FALSE;
end;
Figura 3-47:
Degradado
del mapa de
bits
ejecutndose
SetPixelV
Windows.Pas
Sintaxis
SetPixelV(
DC: HDC;
Funciones de dibujo
X: Integer;
Y: Integer;
Color: COLORREF
): BOOL;
193
Descripcin
Esta funcin asigna el color del pxel en las coordenadas especificadas del contexto de
dispositivo indicado. Es generalmente ms rpida que SetPixel porque no tiene que
devolver un color. Las coordenadas tienen que estar dentro de las fronteras de la regin
actual de recorte.
Parmetros
DC: Manejador del contexto de dispositivo en el cual se asigna el color del nuevo
pxel.
Vase adems
GetPixel, SetPixel
Ejemplo
Vea el Listado 3-31 bajo LineDDA.
SetPolyFillMode
Windows.Pas
Sintaxis
SetPolyFillMode(
DC: HDC;
PolyFillMode: Integer
): Integer;
Descripcin
Esta funcin asigna el modo de relleno de polgonos del contexto de dispositivo
especificado. El modo de relleno de polgonos determina cmo sern rellenados los
3
Captulo
194
Captulo 3
polgonos y las regiones. Para determinar qu pxeles sern rellenados cuando se utilice
el modo ALTERNATE, seleccione cualquier pxel del interior del polgono y dibuje una
lnea imaginaria en la direccin positiva de las X, hasta el infinito. Para cada lnea del
polgono que intersecte la lnea imaginaria, incremente un contador en uno. El pxel
ser rellenado si este valor es un nmero impar. Para determinar qu pxeles sern
rellenados cuando se utilice el modo WINDING, seleccione cualquier pxel en el
interior del polgono y dibuje una lnea imaginaria en la direccin positiva de las X,
hasta el infinito. Para cada lnea del polgono que intersecte la lnea imaginaria, si la
lnea del polgono fue dibujada en la direccin positiva de las Y, se incrementa un
contador. Si la lnea del polgono fue dibujada en la direccin negativa de las Y, se
decrementa el contador. El pxel ser rellenado si el valor del contador es distinto de
cero.
Figura 3-48:
Resultados de
modos de
relleno de
polgonos
ALTERNATE
WINDING
Parmetros
DC: Manejador del contexto de dispositivo cuyo modo actual de relleno de polgonos
ser seleccionado.
PolyFillMode: Un indicador que especifica el nuevo modo de relleno de polgonos. A
este parmetro se le puede asignar un valor de la Tabla 3-37.
Vase adems
FillPath, GetPolyFillMode, Polygon, PolyPolygon
Ejemplo
Vea el Listado 3-25 bajo GetPolyFillMode.
Tabla 3-37: Valores del parmetro PolyFillMode y valores que devuelve SetPolyFillMode
Valor
ALTERNATE
WINDING
Descripcin
Rellena el polgono utilizando el mtodo Alternate.
Rellena el polgono utilizando el mtodo Winding.
Funciones de dibujo
SetROP2
195
Windows.Pas
Sintaxis
SetROP2(
DC: HDC;
p2: Integer
): Integer;
Descripcin
Esta funcin selecciona el modo de mezcla del primer plano para el contexto de
dispositivo especificado. El modo de mezcla del primer plano determina cmo se
combinar el color de la pluma utilizada en las operaciones de dibujo con el color de
los pxeles en el contexto de dispositivo especificado.
DC: Manejador del contexto de dispositivo cuyo modo de mezcla del primer plano ser
seleccionado.
p2: Indicador que especifica el nuevo modo de mezcla del primer plano. A este
parmetro se le puede asignar un valor de la Tabla 3-38.
Vase adems
GetROP2, LineTo, PolyBezier, Polyline, Rectangle
Ejemplo
Vea el Listado 3-26 bajo GetROP2.
Tabla 3-38: Valores del parmetro p2 y valores que devuelve SetROP2
Valor
R2_BLACK
R2_COPYPEN
R2_MASKNOTPEN
R2_MASKPEN
R2_MASKPENNOT
Descripcin
El pxel de destino siempre ser negro.
Al pxel de destino se le asigna el color de la pluma.
El pxel de destino es una combinacin de los colores comunes
a la pantalla y al inverso de la pluma.
El pxel de destino es una combinacin de los colores comunes
a la pantalla y a la pluma.
El pxel de destino es una combinacin de los colores comunes
a la pluma y al inverso de la pantalla.
3
Captulo
Parmetros
196
Captulo 3
Valor
R2_MERGENOTPEN
R2_MERGEPEN
R2_MERGEPENNOT
R2_NOP
R2_NOT
R2_NOTCOPYPEN
R2_NOTMASKPEN
R2_NOTMERGEPEN
R2_NOTXORPEN
R2_WHITE
R2_XORPEN
StrokeAndFillPath
Descripcin
El pxel de destino es una combinacin de la pantalla y del
inverso de la pluma.
El pxel de destino es una combinacin de la pluma y la pantalla.
El pxel de destino es una combinacin de la pluma y del
inverso de la pantalla.
El pxel de destino no ser modificado.
El pxel de destino es el inverso de la pantalla.
El pxel de destino es el inverso de la pluma.
El pxel de destino es el inverso de la opcin R2_MASKPEN.
El pxel de destino es el inverso de la opcin R2_MERGEPEN.
El pxel de destino es el inverso de la opcin R2_XORPEN.
El pxel de destino siempre ser blanco.
El pxel de destino es una combinacin de los colores en la
pluma o en la pantalla, pero no ambos.
Windows.Pas
Sintaxis
StrokeAndFillPath(
DC: HDC
): BOOL;
Descripcin
Esta funcin cierra las figuras abiertas en la ruta del contexto de dispositivo
especificado y traza y rellena la ruta utilizando la pluma y la brocha actualmente
seleccionadas. La ruta es rellenada segn el modo actual de relleno de polgonos del
contexto de dispositivo. Tenga en cuenta que cuando esta funcin retorne, la ruta ser
descartada del contexto de dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo que contiene la ruta a trazar y rellenar.
Vase adems
BeginPath, FillPath, SetPolyFillMode, StrokePath
Funciones de dibujo
197
Ejemplo
Listado 3-45: Trazando y rellenando una ruta simultneamente
procedure TForm1.FormPaint(Sender: TObject);
begin
{Comenzar una definicin de ruta}
BeginPath(Canvas.Handle);
{Dibujar algn texto agradable}
SetBkMode(Canvas.Handle, TRANSPARENT);
Canvas.TextOut(10, 10, 'DELPHI ROCKS!');
{Cerrar la ruta}
EndPath(Canvas.Handle);
Figura 3-49:
La ruta
trazada y
rellenada
StrokePath
Windows.Pas
Sintaxis
StrokePath(
DC: HDC
): BOOL;
Descripcin
Esta funcin traza la ruta contenida en el contexto de dispositivo especificado con la
pluma actualmente seleccionada. Observe que cuando esta funcin retorne la ruta ser
desechada del contexto de dispositivo.
Parmetros
DC: Manejador del contexto de dispositivo que contiene la ruta a trazar.
3
Captulo
198
Captulo 3
Vase adems
BeginPath, EndPath, FillPath, ExtCreatePen, StrokeAndFillPath
Ejemplo
Listado 3-46: Trazando una ruta
procedure TForm1.FormPaint(Sender: TObject);
begin
{Comenzar definicin de ruta}
BeginPath(Canvas.Handle);
{Dibujar algn texto agradable}
SetBkMode(Canvas.Handle, TRANSPARENT);
Canvas.TextOut(10, 10, 'DELPHI ROCKS!');
{Cerrar la ruta}
EndPath(Canvas.Handle);
{Inicializar la pluma a utilizar para dibujar el borde de la ruta}
Canvas.Pen.Color := clRed;
Canvas.Pen.Style := psSolid;
{Trazar la ruta}
StrokePath(Canvas.Handle);
end;
Figura 3-50:
La ruta
delineada
199
Captulo 4
Regiones y rutas
Inicialmente, una ruta y una regin pueden parecer muy similares. Ambas definen una
figura. Pueden ser trazadas y rellenadas utilizando las plumas y brochas que el
programador determine. Sin embargo, con una inspeccin ms detallada, las diferencias
entre rutas y regiones se hacen tangibles.
Regiones
Una regin es una figura poligonal cerrada. No es una figura en el sentido visual; se
comporta como una definicin de figura, que puede ser creada mediante diversas
tcnicas. Generalmente, una regin se construye mediante funciones especficas que
crean una definicin de figura en forma de primitiva grfica, como puede ser un
rectngulo o una elipse. Como tal, las regiones tienden a ser ms simples en cuanto a
forma que las rutas. Sin embargo, las regiones pueden combinarse entre s de varias
maneras para producir figuras ms complejas. La funcin CombineRgn ejecuta este
servicio usando varias opciones, que representan operaciones booleanas para combinar
regiones de diferentes maneras, como se ilustra a continuacin.
4
Captulo
200
Captulo 4
RGN_AND
RGN_DIFF
RGN_OR
Figura 4-1:
Mtodos de
combinacin
de regiones de RGN_XOR
CombineRgn
A diferencia de una ruta, una regin puede usarse para comprobar una pulsacin del
ratn (hit testing). Dicha comprobacin es el acto de determinar dnde est situado el
cursor del ratn con respecto a un rea determinada, normalmente en respuesta a un
clic. Empleando las funciones PtInRect o PtInRegion combinadas con rectngulos o
regiones, el desarrollador puede crear zonas calientes (hot spots) de formas muy
complejas. Por ejemplo, una aplicacin puede definir cincuenta regiones diferentes con
la forma de los cincuenta estados de los Estados Unidos. Utilizando esas regiones como
zonas calientes en un mapa de los Estados Unidos, un estado en particular puede
resaltarse cuando el cursor del ratn entre en su permetro, o se puede mostrar
determinada informacin cuando se haga clic sobre l. Esto puede llevarse a cabo
fcilmente en el evento OnMouseDown de un componente TImage o del propio
formulario, utilizando la funcin PtInRegion para comparar las coordenadas del clic
con cada regin hasta que se encuentre la regin correcta. Tambin, a diferencia de las
rutas, una regin puede desplazarse a posiciones diferentes de sus coordenadas
originales y comparada con otras regiones.
Si se necesita obtener informacin ms detallada sobre una regin, una aplicacin
puede usar la funcin GetRegionData para recuperar los atributos de una regin. En
particular, una regin se define internamente como una serie de rectngulos, ordenados
de arriba a abajo y de izquierda a derecha. La funcin GetRegionData puede utilizarse
para recuperar el rectngulo individual que define una regin, como se ilustra en el
siguiente ejemplo.
Listado 4-1: Recuperando informacin acerca de una regin
procedure TForm1.Button1Click(Sender: TObject);
var
TheRegion: HRGN;
// almacena la regin
RegionDataSize: DWORD;
// almacena el tamao de la informacin de la regin
RegionData: Pointer;
// puntero a la informacin de la regin
iCount: Integer;
// variable de control del bucle general
RectPointer: ^TRect;
// puntero utilizado para extraer las coordenadas
del rectngulo
begin
201
{Asignar a la pluma activa un color diferente para que se vean los rectngulos}
Canvas.Pen.Color := clBlack;
{Recorrer los rectngulos}
for iCount := 0 to TRgnData(RegionData^).rdh.nCount-1 do
begin
{El puntero RectPointer por definicin convertir los tipos de los valores
en el buffer al tipo TRect, lo que permitir a la aplicacin extraer los
campos necesarios}
Add('Rect: ' + IntToStr(iCount) +
' - L: ' + IntToStr(RectPointer^.Left) +
', T: ' + IntToStr(RectPointer^.Top) +
', R: ' + IntToStr(RectPointer^.Right) +
', B: ' + IntToStr(RectPointer^.Bottom));
{Dibujar este rectngulo especfico sobre la regin}
Canvas.Rectangle(RectPointer^.Left, RectPointer^.Top, RectPointer^.Right,
RectPointer^.Bottom);
{Como RectPointer es un puntero a TRect, cuando se incremente su valor
pasar a apuntar al prximo rectngulo de la serie}
Inc(RectPointer);
end;
end;
4
Captulo
202
Captulo 4
Figura 4-2: La
informacin
sobre la regin
Rutas
Al igual que una regin, una ruta es una definicin de figura. Sin embargo, una ruta no
necesita formar una figura poligonal cerrada. Una ruta puede ser cualquier cosa, desde
un rectngulo hasta una serie compleja de lneas y curvas de Bzier. Una ruta se crea
encerrando una serie de llamadas a funciones de dibujo del GDI en lo que se conoce
como una definicin de ruta (path bracket). Una definicin de ruta es una seccin de
cdigo que comienza con una llamada a la funcin BeginPath y termina con una
llamada a la funcin EndPath. Las funciones de dibujo especficas que sean llamadas
entre estas dos funciones no producirn salida grfica en la pantalla; en lugar de ello,
definirn la forma de la ruta. Generalmente las rutas son mucho ms complejas que las
regiones en cuanto a forma. Consulte la funcin BeginPath para ver una lista de las
funciones de dibujo que pueden utilizarse en una definicin de ruta.
A diferencia de las regiones, de las cuales pueden crearse mltiples instancias, una ruta
se asocia con el contexto de dispositivo en el cual ha sido definida. En un contexto de
dispositivo cualquiera puede existir solamente una ruta a la vez; cuando se inicia la
definicin de otra ruta o se destruye el contexto de dispositivo, cualquier ruta existente
es destruida. Sin embargo, una ruta puede convertirse en una regin usando la funcin
PathToRegion. Esto permite al desarrollador crear regiones de forma extremadamente
compleja. Los puntos que definen la ruta pueden ser recuperados llamando a la funcin
GetPath. Esta funcin devuelve un array de registros TPoint que contienen las
coordenadas de los puntos que definen la regin, en unidades lgicas. Un uso comn de
esta funcin puede verse en algoritmos que ajustan un texto a lo largo de una ruta o una
figura, como por ejemplo una curva.
Efectos especiales
Quizs el uso ms comn de una regin o una ruta sea definir una regin de recorte.
Cuando una regin de recorte es definida y seleccionada dentro de un contexto de
dispositivo, cualquier salida grfica al contexto de dispositivo se confina dentro de los
lmites de la regin. Cualquier salida que quede fuera de la regin ser descartada o
203
implementation
{$R *.DFM}
procedure TForm1.FormPaint(Sender: TObject);
begin
{Dibuja un marco del efecto}
DrawEffect;
end;
{Crear un buffer fuera de pantalla del tamao del rea cliente del formulario}
Buffer := TBitmap.Create;
Buffer.Width := ClientWidth;
Buffer.Height := ClientHeight;
{Crear y cargar el mapa de bits de la textura utilizada en las letras}
TileBitmap := TBitmap.Create;
TileBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Tile.bmp');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Liberar los mapas de bits de la textura y el buffer fuera de pantalla}
Buffer.Free;
TileBitmap.Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Incrementar el desplazamiento}
Inc(Offset);
4
Captulo
204
Captulo 4
205
Figura 4-3:
Una agradable
pantalla de
presentacin
CreatePolygonRgn
CreatePolyPolygonRgn
CreateRectRgn
CreateRectRgnIndirect
CreateRoundRectRgn
EndPath
EqualRect
EqualRgn
ExcludeClipRect
ExtCreateRegion
ExtSelectClipRgn
FlattenPath
GetClipBox
GetClipRgn
Descripcin
Descarta una ruta y cierra una definicin de ruta abierta.
Comienza una definicin de ruta.
Cierra una figura abierta en una definicin de ruta.
Combina dos regiones usando una operacin booleana.
Copia las coordenadas de un rectngulo en otro.
Crea una regin elptica.
Crea una regin elptica basada en propiedades definidas en
un registro de datos.
Crea una regin poligonal.
Crea una regin consistente en mltiples polgonos.
Crea una regin rectangular.
Crea una regin rectangular basada en propiedades definidas
en un registro de datos.
Crea una regin rectangular redondeada.
Termina una definicin de ruta.
Determina si las coordenadas de dos rectngulos son iguales.
Determina si el tamao y la forma de dos regiones son
iguales.
Crea una nueva regin de recorte, excluyendo la regin
especificada.
Transforma una regin existente.
Selecciona una regin de recorte, combinndola con la
regin de recorte existente mediante operaciones
booleanas.
Convierte las curvas en una ruta en segmentos de lneas.
Recupera el rectngulo lmite de la regin de recorte.
Recupera un manejador de la regin de recorte actual.
4
Captulo
Funcin
AbortPath
BeginPath
CloseFigure
CombineRgn
CopyRect
CreateEllipticRgn
CreateEllipticRgnIndirect
206
Captulo 4
Funcin
GetPath
GetRegionData
GetRgnBox
InflateRect
IntersectRect
InvertRect
InvertRgn
IsRectEmpty
OffsetClipRgn
OffsetRect
OffsetRgn
PathToRegion
PtInRect
PtInRegion
PtVisible
RectInRegion
RectVisible
SelectClipPath
SelectClipRgn
SetRect
SetRectEmpty
SetRectRgn
SetWindowRgn
SubtractRect
UnionRect
WidenPath
AbortPath
Descripcin
Recupera los puntos que definen una ruta.
Recupera informacin sobre una regin.
Recupera el rectngulo lmite de una regin.
Modifica el tamao de un rectngulo.
Crea un nuevo rectngulo a partir de la interseccin de dos
rectngulos.
Invierte los colores de los pxeles dentro del rea definida
por un rectngulo.
Invierte los colores de los pxeles dentro del rea definida
por una regin.
Determina si un rectngulo est vaco.
Mueve un rea de recorte.
Mueve un rectngulo.
Mueve una regin.
Convierte una ruta en una regin.
Determina si una coordenada especfica est situada dentro
de un rectngulo.
Determina si una coordenada especfica est situada dentro
de una regin.
Determina si una coordenada especfica est situada dentro
de la regin de recorte.
Determina si un rectngulo est situado dentro de una
regin.
Determina si un rectngulo est situado dentro de la regin
de recorte.
Selecciona la ruta actual como la regin de recorte.
Selecciona una regin como la regin de recorte.
Inicializa un rectngulo.
Vaca un rectngulo.
Convierte una regin en una regin rectangular.
Asigna la regin de una ventana.
Calcula la diferencia entre dos rectngulos.
Crea un rectngulo a partir de la suma de dos rectngulos.
Redefine la forma de una ruta con respecto a la pluma actual.
Windows.Pas
Sintaxis
AbortPath(
DC: HDC
): BOOL;
207
Descripcin
Esta funcin descarta cualquier ruta definida en el contexto de dispositivo identificado
por el parmetro DC. Si la funcin es llamada dentro de una definicin de ruta abierta,
sta es cerrada y la ruta es descartada.
Parmetros
DC: Manejador del contexto de dispositivo que contiene la ruta que ser eliminada.
Vase adems
BeginPath, CloseFigure, EndPath
Ejemplo
Vea el Listado 4-3 bajo CloseFigure.
Windows.Pas
Sintaxis
BeginPath(
DC: HDC
): BOOL;
Descripcin
Esta funcin abre una definicin de ruta en el contexto de dispositivo especificado.
Cualquier ruta que exista previamente en el contexto de dispositivo especificado es
descartada. Utilice la funcin EndPath para cerrar una definicin de ruta abierta. Una
vez que una definicin ha comenzado, ciertas funciones de dibujo aplicadas en el
contexto de dispositivo especificado sern convertidas a informacin de la ruta y no
mostrarn ninguna salida visible. Una vez que una definicin de ruta es cerrada, sta es
asociada con el contexto de dispositivo especificado. La ruta puede ser convertida en
una regin mediante una llamada a la funcin PathToRegion.
Bajo Windows NT, las siguientes funciones pueden ser usadas dentro de una definicin
de ruta: AngleArc, Arc, ArcTo, Chord, CloseFigure, Ellipse, ExtTextOut, LineTo,
MoveToEx, Pie, PolyBezier, PolyBezierTo, PolyDraw, Polygon, Polyline, PolylineTo,
PolyPolygon, PolyPolyline, Rectangle, RoundRect y TextOut.
4
Captulo
BeginPath
208
Captulo 4
Bajo Windows 95/98, las siguientes funciones pueden ser usadas dentro de una
definicin de ruta: CloseFigure, ExtTextOut, LineTo, MoveToEx, PolyBezier,
PolyBezierTo, Polygon, Polyline, PolylineTo, PolyPolygon, PolyPolyline y TextOut.
Parmetros
DC: Manejador del contexto de dispositivo en el que ciertas funciones de dibujo sern
convertidas en informacin de la ruta.
Vase adems
CloseFigure, EndPath, ExtTextOut, FillPath, LineTo, MoveToEx, PathToRegion,
PolyBezier, PolyBezierTo, Polygon, Polyline, PolylineTo, PolyPolygon, PolyPolyline,
SelectClipPath, StrokeAndFillPath, StrokePath, TextOut, WidenPath
Ejemplo
Vea el Listado 4-19 bajo SelectClipPath, y otros ejemplos a lo largo de este captulo.
CloseFigure
Windows.Pas
Sintaxis
CloseFigure(
DC: HDC
): BOOL;
Descripcin
Esta funcin cierra la figura creada en una definicin de ruta en el contexto de
dispositivo especificado. La figura es cerrada ejecutando la operacin LineTo desde el
punto actual hasta el punto especificado en la llamada ms reciente a la funcin
MoveToEx. Las lneas sern conectadas usando el estilo de unin de lneas identificado
por la pluma geomtrica que se encuentre seleccionada. Si la funcin LineTo es
llamada explcitamente para cerrar la figura antes de llamar a la funcin CloseFigure,
el estilo de punto final de la pluma geomtrica que se encuentre seleccionada es usado
para dibujar los finales de las lneas. Esta funcin es til slo cuando es llamada dentro
de una definicin de ruta abierta. Una figura en una definicin de ruta est abierta a
menos que sea explcitamente cerrada mediante una llamada a esta funcin. Despus de
que esta funcin sea llamada, cualquier otra funcin de dibujo que sea usada en la ruta
comenzar una nueva figura.
209
Parmetros
DC: Especifica el contexto de dispositivo que contiene la ruta cuya figura actual ser
cerrada.
Vase adems
BeginPath, EndPath, ExtCreatePen, LineTo, MoveToEx
Ejemplo
Listado 4-3: Cerrando una figura abierta en una definicin de ruta
procedure TForm1.Button1Click(Sender: TObject);
begin
{Comenzar una definicin de ruta. Todas las subsiguientes llamadas a funciones
de dibujo definirn una ruta y no producirn salida visible}
BeginPath(Canvas.Handle);
4
Captulo
210
Captulo 4
StrokeAndFillPath(Canvas.Handle);
end;
Figura 4-4: La
figura cerrada
CombineRgn
Windows.Pas
Sintaxis
CombineRgn(
p1: HRGN;
p2: HRGN;
p3: HRGN;
p4: Integer
): Integer;
Descripcin
Esta funcin combina las regiones identificadas por los parmetros p2 y p3 de acuerdo
a la operacin indicada en el parmetro p4. La regin identificada por el parmetro p1
es inicializada para apuntar a la regin resultante. Las regiones identificadas por los
parmetros p1, p2 y p3 no tienen que ser nicas (por ejemplo, la regin resultado
identificada por el parmetro p1 puede coincidir con la misma regin identificada por
alguno de los parmetros p2 p3). Cuando la regin combinada deje de ser necesaria,
deber ser eliminada llamando a la funcin DeleteObject.
Parmetros
p1: Manejador de la regin que recibir la regin combinada. Este parmetro tiene que
especificar un manejador de una regin existente.
p2: Manejador de la primera regin que ser combinada.
p3: Manejador de la segunda regin que ser combinada.
p4: Opcin que indica el modo de combinacin de las regiones identificadas por los
parmetros p2 y p3. Este parmetro puede contener un valor de la Tabla 4-2.
211
Vase adems
CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn,
CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn,
DeleteObject
Ejemplo
Listado 4-4: Combinando dos regiones para crear un efecto especial
var
Form1: TForm1;
BinocularRgn: HRGN;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
Circle1, Circle2: HRGN; // almacena dos regiones circulares
begin
{El manejador de la regin combinada tiene que identificar una regin ya
existente, por eso creamos una regin fantasma}
BinocularRgn := CreateEllipticRgnIndirect(BoundsRect);
{Combinar las dos regiones, creando una regin que recuerda a unos binoculares}
CombineRgn(BinocularRgn, Circle1, Circle2, RGN_OR);
{Eliminar las dos regiones circulares porque ya no son necesarias}
DeleteObject(Circle1);
DeleteObject(Circle2);
end;
procedure TForm1.FormPaint(Sender: TObject);
var
ClipRect: TRect;
// almacena las coordenadas de la regin de recorte actual
begin
{Seleccionar la regin combinada como regin de recorte}
SelectClipRgn(Canvas.Handle, BinocularRgn);
{Dibujar el contenido de la imagen (que es invisible) sobre la superficie del
formulario. Ser recortado segn la regin de recorte actual, resultando en lo
que parece la imagen de un barco vista a travs de unos binoculares}
Canvas.Draw(Image1.Left, Image1.Top, Image1.Picture.Bitmap);
4
Captulo
{Crear dos regiones circulares. La primera ocupa 3/4 del lado izquierdo del rea
cubierta por Image1, y la segunda ocupa 3/4 del lado derecho de ese rea}
Circle1 := CreateEllipticRgn(Image1.Left, Image1.Top,
Image1.Left + MulDiv(Image1.Width,3,4),
Image1.Top + Image1.Height);
Circle2 := CreateEllipticRgn(Image1.Left +(Image1.Width div 4),
Image1.Top, Image1.Left + Image1.Width,
Image1.Top + Image1.Height);
212
Captulo 4
Figura 4-5: La
regin
combinada
usada como
regin de
recorte
Descripcin
La regin resultante es la interseccin de las dos regiones especificadas.
La regin resultante es una copia de la regin identificada por el
parmetro p2.
La regin resultante es el rea de la regin identificada por el parmetro
p2 que no forma parte de la regin identificada por el parmetro p3.
La regin resultante es la unin de las dos regiones especificadas.
La regin resultante es la unin de las dos reas especificadas,
excluyendo las reas comunes.
213
CopyRect
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un rectngulo.
Indica que ha ocurrido un error y que no ha sido creada ninguna
regin.
Windows.Pas
Sintaxis
CopyRect(
var lprcDst: TRect;
const lprcSrc: TRect
): BOOL;
Descripcin
Esta funcin copia las coordenadas del rectngulo al que apunta el parmetro lprcSrc
en las coordenadas del rectngulo al que apunta el parmetro lprcDst.
lprcDst: Puntero a un registro TRect que recibir las coordenadas del rectngulo al que
apunta el parmetro lprcSrc.
lprcSrc: Puntero a un registro TRect que contiene las coordenadas que sern copiadas al
rectngulo al que apunta el parmetro lprcDst.
Vase adems
IsRectEmpty, SetRect, SetRectEmpty, SetRectRgn
Ejemplo
Vea el Listado 4-16 bajo OffsetRect.
4
Captulo
Parmetros
214
Captulo 4
CreateEllipticRgn
Windows.Pas
Sintaxis
CreateEllipticRgn(
p1: Integer;
p2: Integer;
p3:Integer;
p4: Integer
): HRGN;
Descripcin
Esta funcin crea una regin elptica. Las coordenadas especificadas representan el
rectngulo ms pequeo que puede ser trazado alrededor de la elipse resultante.
Cuando la regin deje de ser necesaria, deber ser eliminada llamando a la funcin
DeleteObject.
Parmetros
p1: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo
lmite de la elipse, en unidades lgicas.
p2: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo
lmite de la elipse, en unidades lgicas.
p3: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo
lmite de la elipse, en unidades lgicas.
p4: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo
lmite de la elipse, en unidades lgicas.
Vase adems
CreateEllipticRgnIndirect, DeleteObject
Ejemplo
Vea el Listado 4-4 bajo CombineRgn.
CreateEllipticRgnIndirect
215
Windows.Pas
Sintaxis
CreateEllipticRgnIndirect(
const p1: TRect
): HRGN;
Descripcin
Esta funcin crea una regin elptica basada en las coordenadas del rectngulo al que
apunta el parmetro p1. Las coordenadas especificadas representan el rectngulo ms
pequeo que puede ser dibujado alrededor de la elipse resultante. Cuando la regin deje
de ser necesaria, deber ser eliminada llamando a la funcin DeleteObject.
Parmetros
p1: Puntero a un registro TRect que contiene las coordenadas del rectngulo ms
pequeo que puede ser dibujado alrededor de la elipse resultante, en unidades lgicas.
Vase adems
Ejemplo
Listado 4-5: Creando dinmicamente una regin elptica basada en el tamao del
formulario
var
Form1: TForm1;
TheRegion: HRGN;
implementation
{$R *.DFM}
procedure TForm1.FormPaint(Sender: TObject);
begin
{Borrar la imagen actual en el formulario}
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(BoundsRect);
{Trazar la regin elptica en color rojo}
Canvas.Brush.Color := clRed;
FrameRgn(Canvas.Handle, TheRegion, Canvas.Brush.Handle, 2, 2);
end;
4
Captulo
CreateEllipticRgn, DeleteObject
216
Captulo 4
Figura 4-6: La
regin elptica
creada
CreatePolygonRgn
Windows.Pas
Sintaxis
CreatePolygonRgn(
const Points;
Count: Integer;
FillMode: Integer
): HRGN;
{array de puntos}
{cantidad de puntos en el array}
{opcin de modo de relleno}
{devuelve un manejador de regin}
Descripcin
Esta funcin crea una regin poligonal con vrtices en las coordenadas almacenadas en
el array de vrtices al que apunta el parmetro Points. Cuando la regin deje de ser
necesaria, deber ser eliminada llamando a la funcin DeleteObject.
Parmetros
Points: Puntero a un array de registros de tipo TPoint que contiene las coordenadas de
los vrtices del polgono, en unidades del dispositivo. Se asume que el polgono es
cerrado y cada vrtice puede ser especificado una sola vez.
217
Count: Especifica la cantidad de elementos de tipo TPoint que contiene el array al que
apunta el parmetro Points.
FillMode: Opcin que indica el modo de relleno a utilizar para determinar qu pxeles
son incluidos en la regin. Si este parmetro toma el valor ALTERNATE, la regin se
rellena entre los lados impares y pares del polgono especificado. Si el valor es
WINDING, se rellenar cualquier parte de la regin con un valor WINDING distinto de
cero. Consulte la funcin SetPolyFillMode para ms informacin sobre el significado
de estas opciones.
Vase adems
CreatePolyPolygonRgn, DeleteObject, SetPolyFillMode
Ejemplo
Listado 4-6: Creando una regin con forma de estrella
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
Vertices: array[0..9] of TPoint; // vrtices de la regin poligonal
RegionData: Pointer;
// puntero a datos de la regin
RgnDataSize: DWORD;
// tamao de los datos de la regin
Transform: TXForm;
// matriz de transformacin de escala
begin
{Especificar un polgono en forma de estrella}
Vertices[0] := Point(120, 5);
Vertices[1] := Point(140, 70);
Vertices[2] := Point(210, 70);
Vertices[3] := Point(150, 100);
Vertices[4] := Point(180, 175);
Vertices[5] := Point(120, 120);
Vertices[6] := Point(60, 175);
Vertices[7] := Point(90, 100);
Vertices[8] := Point(30, 70);
Vertices[9] := Point(100, 70);
{Crear una regin poligonal en forma de estrella}
PolygonRgn := CreatePolygonRgn(Vertices, 10, WINDING);
{Recuperar el tamao de los datos de la regin}
4
Captulo
var
Form1: TForm1;
PolygonRgn, ScaledRgn: HRGN;
218
Captulo 4
219
Figura 4-7: La
regin en
forma de
estrella
CreatePolyPolygonRgn
Windows.Pas
Sintaxis
CreatePolyPolygonRgn(
const pPtStructs;
const pIntArray;
p3: Integer;
p4: Integer
): HRGN;
{array de puntos}
{array de cantidades de vrtices}
{cantidad de entradas en el array de cantidad de vrtices}
{opcin de modo de relleno}
{devuelve un manejador de regin}
Descripcin
Esta funcin crea una regin definida por mltiples polgonos. Los vrtices de cada
polgono son especificados consecutivamente en el array de registros TPoint al que
apunta el parmetro pPtStructs. Cada entrada en el array al que apunta el parmetro
pIntArray indica la cantidad de puntos en el array de registros TPoint que definen los
vrtices de cada polgono. Los polgonos definidos por este array pueden solaparse.
Captulo
220
Captulo 4
Cuando la regin deje de ser necesaria, debe ser eliminada llamando a la funcin
DeleteObject.
Parmetros
pPtStructs: Puntero a un array de registros TPoint que describen los vrtices de cada
polgono, en unidades del dispositivo. Cada polgono es descrito consecutivamente y se
asume que es cerrado. Cada vrtice puede ser especificado una sola vez.
pIntArray: Puntero a un array de enteros. Cada entero especifica la cantidad de puntos
del array al que apunta el parmetro pPtStructs que definen cada polgono.
p3: Especifica la cantidad de entradas en el array al que apunta el parmetro pIntArray.
p4: Opcin que indica el modo de relleno a utilizar para determinar qu pxeles son
incluidos en la regin. Si este parmetro toma el valor ALTERNATE, la regin se
rellena entre los lados impares y pares del polgono especificado. Si el valor es
WINDING, se rellenar cualquier parte de la regin con un valor WINDING distinto de
cero. Consulte la funcin SetPolyFillMode para ms informacin sobre el significado
de estas opciones.
Vase adems
CreatePolygonRgn, DeleteObject, SetPolyFillMode
Ejemplo
Listado 4-7: Creando una regin de polgonos mltiples
var
Form1: TForm1;
HotSpotRgn: HRGN;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
PolyPoints: array[0..11] of TPoint;
// almacena los puntos de los polgonos
VertexCounts: array[0..1] of Integer;
// almacena la cantidad de vrtices
begin
{Definir un polgono en la regin}
PolyPoints[0] := Point(68, 80);
PolyPoints[1] := Point(76, 72);
PolyPoints[2] := Point(87, 80);
PolyPoints[3] := Point(86, 96);
PolyPoints[4] := Point(100, 96); PolyPoints[5] := Point(100, 160);
PolyPoints[6] := Point(68, 160);
{Definir otro polgono en la regin}
221
Figura 4-8:
Usando una
regin de
polgonos
mltiples
como zona
caliente
4
Captulo
222
Captulo 4
CreateRectRgn
Windows.Pas
Sintaxis
CreateRectRgn(
p1: Integer;
p2: Integer;
p3: Integer;
p4: Integer
): HRGN;
Descripcin
Esta funcin crea una regin rectangular basada en las coordenadas especificadas.
Cuando la regin deje de ser necesaria, deber ser eliminada llamando a la funcin
DeleteObject.
Parmetros
p1: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo,
en unidades del dispositivo.
p2: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo,
en unidades del dispositivo.
p3: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo,
en unidades del dispositivo.
p4: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo, en
unidades del dispositivo.
Vase adems
CreateRectRgnIndirect, CreateRoundRectRgn, DeleteObject
Ejemplo
Listado 4-8: Creando una regin rectangular
procedure TForm1.Button1Click(Sender: TObject);
var
RegionHandle: HRGN;
// almacena la regin rectangular
begin
{Inicializar la brocha del rea de dibujo}
Canvas.Brush.Style := bsCross;
Canvas.Brush.Color := clRed;
{Crear la regin rectangular}
RegionHandle := CreateRectRgn(10, 40, 175, 175);
223
{Dibujar la regin}
FillRgn(Canvas.Handle, RegionHandle, Canvas.Brush.Handle);
{Eliminar la regin}
DeleteObject(RegionHandle);
end;
Figura 4-9: La
regin
rectangular
CreateRectRgnIndirect
Windows.Pas
Sintaxis
{coordenadas de la regin rectangular}
{devuelve un manejador de regin}
Descripcin
Esta funcin crea una regin rectangular basada en las coordenadas del rectngulo
identificado por el parmetro p1. Cuando la regin deje de ser necesaria, deber ser
eliminada llamando a la funcin DeleteObject.
Parmetros
p1: Un registro TRect que contiene las coordenadas del rectngulo que define la regin,
en unidades del dispositivo.
Vase adems
CreateRectRgn, CreateRoundRectRgn, DeleteObject
Ejemplo
Listado 4-9: Creando indirectamente una regin rectangular
procedure TForm1.Button1Click(Sender: TObject);
var
4
Captulo
CreateRectRgnIndirect(
const p1: TRect
): HRGN;
224
Captulo 4
RegionHandle: HRGN;
// manejador de regin
begin
{Crear una regin rectangular del tamao del rea cliente del formulario}
RegionHandle := CreateRectRgnIndirect(Form1.ClientRect);
{Inicializar la brocha}
Canvas.Brush.Style := bsDiagCross;
Canvas.Brush.Color := clRed;
{Rellenar la regin rectangular}
FillRgn(Canvas.Handle, RegionHandle, Canvas.Brush.Handle);
{La regin ya no es necesaria y es eliminada}
DeleteObject(RegionHandle);
end;
Figura 4-10:
La regin
rectangular
CreateRoundRectRgn
Windows.Pas
Sintaxis
CreateRoundRectRgn(
p1: Integer;
p2: Integer;
p3: Integer;
p4: Integer;
p5: Integer;
p6: Integer
): HRGN;
Descripcin
Esta funcin crea una regin rectangular con esquinas redondeadas, basada en las
coordenadas especificadas. Cuando la regin deje de ser necesaria, debe ser eliminada
llamando a la funcin DeleteObject.
225
Parmetros
p1: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo,
en unidades del dispositivo.
p2: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo,
en unidades del dispositivo.
p3: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo,
en unidades del dispositivo.
p4: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo, en
unidades del dispositivo.
p5: Especifica el ancho de la elipse utilizada para definir las esquinas redondeadas del
rectngulo, en unidades del dispositivo.
p6: Especifica la altura de la elipse utilizada para definir las esquinas redondeadas del
rectngulo, en unidades del dispositivo.
Vase adems
CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, DeleteObject
4
Captulo
Ejemplo
226
Captulo 4
Figura 4-11:
La regin
rectangular
redondeada
EndPath
Windows.Pas
Sintaxis
EndPath(
DC: HDC
): BOOL;
Descripcin
Esta funcin cierra una definicin de ruta abierta. La ruta resultante es asociada con el
contexto de dispositivo identificado por el parmetro DC.
Parmetros
DC: Especifica el contexto de dispositivo que contendr la ruta resultante.
Vase adems
BeginPath
Ejemplo
Vea el Listado 4-19 bajo SelectClipPath y otros ejemplos a lo largo de este captulo.
EqualRect
Windows.Pas
Sintaxis
EqualRect(
const lprc1: TRect;
const lprc2: TRect
): BOOL;
227
Descripcin
Esta funcin determina si las coordenadas de dos rectngulos son idnticas.
Parmetros
lprc1: Puntero al primer registro TRect que contiene las coordenadas a comparar.
lprc2: Puntero al segundo registro TRect que contiene las coordenadas a comparar.
Vase adems
EqualRgn, IsRectEmpty, PtInRect
Ejemplo
Vea el Listado 4-16 bajo OffsetRect.
Windows.Pas
Sintaxis
EqualRgn(
p1: HRGN;
p2: HRGN
): BOOL;
Descripcin
Esta funcin determina si dos regiones son idnticas en tamao y forma, y residen en
las mismas coordenadas.
Parmetros
p1: Manejador de la primera regin a comparar.
p2: Manejador de la segunda regin a comparar.
4
Captulo
EqualRgn
228
Captulo 4
Vase adems
CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn,
CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn
Ejemplo
Listado 4-11: Comparando dos regiones
procedure TForm1.FormPaint(Sender: TObject);
var
Region1, Region2: HRGN; // almacena las regiones a comparar
begin
{Crear una regin elptica}
Region1 := CreateEllipticRgn(50, 50, 150, 150);
{Transformar la regin en una regin rectangular. Esta funcin puede ser
ejecutada sobre cualquier regin preexistente}
SetRectRgn(Region1, 50, 50, 150, 150);
{Crear una regin rectangular idntica a Region1}
Region2 := CreateRectRgn(50, 50, 150, 150);
{Rellenar ambas regiones de rojo}
Canvas.Brush.Color := clRed;
PaintRgn(Canvas.Handle, Region1);
PaintRgn(Canvas.Handle, Region2);
{Indicar que las regiones son idnticas}
if EqualRgn(Region1, Region2) then
Label1.Caption := 'Regions Equal'
else
Label1.Caption := 'Regions Not Equal';
{Eliminar ambas regiones, pues no son necesarias}
DeleteObject(Region1);
DeleteObject(Region2);
end;
ExcludeClipRect
Windows.Pas
Sintaxis
ExcludeClipRect(
DC: HDC;
p2: Integer;
p3: Integer;
p4: Integer;
p5: Integer
): Integer;
229
Descripcin
Esta funcin excluye el rectngulo definido por las coordenadas dadas de la regin de
recorte del contexto de dispositivo especificado. Los bordes superior e izquierdo del
rectngulo especificados son excluidos de la regin de recorte, pero no los bordes
inferior y derecho.
Parmetros
DC: Manejador del contexto de dispositivo que contiene la regin de recorte que ser
modificada.
p2: Especifica la coordenada horizontal de la esquina superior izquierda del rectngulo,
en unidades lgicas.
p3: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo,
en unidades lgicas.
p4: Especifica la coordenada horizontal de la esquina inferior derecha del rectngulo,
en unidades lgicas.
p5: Especifica la coordenada vertical de la esquina inferior derecha del rectngulo, en
unidades lgicas.
Vase adems
OffsetClipRgn, SetRect, SetRectRgn
Ejemplo
Listado 4-12: Dibujando una imagen de primer plano slo una vez
{Estructura del registro que define un punto que se mueve}
TDot = record
Pos: TPoint;
Vel: TPoint;
end;
var
Form1: TForm1;
Dots: array[0..9] of TDot;
Offscreen: TBitmap;
implementation
{$R *.DFM}
procedure TForm1.FormPaint(Sender: TObject);
begin
4
Captulo
Esta funcin devuelve un resultado que indica el tipo de regin creada o una condicin
de error y puede ser un valor de la Tabla 4-4.
230
Captulo 4
231
Offscreen.Canvas.Pixels[Dots[iCount].Pos.X+1,Dots[iCount].Pos.Y+1] := clRed;
end;
{El mapa de bits almacenado en Image1 ya ha sido dibujado sobre el formulario.
Esto se produce slo una vez, cuando el evento Paint se dispara, lo que
ocurre cuando el formulario es mostrado la primera vez o despus que sea
descubierto por una ventana de nivel superior. Debido a que no queremos destruir
esta imagen de primer plano, excluimos su rea rectangular de la regin de
recorte. Esto abrir un hueco en la regin de recorte, y cualquier intento de
dibujar en esta rea ser denegado}
ExcludeClipRect(Canvas.Handle, Image2.Left, Image2.Top,
Image2.Left + Image2.Width, Image2.Top + Image2.Height);
{Dibuja el mapa de bits fuera de pantalla en la pantalla. El hueco en la regin
de recorte evita que el mapa de bits sea dibujado sobre el mapa de bits de
primer plano}
Canvas.Draw(0, 0, Offscreen);
end;
Figura 4-12:
La imagen de
primer plano
no es afectada
durante la
animacin
continua
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un rectngulo.
Indica que ocurri un error.
ExtCreateRegion Windows.Pas
Sintaxis
ExtCreateRegion(
p1: PXForm;
p2: DWORD;
const p3: TRgnData
): HRGN;
Captulo
232
Captulo 4
Descripcin
Esta funcin crea una nueva regin aplicando la matriz de transformacin especificada
en el parmetro p1 a los datos de regin especificados en el parmetro p3. Tenga en
cuenta que bajo Windows 95/98, las transformaciones de corte (shearing) y rotacin no
estn soportadas y la funcin fallar si el registro indicado en el parmetro p1 contiene
otra cosa que no sean valores de escalamiento y traslacin.
Parmetros
p1: Puntero al registro TXForm que contiene una matriz de transformacin que es
aplicada a la regin identificada por el parmetro p3. Si este parmetro es nil, la
regin no es transformada en modo alguno. Consulte la Tabla 4-5, que describe cmo
los campos de este registro son usados en caso de diferentes transformaciones. El
registro TXForm se define de la siguiente forma:
TXForm = packed record
eM11: Single;
eM12: Single;
eM21: Single;
eM22: Single;
eDx: Single;
eDy: Single;
end;
233
Vase adems
CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn,
CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn,
GetRegionData
Ejemplo
Vea el Listado 4-6 bajo CreatePolygonRgn.
4
Captulo
234
Captulo 4
Corte
Reflexin
Valor eM11
Coseno del ngulo
de rotacin
Valor de
escalamiento
horizontal
Cero
Valor de reflexin
horizontal
Valor eM12
Seno del ngulo
de rotacin
Cero
Valor eM21
Seno negativo del
ngulo de rotacin
Cero
Valor eM22
Coseno del ngulo de
rotacin
Valor de escalamiento
vertical
Valor de
proporcionalidad
horizontal
Cero
Valor de
proporcionalidad
vertical
Cero
Cero
Valor de reflexin
vertical
ExtSelectClipRgn Windows.Pas
Sintaxis
ExtSelectClipRgn(
DC: HDC;
p2: HRGN;
p3: Integer
): Integer;
Descripcin
Esta funcin combina la regin de recorte del contexto de dispositivo identificado por
el parmetro DC, con la regin identificada por el parmetro p2, de acuerdo a la opcin
especificada en el parmetro p3. Se asume que las coordenadas de la regin
identificada por el parmetro p2 estn dadas en unidades del dispositivo. Esta funcin
crea una copia de la regin identificada por el parmetro p2; la regin original no es
afectada y puede ser utilizada en otras llamadas a funciones posteriores.
Parmetros
DC: Manejador del contexto de dispositivo que contiene la regin de recorte que ser
combinada con la regin especificada.
p2: Manejador de la regin que ser combinada con la regin de recorte del contexto de
dispositivo especificado.
p3: Opcin que indica cmo la regin de recorte del contexto de dispositivo y la regin
especificada sern combinadas. Este parmetro puede contener un valor de la Tabla
4-6.
235
Vase adems
GetClipBox, GetClipRgn, OffsetClipRgn, SelectClipPath, SelectClipRgn
Ejemplo
Vea el Listado 4-15 bajo OffsetClipRgn.
Tabla 4-6: Valores del parmetro p3 de ExtSelectClipRgn
RGN_DIFF
RGN_OR
RGN_XOR
Descripcin
La regin resultante es la interseccin de las dos regiones especificadas.
La regin resultante es una copia de la regin identificada por el
parmetro p2. Si se especifica esta opcin y el parmetro p2 es igual a
cero, la regin de recorte actual es reinicializada a la regin de recorte
por defecto para el contexto de dispositivo especificado.
La regin resultante es el rea de la regin identificada por el parmetro
p2 que no forma parte de la regin actualmente recortada.
La regin resultante es la unin de las dos regiones especificadas.
La regin resultante es la unin de las dos reas especificadas,
excluyendo las reas comunes a ambas.
FlattenPath
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un rectngulo.
Indica que ha ocurrido un error.
Windows.Pas
Sintaxis
FlattenPath(
DC: HDC
): BOOL;
Descripcin
Esta funcin convierte cualquier curva ubicada en la ruta seleccionada en el contexto
de dispositivo especificado en una serie de segmentos de lnea recta.
4
Captulo
Valor
RGN_AND
RGN_COPY
236
Captulo 4
Parmetros
DC: Manejador del contexto de dispositivo que contiene la ruta que ser convertida en
segmentos de lneas.
Vase adems
GetPath, PathToRegion, WidenPath
Ejemplo
Vea el Listado 4-13 bajo GetPath.
GetClipBox
Windows.Pas
Sintaxis
GetClipBox(
DC: HDC;
var Rect: TRect
): Integer;
Descripcin
Esta funcin recupera las coordenadas del rectngulo ms pequeo que puede ser
dibujado alrededor del rea actualmente visible en el contexto de dispositivo
identificado por el parmetro DC.
Parmetros
DC: Manejador del contexto de dispositivo cuyo rectngulo lmite del rea visible ser
recuperado.
Rect: Puntero a un registro TRect que recibe las coordenadas del rectngulo ms
pequeo que engloba el rea visible del contexto de dispositivo especificado, en
unidades lgicas.
Vase adems
ExtSelectClipRgn, GetClipRgn, GetRgnBox, OffsetClipRgn, SelectClipPath,
SelectClipRgn
237
Ejemplo
Vea el Listado 4-4 bajo CombineRgn.
Tabla 4-8: Valores que devuelve GetClipBox
Valor
NULLREGION
SIMPLEREGION
COMPLEXREGION
ERROR
GetClipRgn
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un rectngulo.
Indica que ha ocurrido un error.
Windows.Pas
Sintaxis
GetClipRgn(
DC: HDC;
rgn: HRGN
): Integer;
Descripcin
Parmetros
DC: Especifica un manejador del contexto de dispositivo que contiene la regin de
recorte definida por la aplicacin que ser recuperada.
rgn: Especifica un manejador de una regin preexistente. Este manejador identificar
una copia de la regin de recorte definida por la aplicacin cuando la funcin retorne.
Cualquier cambio en esta regin copiada no afectar a la regin de recorte actual.
Vase adems
GetClipBox, GetRgnBox, SelectClipRgn
Ejemplo
Vea el Listado 4-6 bajo CreatePolygonRgn.
4
Captulo
238
Captulo 4
GetPath
Windows.Pas
Sintaxis
GetPath(
DC: HDC;
var Points;
var Types;
nSize: Integer
): Integer;
Descripcin
Esta funcin recupera las coordenadas y tipos de vrtices de los puntos de terminacin
de los segmentos de lnea y los puntos de control de las curvas de Bzier, que definen
la ruta en el contexto de dispositivo especificado. Los puntos de terminacin y puntos
de control de la ruta son almacenados en el array de registros TPoint al que apunta el
parmetro Points, y los tipos de vrtices son almacenados en el array de bytes al que
apunta el parmetro Types.
Parmetros
DC: Manejador del contexto de dispositivo que contiene la ruta cuyos puntos y tipos de
vrtices sern recuperados.
Points: Puntero a un array de registros TPoint reservado por la aplicacin, que recibir
los puntos de terminacin de las lneas y los puntos de control de las curvas de la ruta.
Estas coordenadas estarn especificadas en unidades lgicas.
Types: Puntero a un array de bytes reservado por la aplicacin, donde cada entrada
recibir un valor que indica el tipo de vrtice correspondiente. Deber existir un
elemento en este array por cada elemento del array al que apunta el parmetro Points.
Los posibles valores que tomar este array se muestran en la Tabla 4-9.
nSize: Especifica el nmero total de elementos de los arrays a los que apuntan los
parmetros Points y Types. Si a estos parmetros se les asigna cero, la funcin
devolver la cantidad total de entradas que se requieren para almacenar todos los
puntos que definen la ruta.
Vase adems
BeginPath, EndPath, FlattenPath, PathToRegion, WidenPath
239
Ejemplo
Listado 4-13: Recuperando los puntos que definen una curva aplanada
procedure TForm1.Button1Click(Sender: TObject);
type
TPointsArray = array[0..0] of TPoint;
// array para los vrtices
TTypesArray = array[0..0] of Byte;
// array para los tipos de vrtices
var
CurvePts: array[0..3] of TPoint;
// array de puntos que definen la curva
Points: ^TPointsArray;
// puntero a un array de puntos
Types: ^TTypesArray;
// puntero a un array de bytes
PtCount: Integer;
// el nmero de puntos en la ruta
iCount: Integer;
// variable de control de bucle general
FormDC: HDC;
// un manejador del DC del formulario
ThePen, OldPen: HPEN;
// manejadores de plumas
InfoString: String;
// una cadena que describe un punto
begin
{Define puntos utilizados para dibujar una curva de Bzier}
CurvePts[0] := Point(30, 80);
CurvePts[1] := Point(55, 30);
CurvePts[2] := Point(105, 30);
CurvePts[3] := Point(130, 80);
{Recupera un manejador del contexto de dispositivo del formulario}
FormDC := GetDC(Form1.Handle);
4
Captulo
240
Captulo 4
PT_CLOSEFIGURE) of
InfoString+' Type: MoveTo';
InfoString+' Type: LineTo';
InfoString+' Type: BezierTo';
Figura 4-13:
Los puntos
finales del
segmento de
lnea de una
curva plana
241
PT_CLOSEFIGURE
GetRegionData
Descripcin
En el punto asociado comienza una nueva figura.
El punto asociado y el punto previo forman un segmento de
lnea.
El punto asociado es un punto de control o de terminacin
para una curva de Bzier. El punto que precede al primer
punto PT_BEZIERTO es el punto de inicio para la curva de
Bzier. Los siguientes dos puntos PT_BEZIERTO son los
puntos de control para la curva. Estos sern seguidos por otro
punto PT_BEZIERTO que identifica el punto de terminacin
de la curva de Bzier, si una fue especificada.
Este valor puede ser combinado con las opciones
PT_LINETO o PT_BEZIERTO mediante el operador
booleano or, e indica el ltimo punto en una figura cerrada.
Windows.Pas
Sintaxis
{manejador de la regin}
{tamao del buffer de datos de la regin}
{puntero a un registro TRgnData}
{si tiene xito, devuelve 1}
Descripcin
Esta funcin recupera informacin sobre la regin identificada por el parmetro RGN;
esencialmente, se trata de informacin concerniente al rectngulo que define la regin.
Esta informacin es almacenada en el registro de longitud variable al que apunta el
parmetro p3.
Parmetros
RGN: Un manejador de la regin cuya informacin se desea recuperar.
p2: Especifica el tamao del registro de datos al que apunta el parmetro p3, en bytes.
Si este valor no es lo suficientemente grande para almacenar los datos de la regin, la
funcin devuelve el tamao requerido del buffer, en bytes.
p3: Puntero al registro TRgnData que recibir la informacin sobre la regin
especificada. El registro TRgnData es un registro de longitud variable para el cual la
aplicacin debe reservar memoria. Si a este parmetro se le asigna nil, la funcin
devuelve el tamao de buffer necesario para almacenar los datos de la regin (en
bytes). El registro TRgnData se define como:
4
Captulo
GetRegionData(
RGN: HRGN;
p2: DWORD;
p3: PRgnData
): DWORD;
242
Captulo 4
TRgnData = record
rdh: TRgnDataHeader;
Buffer: array[0..0] of CHAR;
end;
{informacin de la regin}
{array de rectngulos}
Vase adems
ExtCreateRegion, GetClipRgn
Ejemplo
Vea el Listado 4-6 bajo CreatePolygonRgn.
GetRgnBox
Windows.Pas
Sintaxis
GetRgnBox(
RGN: HRGN;
var p2: TRect
): Integer;
Descripcin
Esta funcin recupera las coordenadas del rectngulo ms pequeo que puede ser
dibujado alrededor de la regin especificada.
Parmetros
RGN: Un manejador de la regin cuyo rectngulo lmite se desea recuperar.
p2: Puntero a un registro TRect que recibir las coordenadas del rectngulo ms
pequeo que circunda la regin especificada, en unidades lgicas.
Vase adems
GetClipBox, GetClipRgn, GetRegionData
Ejemplo
Vea el Listado 4-17 bajo OffsetRgn y el Listado 4-18 bajo PathToRegion.
243
InflateRect
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un rectngulo.
Indica que ocurri un error.
Windows.Pas
Sintaxis
InflateRect(
var lprc: TRect;
dx: Integer;
dy: Integer
): BOOL;
Descripcin
Esta funcin modifica el tamao del rectngulo identificado por el parmetro lprc,
aadiendo el valor del parmetro dx a los lados izquierdo y derecho, y el valor del
parmetro dy a los lados superior e inferior.
lprc: Puntero a un registro TRect que contiene el rectngulo que ser incrementado o
decrementado en tamao.
dx: Especifica la cantidad en la cual incrementar o decrementar el ancho del rectngulo.
Un valor positivo incrementa el ancho; un valor negativo lo decrementa.
dy: Especifica la cantidad en la cual incrementar o decrementar la altura del
rectngulo. Un valor positivo incrementa la altura; un valor negativo la decrementa.
Vase adems
CopyRect, IntersectRect, OffsetRect, PtInRect, SetRect, UnionRect
Ejemplo
Vea el Listado 4-16 bajo OffsetRect.
4
Captulo
Parmetros
244
Captulo 4
IntersectRect
Windows.Pas
Sintaxis
IntersectRect(
var lprcDst: TRect;
const lprcSrc1: TRect;
const lprcSrc2: TRect
): BOOL;
Descripcin
Esta funcin determina la interseccin entre los rectngulos identificados por los
parmetros lprcSrc1 y lprcSrc2. Las coordenadas del rectngulo interseccin son
almacenadas en el registro TRect al que apunta el parmetro lprcDst. Si los rectngulos
no se intersectan, las coordenadas del parmetro lprcDst sern puestas a cero.
Parmetros
lprcDst: Puntero a un registro TRect que recibe las coordenadas de la interseccin entre
dos rectngulos identificados por los parmetros lprcSrc1 y lprcSrc2.
lprcSrc1: Puntero al registro TRect que contiene las coordenadas del primer rectngulo.
lprcSrc2: Puntero al registro TRect que contiene las coordenadas del segundo
rectngulo.
Vase adems
InflateRect, OffsetRect, PtInRect, SetRect, UnionRect
Ejemplo
Vea el Listado 4-16 bajo OffsetRect.
InvertRect
Windows.Pas
Sintaxis
InvertRect(
hDC: HDC;
const lprc: TRect
): BOOL;
245
Descripcin
Esta funcin ejecuta una operacin booleana not sobre el valor del color de cada pxel
del contexto de dispositivo especificado que cae dentro del rea rectangular definida
por el rectngulo al que apunta el parmetro lprc.
Parmetros
hDC: Un manejador del contexto de dispositivo que contiene los pxeles cuyos colores
sern invertidos.
lprc: Puntero a un registro TRect que contiene las coordenadas del rea rectangular que
ser invertida, en unidades lgicas.
Vase adems
FillRect, InvertRgn, SetRect
Ejemplo
Listado 4-14: Invirtiendo una porcin rectangular de una imagen
Figura 4-14:
El rea
rectangular
invertida
4
Captulo
246
Captulo 4
InvertRgn
Windows.Pas
Sintaxis
InvertRgn(
DC: HDC;
p2: HRGN
): BOOL;
Descripcin
Esta funcin ejecuta una operacin booleana not sobre el valor del color de cada pxel
del contexto de dispositivo DC que cae dentro de la regin identificada por el
parmetro p2.
Parmetros
DC: Un manejador del contexto de dispositivo que contiene los colores de los pxeles
que sern invertidos.
p2: Un manejador de la regin que define el rea que ser invertida. Se asume que las
coordenadas de esta regin estn en unidades lgicas.
Vase adems
FillRgn, InvertRect, PaintRgn
Ejemplo
Vea el Listado 4-7 bajo CreatePolyPolygonRgn.
IsRectEmpty
Windows.Pas
Sintaxis
IsRectEmpty(
const lprc: TRect
): BOOL;
Descripcin
Esta funcin determina si el rectngulo especificado est vaco. Un rectngulo se
considera vaco si su lado inferior es menor o igual que su lado superior, o si su lado
derecho es menor o igual que su lado izquierdo.
247
Parmetros
lprc: Un puntero al registro TRect que ser comprobado. Las coordenadas de este
rectngulo estn en unidades lgicas.
Vase adems
EqualRect, PtInRect, SetRect, SetRectEmpty, SetRectRgn
Ejemplo
Vea el Listado 4-21 bajo SetRectEmpty.
OffsetClipRgn
Windows.Pas
Sintaxis
{manejador de un contexto de dispositivo}
{desplazamiento horizontal}
{desplazamiento vertical}
{devuelve el tipo de regin}
Descripcin
Esta funcin mueve la regin de recorte del contexto de dispositivo especificado en las
cantidades horizontal y vertical dadas en los parmetros p2 y p3.
Parmetros
DC: Un manejador del contexto de dispositivo que contiene la regin de recorte que
ser movida.
p2: Especifica el desplazamiento horizontal en que ser movida la regin de recorte, en
unidades lgicas.
p3: Especifica el desplazamiento vertical en que ser movida la regin de recorte, en
unidades lgicas.
Vase adems
OffsetRgn, SelectClipRgn
4
Captulo
OffsetClipRgn(
DC: HDC;
p2: Integer;
p3: Integer
): Integer;
248
Captulo 4
Ejemplo
Listado 4-15: Ejecutando efectos especiales de animacin al mover la regin de recorte
var
Form1: TForm1;
MovingRgn: HRGN;
XPos, YPos, XVel, YVel: Integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crea una pequea regin circular que ser usada como regin de recorte}
MovingRgn := CreateEllipticRgn(0, 0, 75, 75);
{Inicializa la posicin y velocidad de la regin}
XPos := 1;
YPos := 1;
XVel := 1;
YVel := 1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
TempBitmap: TBitmap;
// almacena un mapa de bits fuera de la pantalla
begin
{Crea el mapa de bits fuera de la pantalla e inicializa su tamao con el del
TImage invisible. Este mapa de bits fuera de la pantalla es usado para eliminar
el parpadeo}
TempBitmap := TBitmap.Create;
TempBitmap.Width := Image1.Width;
TempBitmap.Height := Image1.Height;
{Incrementa la posicin de la regin segn la velocidad}
Inc(XPos, XVel);
Inc(YPos, YVel);
{Si la regin ha llegado al borde de la pantalla, invertir la velocidad}
if (Xpos < 0) or (Xpos > ClientRect.Right-75) then
XVel := 0-XVel;
if (Ypos < 0) or (Ypos > ClientRect.Bottom-75) then
YVel := 0-YVel;
{Selecciona una regin circular en el contexto de dispositivo del mapa de bits
fuera de pantalla que indica que debe aplicrsele un AND con la regin actual
de recorte del mapa de bits}
ExtSelectClipRgn(TempBitmap.Canvas.Handle, MovingRgn, RGN_AND);
{Mueve la regin de recorte a la posicion que est siendo seguida}
OffsetClipRgn(TempBitmap.Canvas.Handle, XPos, YPos);
249
Figura 4-15:
La regin de
recorte
desplazada
Descripcin
Indica una regin vacia.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un
rectngulo.
Indica que ha ocurrido un error.
ERROR
OffsetRect
Windows.Pas
Sintaxis
OffsetRect(
var lprc: TRect;
dx: Integer;
dy: Integer
): BOOL;
Captulo
250
Captulo 4
Descripcin
Esta funcin mueve el rectngulo especificado horizontal y verticalmente en las
cantidades indicadas por los parmetros dx y dy.
Parmetros
lprc: Puntero a un registro TRect que contiene las coordenadas del rectngulo que ser
desplazado, en unidades lgicas.
dx: Especifica el desplazamiento horizontal en el que ser movido el rectngulo, en
unidades lgicas.
dy: Especifica el desplazamiento vertical en el que ser movido el rectngulo, en
unidades lgicas.
Vase adems
CopyRect, InflateRect, IntersectRect, OffsetRgn, SubtractRect, UnionRect
Ejemplo
Listado 4-16: Una demostracion de varias funciones de manipulacin de rectngulos
var
Form1: TForm1;
Rect1, Rect2: TRect;
DragRect: PRect;
DraggingRect: Boolean;
MouseOffsetX, MouseOffsetY: Integer;
//
//
//
//
//
//
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Inicializa los dos rectngulos que sern comprobados}
SetRect(Rect1, 10, 30, 110, 130);
SetRect(Rect2, 60, 80, 160, 180);
{Inicializa el indicador de que el arrastre est ocurriendo}
DraggingRect := FALSE;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
251
4
Captulo
252
Captulo 4
253
Figura 4-16:
La prueba de
la funcin
Rectangle
Windows.Pas
Sintaxis
OffsetRgn(
RGN: HRGN;
p2: Integer;
p3: Integer
): Integer;
{manejador de la regin}
{desplazamiento horizontal}
{desplazamiento vertical}
{devuelve el tipo de regin}
Descripcin
Esta funcin mueve la regin especificada en las cantidades indicadas en los
parmetros p2 y p3.
Parmetros
RGN: Un manejador de la regin que ser movida.
p2: Especifica el desplazamiento horizontal en que ser movida la regin, en unidades
lgicas.
p3: Especifica el desplazamiento vertical en que ser movida la regin, en unidades
lgicas.
4
Captulo
OffsetRgn
254
Captulo 4
Vase adems
EqualRgn, OffsetClipRgn, OffsetRect
Ejemplo
Listado 4-17: Moviendo una regin para producir efectos especiales de animacin
var
Form1: TForm1;
MovingRgn: HRGN;
XVel, YVel: Integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crea una regin elptica}
MovingRgn := CreateEllipticRgn(0, 0, 75, 75);
{Inicializa la velocidad de movimiento}
XVel := 1;
YVel := 1;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
{Selecciona la regin circular como la regin de recorte para el formulario}
SelectClipRgn(Canvas.Handle, MovingRgn);
{Dibuja la imagen en el Timage oculto sobre el formulario. La regin de
recorte circular evita cualquier dibujo fuera de la regin circular}
Canvas.Draw(Image1.Left, Image1.Top, Image1.Picture.Bitmap);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
RegionBounds: TRect; // almacena el rectngulo lmite de la regin
begin
{Recupera el rectngulo ms pequeo que puede ser dibujado alrededor de la regin
circular}
GetRgnBox(MovingRgn, RegionBounds);
{El rectngulo lmite es usado para determinar si la regin circular ha
alcanzado los bordes de la pantalla. En ese caso, se invierte la velocidad}
if (RegionBounds.Left < 0) or (RegionBounds.Left > ClientRect.Right-75) then
XVel := 0-XVel;
if (RegionBounds.Top < 0) or (RegionBounds.Top > ClientRect.Bottom-75) then
YVel := 0-YVel;
{Mueve la regin a su velocidad actual}
OffsetRgn(MovingRgn, XVel, YVel);
255
Figura 4-17:
La regin en
movimiento
PathToRegion
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un rectngulo.
Indica que ha ocurrido un error.
Windows.Pas
Sintaxis
PathToRegion(
DC: HDC
): HRGN;
Descripcin
Esta funcin convierte la ruta en el contexto de dispositivo especificado en una regin.
La ruta tiene que haber sido cerrada, y es descartada del contexto de dispositivo cuando
la funcin retorna. Cuando la regin ya no es necesaria, debe ser eliminada llamando a
la funcin DeleteObject.
Parmetros
DC: Un manejador del contexto de dispositivo que contiene la ruta cerrada que ser
convertida en una regin.
4
Captulo
Valor
NULLREGION
SIMPLEREGION
COMPLEXREGION
ERROR
256
Captulo 4
Vase adems
BeginPath, EndPath, GetPath
Ejemplo
Listado 4-18: Convirtiendo una ruta en una regin
var
Form1: TForm1;
TextRgn: HRGN;
YVel: Integer;
TempBitmap: TBitmap;
//
//
//
//
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Comienza una definicin de ruta para el contexto de dispositivo del formulario}
BeginPath(Canvas.Handle);
{Asigna al fondo un modo transparente. Esto es necesario porque la ruta
ser el rea interior del texto. Sin sto, la ruta queda definida como el
rea exterior del texto.}
SetBkMode(Canvas.Handle, TRANSPARENT);
{Salida de una palabra al formulario. Esto es capturado como parte de la ruta.
Observe que a la fuente del formulario se le ha asignado un tamao 48 Arial}
TextOut(Canvas.Handle, 1, 1, 'DELPHI', Length('DELPHI'));
{Termina la definicin de ruta}
EndPath(Canvas.Handle);
{Convierte la ruta en una regin. Observe que sto descarta la ruta en el
contexto de dispositivo}
TextRgn := PathToRegion(Canvas.Handle);
257
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
RegionBounds: TRect;
// almacena el rectngulo lmite de la regin
begin
{Recupera el rectngulo lmite de la regin}
GetRgnBox(TextRgn, RegionBounds);
{Si la regin est en el borde superior o inferior del formulario, se invierte su
velocidad}
if (RegionBounds.Top < 0) or (RegionBounds.Top > ClientRect.Bottom (RegionBounds.Bottom - RegionBounds.Top)) then
YVel := 0-YVel;
{Desplaza la regin verticalmente de acuerdo a su velocidad}
OffsetRgn(TextRgn, 0, YVel);
{Dibuja el grfico en la imagen invisible al mapa de bits fuera de la pantalla}
TempBitmap.Canvas.Draw(0, 0, Image1.Picture.Bitmap);
{Invierte el rea dentro de la regin de texto}
InvertRgn(TempBitmap.Canvas.Handle, TextRgn);
{Copia el mapa de bits fuera de pantalla en el formulario, sin parpadeo}
Canvas.Draw(0, 0, TempBitmap);
end;
Figura 4-18:
La ruta
convertida
PtInRect
Windows.Pas
Sintaxis
PtInRect(
const lprc: TRect;
4
Captulo
258
Captulo 4
pt: TPoint
): BOOL;
Descripcin
Esta funcin determina si el punto identificado por el parmetro pt se encuentra dentro
del rectngulo al que apunta el parmetro lprc. El punto es considerado externo al
rectngulo si se encuentra exactamente sobre el borde inferior o sobre el derecho del
rectngulo.
Parmetros
lprc: Puntero a un registro TRect que contiene las coordenadas del rectngulo.
pt: Puntero a un registro TPoint que contiene el punto que ser comprobado.
Vase adems
EqualRect, IsRectEmpty, PtInRegion, PtVisible, RectInRegion, SetRect
Ejemplo
Vea el Listado 4-16 bajo OffsetRect.
PtInRegion
Windows.Pas
Sintaxis
PtInRegion(
RGN: HRGN;
p2: Integer;
p3: Integer
): BOOL;
Descripcin
Esta funcin determina si el punto identificado por los parmetros p2 y p3 se
encuentra dentro de la regin especificada en el parmetro RGN.
Parmetros
RGN: Un manejador de la regin en la que el punto ser comprobado.
p2: Especifica la coordenada horizontal del punto que ser comprobado.
p3: Especifica la coordenada vertical del punto que ser comprobado.
259
Vase adems
PtInRect, PtVisible, RectInRegion
Ejemplo
Vea el Listado 4-7 bajo CreatePolyPolygonRgn.
PtVisible
Windows.Pas
Sintaxis
PtVisible(
DC: HDC;
p2: Integer;
p3: Integer
): BOOL;
Descripcin
Parmetros
DC: Un manejador del contexto de dispositivo que contiene la regin de recorte en la
que el punto ser comprobado.
p2: Especifica la coordenada horizontal del punto que ser comprobado.
p3: Especifica la coordenada vertical del punto que ser comprobado.
Vase adems
PtInRect, PtInRegion, RectInRegion, RectVisible
Ejemplo
Vea el Listado 4-6 bajo CreatePolygonRgn.
4
Captulo
260
Captulo 4
RectInRegion
Windows.Pas
Sintaxis
RectInRegion(
RGN: HRGN;
const p2: TRect
): BOOL;
Descripcin
Esta funcin determina si alguna porcin del rectngulo al que apunta el parmetro p2
se encuentra dentro de la regin identificada por el parmetro RGN. Observe que los
lados inferior y derecho del rectngulo son excluidos de la comparacin.
Parmetros
RGN: Un manejador de la regin en la que el rectngulo ser comprobado.
p2: Puntero a un registro TRect que contiene las coordenadas del rectngulo a
comprobar.
Vase adems
PtInRect, PtInRegion, PtVisible, RectVisible, SelectClipRegion
Ejemplo
Vea el Listado 4-20 bajo SelectClipRgn.
RectVisible
Windows.Pas
Sintaxis
RectVisible(
DC: HDC;
const Rect: TRect
): BOOL;
Descripcin
Esta funcin determina si alguna porcin del rectngulo al que apunta el parmetro
Rect se encuentra dentro de la regin de recorte del contexto de dispositivo identificado
por el parmetro DC.
261
Parmetros
DC: Un manejador del contexto de dispositivo que contiene la regin de recorte en la
que el rectngulo ser comprobado.
Rect: Puntero a un registro TRect que contiene las coordenadas del rectngulo a
comprobar.
Vase adems
GetClipRgn, PtInRegion, PtVisible, RectInRegion, SelectClipRgn
Ejemplo
Vea el Listado 4-20 bajo SelectClipRgn.
SelectClipPath
Windows.Pas
Sintaxis
{manejador de un contexto de dispositivo}
{modo de combinacin de regin}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin selecciona la ruta actual en el contexto de dispositivo especificado como
la regin de recorte del contexto de dispositivo, combinndola con la regin de recorte
actual de acuerdo a las opciones especificadas en el parmetro Mode.
Parmetros
DC: Un manejador del contexto de dispositivo que contiene la ruta que ser usada
como regin de recorte. Tiene que ser una ruta cerrada.
Mode: Opcin que indica cmo la regin de recorte formada por la ruta ser combinada
con la regin de recorte actual del contexto de dispositivo. Este parmetro puede
contener un valor de la Tabla 4-13.
4
Captulo
SelectClipPath(
DC: HDC;
Mode: Integer
): BOOL;
262
Captulo 4
Vase adems
BeginPath, EndPath, PathToRegion, SelectClipRgn
Ejemplo
Listado 4-19: Creando efectos de texto especiales
var
Form1: TForm1;
ThePalette: HPalette;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
NewPalette: PLogPalette;
// puntero a informacin de la paleta lgica
iCount: Integer;
// contador de bucle general
begin
{Inicializa la fuente del formulario}
Font.Name := 'Arial';
Font.Size := 48;
{Asigna memoria suficiente para crear una paleta de 75 entradas}
GetMem(NewPalette, SizeOf(TLogPalette)+75*SizeOf(TPaletteEntry));
{Inicializa informacin especfica de la paleta}
NewPalette^.palVersion := $300;
NewPalette^.palNumEntries := 75;
{Recupera las primeras diez entradas de la paleta del sistema}
GetSystemPaletteEntries(Form1.Canvas.Handle, 0, 10, NewPalette^.palPalEntry);
{Crea una paleta de gradiente para las entradas restantes}
for iCount := 10 to 74 do
begin
NewPalette^.palPalEntry[iCount].peRed
:= 255;
NewPalette^.palPalEntry[iCount].peGreen := ((256 div 64) * (iCount-10));
NewPalette^.palPalEntry[iCount].peBlue := 0;
NewPalette^.palPalEntry[iCount].peFlags := PC_NOCOLLAPSE;
end;
{Crea una nueva paleta}
ThePalette := CreatePalette(NewPalette^);
{Libera la memoria reservada para la informacin de la paleta lgica}
FreeMem(NewPalette);
end;
{Dibuja lneas radiales gradientes, cuyo origen es el centro del texto}
procedure TForm1.DrawRadial;
var
iCount: Integer;
//
RayOrigin: TPoint;
//
Radius: Integer;
//
NewPen, OldPen: HPen;
//
begin
{Comienza una definicin de
formulario}
BeginPath(Canvas.Handle);
263
4
Captulo
{El radio del crculo dentro del cual las lneas sern dibujadas ser igual a la
longitud del texto}
Radius := Canvas.TextWidth('Delphi Rocks!');
264
Captulo 4
265
Captulo
4
Figura 4-19:
Usando rutas
para crear
efectos de
texto
especiales
Descripcin
La regin resultante es la interseccin de la regin de recorte
actual y la ruta.
La regin resultante es la ruta.
La regin resultante es el rea de la regin de recorte actual que
no est en el rea de la ruta.
La regin resultante es la unin de la regin de recorte actual y
la ruta.
266
Captulo 4
RGN_XOR
SelectClipRgn
Windows.Pas
Sintaxis
SelectClipRgn(
DC: HDC;
p2: HRGN
): Integer;
Descripcin
Esta funcin selecciona la regin identificada por el parmetro p2 como la regin de
recorte para el contexto de dispositivo especificado.
Parmetros
DC: Un manejador del contexto de dispositivo cuya regin de recorte ser
seleccionada.
p2: Un manejador de la regin que ser seleccionada como la regin de recorte del
contexto de dispositivo especificado. Esta funcin usa una copia de la regin; la regin
original no se ve afectada y puede utilizarse en otras funciones. Se asume que las
coordenadas estn en unidades del dispositivo. Si a este parmetro se le asigna cero, la
regin de recorte actual del contexto de dispositivo es eliminada.
Vase adems
ExtSelectClipRgn, GetClipRgn, OffsetClipRgn, SelectClipPath
Ejemplo
Listado 4-20: Dibujando sobre una regin de recorte
var
Form1: TForm1;
ClippingRegion: HRGN;
DraggingRect: Boolean;
TheRect: TRect;
MouseOffsetX,
MouseOffsetY: Integer;
implementation
{$R *.DFM}
//
//
//
//
//
267
4
Captulo
268
Captulo 4
begin
{Si una operacin de arrastre est ocurriendo...}
if DraggingRect then
begin
{...borra el rea de dibujo del formulario}
Form1.Canvas.Brush.Color := clBtnFace;
Form1.Canvas.FillRect(TheRect);
{Mueve el rectngulo arrastrado, desplazndolo a partir de la posicin actual
del ratn para que se mantenga el lugar original donde se hizo clic dentro
del rectngulo}
OffsetRect(TheRect, X - TheRect.Left - MouseOffsetX,
Y - TheRect.Top - MouseOffsetY);
{Inicializa la barra de ttulo del formulario}
Caption := 'SelectClipRgn Example - ';
{Indica si el rectngulo est dentro la regin elptica}
if RectInRegion(ClippingRegion, TheRect) then
Caption := Caption+'Rect In Regin - '
else
Caption := Caption+'Rect Not In Regin - ';
{Redibuja el formulario para mostrar los cambios}
Form1.Repaint;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
{Indicar que la operacin de arrastre se ha detenido}
DraggingRect := FALSE;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{La regin ya no es necesaria y se elimina}
DeleteObject(ClippingRegion);
end;
Figura 4-20:
La regin de
recorte
269
Descripcin
Indica una regin vaca.
Indica una regin rectangular simple.
Indica una regin que consta de ms de un
rectngulo.
Indica que ha ocurrido un error.
ERROR
SetRect
Windows.Pas
Sintaxis
SetRect(
var lprc: TRect;
xLeft: Integer;
yTop: Integer;
xRight: Integer;
yBottom: Intege
): BOOL;
Descripcin
Parmetros
lprc: Un puntero a un registro TRect cuyas coordenadas sern seleccionadas.
xLeft: Especifica la coordenada horizontal de la esquina superior izquierda del
rectngulo.
yTop: Especifica la coordenada vertical de la esquina superior izquierda del rectngulo.
xRight: Especifica la coordenada horizontal de la esquina inferior derecha del
rectngulo.
yBottom: Especifica la coordenada vertical de la esquina inferior derecha del
rectngulo.
Vase adems
CopyRect, IntersectRect, SetRectEmpty, SetRectRgn, SubtractRect, UnionRect
4
Captulo
Esta funcin asigna a las coordenadas del rectngulo al que apunta el parmetro lprc
las coordenadas especificadas.
270
Captulo 4
Ejemplo
Vea el Listado 4-20 bajo SelectClipRgn, y otros ejemplos a lo largo este captulo.
SetRectEmpty
Windows.Pas
Sintaxis
SetRectEmpty(
var lprc: TRect
): BOOL;
Descripcin
Esta funcin pone a cero todas las coordenadas del rectngulo especificado.
Parmetros
lprc: Puntero a un registro TRect cuyas coordenadas sern puestas a cero.
Vase adems
CopyRect, IntersectRect, SetRect, SetRectRgn, SubtractRect, UnionRect
Ejemplo
Listado 4-21: Vaciando un rectngulo
var
Form1: TForm1;
TheRect: TRect;
// almacena un rectngulo
implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject);
begin
{Crea un nuevo rectngulo}
SetRect(TheRect, 8, 40, 169, 160);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
{Muestra el rectngulo}
Form1.Canvas.Brush.Color := clRed;
Form1.Canvas.FillRect(TheRect);
271
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{Vaca el rectngulo}
SetRectEmpty(TheRect);
{Indica si el rectngulo est vaco}
if IsRectEmpty(TheRect) then
Button1.Caption := 'Rectangle is empty'
else
Button1.Caption := 'Rectangle is not empty';
{Redibuja el formulario para mostrar los cambios}
Form1.Repaint;
end;
SetRectRgn
Windows.Pas
Sintaxis
{manejador de una regin preexistente}
{coordenada horizontal superior izquierda}
{coordenada vertical superior izquierda}
{coordenada horizontal inferior derecha}
{coordenada vertical inferior derecha}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin convierte la regin identificada por el parmetro Rgn en una regin
rectangular situada en las coordenadas especificadas. Observe que los bordes inferior y
derecho del rectngulo son excluidos de la regin.
Parmetros
Rgn: Especifica un manejador de la regin que ser convertida en una regin
rectangular.
X1: Especifica la coordenada horizontal superior izquierda de la regin rectangular, en
unidades lgicas.
Y1: Especifica la coordenada vertical superior izquierda de la regin rectangular, en
unidades lgicas.
X2: Especifica la coordenada horizontal inferior derecha de la regin rectangular, en
unidades lgicas.
Y2: Especifica la coordenada vertical inferior derecha de la regin rectangular, en
unidades lgicas.
4
Captulo
SetRectRgn(
Rgn: HRgn;
X1: Integer;
Y1: Integer;
X2: Integer;
Y2: Integer
): BOOL;
272
Captulo 4
Vase adems
CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, SetRect
Ejemplo
Vea el Listado 4-11 bajo EqualRgn.
SetWindowRgn
Windows.Pas
Sintaxis
SetWindowRgn(
hWnd: HWND;
hRgn: HRGN;
bRedraw: BOOL
): BOOL;
Descripcin
Esta funcin asigna la regin de la ventana especificada a la regin identificada por el
parmetro hRgn. La regin de la ventana determina el rea dentro de la ventana donde
est permitido dibujar y Windows no permitir que se haga ningn dibujo fuera de la
regin de la ventana. Cuando esta funcin retorna, el sistema operativo es responsable
de la regin especificada y sta no debe ser usada por funciones subsiguientes. Esta
funcin es tpicamente usada para crear ventanas con una forma no rectangular.
Parmetros
hWnd: Un manejador de la ventana cuya regin ser asignada.
hRgn: Un manejador de la regin que ser usada como la regin de la ventana. Las
coordenadas de esta regin son relativas a la ventana, no al rea cliente. Si a este
parmetro se le asigna cero, la regin de la ventana es reiniciada a la regin por
defecto.
bRedraw: Indica si la ventana debe ser redibujada cuando la regin es asignada. Si a
este valor se le asigna TRUE la ventana es redibujada y los mensajes
WM_WINDOWPOSCHANGING y WM_WINDOWPOSCHANGED son enviados a la
ventana. Si se le asigna FALSE, la ventana no es redibujada.
273
Vase adems
CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn,
CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn,
ExtCreateRegion, ExtSelectClipRgn, SelectClipRgn
Ejemplo
Listado 4-22: Creando una ventana redonda para una aplicacin de un reloj analgico
var
Form1: TForm1;
OriginX, OriginY: Integer;
implementation
uses Math;
{$R *.DFM}
{Determina el centro del crculo. Se utiliza al dibujar los nmeros del reloj}
OriginX := (GetSystemMetrics(SM_CXBORDER) + 90) div 2;
OriginY := ((GetSystemMetrics(SM_CXBORDER) + 90) div 2) - 3;
{Asigna la regin de la ventana a una regin circular. Esto crear una ventana
redondeada}
SetWindowRgn(Handle, NewShape, TRUE);
end;
procedure TForm1.FormPaint(Sender: TObject);
var
iCount: Integer;
// variable de control de bucle general
Hour, Minute, Second, MilSec: Word;
// usado para decodificar el tiempo
begin
{Asigna el modo de fondo a transparente para dibujar texto}
SetBkMode(Canvas.Handle, TRANSPARENT);
{Dibuja un bisel resaltado}
Canvas.Pen.Color := clWhite;
Canvas.Pen.Width := 2;
Arc(Canvas.Handle, 1, 1, 98, 98, 98, 1, 1, 98);
{Dibuja un bisel opaco}
Canvas.Pen.Color := clBtnShadow;
4
Captulo
274
Captulo 4
275
Figura 4-21:
El reloj
analgico
SubtractRect
Windows.Pas
Sintaxis
SubtractRect(
var lprcDst: TRect;
const lprcSrc1: TRect;
const lprcSrc2: TRect
): BOOL;
Descripcin
Esta funcin sustrae las coordenadas del rectngulo al que apunta el parmetro
lprcSrc2, de las coordenadas del rectngulo al que apunta el parmetro lprcSrc1.
Observe que esta funcin tiene xito slo cuando los dos rectngulos se intersectan
completamente en uno de los dos ejes, horizontal o vertical.
Vase adems
EqualRect, IntersectRect, SetRect, UnionRect
Ejemplo
Listado 4-23: Sustrayendo un rectngulo de otro
procedure TForm1.FormPaint(Sender: TObject);
var
Rect1, Rect2, Subtract: TRect;
// almacena los rectngulos
begin
4
Captulo
Parmetros
276
Captulo 4
Figura 4-22:
El rectngulo
resultante
UnionRect
Windows.Pas
Sintaxis
UnionRect(
var lprcDst: TRect;
const lprcSrc1: TRect;
const lprcSrc2: TRect
): BOOL;
Descripcin
Esta funcin crea un rectngulo que es la unin de los rectngulos a los que apuntan los
parmetros lprcSrc1 y lprcSrc2.
277
Parmetros
lprcDst: Un puntero a un registro TRect que recibe las coordenadas resultantes de la
unin de los rectngulos a los que apuntan los parmetros lprcSrc1 y lprcSrc2.
lprcSrc1: Un puntero a un registro TRect que contiene uno de los rectngulos que ser
unido.
lprcSrc2: Un puntero a un registro TRect que contiene uno de los rectngulos que ser
unido.
Vase adems
EqualRect, InflateRect, IntersectRect, IsRectEmpty, SetRect, SetRectEmpty,
SubtractRect
Ejemplo
Vea el Listado 4-16 bajo OffsetRect.
Windows.Pas
Sintaxis
WidenPath(
DC: HDC
): BOOL;
Descripcin
Esta funcin ensancha la ruta contenida en el contexto de dispositivo especificado. La
nueva ruta se define como el rea que sera dibujada si la funcin StrokePath fuese
llamada usando la pluma actualmente seleccionada. Cualquier curva de Bzier que
defina una parte de la ruta es convertida a segmentos de lneas.
Parmetros
DC: Un manejador del contexto de dispositivo que contiene la ruta que ser
ensanchada.
4
Captulo
WidenPath
278
Captulo 4
Vase adems
BeginPath, CreatePen, EndPath, ExtCreatePen, FlattenPath, GetPath, PathToRegion,
SetMiterLimit
Ejemplo
Listado 4-24: Dibujando el contorno de un texto
procedure TForm1.FormPaint(Sender: TObject);
begin
{Comienza una definicin de ruta}
BeginPath(Canvas.Handle);
{Asigna el modo TRANSPARENT al fondo para que la ruta sea definida como el rea
dentro del texto}
SetBkMode(Canvas.Handle, TRANSPARENT);
{Dibuja algn texto. Observe que a la fuente del formulario se le asigna 48
Arial, negrita}
TextOut(Canvas.Handle, 20, 20, 'Delphi Rocks!', Length('Delphi Rocks!'));
{Termina la definicin de ruta}
EndPath(Canvas.Handle);
{Modifica la pluma para que sea de 4 pxeles de ancho}
Canvas.Pen.Width := 4;
{Ensancha la ruta definida por el texto. Debido al ancho de la pluma, el
ancho del contorno de las letras de la ruta es de 4 pxeles}
WidenPath(Canvas.Handle);
{Reinicia el ancho de la pluma y el color de la brocha para dibujar la ruta}
Canvas.Pen.Width := 1;
Canvas.Brush.Color := clRed;
{Asigna el modo de relleno para que la ruta sea rellenada correctamente}
SetPolyFillMode(Canvas.Handle, WINDING);
{Rellena la ruta con la brocha roja}
FillPath(Canvas.Handle);
end;
Figura 4-23:
El texto
delineado
279
Captulo 5
Mapas de bits
5
Captulo
Figura 5-1:
Un pxel es el
elemento ms
pequeo de
una imagen
Un mapa de bits es un array de bytes que almacena la informacin sobre el color de los
elementos de la imagen conocidos como pxeles. Un pxel es un pequeo cuadrado de
color que, cuando es visto en conjunto con los que lo rodean, conforma una imagen de
mapa de bits, como se ilustra en la Figura 5-1.
La cantidad de bits que son utilizados para describir un pxel individual puede variar
ampliamente, de acuerdo con la profundidad del color de la imagen. Los pxeles de una
280
Captulo 5
imagen de 16 colores pueden ser descritos con 4 bits por pxel; de esta manera, un byte
de memoria puede contener 2 pxeles de la imagen. Una imagen de 256 colores utiliza
1 byte para cada pxel y una imagen en color verdadero (16.7 millones de colores) usa
3 bytes para cada pxel. Vea la Tabla 5-6 bajo CreateDIBSection para ver una
descripcin completa de la profundidad de colores de los mapas de bits.
281
implementation
{$R *.DFM}
{Inicializa el rectngulo}
ScaleRect := Rect(X, Y, X, Y);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
{Si estamos arrastrando un rectngulo}
if IsDragging then
begin
{Dibuja sobre el rectngulo actual para borrarlo}
5
Captulo
282
Captulo 5
Canvas.Pen.Style := psSolid;
Canvas.Pen.Color := clBlack;
Canvas.Pen.Mode := pmNot;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(ScaleRect.Left, ScaleRect.Top, ScaleRect.Right,
ScaleRect.Bottom);
{Convierte las coordenadas del rectngulo dibujado a las nuevas coordenadas}
ScaleRect := Rect(ScaleRect.Left, ScaleRect.Top, X, Y);
{Dibuja el nuevo rectngulo}
Canvas.Rectangle(ScaleRect.Left, ScaleRect.Top, ScaleRect.Right,
ScaleRect.Bottom);
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Ratio: Real;
// almacena la relacin de compresin
begin
{Indica que el usuario no est arrastrando ya un rectngulo}
IsDragging := FALSE;
{Borra la ventana completa}
Canvas.Brush.Color := clBtnFace;
Canvas.Brush.Style := bsSolid;
Canvas.FillRect(Form1.ClientRect);
{Dibuja un rectngulo vaco en las actuales coordenadas del rectngulo}
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(ScaleRect.Left, ScaleRect.Top, ScaleRect.Right,
ScaleRect.Bottom);
{Selecciona la paleta de la imagen en el rea de dibujo del formulario
y la activa}
SelectPalette(Canvas.Handle, ScaledImage.Palette, FALSE);
RealizePalette(Canvas.Handle);
{Determina la relacin de aspecto apropiada}
if ScaleRect.Right - ScaleRect.Left < ScaleRect.Bottom - ScaleRect.Top then
Ratio := (ScaleRect.Right - ScaleRect.Left) / ScaledImage.Width
else
Ratio := (ScaleRect.Bottom - ScaleRect.Top) / ScaledImage.Height;
{Copia la imagen al rea de dibujo, centrada en el rectngulo y escalada de
manera que la relacin de aspecto es conservada}
StretchBlt(Canvas.Handle,
ScaleRect.Left + (((ScaleRect.Right - ScaleRect.Left) div 2) (Trunc(ScaledImage.Width * Ratio) div 2)),
ScaleRect.Top + (((ScaleRect.Bottom - ScaleRect.Top) div 2) (Trunc(ScaledImage.Height * Ratio) div 2)),
Trunc(ScaledImage.Width * Ratio),
Trunc(ScaledImage.Height * Ratio),
283
ScaledImage.Canvas.Handle, 0, 0,
ScaledImage.Width, ScaledImage.Height, SRCCOPY);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crea y carga la imagen que ser escalada}
ScaledImage := TBitmap.Create;
ScaledImage.LoadFromFile('Image9.bmp');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Libera la imagen del mapa de bits}
ScaledImage.Free;
end;
Figura 5-2: El
mapa de bits
escalado, con
la relacin de
aspecto
corregida
Ciertas operaciones de barrido pueden ser usadas para producir efectos especiales, tales
como la ilusin de transparencia. Para copiar un mapa de bits a un destino usando
operaciones de barrido, simulando el efecto de pxeles transparentes, la aplicacin debe
tener dos versiones del mapa de bits que ser copiado, conocidas como las mscaras
and y or. La imagen de la mscara and es una silueta monocromtica del mapa de bits
original. Los pxeles blancos indican dnde se mostrar el fondo (a travs de los
pxeles transparentes) y los pxeles negros indican dnde aparecer la imagen actual del
mapa de bits. La mscara or contiene la imagen real que ser copiada y en ella los
5
Captulo
284
Captulo 5
285
Figura 5-3: El
mapa de bits
copiado
transparentemente
// almacena un polgono
5
Captulo
286
Captulo 5
begin
{Reserva la memoria necesaria para el registro de informacin del mapa de bits}
GetMem(DibInfo, SizeOf(TBitmapInfo) + 256 * SizeOf(TRGBQuad));
{Inicializa la informacin del mapa de bits}
DibInfo^.bmiHeader.biWidth
:= 64;
// crea un DIB de 64 X 64 pxeles
DibInfo^.bmiHeader.biHeight
:= -64;
// orientado de arriba abajo
DibInfo^.bmiHeader.biPlanes
:= 1;
DibInfo^.bmiHeader.biBitCount
:= 8;
// 256 colores
DibInfo^.bmiHeader.biCompression
:= BI_RGB; // sin compresin
DibInfo^.bmiHeader.biSizeImage
:= 0;
// Windows determina el tamao
DibInfo^.bmiHeader.biXPelsPerMeter := 0;
DibInfo^.bmiHeader.biYPelsPerMeter := 0;
DibInfo^.bmiHeader.biClrUsed
:= 0;
DibInfo^.bmiHeader.biClrImportant := 0;
DibInfo^.bmiHeader.biSize
:= SizeOf(TBitmapInfoHeader);
{Recupera la paleta actual del sistema}
GetSystemPaletteEntries(Form1.Canvas.Handle, 0, 256, SystemPalette);
{La paleta del sistema es devuelta como un array de registros TPaletteEntry,
que almacena los colores de la paleta en la forma (Red, Green, Blue). Sin
embargo, el campo bmiColors del registro TBitmapInfo del registro requiere un
array de registros del tipo TRGBQuad, que almacena los colores de la paleta en
la forma (Blue, Green, Red). Debido a sto, debemos convertir los registros
TPaletteEntry en registros TRGBQuad para obtener los colores correctos.}
for iCount := 0 to 255 do
begin
DibInfo^.bmiColors[iCount].rgbBlue
:= SystemPalette[iCount].peBlue;
DibInfo^.bmiColors[iCount].rgbRed
:= SystemPalette[iCount].peRed;
DibInfo^.bmiColors[iCount].rgbGreen
:= SystemPalette[iCount].peGreen;
DibInfo^.bmiColors[iCount].rgbReserved := 0;
end;
{Crea un contexto de dispositivo basado en memoria}
ReferenceDC := CreateCompatibleDC(0);
{Crea un DIB sobre el contexto de dispositivo en memoria, a partir de la
informacin inicializada del mapa de bits}
Dib := CreateDIBSection(ReferenceDC, DibInfo^, DIB_RGB_COLORS,
Pointer(BitsPtr), 0, 0);
{Selecciona el DIB en el contexto de dispositivo}
OldBitmap := SelectObject(ReferenceDC, Dib);
{Crea un rea de dibujo y asigna su manejador del contexto de dispositivo creado}
ScratchCanvas := TCanvas.Create;
ScratchCanvas.Handle := ReferenceDC;
{Rellena el rea de dibujo con rojo}
ScratchCanvas.Brush.Color := clRed;
ScratchCanvas.FillRect(ScratchCanvas.ClipRect);
287
Figura 5-4: El
mapa de bits
independiente
del dispositivo
modificado
Metaficheros
Un metafichero es un formato grfico basado en vectores para el almacenamiento de
imgenes. La imagen es almacenada como una serie de instrucciones que describen
cmo dibujarla, en lugar de un array de pxeles que explcitamente describen la imagen
como un mapa de bits. Esto da a los metaficheros una cierta independencia de los
dispositivos ya que pueden ser mostrados en su tamao y resolucin original tanto en
una impresora como en una pantalla.
Especficamente, un metafichero es una coleccin de registros de metafichero que se
corresponden con llamadas a funciones del GDI para dibujar lneas y figuras, rellenar
Captulo
288
Captulo 5
Metaficheros mejorados
Las aplicaciones Win32 deben usar el formato de metafichero mejorado en lugar del
formato Win16 de metafichero. El formato de metafichero mejorado contiene un
encabezamiento que describe la resolucin y tamao originales para los cuales el
metafichero fue creado. Tambin almacena una paleta de colores para la imagen. El
formato de metafichero Win16 no incluye nada de esto. Observe que el metafichero
mejorado est sujeto a las limitaciones del GDI de Windows 95/98. Especficamente, el
GDI de Windows 95/98 slo soporta coordenadas con signo de 16 bits. Por esta razn,
cualquier registro de metafichero mejorado con coordenadas ms all del rango -32,768
a 32,767 fallar al tratar de ser mostrado. La clase TMetafile de la VCL de Delphi
encapsula ambos formatos, Win16 y metafichero mejorado.
Descripcin
Copia bits de un contexto de dispositivo a otro.
Cierra un contexto de dispositivo de metafichero
mejorado y devuelve un manejador del metafichero.
Crea un duplicado del metafichero mejorado.
Crea un duplicado de un icono, un mapa de bits o un
cursor.
Crea un mapa de bits dependiente del dispositivo.
Crea un mapa de bits dependiente del dispositivo a
partir de la informacin en un registro.
Crea un mapa de bits dependiente del dispositivo
compatible con un contexto de dispositivo especificado.
Funcin
CreateDIBitmap
CreateDIBSection
CreateEnhMetaFile
DeleteEnhMetaFile
EnumEnhMetaFile
GetBitmapBits
GetBitmapDimensionEx
GetDIBits
GetEnhMetaFile
GetEnhMetaFileDescription
GetEnhMetaFileHeader
GetStretchBltMode
LoadBitmap
LoadImage
PatBlt
PlayEnhMetaFile
PlayEnhMetaFileRecord
SetBitmapBits
SetBitmapDimensionEx
SetDIBits
SetDIBitsToDevice
SetStretchBltMode
StretchBlt
StretchDIBits
289
Descripcin
Crea un mapa de bits dependiente del dispositivo a
partir de un mapa de bits independiente del dispositivo.
Crea un mapa de bits independiente del dispositivo.
Crea un metafichero mejorado.
Elimina un metafichero mejorado.
Enumera los registros de metafichero en un
metafichero mejorado.
Recupera pxeles de un mapa de bits hacia un array.
Recupera las dimensiones preferidas de un mapa de
bits.
Crea un mapa de bits independiente del dispositivo a
partir de un mapa de bits dependiente del dispositivo.
Abre un metafichero mejorado.
Recupera la cadena de descripcin de un metafichero
mejorado.
Recupera el encabezamiento de un metafichero
mejorado.
Recupera el modo actual de compresin de mapas de
bits.
Carga un recurso de mapa de bits.
Carga un icono, un cursor o un mapa de bits desde un
recurso o un de mapa de bits.
Rellena el rectngulo especificado con la brocha del DC
destino y puede ejecutar ciertas operaciones de
barrido.
Dibuja un metafichero mejorado sobre un contexto de
dispositivo.
Dibuja un solo registro de un metafichero sobre un
contexto de dispositivo.
Asigna los pxeles de un mapa de bits dependiente del
dispositivo.
Asigna las dimensiones preferidas de un mapa de bits.
Asigna los pxeles de un mapa de bits dependiente del
dispositivo a los pxeles de un mapa de bits
independiente del dispositivo.
Dibuja un mapa de bits independiente del dispositivo
sobre un contexto de dispositivo.
Asigna el modo de compresin de mapas de bits.
Dibuja y escala pxeles de un contexto de dispositivo
sobre otro.
Dibuja y escala un mapa de bits independiente del
dispositivo sobre un contexto de dispositivo.
5
Captulo
290
Captulo 5
BitBlt
Windows.Pas
Sintaxis
BitBlt(
DestDC: HDC;
X: Integer;
Y: Integer;
Width: Integer;
Height: Integer;
SrcDC: HDC;
XSrc: Integer;
YSrc: Integer;
ROP: DWORD
): BOOL;
Descripcin
Esta funcin copia un rectngulo de pxeles del mapa de bits del contexto de
dispositivo especificado en el contexto de dispositivo de destino. El ancho y la altura
del rectngulo de destino determinan el ancho y la altura del rectngulo de origen. Si el
formato de colores de los contextos de dispositivo de origen y destino difieren, esta
funcin convierte el formato de color del origen al formato de color del destino.
Parmetros
DestDC: Manejador del contexto de dispositivo al cual los pxeles son copiados.
X: La coordenada horizontal de la esquina superior izquierda del rectngulo destino en
el contexto de dispositivo destino, en unidades lgicas.
Y: La coordenada vertical de la esquina superior izquierda del rectngulo destino en el
contexto de dispositivo destino, en unidades lgicas.
Width: El ancho de los rectngulos de origen y destino, en unidades lgicas.
Height: La altura de los rectngulos de origen y destino, en unidades lgicas.
SrcDC: Manejador del contexto de dispositivo desde el cual los pxeles son copiados.
Este no puede ser el manejador de un contexto de dispositivo de metafichero.
XSrc: La coordenada horizontal de la esquina superior izquierda del rectngulo de
origen en el contexto de dispositivo de destino, en unidades lgicas.
YSrc: La coordenada vertical de la esquina superior izquierda del rectngulo de origen
en el contexto de dispositivo de destino, en unidades lgicas.
ROP: Cdigo de operacin de barrido que determina cmo los colores de los pxeles en
la imagen original son combinados con los colores de los pxeles en el dispositivo de
destino. Este parmetro puede tomar un valor de la Tabla 5-2.
291
Vase adems
GetDC, CreateCompatibleDC, CreateBitmap, LoadBitmap, StretchBlt
Ejemplo
Vea el Listado 5-16 bajo LoadImage y otros ejemplos a lo largo de este captulo.
Tabla 5-2: Valores del parmetro ROP de BitBlt
DSTINVERT
MERGECOPY
MERGEPAINT
NOTSRCCOPY
NOTSRCERASE
PATCOPY
PATINVERT
PATPAINT
SRCAND
Descripcin
Rellena los pxeles del rectngulo especificado en el destino
con el color especificado en el ndice 0 de la paleta fsica. Por
defecto este color es el negro.
Invierte los colores de los pxeles del rectngulo especificado
en el destino.
Combina los colores de los pxeles del rectngulo de origen
con los colores de los pxeles del patrn de la brocha
seleccionada en el contexto de dispositivo de destino, usando
el operador booleano and.
Invierte los colores de los pxeles del rectngulo de origen y
los combina con los colores de los pxeles del rectngulo de
destino, usando el operador booleano or.
Invierte los colores de los pxeles del rectngulo de origen y
los copia en el rectngulo de destino.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano or y luego
invierte el color resultante.
Copia el patrn de la brocha seleccionada en el contexto de
dispositivo de destino directamente en el destino.
Combina los colores de los pxeles del patrn de la brocha
seleccionada en el contexto de dispositivo de destino, con los
colores de los pxeles en el destino, usando el operador
booleano xor.
Combina los colores del patrn de la brocha seleccionada en
el contexto de dispositivo de destino con los colores
invertidos de los pxeles del rectngulo de origen, usando el
operador booleano or, y entonces combina el resultado con
los colores de los pxeles del rectngulo de destino, usando el
operador booleano or.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano and.
5
Captulo
Valor
BLACKNESS
292
Captulo 5
Valor
SRCCOPY
SRCERASE
SRCINVERT
SRCPAINT
WHITENESS
CloseEnhMetaFile
Descripcin
Copia los colores de los pxeles del rectngulo de origen
directamente en el rectngulo destino.
Combina los colores de los pxeles del rectngulo de origen
con los colores invertidos del rectngulo destino, usando el
operador booleano and.
Combina los colores de los pxeles de los rectngulos de
origen y destino, usando el operador booleano xor.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano or.
Rellena los pxeles del rectngulo especificado en el destino
con el color especificado en el ndice 255 de la paleta fsica.
Por defecto este color es el blanco.
Windows.Pas
Sintaxis
CloseEnhMetaFile(
DC: HDC
): HENHMETAFILE;
Descripcin
Esta funcin cierra el contexto de dispositivo de metafichero mejorado especificado y
devuelve un manejador del metafichero mejorado. Este manejador puede ser utilizado
en todas las funciones que requieren un manejador de metafichero mejorado. Cuando el
metafichero deje de ser necesario deber ser eliminado llamando a la funcin
DeleteEnhMetaFile.
Parmetros
DC: Manejador de un contexto de dispositivo de metafichero mejorado.
Vase adems
CopyEnhMetaFile, CreateEnhMetaFile, DeleteEnhMetaFile,
GetEnhMetaFileDescription, GetEnhMetaFileHeader, PlayEnhMetaFile
Ejemplo
Vea el Listado 5-10 bajo CreateEnhMetaFile.
CopyEnhMetaFile
293
Windows.Pas
Sintaxis
CopyEnhMetaFile(
p1: HENHMETAFILE;
p2: PChar
): HENHMETAFILE;
Descripcin
Esta funcin copia el metafichero mejorado especificado a un fichero o a memoria,
devolviendo un manejador del metafichero mejorado copiado. Cuando el metafichero
no sea necesario deber ser eliminado llamando a la funcin DeleteEnhMetaFile.
Parmetros
p1: Manejador del metafichero mejorado que ser copiado.
p2: Cadena terminada en nulo que especifica el nombre del fichero de destino. Si a este
parmetro se le asigna nil, la funcin simplemente copia el metafichero mejorado en
memoria.
Vase adems
CreateEnhMetaFile, DeleteEnhMetaFile, GetEnhMetaFileDescription,
GetEnhMetaFileHeader, PlayEnhMetaFile
Ejemplo
CopyImage
Windows.Pas
Sintaxis
CopyImage(
hImage: THandle;
ImageType: UINT;
X: Integer;
Y: Integer;
Flags: UINT
): THandle;
{manejador de imagen}
{indicador de tipo de imagen}
{ancho de la nueva imagen}
{altura de la nueva imagen}
{opciones de la operacin de copia}
{devuelve un manejador de la imagen copiada}
5
Captulo
294
Captulo 5
Descripcin
Esta funcin crea un duplicado de la imagen especificada (mapa de bits, icono o
cursor). La nueva imagen puede ser ampliada o reducida como se desee y convertida a
un formato monocromtico o de color.
Parmetros
hImage: Manejador de la imagen que es copiada.
ImageType: Valor que indica el tipo de imagen que ser copiada. Este parmetro puede
ser un valor de la Tabla 5-3.
X: Indica el ancho deseado para la imagen copiada, en pxeles.
Y: Indica la altura deseada para la imagen copiada, en pxeles.
Flags: Un valor que indica cmo la imagen debe ser copiada. Este parmetro puede
incluir una o ms opciones de la Tabla 5-4.
Vase adems
LoadBitmap, LoadCursor, LoadCursorFromFile, LoadIcon, LoadImage
Ejemplo
Listado 5-4: Creando una imagen monocromtica para realizar una copia transparente
var
ForegroundImage: TBitmap;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crea el mapa de bits del primer plano y lo carga}
ForegroundImage := TBitmap.Create;
ForegroundImage.LoadFromFile('Foreground.bmp');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Libera el mapa de bits del primer plano}
ForegroundImage.Free;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
TempBitmap: HBITMAP;
// un manejador de la imagen copiada
295
OldBitmap: HBITMAP;
// almacena el mapa de bits anterior del DC
OffscreenDC: HDC;
// manejador de contexto de dispositivo fuera de pantalla
begin
{Crea una mscara monocromtica de la imagen del primer plano}
TempBitmap := CopyImage(ForegroundImage.Handle, IMAGE_BITMAP,
ForegroundImage.Width, ForegroundImage.Height,
LR_MONOCHROME);
{Crea un contexto de dispositivo en memoria}
OffscreenDC := CreateCompatibleDC(0);
{Selecciona la imagen de la mscara monocromtica en el contexto de dispositivo
en memoria}
OldBitmap := SelectObject(OffscreenDC, TempBitmap);
{Efecta un blit de la mscara monocromtica sobre la imagen de fondo.
$00220326 es una operacin de barrido que invierte los pxeles del rectngulo
de origen y combina esos pxeles con los del mapa de bits del destino usando el
operador booleano and. Esto labra un rea para el mapa de bits regular de
primer plano}
BitBlt(Image1.Picture.Bitmap.Canvas.Handle, 150, 50, 100, 100, OffscreenDC,
0, 0, $00220326);
{Efecta un blit del mapa de bits del primer plano sobre el fondo, combinando
los pxeles del primer plano y el fondo mediante el operador booleano or. El
resultado es el globo terrqueo del primer plano copiado sobre el fondo,
mientras los bordes de la imagen del globo terrqueo se ven transparente}
BitBlt(Image1.Picture.Bitmap.Canvas.Handle, 150, 50, 100, 100,
ForegroundImage.Canvas.Handle, 0, 0, SRCPAINT);
{Selecciona el mapa de bits anterior en el contexto de dispositivo en memoria}
SelectObject(OffscreenDC, OldBitmap);
{Elimina el mapa de bits de mscara y el contexto de dispositivo en memoria}
DeleteObject(TempBitmap);
DeleteDC(OffscreenDC);
end;
Captulo
Figura 5-5: La
copia de la
imagen
transparente
296
Captulo 5
Descripcin
La imagen es un mapa de bits.
La imagen es un cursor.
La imagen es un metafichero mejorado.
La imagen es un icono.
LR_COPYRETURNORG
LR_MONOCHROME
CreateBitmap
Descripcin
La imagen original es borrada despus que se haga la
copia.
La funcin trata de cargar un recurso de icono o
cursor desde el fichero de recursos, en lugar de
hacer una copia La imagen recuperada desde el
fichero de recursos es la imagen ms cercana al
tamao deseado; no se escala la imagen al ancho y
altura indicados. Si la imagen no fue cargada
mediante las funciones LoadIcon o LoadCursor, o
mediante la funcin LoadImage con la opcin
LR_SHARED seleccionada, la funcin falla.
Crea un duplicado exacto de la imagen original. Los
parmetros X e Y son ignorados.
Crea una versin en blanco y negro de la imagen
original.
Windows.Pas
Sintaxis
CreateBitmap(
Width: Integer;
Height: Integer;
Planes: Longint;
BitCount: Longint;
Bits: Pointer
): HBITMAP;
Descripcin
Esta funcin crea un nuevo mapa de bits con el ancho, altura y profundidad de color
especificados. Un array de informacin sobre los pxeles puede ser especificado para
crear un mapa de bits con una imagen inicial. Si a los parmetros Width y Height se les
asigna cero, esta funcin devuelve un manejador de un mapa de bits monocromtico de
1 x 1 pxeles. Una vez que el mapa de bits es creado, puede ser seleccionado sobre un
297
Parmetros
Width: El ancho del mapa de bits en pxeles.
Height: La altura del mapa de bits en pxeles.
Planes: El nmero de planos de colores usados por el dispositivo.
BitCount: La cantidad de bits requeridos para describir el color de un pxel (por
ejemplo, 8 bits para imgenes de 256 colores, 24 bits para imgenes de 16,7 millones
de colores, etc.).
Bits: Un puntero a un array de bytes que contiene los datos de los colores que
describen la imagen del mapa de bits. Este array especifica el color de los pxeles en
un rea rectangular. A cada fila horizontal de pxeles en el rectngulo se le llama lnea
de barrido. Cada lnea de barrido tiene que estar alineada a frontera de palabra, lo cual
significa que su ancho tiene que ser un mltiplo de 2. Una lnea de barrido puede ser
rellenada con ceros para facilitar la alineacin. Si este parmetro es nil, el nuevo mapa
de bits no est definido y no contiene ninguna imagen.
Ejemplo
Listado 5-5: Creando un mapa de bits
procedure TForm1.Button1Click(Sender: TObject);
var
TheBitmap: HBitmap;
// manejador para un nuevo mapa de bits
TheBits: array[0..4095] of Byte;
// array de bits del mapa de bits original
GotBits: array[0..4095] of Byte;
// array para recuperar un mapa de bits
LoopX,
// variables de contador de bucle general
5
Captulo
Vase adems
298
Captulo 5
LoopY: Integer;
OffScreen: HDC;
// contexto de dispositivo fuera de pantalla
TheSize: TSize;
// almacena las dimensiones del mapa de bits
begin
{Establece cada bit del nuevo mapa de bits con el color almacenado en la
posicin 3 de la paleta del sistema}
FillMemory(@TheBits, 4096, 3);
{Establece un cuadrado de 10 X 10 en el centro de la imagen con el color
especificado en la posicin 1 de la paleta del sistema}
for LoopX:=27 to 37 do
begin
TheBits[LoopX*64+27] := 1;
TheBits[LoopX*64+28] := 1;
TheBits[LoopX*64+29] := 1;
TheBits[LoopX*64+30] := 1;
TheBits[LoopX*64+31] := 1;
TheBits[LoopX*64+32] := 1;
TheBits[LoopX*64+33] := 1;
TheBits[LoopX*64+34] := 1;
TheBits[LoopX*64+35] := 1;
TheBits[LoopX*64+36] := 1;
end;
{Crea un mapa de bits de 64 X 64 pxeles, usando la informacin en el array}
TheBitmap:=CreateBitmap(64, 64, 1, 8, @TheBits);
{Establece las dimensiones preferidas del mapa de bits. Esto no es usado por
Windows; simplemente se asigna informacin definida por el usuario}
SetBitmapDimensionEx(TheBitmap, 100, 100, nil);
{Crea un contexto de dispositivo fuera de pantalla compatible con sta}
OffScreen:=CreateCompatibleDC(0);
{Selecciona el mapa de bits en el contexto de dispositivo fuera de pantalla}
SelectObject(OffScreen, TheBitmap);
{Copia el mapa de bits del contexto de dispositivo fuera de pantalla
sobre el rea de dibujo del formulario. Esto mostrar el mapa de bits}
BitBlt(Form1.Canvas.Handle, 162, 16, 64, 64, OffScreen, 0, 0, SRCCOPY);
{Recupera los bits que conforman la imagen}
GetBitmapBits(TheBitmap, 4096, @GotBits);
{Muestra los bits en la rejilla de cadenas}
for LoopX:=0 to 63 do
for LoopY:=0 to 63 do
StringGrid1.Cells[LoopX,LoopY] := IntToStr(GotBits[LoopX*64+LoopY]);
{Recupera dimensiones preferidas, definidas por el usuario, del mapa de bits}
GetBitmapDimensionEx(TheBitmap, TheSize);
{Muestra esas dimensiones}
Label1.Caption:='Preferred bitmap dimensions - Width: ' + IntToStr(TheSize.CX)
+ ' Height: ' + IntToStr(TheSize.CY);
299
Figura 5-6: El
nuevo mapa
de bits
end;
CreateBitmapIndirect
Windows.Pas
Sintaxis
{puntero a estructura con informacin del mapa de bits}
{devuelve un manejador de mapa de bits}
Descripcin
Esta funcin crea un nuevo mapa de bits con el ancho, altura y profundidad de color
especificados. Un array de informacin sobre pxeles puede ser especificado para crear
un mapa de bits con una imagen inicial. Si a los parmetros Width y Height se les
asigna cero, esta funcin devuelve un manejador de un mapa de bits monocromtico de
1 x 1 pxeles. Una vez que el mapa de bits es creado, puede ser seleccionado sobre el
contexto de dispositivo mediante la funcin SelectObject. Cuando el mapa de bits deje
de ser necesario deber ser eliminado llamando a la funcin DeleteObject.
Aunque esta funcin puede ser usada para crear mapas de bits a color, por razones de
ejecucin las aplicaciones deben usar CreateBitmapIndirect para crear mapas de bits
monocromticos y CreateCompatibleBitmap para crear mapas de bits a color.
CreateCompatibleBitmap requiere un contexto de dispositivo y devuelve un mapa de
bits que tiene el mismo formato de color que el dispositivo dado. Por esta razn, las
5
Captulo
CreateBitmapIndirect(
const p1: TBitmap
): HBITMAP;
300
Captulo 5
Parmetros
p1: Identifica un registro TBitmap que contiene informacin sobre la imagen que se
desea crear. El registro TBitmap se define como:
TBitmap = packed record
bmType: Longint;
bmWidth: Longint;
bmHeight: Longint;
bmWidthBytes: Longint;
bmPlanes: Word;
bmBitsPixel: Word;
bmBits: Pointer;
end;
Vase adems
BitBlt, CreateBitmap, CreateCompatibleBitmap, CreateDIBitmap, DeleteObject,
SelectObject
301
Ejemplo
Listado 5-6: Creando un mapa de bits indirectamente
procedure TForm1.Button1Click(Sender: TObject);
var
TheBitmap: HBITMAP;
// manejador del nuevo mapa de bits
BitmapInfo: Windows.TBitmap;
// registro con informacin del mapa de bits
OffscreenDC: HDC;
// manejador de contexto de dispositivo en
// memoria
BitmapBits: array[0..4095] of Byte; // almacena la imagen del mapa de bits
begin
{Inicializa los pxeles del mapa de bits con el color en la posicin 5 de la
paleta del sistema}
FillMemory(@BitmapBits, 4096, 5);
{Define el nuevo mapa de bits}
BitmapInfo.bmType
:= 0;
BitmapInfo.bmWidth
:= 64;
BitmapInfo.bmHeight
:= 64;
BitmapInfo.bmWidthBytes := 64;
BitmapInfo.bmPlanes
:= 1;
BitmapInfo.bmBitsPixel := 8;
// 8 bits/pxel, un mapa de bits de 256 colores
BitmapInfo.bmBits
:= @BitmapBits;
{Crea el mapa de bits a partir de la informacin del mapa de bits}
TheBitmap := CreateBitmapIndirect(BitmapInfo);
{Crea un contexto de dispositivo en memoria compatible con la pantalla}
OffscreenDC := CreateCompatibleDC(0);
{Selecciona el nuevo mapa de bits y una pluma de almacn sobre el contexto
de dispositivo en memoria}
SelectObject(OffscreenDC, TheBitmap);
SelectObject(OffscreenDC, GetStockObject(WHITE_PEN));
5
Captulo
302
Captulo 5
Figura 5-7: El
nuevo mapa
de bits creado
de forma
indirecta
CreateCompatibleBitmap
Windows.Pas
Sintaxis
CreateCompatibleBitmap(
DC: HDC;
Width: Integer;
Height: Integer
): HBitmap;
Descripcin
Esta funcin crea un mapa de bits cuyo formato de color (por ejemplo, 8 bits por pxel,
24 bits por pxel, etc.) y su paleta se corresponden con el formato de color y paleta del
dispositivo de visualizacin asociado con el contexto de dispositivo especificado. Si
una seccin DIB, creada con la funcin CreateDIBSection, es seleccionada en el
contexto de dispositivo especificado, esta funcin crea un mapa de bits DIB. Utilice la
funcin DeleteObject para eliminar el mapa de bits cuando deje de ser necesario. Si a
los parmetros Width y Height se les asigna cero, esta funcin devuelve un manejador a
un mapa de bits monocromtico de 1 x 1 pxeles.
Parmetros
DC: Manejador del contexto de dispositivo desde el cual el mapa de bits recupera su
formato y paleta de colores.
Width: El ancho del mapa de bits en pxeles.
Height: La altura del mapa de bits en pxeles.
Vase adems
CreateBitmap, CreateBitmapIndirect, CreateDIBSection, DeleteObject, SelectObject
303
Ejemplo
Listado 5-7: Creando un mapa de bits compatible con el dispositivo de visualizacin actual
procedure TForm1.Button1Click(Sender: TObject);
var
TheBitmap: HBitmap;
// manejador para el nuevo mapa de bits
TheBits: array[0..4095] of Byte;
// array para el mapa de bits original
LoopX: Integer;
// contador de bucle
OffScreen: HDC;
// contexto de dispositivo fuera de pantalla
ScreenDC: HDC;
// contexto de dispositivo temporal
begin
{Inicializa los pxeles del mapa de bits con el color en la posicin 3 de la
paleta del sistema}
FillMemory(@TheBits, 4095, 3);
{Pone un cuadrado de 10 X 10 en el centro de la imagen al color especificado
en la posicin 1 de la paleta del sistema}
for LoopX:=27 to 37 do
begin
TheBits[LoopX*64+27] := 1;
TheBits[LoopX*64+28] := 1;
TheBits[LoopX*64+29] := 1;
TheBits[LoopX*64+30] := 1;
TheBits[LoopX*64+31] := 1;
TheBits[LoopX*64+32] := 1;
TheBits[LoopX*64+33] := 1;
TheBits[LoopX*64+34] := 1;
TheBits[LoopX*64+35] := 1;
TheBits[LoopX*64+36] := 1;
end;
{Recupera un contexto de dispositivo para el escritorio}
ScreenDC := GetDC(0);
5
Captulo
304
Captulo 5
OffScreen, 0, 0, SRCCOPY);
{Elimina el contexto de dispositivo fuera de pantalla}
DeleteDC(OffScreen);
{Elimina el nuevo mapa de bits}
DeleteObject(TheBitmap);
end;
Figura 5-8: El
mapa de bits
compatible
CreateDIBitmap
Windows.Pas
Sintaxis
CreateDIBitmap(
DC: HDC;
Descripcin
Esta funcin crea un mapa de bits dependiente del dispositivo a partir de los atributos e
imagen del mapa de bits independiente del dispositivo especificado. Cuando el nuevo
mapa de bits deje de ser necesario, deber ser eliminado mediante la funcin
DeleteObject.
Parmetros
DC: Manejador de un contexto de dispositivo. El formato del nuevo mapa de bits
dependiente del dispositivo est basado en este contexto de dispositivo. Por eso no
puede tratarse de un contexto de dispositivo en memoria. A este parmetro se le puede
asignar un valor devuelto por las funciones GetDC o CreateDC.
305
end;
Consulte la funcin CreateDIBSection para ver una descripcin de este registro.
dwUsage: Indicador que especifica cmo el nuevo mapa de bits dependiente del
dispositivo ser inicializado. Si a este parmetro se le asigna cero, los bits de la nueva
imagen del mapa de bits no sern inicializados. Si a este parmetro se le asigna
CBM_INIT, Windows utiliza la informacin a la que apuntan los parmetros InitBits y
InitInfo para inicializar los bits del nuevo mapa de bits dependiente del dispositivo de
manera que se correspondan con los del mapa de bits independiente del dispositivo.
InitBits: Puntero a la imagen del mapa de bits DIB, en forma de un array de bytes. Si
al parmetro dwUsage se le asigna cero, InitBits es ignorado.
5
Captulo
306
Captulo 5
Vase adems
CreateBitmap, CreateBitmapIndirect, CreateDIBSection, DeleteObject
Ejemplo
Listado 5-8: Creando un mapa de bits dependiente del dispositivo desde uno
independiente del dispositivo
procedure TForm1.Button1Click(Sender: TObject);
var
Dib: HBITMAP;
// manejador del mapa de bits independiente del
// dispositivo
DDB: HBITMAP;
// manejador del mapa de bits dependiente del dispositivo
DibInfo: PBitmapInfo;
// puntero a un registro TBitmapInfo
BitsPtr: PByte;
// un puntero a los bits del mapa de bits DIB
ReferenceDC: HDC;
// manejador de un contexto de dispositivo de referencia
ScreenDC: HDC;
// manejador de un contexto fuera de pantalla
iCount: Integer;
// contador de bucle
SystemPalette: array[0..255] of TPaletteEntry;
// necesario para convertir la paleta del sistema
// en paletas compatibles DIB
begin
{Reserva memoria para el DIB}
GetMem(DibInfo, SizeOf(TBitmapInfo) + 256 * SizeOf(TRGBQuad));
{Inicializa la informacin del DIB}
DibInfo^.bmiHeader.biWidth
:=
DibInfo^.bmiHeader.biHeight
:=
DibInfo^.bmiHeader.biPlanes
:=
DibInfo^.bmiHeader.biBitCount
:=
DibInfo^.bmiHeader.biCompression
:=
DibInfo^.bmiHeader.biSizeImage
:=
DibInfo^.bmiHeader.biXPelsPerMeter :=
DibInfo^.bmiHeader.biYPelsPerMeter :=
DibInfo^.bmiHeader.biClrUsed
:=
DibInfo^.bmiHeader.biClrImportant :=
DibInfo^.bmiHeader.biSize
:=
64;
// crea un DIB de 64 X 64 pxeles,
-64;
// orientado de arriba a abajo
1;
8;
// 256 colores
BI_RGB; // sin compresin
0;
// Windows determina el tamao
0;
0;
0;
0;
SizeOf(TBitmapInfoHeader);
DibInfo^.bmiColors[iCount].rgbBlue
DibInfo^.bmiColors[iCount].rgbRed
DibInfo^.bmiColors[iCount].rgbGreen
DibInfo^.bmiColors[iCount].rgbReserved
end;
:=
:=
:=
:=
307
SystemPalette[iCount].peBlue;
SystemPalette[iCount].peRed;
SystemPalette[iCount].peGreen;
0;
5
Captulo
308
Captulo 5
Figura 5-9: El
nuevo mapa
de bits
dependiente
del dispositivo
DIB_RGB_COLORS
CreateDIBSection
Descripcin
El campo bmiColors del registro TBitmapInfo es un array de
ndices de 16 bits en la paleta lgica actualmente activa del
contexto de dispositivo especificado. Este valor no debe ser
usado si el mapa de bits va a ser guardado en disco.
El campo bmiColors del registro TBitmapInfo es un array de
valores de colores RGB literales.
Windows.Pas
Sintaxis
CreateDIBSection(
DC: HDC;
const p2: TBitmapInfo;
p3: UINT;
var p4: Pointer;
p5: THandle;
p6: DWORD
): HBITMAP;
Descripcin
Esta funcin crea un mapa de bits independiente del dispositivo a partir de los atributos
especificados. Devuelve un manejador del nuevo mapa de bits y un puntero a los
valores de bits que conforman la imagen de ste. El desarrollador puede especificar un
objeto de mapeado de fichero para almacenar los bits de la imagen o dejar que
Windows automticamente reserve la memoria. Cuando el mapa de bits deje de ser
necesario, deber ser eliminado llamando a la funcin DeleteObject.
Parmetros
DC: Manejador de un contexto de dispositivo. Si el parmetro p3 contiene la opcin
DIB_PAL_COLORS, la nueva paleta de colores del DIB se corresponder con la paleta
lgica del contexto de dispositivo identificado por este parmetro.
309
p2: Puntero a un registro TBitmapInfo. Este registro contiene informacin que describe
el tipo de mapa de bits DIB que ser creado, tal como su tamao, formato de color y
compresin. El registro TBitmapInfo se define como:
TBitmapInfo = packed record
bmiHeader: TBitmapInfoHeader;
{informacin de encabezamiento}
bmiColors: array[0..0] of TRGBQuad;
{tabla de colores usada por el mapa de bits}
end;
bmiHeader: Un registro de tipo TBitmapInfoHeader que contiene informacin
sobre las dimensiones y formato de color del mapa de bits DIB. El registro
TBitmapInfoHeader se define como:
TBitmapInfoHeader = packed record
biSize: DWORD;
{tamao del registro en bytes}
biWidth: Longint;
{ancho del mapa de bits en pxeles}
biHeight: Longint;
{altura del mapa de bits en pxeles}
biPlanes: Word;
{nmero de planos de color}
biBitCount: Word;
{bits por pixel necesarios para describir un
color}
biCompression: DWORD; {opcin de compresin}
biSizeImage: DWORD;
{tamao de la imagen en bytes}
biXPelsPerMeter: Longint; {pxeles horizontales por unidad de medida
del dispositivo de destino}
biYPelsPerMeter: Longint; {pxeles verticales por unidad de medida
del dispositivo de destino}
biClrUsed: DWORD;
{cantidad de ndices de color usados}
biClrImportant: DWORD; {cantidad de ndices de color importantes}
end;
5
Captulo
310
Captulo 5
311
Vase adems
CreateFileMapping, DeleteObject, GetDIBColorTable, GetObject, SetDIBits,
SetDIBitsToDevice, SetDIBColorTable, StretchDIBits
5
Captulo
p6: Especifica el desplazamiento a partir del inicio del objeto de mapeado de fichero
referido por el parmetro p5 en el que se sitan los valores de los bits del mapa de bits
DIB. Los valores de los bits del mapa de bits deben estar alineados a frontera de doble
palabra, de manera que este parmetro tiene que ser un mltiplo de 4. Si al parmetro
p5 se le asigna cero, este parmetro es ignorado.
312
Captulo 5
Ejemplo
Listado 5-9: Creando un mapa de bits independiente del dispositivo
procedure TForm1.Button1Click(Sender: TObject);
var
Dib: HBITMAP;
// almacena un manejador del DIB
DibInfo: PBitmapInfo;
// puntero al registro de informacin del mapa de bits
BitsPtr: PByte;
// almacena un puntero a los bits del mapa de bits
ReferenceDC: HDC;
// manejador del contexto de dispositivo de referencia
iCount: Integer;
// contador de bucle
SystemPalette: array[0..255] of TPaletteEntry;
// necesario para convertir la paleta del sistema
// en paletas compatibles DIB
begin
{Reserva la memoria necesaria para el registro de informacin del mapa de bits}
GetMem(DibInfo, SizeOf(TBitmapInfo) + 256 * SizeOf(TRGBQuad));
{Inicializa la informacin del mapa de bits}
DibInfo^.bmiHeader.biWidth
:= 64;
// crea un DIB de 64 X 64 pxeles,
DibInfo^.bmiHeader.biHeight
:= -64;
// orientado de arriba a abajo
DibInfo^.bmiHeader.biPlanes
:= 1;
DibInfo^.bmiHeader.biBitCount
:= 8;
// 256 colores
DibInfo^.bmiHeader.biCompression
:= BI_RGB; // sin compresin
DibInfo^.bmiHeader.biSizeImage
:= 0;
// Windows determina el tamao
DibInfo^.bmiHeader.biXPelsPerMeter := 0;
DibInfo^.bmiHeader.biYPelsPerMeter := 0;
DibInfo^.bmiHeader.biClrUsed
:= 0;
DibInfo^.bmiHeader.biClrImportant := 0;
DibInfo^.bmiHeader.biSize
:= SizeOf(TBitmapInfoHeader);
{Recupera la paleta actual del sistema}
GetSystemPaletteEntries(Form1.Canvas.Handle, 0, 256, SystemPalette);
{La paleta del sistema es devuelta como un array de registros TPaletteEntry,
que almacena los colores de la paleta en formato (Red, Green, Blue). Sin
embargo, el campo bmiColors del registro TBitmapInfo necesita un array de
registros TRGBQuad, que almacena los colores en formato (Blue, Green, Red).
Por eso tenemos que convertir los registros TPaletteEntry en registros TRGBQuad}
for iCount := 0 to 255 do
begin
DibInfo^.bmiColors[iCount].rgbBlue
:= SystemPalette[iCount].peBlue;
DibInfo^.bmiColors[iCount].rgbRed
:= SystemPalette[iCount].peRed;
DibInfo^.bmiColors[iCount].rgbGreen
:= SystemPalette[iCount].peGreen;
DibInfo^.bmiColors[iCount].rgbReserved := 0;
end;
{Crea un contexto de dispositivo en memoria}
ReferenceDC := CreateCompatibleDC(0);
{Crea el DIB sobre el contexto de dispositivo en memoria, a partir de la
informacin del mapa de bits inicializada}
Dib := CreateDIBSection(ReferenceDC, DibInfo^, DIB_RGB_COLORS,
313
Pointer(BitsPtr), 0, 0);
{Elimina el contexto de dispositivo de referencia}
DeleteDC(ReferenceDC);
{Rellena los bits de la imagen DIB con bandas de color que se alternan}
FillMemory(BitsPtr, 8*64, $03);
FillMemory(Pointer(LongInt(BitsPtr)+8*64), 8*64, $05);
FillMemory(Pointer(LongInt(BitsPtr)+2*(8*64)), 8*64, $03);
FillMemory(Pointer(LongInt(BitsPtr)+3*(8*64)), 8*64, $05);
FillMemory(Pointer(LongInt(BitsPtr)+4*(8*64)), 8*64, $03);
FillMemory(Pointer(LongInt(BitsPtr)+5*(8*64)), 8*64, $05);
FillMemory(Pointer(LongInt(BitsPtr)+6*(8*64)), 8*64, $03);
FillMemory(Pointer(LongInt(BitsPtr)+7*(8*64)), 8*64, $05);
{Dibuja el DIB sobre el formulario}
SetDIBitsToDevice(Form1.Canvas.Handle, 30, 5, 64, 64, 0, 0, 0, 64, BitsPtr,
DibInfo^, DIB_RGB_COLORS);
{Dibuja el DIB de nuevo, pero esta vez lo agranda al doble de su tamao}
StretchDIBits(Form1.Canvas.Handle, 105, 5, 128, 128, 0, 0, 64, 64, BitsPtr,
DibInfo^, DIB_RGB_COLORS, SRCCOPY);
{Eliminamos el DIB y tambin la memoria reservada para el registro}
DeleteObject(Dib);
FreeMem(DibInfo, SizeOf(TBitmapInfo) + 256 * SizeOf(TRGBQuad));
end;
Figura 5-10:
El DIB, en su
tamao
original y el
doble
Descripcin
Este mapa de bits tiene dos colores como mximo y el array bmiColors
contiene slo dos entradas. Cada pxel en la imagen del mapa de bits est
representado por un bit simple. Si el bit es 0, el pxel es dibujado usando el
color especificado en la primera entrada del array bmiColors. Si el bit es 1, el
pxel es dibujado usando el color de la segunda entrada del array bmiColors.
Captulo
314
Captulo 5
Valor
4
16
24
Descripcin
Este mapa de bits tiene un mximo de 16 colores y el array bmiColors puede
contener hasta 16 entradas. Cada byte que compone el mapa de bits
representa 2 pxeles. Los 4 bits inferiores en el byte representan el ndice en
la paleta de colores para el primer pxel y los 4 bits superiores representan el
ndice de color para el segundo pxel.
Este mapa de bits tiene un mximo de 256 colores y el array bmiColors
puede contener hasta 256 entradas. Cada byte que compone el mapa de bits
representa un pxel, y especifica el ndice del color dentro del array
bmiColors de 256 entradas.
Este mapa de bits tiene un mximo de 65.536 colores. Si el campo
biCompression del registro TBitmapInfoHeader contiene el valor BI_RGB, al
campo bmiColors se le asigna nil. En este caso, cada palabra (16 bits) en los
valores de bits del mapa de bits representa un pxel. Movindose del bit
menos significativo al ms significativo, los ltimos 5 bits de la palabra
especifican la intensidad de azul del pxel, los siguientes 5 bits especifican la
intensidad de verde y los siguientes 5 bits especifican la intensidad de rojo. El
bit ms significativo de la palabra no se utiliza. Si al campo biCompression del
registro TBitmapInfoHeader se le asigna BI_BITFIELDS, el campo bmiColors
contendr 3 dobles palabras que representan una mscara de bits. Estas
mscaras de bits son aplicadas al valor de la palabra para cada pxel, usando el
operador booleano and, para recuperar las intensidades de los colores rojo,
verde y azul respectivamente para ese pxel. Bajo Windows NT, el conjunto
de bits activos en cada mscara de doble palabra tiene que ser contiguo y no
debe solaparse con los bits de las otras mscaras. En este caso, el
desarrollador no tiene que usar todos los bits que describen el pxel. Bajo
Windows 95/98, slo se permiten los siguientes valores de mscaras de doble
palabra: un formato 5-5-5, donde la mscara azul es $0000001F, la verde es
$000003E0 y la roja es $00007C00, o un formato 5-6-5, donde la mscara
azul es $0000001F, la verde es $000007E0 y la roja es $0000F800.
Este mapa de bits tiene un mximo de 16,7 millones de colores y el campo
bmiColors contiene nil. Cada pxel en la imagen del mapa de bits est
representado por 3 bytes. Estos 3 bytes indican la intensidad relativa de los
colores azul, verde y rojo del pxel.
Valor
32
315
Descripcin
Este mapa de bits tiene un mximo de 4,3 billones de colores
aproximadamente. Si al campo biCompression del registro
TBitmapInfoHeader se le asigna BI_RGB, el campo bmiColors se establece a
nil. En este caso, cada doble palabra en los valores de bits del mapa de bits
representa un pxel. Movindose del bit menos significativo al ms
significativo, el ltimo byte de la doble palabra especifica la intensidad del azul
del pxel, el prximo byte especifica la intensidad del verde, y el siguiente
byte especifica la intensidad del rojo. El byte ms significativo de la doble
palabra no es utilizado. Si al campo biCompression del registro
TBitmapInfoHeader se le asigna BI_BITFIELDS, el campo bmiColors
contendr 3 dobles palabras que representan una mscara de bits. Estas
mscaras de bits son aplicadas al valor de doble palabra de cada pxel usando
el operador booleano and para recuperar la intensidad de los colores rojo,
verde y azul, respectivamente para ese pxel. Bajo Windows NT, el conjunto
de bits activos en cada mscara de doble palabra tiene que ser contiguo y no
debe solaparse con los bits de las otras mscaras. En este caso, el
desarrollador no tiene que usar todos los bits que describen el pxel. Bajo
Windows 95/98, slo se permite una mscara azul de $000000FF, una verde
de $0000FF00 y una roja de $00FF0000.
BI_RLE4
BI_BITFIELDS
Descripcin
No se utiliza compresin.
Se utiliza un algoritmo de compresin segn longitud de repeticiones
(run-length encoding) para los mapas de bits de 256 colores (el
formato de color es de 8 bits por pxel). Este formato de compresin
consiste en una secuencia de pares de bytes. El primer byte de cada
par es un byte de conteo que especifica cuntas veces hay que
repetir el siguiente byte cuando se dibuja la imagen. El segundo byte
es un ndice a la tabla de colores.
Se utiliza un algoritmo de compresin segn longitud de repeticiones
(run-length encoding) para los mapas de bits de 16 colores (el formato
de color es de 4 bits por pxel). Este formato de compresin consiste
en una secuencia de pares de bytes. El primer byte de cada par es un
byte de conteo que especifica cuntas veces hay que repetir el
siguiente byte cuando se dibuja la imagen. El segundo byte especifica
dos ndices a la tabla de colores: el primero en los 4 bits ms
significativos y el segundo en los 4 bits menos significativos.
Este formato es vlido slo para mapas de bits de colores de 16 y 32
bits por pxel. El mapa de bits no est comprimido y la tabla de
colores consiste en 3 mscaras de colores de doble palabra para las
intensidades de rojo, verde y azul. Estas mscaras, combinadas con
los bits que describen cada pxel individual mediante el operador
booleano and, determinan la intensidad del rojo, verde y azul de
cada pxel.
5
Captulo
Valor
BI_RGB
BI_RLE8
316
Captulo 5
DIB_RGB_COLORS
CreateEnhMetaFile
Descripcin
El campo bmiColors del registro TBitmapInfo es un array de
ndices de 16 bits en la paleta lgica actualmente activa del
contexto de dispositivo especificado. Este valor no debe ser
usado si el mapa de bits va a ser guardado en disco.
El campo bmiColors del registro TBitmapInfo es un array de
valores de colores RGB literales.
Windows.Pas
Sintaxis
CreateEnhMetaFile(
DC: HDC;
p2: PChar;
p3: PRect;
p4: PChar
): HDC;
Descripcin
Esta funcin crea un contexto de dispositivo de metafichero mejorado. Este contexto de
dispositivo puede ser usado con cualquier funcin del GDI para dibujar en el
metafichero mejorado. Un manejador del metafichero se obtiene llamando a la funcin
CloseEnhMetaFile y el metafichero es dibujado usando la funcin PlayEnhMetaFile.
Parmetros
DC: Manejador de un contexto de dispositivo usado como referencia para el nuevo
contexto de dispositivo del metafichero mejorado. Este contexto de dispositivo de
referencia es usado para registrar la resolucin y unidades del dispositivo sobre el cual
el metafichero aparecer originalmente. Si el parmetro es cero, el dispositivo de
visualizacin actual es usado como referencia. Esta informacin es usada para escalar
el metafichero cuando es dibujado.
p2: Puntero a una cadena terminada en nulo, que describe el nombre del fichero en el
cual se almacenar el metafichero mejorado. La extensin de este nombre de fichero es
habitualmente .EMF. Si este parmetro es nil, el metafichero mejorado slo existir en
memoria y ser borrado con la llamada a la funcin DeleteEnhMetaFile.
p3: Puntero a un rectngulo que describe las dimensiones de la imagen almacenada en
el metafichero mejorado. Estas dimensiones se expresan en trminos de centsimas de
milmetro (por ejemplo, un valor de 3 equivale a 0,03 milmetros). Si este parmetro es
nil, las dimensiones del rectngulo ms pequeo alrededor de la imagen del
317
Vase adems
CloseEnhMetaFile, CopyEnhMetaFile, DeleteEnhMetaFile,
GetEnhMetaFileDescription, GetEnhMetaFileHeader, PlayEnhMetaFile
Ejemplo
Listado 5-10: Creando un metafichero mejorado
procedure TForm1.Button1Click(Sender: TObject);
var
{Aqu se almacena informacin importante sobre las dimensiones de la pantalla,
que es usada cuando se crea el rectngulo de referencia}
WidthInMM,
HeightInMM,
WidthInPixels,
HeightInPixels: Integer;
ReferenceRect: Trect;
// Rectngulo de referencia
MetafileDC: HDC;
// Manejador del contexto de dispositivo del metafichero
TheMetafile: HENHMETAFILE;
// manejador de metafichero
TheBrush, OldBrush: HBRUSH;
// manejadores a las brochas usadas
begin
{La funcin CreateEnhMetaFile asume que las dimensiones del rectngulo de
referencia estn en trminos de 0,01 milmetros. Por eso las siguientes lneas
son necesarias para obtener relacin de milmetros por pxel. Esto puede ser
usado para crear un rectngulo de referencia con las dimensiones apropiadas.}
{Recupera el tamao de la pantalla, en milmetros}
WidthInMM := GetDeviceCaps(Form1.Canvas.Handle, HORZSIZE);
HeightInMM := GetDeviceCaps(Form1.Canvas.Handle, VERTSIZE);
5
Captulo
318
Captulo 5
319
DeleteEnhMetaFile(TheMetafile);
end;
Figura 5-11:
El nuevo
metafichero
DeleteEnhMetaFile
Windows.Pas
Sintaxis
DeleteEnhMetaFile(
p1: HENHMETAFILE
): BOOL;
Descripcin
Esta funcin elimina el metafichero asociado al manejador dado. Si este metafichero
est almacenado en memoria, se elimina el metafichero y se libera la memoria
asociada. Si este manejador identifica un metafichero almacenado en disco, el
manejador y la memoria asociada son liberados, pero el fichero no es destruido.
Vase adems
CopyEnhMetaFile, CreateEnhMetaFile, GetEnhMetaFile
Ejemplo
Vea el Listado 5-10 bajo CreateEnhMetaFile.
5
Captulo
Parmetros
320
Captulo 5
EnumEnhMetaFile
Windows.Pas
Sintaxis
EnumEnhMetaFile(
DC: HDC;
p2: HENHMETAFILE;
p3: TFNEnhMFEnumProc;
p4: Pointer;
const p5: TRect
): BOOL;
Descripcin
Esta funcin recorre todos los registros del metafichero especificado, pasando cada uno
de ellos a una funcin de respuesta definida por la aplicacin. Esta funcin de respuesta
procesa los registros segn sea necesario, y la enumeracin contina hasta que todos
los registros hayan sido procesados o la funcin de respuesta devuelva cero.
Parmetros
DC: Manejador del contexto de dispositivo en el cual el metafichero puede ser
ejecutado. Este parmetro es pasado directamente a la funcin de respuesta y se le
puede asignar cero si la funcin de respuesta no ejecuta los registros del metafichero.
p2: Manejador del metafichero mejorado cuyos registros sern enumerados.
p3: La direccin de la funcin de respuesta definida por la aplicacin.
p4: Puntero a datos definidos por la aplicacin. Este parmetro est previsto slo para
propsitos especficos de la aplicacin y su valor es pasado directamente a la funcin
de respuesta definida por la aplicacin.
p5: Puntero a un registro TRect que contiene las coordenadas superior izquierda e
inferior derecha del rectngulo que contiene la imagen del metafichero, expresadas en
unidades lgicas. Los puntos a lo largo del borde de este rectngulo estn incluidos en
la imagen. Si el parmetro DC contiene cero, este parmetro es ignorado.
321
Descripcin
Esta funcin recibe un puntero a un registro de metafichero por cada registro
almacenado en el metafichero mejorado que est siendo enumerado. Puede ejecutar
cualquier accin deseada.
Parmetros
DisplaySurface: Manejador del contexto de dispositivo en el cual el registro del
metafichero puede ser ejecutado. Si los registros del metafichero no van a ser
ejecutados por la funcin de respuesta, este parmetro puede ser cero.
MetafileTable: Puntero a un array de valores de tipo HGDIOBJ. Este array contiene
manejadores de objetos grficos, tales como plumas y brochas, que conforman el
metafichero. La primera entrada en el array es un manejador del propio metafichero
mejorado.
MetafileRecord: Puntero a un registro de tipo TEnhMetaRecord. Este registro define el
elemento actual del metafichero que est siendo enumerado. El registro
TEnhMetaRecord se define de la siguiente forma:
TEnhMetaRecord = packed record
iType: DWORD;
nSize: DWORD;
dParm: array[0..0] of DWORD;
end;
{tipo de registro}
{tamao del registro}
{array de parmetros}
iType: Indica el tipo de registro e indirectamente la funcin del GDI que cre el
registro. Esta es una constante de la forma EMR_XXX y todos los tipos de
registros estn listados en el fichero Windows.Pas.
nSize: El tamao del registro en bytes.
ObjectCount: Un valor entero que indica el nmero de objetos grficos del GDI con
manejadores en la tabla de manejadores a la que apunta el parmetro MetafileTable.
Data: Puntero a datos definidos por la aplicacin. Estos datos estn previstos slo para
usos especficos de la aplicacin.
Vase adems
GetEnhMetaFile, PlayEnhMetaFile, PlayEnhMetaFileRecord
5
Captulo
dParm: Un array de parmetros usados por la funcin del GDI identificada por el
campo iType.
322
Captulo 5
Ejemplo
Listado 5-11: Cambiando las brochas en un metafichero mejorado
{funcin de respuesta para enumerar los registros del metafichero mejorado}
function EnumerateEnhMetafile(DisplaySurface: HDC;
var MetafileTable: THandleTable;
var MetafileRecord: TEnhMetaRecord;
ObjectCount: Integer;
var Data: Longint): Integer; stdcall;
implementation
procedure TForm1.FileListBox1Click(Sender: TObject);
var
TheMetafile: HENHMETAFILE;
// almacena un metafichero mejorado
begin
{Abre y recupera un manejador del metafichero seleccionado}
TheMetafile := GetEnhMetaFile(PChar(FileListBox1.FileName));
{Borra la ltima imagen}
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
{Enumera los registros en el metafichero}
EnumEnhMetaFile(Image1.Canvas.Handle, TheMetafile, @EnumerateEnhMetafile,
nil, Image1.BoundsRect);
end;
{Esta funcin se dispara para todos los registros almacenados en el metafichero}
function EnumerateEnhMetafile(DisplaySurface: HDC;
var MetafileTable: THandleTable;
var MetafileRecord: TEnhMetaRecord;
ObjectCount: Integer;
var Data: Longint): Integer;
var
NewBrush: HBRUSH;
// almacena una nueva brocha
BrushInfo: TLogBrush;
// define una nueva brocha
begin
{Si el metafichero est tratando de crear una brocha...}
if MetafileRecord.iType = EMR_CREATEBRUSHINDIRECT then
begin
{...lo intercepta y crea nuestra propia brocha}
BrushInfo.lbStyle := BS_SOLID;
BrushInfo.lbColor := clRed;
BrushInfo.lbHatch := 0;
NewBrush := CreateBrushIndirect(BrushInfo);
{Selecciona esta brocha en el contexto de dispositivo donde el metafichero
est siendo ejecutado. Esto reemplazar todas las brochas en el metafichero
con una brocha roja slida}
SelectObject(DisplaySurface,NewBrush);
end
else
{Si no es un registro de brocha creada, lo ejecutar}
323
// continua la enumeracin
Figura 5-12:
Todas las
brochas en el
metafichero
mejorado
fueron
cambiadas
GetBitmapBits
Windows.Pas
Sintaxis
GetBitmapBits(
Bitmap: HBITMAP;
Count: Longint;
Bits: Pointer
): Longint;
Descripcin
Parmetros
Bitmap: Manejador del mapa de bits del cual la informacin de color es recuperada.
Count: Indica la cantidad de bytes del array al que apunta el parmetro Bits.
Bits: Puntero a un array de bytes que recibe la informacin de color del mapa de bits.
Vase adems
CreateBitmap, GetDIBits, SetBitmapBits, SetDIBits
5
Captulo
Esta funcin copia la informacin de color del mapa de bits especificado en un buffer.
La funcin GetBitmapBits se mantiene en el API Win32 por motivos de
compatibilidad. Las aplicaciones basadas en Win32 deben usar la funcin GetDIBits.
324
Captulo 5
Ejemplo
Listado 5-12: Recuperando datos del color del mapa de bits
procedure TForm1.Button1Click(Sender: TObject);
type
TBitmapBits = array[0..0] of Byte;
var
BitmapBits: ^TBitmapBits;
// almacena los bytes del mapa de bits
LoopRow, LoopCol: Integer;
// variables de control de bucles
begin
{Asigna a la rejilla de cadenas la dimensiones del mapa de bits}
StringGrid1.ColCount := Image1.Picture.Bitmap.Width;
StringGrid1.RowCount := Image1.Picture.Bitmap.Height;
{Reserva dinmicamente el espacio necesario para los datos de color del bitmap}
GetMem(BitmapBits, StringGrid1.RowCount * StringGrid1.ColCount);
{Recupera los datos de color del mapa de bits}
GetBitmapBits(Image1.Picture.Bitmap.Handle, StringGrid1.RowCount *
StringGrid1.ColCount, BitmapBits);
{Muestra los valores que definen el mapa de bits en la rejilla de cadena. Debido
a que se trata de un mapa de bits de 256 colores, estos valores representan
ndices en la paleta de colores del mapa de bits.}
for LoopRow := 0 to Image1.Height-1 do
for LoopCol := 0 to Image1.Width-1 do
StringGrid1.Cells[LoopCol, LoopRow] :=
IntToStr(BitmapBits[LoopRow * Image1.Width + LoopCol]);
{Libera la memoria}
FreeMem(BitmapBits);
end;
Figura 5-13:
Los bits del
mapa de bits
325
GetBitmapDimensionEx Windows.Pas
Sintaxis
GetBitmapDimensionEx(
p1: HBITMAP;
var p2: TSize
): BOOL;
Descripcin
Esta funcin recupera las dimensiones preferidas del mapa de bits especificado,
asignadas anteriormente por una llamada a la funcin SetBitmapDimensionEx. Si esta
funcin no ha sido llamada, el registro TSize devuelto por GetBitmapDimensionEx
contendr cero en todos los campos.
Parmetros
p1: Manejador del mapa de bits cuyas dimensiones preferidas sern recuperadas.
p2: Puntero a un registro TSize. El registro TSize describe el ancho y la altura de un
rectngulo y se define como:
TSize = record
cx: Longint;
cy: Longint;
end;
{ancho preferido}
{altura preferida}
cx: El ancho preferida del mapa de bits. Cada unidad representa 0.1 milmetros.
cy: La altura preferida del mapa de bits. Cada unidad representa 0.1 milmetros.
Vase adems
SetBitmapDimensionEx
Ejemplo
Vea el Listado 5-5 bajo CreateBitmap.
GetDIBits
Windows.Pas
Sintaxis
GetDIBits(
DC: HDC;
Bitmap: HBITMAP;
StartScan: UINT;
5
Captulo
Si la funcin tiene xito, devuelve TRUE; en caso contrario, devuelve FALSE. Para
obtener informacin ms amplia sobre posibles errores, se debe llamar a la funcin
GetLastError.
326
Captulo 5
NumScans: UINT;
{nmero total de lneas de barrido}
Bits: Pointer;
{puntero a los valores de los bits del mapa de bits DIB}
var BitsInfo: TBitmapInfo; {puntero a la informacin del mapa de bits DIB}
Usage: UINT
{opciones de tipo de color}
): Integer;
{devuelve el nmero de lneas de barrido copiadas}
Descripcin
Esta funcin crea un mapa de bits independiente del dispositivo a partir de la imagen
almacenada en un mapa de bits dependiente del dispositivo, recuperando los valores de
los bits del mapa de bits dependiente del dispositivo especificado y almacenndolos en
un buffer en el formato definido por el registro TBitmapInfo, al que apunta el parmetro
BitsInfo. El parmetro Bitmap puede tambin especificar el manejador de un mapa de
bits independiente del dispositivo, en cuyo caso esta funcin puede ser usada para crear
una copia del DIB en el formato que se desee, especificado en el registro TBitmapInfo.
Si el formato de color del DIB solicitado no se corresponde con el formato de color del
mapa de bits especificado, se generar una paleta de colores para el DIB, usando los
colores por defecto para el formato de color solicitado. Si el parmetro BitsInfo indica
un formato de colores de 16 bits por pxel o superior para el DIB, entonces no se
generar una tabla de colores.
Parmetros
DC: Manejador de un contexto de dispositivo. El mapa de bits dependiente del
dispositivo especificado por el parmetro Bitmap utiliza la paleta actual de este
contexto de dispositivo para su informacin de color.
Bitmap: Manejador del mapa de bits dependiente del dispositivo cuyos valores de bits
son copiados.
StartScan: Especifica la lnea de barrido de inicio a recuperar del mapa de bits
dependiente del dispositivo.
NumScans: Especifica la cantidad de lneas de barrido a recuperar del mapa de bits
dependiente del dispositivo.
Bits: Puntero a un buffer que recibe los valores de los bits del mapa de bits. La
aplicacin es responsable de reservar suficiente memoria para almacenar la imagen del
mapa de bits, y de liberar esta memoria cuando no sea necesaria. Los seis campos del
registro TBitmapInfoHeader contenido a su vez en el registro TBitmapInfo al que
apunta el parmetro BitsInfo tienen que ser inicializados para indicar las dimensiones y
formato de color de los bits del DIB solicitado. Si este parmetro es nil, la funcin
rellena el registro TBitmapInfo al que apunta el parmetro BitsInfo con las dimensiones
y el formato de color del mapa de bits dependiente del dispositivo especificado por el
parmetro Bitmap. En este caso, al campo biSize del registro TBitmapInfoHeader hay
que asignarle SizeOf(TBitmapInfoHeader) o la funcin fallar. Adicionalmente, si el
campo biBitCount es cero, el registro TBitmapInfo es rellenado sin la tabla de colores
del mapa de bits. Esta funcionalidad puede utilizarse para solicitar los atributos de un
mapa de bits.
327
BitsInfo: Puntero al registro TBitmapInfo que describe el formato deseado para el DIB,
incluyendo la informacin sobre sus dimensiones y tabla de colores. El registro
TBitmapInfo se define de la siguiente forma:
TBitmapInfo = packed record
bmiHeader: TBitmapInfoHeader;
{informacin de encabezamiento}
bmiColors: array[0..0] of TRGBQuad; {tabla de colores usada por el mapa de
bits}
end;
El registro TBitmapInfoHeader se define como:
TBitmapInfoHeader = packed record
biSize: DWORD;
{tamao del registro en bytes}
biWidth: Longint;
{ancho del mapa de bits en pxeles}
biHeight: Longint;
{altura del mapa de bits en pxeles}
biPlanes: Word;
{nmero de planos de colores}
biBitCount: Word;
{bits necesarios para describir un color}
biCompression: DWORD; {opciones de compresin}
biSizeImage: DWORD;
{tamao de la imagen en bytes}
biXPelsPerMeter: Longint; {pxeles horizontales por medida del
dispositivo de destino}
biYPelsPerMeter: Longint; {pxeles verticales por medida del
dispositivo de destino}
biClrUsed: DWORD;
{nmero de ndices de colores usados}
biClrImportant: DWORD; {nmero de ndices de colores importantes}
end;
El registro TRGBQuad se define como:
{intensidad del color azul}
{intensidad del color verde}
{intensidad del color rojo}
{valor reservado}
5
Captulo
328
Captulo 5
es inicializado con las dimensiones y formato del mapa de bits dependiente del
dispositivo y la funcin devuelve la cantidad total de lneas de barrido en el mapa de
bits dependiente del dispositivo. Si la funcin falla, devuelve cero.
Vase adems
CreateDIBitmap, CreateDIBSection, GetBitmapBits, SetDIBits
Ejemplo
Listado 5-13: Creando un DIB a partir de un mapa de bits dependiente del dispositivo
procedure TForm1.Button1Click(Sender: TObject);
var
TheBitmap: HBITMAP;
// manejador de un mapa de bits corriente
RegularBitmapInfo: Windows.TBitmap; // registro con informacin de un mapa de
// bits de Windows
BitmapInfo: PBitmapInfo;
// puntero a registro con informacin
// de un DIB
BitmapBits: Pointer;
// puntero a valores de un DIB
begin
{Obtiene un manejador de un mapa de bits del sistema}
TheBitmap:=LoadBitmap(0, MakeIntResource(OBM_CHECKBOXES));
{Rellena un registro TBitmap de Windows}
GetObject(TheBitmap, SizeOf(Windows.TBitmap), @RegularBitmapInfo);
{Reserva memoria para el encabezamiento del mapa de bits DIB}
GetMem(BitmapInfo, SizeOf(TBitmapInfo) + 256 * SizeOf(TRGBQuad));
{Inicializa la informacin del mapa de bits}
BitmapInfo^.bmiHeader.biWidth
:= RegularBitmapInfo.bmWidth;
BitmapInfo^.bmiHeader.biHeight
:= RegularBitmapInfo.bmHeight;
BitmapInfo^.bmiHeader.biPlanes
:= 1;
BitmapInfo^.bmiHeader.biBitCount
:= 8;
// 256 colores
BitmapInfo^.bmiHeader.biCompression
:= BI_RGB; // sin compresin
BitmapInfo^.bmiHeader.biSizeImage
:= 0;
// Windows determina el tamao
BitmapInfo^.bmiHeader.biXPelsPerMeter := 0;
BitmapInfo^.bmiHeader.biYPelsPerMeter := 0;
BitmapInfo^.bmiHeader.biClrUsed
:= 0;
BitmapInfo^.bmiHeader.biClrImportant := 0;
BitmapInfo^.bmiHeader.biSize
:= SizeOf(TBitmapInfoHeader);
{Reserva suficiente memoria para almacenar los bits del mapa de bits}
GetMem(BitmapBits, RegularBitmapInfo.bmWidth * RegularBitmapInfo.bmHeight);
{Recupera los bits de un mapa de bits corriente en formato DIB}
GetDIBits(Form1.Canvas.Handle, TheBitmap, 0, RegularBitmapInfo.bmHeight,
BitmapBits, BitmapInfo^, 0);
{Muestra este nuevo mapa de bits DIB}
SetDIBitsToDevice(Form1.Canvas.Handle,
(Form1.Width div 2) - (BitmapInfo^.bmiHeader.biWidth div 2), 25,
BitmapInfo^.bmiHeader.biWidth,
BitmapInfo^.bmiHeader.biHeight, 0, 0, 0,
329
Figura 5-14:
DIB creado a
partir de un
mapa de bits
dependiente
del dispositivo
FreeMem(BitmapBits,RegularBitmapInfo.bmWidth * RegularBitmapInfo.bmHeight);
end;
DIB_RGB_COLORS
GetEnhMetaFile
Descripcin
El campo bmiColors del registro TBitmapInfo es un array de
ndices de 16 bits en la paleta lgica actual del contexto de
dispositivo especificado. Este valor no debe ser usado si el
mapa de bits va a ser guardado en disco.
El campo bmiColors del registro TBitmapInfo es un array de
valores de colores RGB literales.
Windows.Pas
Sintaxis
GetEnhMetaFile(
p1: PChar
): HENHMETAFILE;
Descripcin
Esta funcin crea un metafichero mejorado y devuelve su manejador, utilizando la
informacin de metafichero mejorado almacenada en el fichero especificado. Cuando
la aplicacin deje de necesitar el metafichero mejorado, deber eliminarlo llamando a
la funcin DeleteObject. Esta funcin slo abre metaficheros en formato mejorado.
5
Captulo
Valor
DIB_PAL_COLORS
330
Captulo 5
Parmetros
p1: Cadena de caracteres terminada en nulo que contiene el nombre de fichero del
metafichero mejorado que ser abierto.
Vase adems
CreateEnhMetaFile, DeleteEnhMetaFile, GetEnhMetaFileHeader,
GetEnhMetaFileDescription
Ejemplo
Listado 5-14: Abriendo metaficheros mejorados
procedure TForm1.FileListBox1DblClick(Sender: TObject);
var
TheMetafile: HENHMETAFILE;
// manejador del metafichero original
CopyMetafile: HENHMETAFILE;
// manejador del metafichero copiado
MetafileInfo: TEnhMetaHeader;
// encabezamiento del metafichero
MetafileDescription: PChar;
// almacena la descripcin del metafichero
DescriptionSize: UINT;
// almacena el tamao de la descripcin
CorrectedRect: TRect;
// relacin de aspecto de un rectngulo
ScaleVert,
// se utilizan para calcular
ScaleHorz,
// la relacin de aspecto corregida
ScaleLeast: Real;
begin
{Abre y recupera un manejador del metafichero seleccionado}
TheMetafile := GetEnhMetaFile(PChar(FileListBox1.FileName));
{Recupera el tamao de la cadena de descripcin}
DescriptionSize := GetEnhMetaFileDescription(TheMetaFile, 0, nil);
{Reserva dinmicamente un buffer para almacenar la descripcin}
MetafileDescription := StrAlloc(DescriptionSize + 1);
{Recupera la cadena de descripcin del metafichero, si existe}
GetEnhMetaFileDescription(TheMetaFile, DescriptionSize, MetafileDescription);
{Recupera la informacin del encabezamiento del metafichero}
GetEnhMetaFileHeader(TheMetafile, SizeOf(MetafileInfo), @MetafileInfo);
{Busca la menor relacin entre el tamao del rectngulo lmite del metafichero
y el rectngulo TImage}
ScaleVert:=Image1.Height / (MetafileInfo.rclBounds.Bottom MetafileInfo.rclBounds.Top);
ScaleHorz:=Image1.Width / (MetafileInfo.rclBounds.Right MetafileInfo.rclBounds.Left);
{Busca la menor relacin}
if ScaleVert < ScaleHorz then
ScaleLeast := ScaleVert
331
else
ScaleLeast := ScaleHorz;
{Determina el nuevo rectngulo lmite usando este factor de compresin}
CorrectedRect.Left :=Trunc(MetafileInfo.rclBounds.Left * ScaleLeast);
CorrectedRect.Top
:=Trunc(MetafileInfo.rclBounds.Top * ScaleLeast);
CorrectedRect.Right :=Trunc(MetafileInfo.rclBounds.Right * ScaleLeast);
CorrectedRect.Bottom:=Trunc(MetafileInfo.rclBounds.Bottom * ScaleLeast);
{Ajusta el nuevo rectngulo lmite para comenzar en la esquina superior izq.}
CorrectedRect.Left := 0;
CorrectedRect.Top := 0;
CorrectedRect.Right := CorrectedRect.Right - CorrectedRect.Left;
CorrectedRect.Bottom := CorrectedRect.Bottom - CorrectedRect.Top;
{Comienza mostrando la informacin del metafichero}
with ListBox1.Items do begin
Clear;
Add('Description -');
if DescriptionSize > 0 then
begin
{La primera parte de la descripcin es el nombre del programa usado
para crear el metafichero, seguido de un carcter nulo}
Add(string(MetafileDescription));
5
Captulo
332
Captulo 5
end;
{Borra cualquier imagen previa}
Image1.Canvas.Fillrect(Image1.Canvas.Cliprect);
Image2.Canvas.Fillrect(Image2.Canvas.Cliprect);
{Muestra el metafichero como aparece originalmente}
PlayEnhMetaFile(Image1.Canvas.Handle, TheMetafile, CorrectedRect);
{Hace una copia del metafichero original en memoria}
CopyMetafile := CopyEnhMetaFile(TheMetafile, nil);
{Muestra este metafichero copiado}
PlayEnhMetaFile(Image2.Canvas.Handle, CopyMetafile, Image1.Canvas.Cliprect);
{Elimina los manejadores de ambos metaficheros pues ya no son necesarios}
DeleteEnhMetaFile(TheMetafile);
Figura 5-15:
Un
metafichero
mejorado
DeleteEnhMetaFile(CopyMetafile);
{Libera la memoria reservada para la descripcin}
StrDispose(MetafileDescription);
end;
GetEnhMetaFileDescription
Windows.Pas
Sintaxis
GetEnhMetaFileDescription(
p1: HENHMETAFILE;
{manejador de metafichero}
p2: UINT;
{tamao del buffer al que apunta el parmetro p3}
p3: PChar
{puntero a buffer}
): UINT;
{devuelve la longitud de la descripcin}
333
Descripcin
Esta funcin extrae la cadena de descripcin de un metafichero mejorado, copindola
en el buffer especificado. Esta descripcin es opcional, de manera que algunos
metaficheros mejorados pueden no tenerla. La cadena de descripcin contiene dos
cadenas individuales, separadas por un carcter nulo y terminada por dos caracteres
nulos (por ejemplo, CreateEnhMetaFile Example Program + Chr(0) + Example
metafile + Chr(0) + Chr(0)). Normalmente, la primera cadena contiene el nombre del
paquete grfico que cre el metafichero mejorado y la segunda cadena contiene el ttulo
de la imagen del metafichero mejorado. Consulte la funcin CreateEnhMetaFile para
ms informacin acerca de cmo incluir una descripcin en un metafichero mejorado.
Bajo Windows 95/98, la longitud mxima de una cadena de descripcin es de 16.384
bytes.
Parmetros
p1: Manejador del metafichero cuya cadena de descripcin ser recuperada.
p2: Especifica el tamao del buffer de texto al que apunta el parmetro p3, en
caracteres. Si la longitud de la cadena de descripcin es superior a este valor ser
truncada.
p3: Puntero al buffer de texto que recibe la cadena de descripcin. Este parmetro
puede ser nil.
Vase adems
CreateEnhMetaFile
GetEnhMetaFileHeader
Windows.Pas
Sintaxis
GetEnhMetaFileHeader(
p1: HENHMETAFILE;
p2: UINT;
p3: PEnhMetaHeader
): UINT;
Captulo
Ejemplo
334
Captulo 5
Descripcin
Esta funcin recupera un registro que contiene la informacin de encabezamiento del
metafichero mejorado especificado. La informacin del encabezamiento describe
completamente el metafichero mejorado, incluyendo elementos tales como su paleta de
colores, sus dimensiones y su tamao.
Parmetros
p1: Manejador de un metafichero mejorado cuya informacin de encabezamiento ser
recuperada.
p2: Especifica el tamao del buffer al que apunta el parmetro p3, en bytes. A este
parmetro se le debe asignar SizeOf(TEnhMetaHeader).
p3: Un puntero a un registro TEnhMetaHeader que recibe la informacin sobre el
metafichero mejorado especificado. Este parmetro puede ser nil. El registro
TEnhMetaHeader se define de la siguiente forma:
TEnhMetaHeader = packed record
iType: DWORD;
{identificador del tipo de registro}
nSize: DWORD;
{tamao del registro, en bytes}
rclBounds: TRect;
{las dimensiones del rectngulo lmite}
rclFrame: TRect;
{las dimensiones de la imagen rectangular}
dSignature: DWORD;
{firma del metafichero mejorado}
nVersion: DWORD;
{versin del metafichero mejorado}
nBytes: DWORD;
{tamao del metafichero mejorado, en bytes}
nRecords: DWORD;
{cantidad de registros en el metafichero mejorado}
nHandles: Word;
{cantidad de manejadores en tabla de manejadores}
sReserved: Word;
{valor reservado}
nDescription: DWORD;
{longitud de la cadena de descripcin}
offDescription: DWORD; {desplazamiento de la cadena de descripcin}
nPalEntries: DWORD;
{nmero de entradas en la paleta de colores}
szlDevice: TSize;
{resolucin de dispositivo de referencia, en pxeles}
szlMillimeters: TSize;
{resolucin de dispositivo de referencia, en mm.}
end;
iType: Siempre se le asigna el identificador de registro de metafichero mejorado
EMR_HEADER.
nSize: Especifica el tamao del registro TEnhMetaHeader, en bytes.
rclBounds: Un registro TRect que contiene las coordenadas, en unidades del
dispositivo, del rectngulo ms pequeo que puede contener la imagen
almacenada en el metafichero mejorado. Estas dimensiones son suministradas por
el GDI.
rclFrame: Un registro TRect que contiene las coordenadas, en centsimas de
milmetro, del rectngulo que encierra la imagen almacenada en el metafichero
mejorado. Esta coordenadas son suministradas por la funcin que originalmente
cre el metafichero mejorado.
335
Vase adems
CreateEnhMetaFile, GetEnhMetaFile, GetEnhMetaFileDescription, PlayEnhMetaFile
Ejemplo
Vea el Listado 5-14 bajo GetEnhMetaFile.
GetStretchBltMode
Windows.Pas
Sintaxis
GetStretchBltMode(
DC: HDC
): Integer;
5
Captulo
Si la funcin tiene xito, devuelve la cantidad de bytes que fueron copiados al registro
TEnhMetaHeader al que apunta el parmetro p3. Si la funcin tiene xito y al
parmetro p3 se le asigna nil, devuelve el tamao del buffer necesario para almacenar
la informacin del encabezamiento. Si la funcin falla, devuelve cero.
336
Captulo 5
Descripcin
Esta funcin recupera el modo actual de escalamiento de mapas de bits del contexto de
dispositivo especificado. Este modo determina cmo se aaden o eliminan filas y
columnas de un mapa de bits cuando se llama a la funcin StretchBlt.
Parmetros
DC: Manejador del contexto de dispositivo cuyo modo de escalamiento ser
recuperado.
Vase adems
SetStretchBltMode, StretchBlt
Ejemplo
Vea el Listado 5-15 bajo LoadBitmap.
Tabla 5-10: Valores que devuelve GetStretchBltMode
Valor
BLACKONWHITE
COLORONCOLOR
HALFTONE
STRETCH_ANDSCANS
STRETCH_DELETESCANS
STRETCH_HALFTONE
STRETCH_ORSCANS
WHITEONBLACK
Descripcin
Ejecuta una operacin booleana and usando los valores de
los colores para pxeles existentes y eliminados. Si el mapa
de bits es monocromtico, este modo mantiene los pxeles
negros a expensas de los blancos.
Borra pxeles sin hacer ningn intento de conservar
informacin sobre ellos.
Mapea pxeles del mapa de bits de origen en bloques de
pxeles sobre el mapa de bits de destino. El color del pxel
de destino es el promedio de los colores de los pxeles de
origen. Este modo requiere ms tiempo de procesamiento
que otros, pero produce imgenes de mejor calidad. Si
este modo es utilizado, la aplicacin tiene que llamar a la
funcin SetBrushOrgEx para reinicializar la brocha original,
u ocurrir un desalineamiento de la brocha.
Equivalente a BLACKONWHITE.
Equivalente a COLORONCOLOR.
Equivalente a HALFTONE.
Equivalente a WHITEONBLACK.
Ejecuta una operacin booleana or usando los valores de
los colores para pxeles eliminados y existentes. Si el mapa
de bits es monocromtico, este modo mantiene los pxeles
blancos a expensas de los negros.
LoadBitmap
337
Windows.Pas
Sintaxis
LoadBitmap(
hInstance: HINST;
lpBitmapName: PAnsiChar
): HBITMAP;
{manejador de instancia}
{nombre de recurso de mapa de bits}
{devuelve un manejador de mapa de bits}
Descripcin
Esta funcin carga un mapa de bits de los recursos del fichero ejecutable, devolviendo
su manejador. Cuando la aplicacin termina de utilizar el mapa de bits, deber
eliminarlo llamando a la funcin DeleteObject. Esta funcin asume que el mapa de bits
tendr slo 16 colores. Utilice la funcin LoadResource para cargar mapas de bits con
mayor resolucin de colores.
Parmetros
hInstance: Manejador de instancia de un mdulo cuyo fichero ejecutable contiene los
recursos del mapa de bits a cargar.
lpBitmapName: Puntero a una cadena de caracteres terminada en nulo que contiene el
nombre del recurso de mapa de bits a cargar. La funcin MakeIntResource puede ser
utilizada con un identificador de recurso para suministrar un valor para este parmetro.
Para cargar alguno de los recursos de mapa de bits predefinidos utilizados por el Win32
API, asgnele al parmetro hInstance el valor cero (0) y utilice la funcin
MakeIntResource con uno de los valores de la Tabla 5-11 para este parmetro.
Ejemplo
Listado 5-15: Cargando un mapa de bits predefinido
procedure TForm1.ComboBox1Change(Sender: TObject);
var
TheBitmap: HBITMAP;
// almacena el mapa de bits
BitmapInfo: Windows.TBitmap;
// almacena la informacin sobre el mapa de bits
OffscreenDC: HDC;
// manejador de un contexto de dispositivo
// fuera de pantalla
{Esto define todos los mapas de bits del sistema accesibles en Windows}
type
TBitmapTypes = array[0..25] of Integer;
5
Captulo
Vase adems
338
Captulo 5
const
BitmapTypes: TBitmapTypes = (OBM_CLOSE,OBM_UPARROW,OBM_DNARROW,OBM_RGARROW,
OBM_LFARROW,OBM_REDUCE,OBM_ZOOM,OBM_RESTORE,
OBM_REDUCED,OBM_ZOOMD,OBM_RESTORED,OBM_UPARROWD,
OBM_DNARROWD,OBM_RGARROWD,OBM_LFARROWD,
OBM_MNARROW,OBM_COMBO,OBM_UPARROWI,OBM_DNARROWI,
OBM_RGARROWI,OBM_LFARROWI,OBM_BTSIZE,
OBM_CHECK,OBM_CHECKBOXES,OBM_BTNCORNERS,
OBM_SIZE);
begin
{Borra las ltimas imgenes}
Image1.Canvas.Brush.Color:=clBtnFace;
Image2.Canvas.Brush.Color:=clBtnFace;
Image1.Canvas.FillRect(Image1.Canvas.Cliprect);
Image2.Canvas.FillRect(Image2.Canvas.Cliprect);
{Carga el mapa de bits seleccionado}
TheBitmap := LoadBitmap(0, MakeIntResource(BitmapTypes[ComboBox1.ItemIndex]));
{Crea contexto de dispositivo fuera de pantalla y selecciona mapa de bits en l}
OffscreenDC := CreateCompatibleDC(0);
SelectObject(OffscreenDC, TheBitmap);
{Rellena un registro de un mapa de bits}
GetObject(TheBitmap, SizeOf(Windows.TBitmap), @BitmapInfo);
{Dibuja el mapa de bits en Image1}
BitBlt(Image1.Canvas.Handle, 45, 45, Image1.Width, Image1.Height, OffscreenDC,
0,0,SRCCOPY);
{Verifica que el modo de escalamiento en Image2 es el que se quiere}
if GetStretchBltMode(Image2.Canvas.Handle) <> COLORONCOLOR then
SetStretchBltMode(Image2.Canvas.Handle, COLORONCOLOR);
{Dibuja el mapa de bits en Image2, agrandndolo para llenar la imagen}
StretchBlt(Image2.Canvas.Handle, 0, 0, Image2.Width, Image2.Height,
OffscreenDC, 0, 0, BitmapInfo.bmWidth, BitmapInfo.bmHeight,
SRCCOPY);
{Elimina el mapa de bits}
Figura 5-16:
Un recurso de
mapa de bits
predefinido
DeleteObject(TheBitmap);
339
OBM_BTSIZE
OBM_CHECK
OBM_CHECKBOXES
OBM_CLOSE
OBM_COMBO
OBM_DNARROW
OBM_DNARROWD
OBM_DNARROWI
OBM_LFARROW
OBM_LFARROWD
OBM_LFARROWI
OBM_MNARROW
OBM_REDUCE
OBM_REDUCED
OBM_RESTORE
OBM_RESTORED
OBM_RGARROW
OBM_RGARROWD
Descripcin
Carga el recurso del mapa de bits para marcador de esquina
del sistema.
Carga el recurso del mapa de bits para el botn de
dimensionamiento.
Carga el recurso del mapa de bits para la marca de
verificacin por defecto.
Carga la coleccin de smbolos del sistema de las casillas de
verificacin.
Carga el recurso de iconos del men del sistema.
Carga el recurso del mapa de bits para la flecha de
despliegue de la caja de combinacin.
Carga el recurso del mapa de bits para la flecha hacia abajo
de la barra de desplazamiento, en estado normal.
Carga el recurso del mapa de bits para la flecha hacia abajo
de la barra de desplazamiento, en estado pulsado.
Carga el recurso del mapa de bits para la flecha hacia abajo
de la barra de desplazamiento, en estado deshabilitado.
Carga el recurso del mapa de bits para la flecha hacia la
izquierda de la barra de desplazamiento, en estado normal.
Carga el recurso del mapa de bits para la flecha hacia la
izquierda de la barra de desplazamiento, en estado pulsado.
Carga el recurso del mapa de bits para la flecha hacia la
izquierda de la barra de desplazamiento, en estado
deshabilitado.
Carga el recurso del mapa de bits usado para indicar una
opcin de men que contiene un submen.
Carga el recurso del mapa de bits para un botn de
minimizar, en estado normal.
Carga el recurso del mapa de bits para un botn de
minimizar, en estado pulsado.
Carga el recurso del mapa de bits para un botn de
restaurar, en estado normal.
Carga el recurso del mapa de bits para un botn de
restaurar, en estado pulsado.
Carga el recurso del mapa de bits para la flecha hacia la
derecha de la barra de desplazamiento, en estado normal.
Carga el recurso del mapa de bits para la flecha hacia la
derecha de la barra de desplazamiento, en estado pulsado.
5
Captulo
Valor
OBM_BTNCORNERS
340
Captulo 5
Valor
OBM_RGARROWI
OBM_SIZE
OBM_UPARROW
OBM_UPARROWD
OBM_UPARROWI
OBM_ZOOM
OBM_ZOOMD
LoadImage
Descripcin
Carga el recurso del mapa de bits para la flecha hacia la
derecha de la barra de desplazamiento, en estado
deshabilitado.
Carga el recurso del mapa de bits para la esquina de
redimensionamiento.
Carga el recurso del mapa de bits para la flecha hacia arriba
de la barra de desplazamiento, en estado normal.
Carga el recurso del mapa de bits para la flecha hacia arriba
de la barra de desplazamiento, en estado pulsado.
Carga el recurso del mapa de bits para la flecha hacia arriba
de la barra de desplazamiento, en estado deshabilitado.
Carga el recurso del mapa de bits para un botn de
maximizar, en estado normal.
Carga el recurso del mapa de bits para un botn de
maximizar, en estado pulsado.
Windows.Pas
Sintaxis
LoadImage(
hInst: HINST;
ImageName: PChar;
ImageType: UINT;
X: Integer;
Y: Integer;
Flags: UINT
): THandle;
Descripcin
Esta funcin carga un icono, un cursor, un metafichero mejorado o un mapa de bits
desde un fichero o desde recursos ejecutables. La imagen puede ser redimensionada
como se desee y numerosas opciones afectan a la imagen final cargada.
Parmetros
hInst: Manejador de instancia del mdulo que contiene la imagen que ser cargada.
ImageName: Puntero a una cadena de caracteres terminada en nulo que contiene el
nombre de la imagen que ser cargada. Si el parmetro Flags incluye la opcin
LR_LOADFROMFILE, este parmetro contendr un puntero a una cadena terminada en
nulo que especifica el nombre de fichero de la imagen a cargar.
ImageType: Un valor que indica el tipo de imagen que ser cargada. Este parmetro
puede tomar un valor de la Tabla 5-12.
341
Vase adems
CopyImage, GetSystemMetrics, LoadBitmap, LoadCursor, LoadIcon
Ejemplo
Listado 5-16: Cargando imgenes de mapas de bits desde archivos
5
Captulo
342
Captulo 5
Figura 5-17:
La imagen del
mapa de bits
cargado
{Elimina la imagen cargada y el contexto de dispositivo fuera de pantalla}
DeleteDC(TheOffscreenDC);
DeleteObject(TheBitmap);
end;
Descripcin
La imagen es un mapa de bits.
La imagen es un cursor.
La imagen es un metafichero mejorado.
La imagen es un icono.
LR_DEFAULTCOLOR
Descripcin
Si el parmetro ImageType contiene el valor
IMAGE_BITMAP, esta funcin devuelve un manejador
de un mapa de bits de seccin DIB.
Carga la imagen en su formato de colores definido.
Esta es la opcin por defecto.
Valor
LR_DEFAULTSIZE
LR_LOADFROMFILE
LR_LOADMAP3DCOLORS
LR_LOADTRANSPARENT
LR_MONOCHROME
LR_SHARED
PatBlt
343
Descripcin
Solamente para una imagen de icono o cursor. Esta
opcin hace que la funcin cargue la imagen usando el
ancho y altura de stos por defecto, segn indica la
funcin GetSystemMetrics.
Indica que la cadena terminada en nulo a la que apunta
el parmetro ImageName contiene un nombre de
fichero y la imagen debe ser cargada desde disco.
Busca en los pxeles de la imagen cargada y reemplaza
los pxeles gris oscuro (RGB(128,128,128)) con el
color del sistema COLOR_3DSHADOW, los pxeles
grises (RGB(192,192,192)) con el color del sistema
COLOR_3DFACE y los pxeles gris claros
(RGB(223,223,223)) con el color del sistema
COLOR_3DLIGHT.
Recupera el valor del primer pxel en la imagen, y
reemplaza todos los pxeles del mismo color en la
imagen con el color del sistema COLOR_WINDOW.
Esto tiene el mismo efecto que realizar un blit de la
imagen con el rea de dibujo usando la funcin
BrushCopy. Si la opcin LR_LOADMAP3DCOLORS
ha sido incluida, LR_LOADTRANSPARENT se hace
precedente, pero reemplaza el color indicado del
pxel con el color del sistema COLOR_3DFACE.
Crea una versin en blanco y negro de la imagen
original.
Para recursos, esta opcin hace que la funcin
devuelva el mismo manejador para recursos idnticos
cargados varias veces. Sin esta opcin, LoadImage
devuelve un manejador diferente cada vez que el
mismo recurso es cargado. No especifique esta
opcin para imgenes cargadas desde ficheros o para
imgenes que cambiarn despus de cargadas.
Windows.Pas
Sintaxis
PatBlt(
DC: HDC;
X: Integer;
Y: Integer;
Width: Integer;
Height: Integer;
ROP: DWORD
): BOOL;
5
Captulo
344
Captulo 5
Descripcin
Esta funcin rellena un rectngulo usando la brocha actualmente seleccionada en el
contexto de dispositivo especificado, combinando los colores de la brocha y el destino
usando la operacin de barrido especificada. Algunos dispositivos pueden no soportar
la funcin PatBlt; utilice la funcin GetDeviceCaps para determinar si el dispositivo de
destino soporta transferencias de bloques de bits.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el rectngulo ser dibujado.
X: La coordenada horizontal de la esquina superior izquierda del rectngulo que ser
rellenado, en unidades lgicas.
Y: La coordenada vertical de la esquina superior izquierda del rectngulo que ser
rellenado, en unidades lgicas.
Width: El ancho del rectngulo que ser rellenado, en unidades lgicas.
Height: La altura del rectngulo que ser rellenado, en unidades lgicas.
Rop: El cdigo de la operacin de barrido. Este valor determina cmo los pxeles de la
brocha usada para pintar el rectngulo sern combinados con los pxeles actuales en el
contexto de dispositivo y puede ser un valor de la Tabla 5-14.
Vase adems
GetDeviceCaps, CreateBrush, CreatePatternBrush
Ejemplo
Listado 5-17: Rellenando un fondo
procedure TForm1.Button1Click(Sender: TObject);
var
BitmapPattern: HBITMAP;
// almacena el patrn de la brocha del mapa de bits
PatternBrush: HBRUSH;
// almacena el manejador de la brocha patrn
OldBrush: HBRUSH;
// almacena la brocha original
begin
{Carga un mapa de bits desde el fichero de recursos}
BitmapPattern := LoadBitmap(hInstance, 'BRUSHPATTERN');
{Lo usa para crear una brocha patrn}
PatternBrush := CreatePatternBrush(BitmapPattern);
{Selecciona esta nueva brocha en el contexto de dispositivo del formulario}
OldBrush := SelectObject(Canvas.Handle, PatternBrush);
345
Figura 5-18:
El patrn de la
brocha
resultante
DSTINVERT
PATCOPY
PATINVERT
WHITENESS
Descripcin
Rellena los pxeles en el rectngulo especificado en el destino con el
color indicado en el ndice 0 de la paleta fsica. Por defecto este
color es negro.
Invierte el color de los pxeles en el rectngulo destino.
Copia el patrn contenido en la brocha seleccionada en el contexto
de dispositivo de destino directamente en el destino.
Combina los colores de los pxeles del patrn contenido en la
brocha seleccionada en el contexto de dispositivo de destino con los
colores de los pxeles en el destino, usando el operador booleano
xor.
Rellena los pxeles en el rectngulo especificado en el destino con el
color indicado en el ndice 255 de la paleta fsica. Por defecto este
color es blanco.
PlayEnhMetaFile
Windows.Pas
Sintaxis
PlayEnhMetaFile(
DC: HDC;
p2: HENHMETAFILE;
const p3: TRect
): BOOL;
Descripcin
Esta funcin reproduce el metafichero mejorado identificado por el parmetro p2 sobre
el contexto de dispositivo especificado. El metafichero puede ser recortado definiendo
5
Captulo
Valor
BLACKNESS
346
Captulo 5
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el metafichero mejorado ser
reproducido (dibujado).
p2: Manejador del metafichero mejorado a dibujar.
p3: Puntero a un registro TRect. El metafichero mejorado ser dibujado dentro de las
coordenadas especificadas por este registro. Estas coordenadas se especifican en
unidades lgicas. El campo rclFrame del encabezamiento del metafichero mejorado es
usado para mapear el metafichero dentro de las coordenadas de rectngulo.
Vase adems
CreateEnhMetaFile, GetEnhMetaFile, GetEnhMetaFileHeader, GetEnhMetaFilePaletteEntries, PlayEnhMetaFileRecord
Ejemplo
Vea el Listado 5-10 bajo CreateEnhMetaFile.
PlayEnhMetaFileRecord
Windows.Pas
Sintaxis
PlayEnhMetaFileRecord(
DC: HDC;
var p2: THandleTable;
const p3: TEnhMetaRecord;
p4: UINT
): BOOL;
347
Descripcin
Esta funcin ejecuta las funciones del GDI identificadas por el registro del metafichero
mejorado. PlayEnhMetaFileRecord est prevista para ser usada conjuntamente con la
funcin EnumEnhMetaFile para procesar y ejecutar un metafichero mejorado registro
por registro. Los parmetros DC, p2 y p3 tienen que corresponderse exactamente con el
contexto de dispositivo, la tabla de manejadores y el contador de manejadores de la
tabla de manejadores del metafichero pasados a la funcin de respuesta que usa la
funcin EnumEnhMetaFile. Si el registro pasado en el parmetro p3 no es reconocido,
es ignorado y la funcin devuelve TRUE.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el metafichero mejorado est
siendo ejecutado.
p2: Puntero a una tabla de manejadores de objetos GDI. Estos objetos definen la
imagen del metafichero mejorado.
p3: Puntero al registro TEnhMetaRecord que define la entrada del metafichero
mejorado que ser ejecutada. El registro TEnhMetaRecord se define como:
TEnhMetaRecord = packed record
iType: DWORD;
{identificador de registro del metafichero}
nSize: DWORD;
{tamao del registro en bytes}
dParm: array[0..0] of DWORD; {array de parmetros}
end;
Consulte la funcin de respuesta asociada a EnumEnhMetaFile para ver una
explicacin de esta estructura.
p4: La cantidad de manejadores almacenados en la tabla de manejadores del
metafichero mejorado.
EnumEnhMetaFile, PlayEnhMetaFile
Ejemplo
Vea el Listado 5-11 bajo EnumEnhMetaFile.
SetBitmapBits
Windows.Pas
Sintaxis
SetBitmapBits(
p1: HBITMAP;
Captulo
Vase adems
348
Captulo 5
p2: DWORD;
bits: Pointer
): Longint;
Descripcin
Esta funcin compone la imagen del mapa de bits especificado, partiendo de los
valores almacenados en el array bits. La funcin SetBitmapBits est incluida en el API
Win32 por razones de compatibilidad. Las aplicaciones basadas en Win32 deben usar la
funcin SetDIBits.
Parmetros
p1: Manejador del mapa de bits cuya imagen ser compuesta a partir de los valores
almacenados en el array al que apunta el parmetro bits.
p2: Indica la cantidad de bytes del array al que apunta el parmetro bits.
bits: Puntero a un array de bytes que contiene los datos de la imagen para el mapa de
bits.
Vase adems
CreateBitmap, DestroyBitmap, GetBitmapBits, SetDIBits
Ejemplo
Listado 5-18: Componiendo los bits del mapa de bits
{Este ejemplo funcionar apropiadamente slo con un controlador de vdeo de 256
colores.}
procedure TForm1.Button1Click(Sender: TObject);
var
BitmapBits: array[0..9999] of byte;
// almacena los bits del mapa de bits
BitmapImage: TBitmap;
// la imagen del mapa de bits
Loop: Integer;
// contador de bucle
const
Started: Boolean = FALSE;
// controla el bucle ms externo
begin
{Cambia la variable de control del bucle}
Started := not Started;
{Cambia el texto del botn para reflejar su nuevo estado}
if Started then
Button1.Caption := 'Stop'
else
Button1.Caption := 'Start';
349
Captulo
5
Figura 5-19:
Usando
SetBitmapBits
para producir
un efecto
nieve de TV
Application.ProcessMessages;
end;
{Libera nuestro mapa de bits}
BitmapImage.Free
350
Captulo 5
end;
SetBitmapDimensionEx
Windows.Pas
Sintaxis
SetBitmapDimensionEx(
hBitmap: HBITMAP;
Width: Integer;
Height: Integer;
Size: PSize
): BOOL;
Descripcin
Esta funcin asigna el ancho y altura preferidos del mapa de bits especificado, en
trminos de 0.1 milmetros. Estas dimensiones son para uso especfico de la aplicacin,
no afectan a la apariencia de la imagen del mapa de bits y no son usadas por Windows.
Una vez asignadas, estas dimensiones pueden ser recuperadas usando la funcin
GetBitmapDimensionEx.
Parmetros
hBitmap: Manejador del mapa de bits cuyas dimensiones preferidas van a ser
asignadas. Este no puede ser un manejador de un mapa de bits devuelto por la funcin
CreateDIBSection.
Width: Un entero que especifica el ancho preferido del mapa de bits en trminos de 0.l
milimetros.
Height: Un entero que especifica la altura preferida del mapa de bits en trminos de 0.l
milimetros.
Size: Puntero a un registro TSize que recibir las dimensiones previamente asignadas.
Este parmetro puede ser nil.
Vase adems
GetBitmapDimensionEx
Ejemplo
Vea el Listado 5-5 bajo CreateBitmap.
SetDIBits
351
Windows.Pas
Sintaxis
SetDIBits(
DC: HDC;
{manejador de contexto de dispositivo}
Bitmap: HBitmap;
{manejador de mapa de bits corriente}
StartScan: UINT;
{lnea de barrido inicial}
NumScans: UINT;
{cantidad de lneas de barrido}
Bits: Pointer;
{puntero a los valores de los bits del mapa de bits DIB}
var BitsInfo: TBitmapInfo; {puntero a registro de informacin del mapa de bits DIB}
Usage: UINT
{opciones de tipo de color}
): Integer;
{devuelve la cantidad de lneas de barrido copiadas}
Descripcin
Esta funcin copia los valores de los bits del rea especificada del DIB a la que apunta
el parmetro Bits, directamente en el mapa de bits dependiente del dispositivo indicado
por el parmetro Bitmap. Observe que la velocidad de copia ptima del mapa de bits se
obtiene cuando los bits del mapa de bits DIB especifican ndices en la paleta del
sistema.
Parmetros
DC: Manejador de un contexto de dispositivo. Si la opcin DIB_PAL_COLORS es
especificada en el parmetro Usage, los valores de los bits copiados desde el DIB usan
los colores en la paleta actualmente activada de este contexto de dispositivo. Si la
opcin DIB_PAL_COLORS no es especificada, este parmetro es ignorado.
Bitmap: Manejador del mapa de bits cuyos valores de bits estn siendo copiados.
StartScan: Especifica la lnea de barrido inicial para comenzar la copia desde la imagen
DIB a la que apunta el parmetro Bits.
5
Captulo
352
Captulo 5
Vase adems
BitBlt, CreateBitmap, GetDIBits, SetBitmapBits
Ejemplo
Listado 5-19: Componiendo la imagen de un DDB desde un DIB
{Este ejemplo slo funcionar apropiadamente con un controlador de vdeo de 256
colores.}
procedure TForm1.Button1Click(Sender: TObject);
353
var
TheBitmap: HBitmap;
OffScreen: HDC;
Dib: HBITMAP;
DibInfo: PBitmapInfo;
BitsPtr: PByte;
ReferenceDC: HDC;
iLoop: Integer;
5
Captulo
354
Captulo 5
que almacena los colores de la paleta en formato (Red, Green, Blue). Sin
embargo, el campo bmiColors del registro TBitmapInfo necesita un array de
registros TRGBQuad, que almacena los colores en formato (Blue, Green, Red).
Por eso hay que convertir los registros TPaletteEntry en registros TRGBQuad}
for iLoop := 0 to 255 do
begin
DibInfo^.bmiColors[iLoop].rgbBlue
:= SystemPalette[iLoop].peBlue;
DibInfo^.bmiColors[iLoop].rgbRed
:= SystemPalette[iLoop].peRed;
DibInfo^.bmiColors[iLoop].rgbGreen
:= SystemPalette[iLoop].peGreen;
DibInfo^.bmiColors[iLoop].rgbReserved := 0;
end;
{Crea un contexto de dispositivo en memoria}
ReferenceDC := CreateCompatibleDC(0);
{Crea un DIB sobre el contexto de dispositivo en memoria, utilizando la
informacin del mapa de bits}
Dib := CreateDIBSection(ReferenceDC, DibInfo^, DIB_RGB_COLORS,
Pointer(BitsPtr), 0, 0);
{Borra el contexto de dispositivo de referencia}
DeleteDC(ReferenceDC);
{Este bucle contina hasta que el botn es presionado de nuevo}
while Started do
begin
{Rellena la informacin de los bits del mapa de bits con blanco}
FillMemory(BitsPtr, 128*128, $FF);
{Pone 10000 pxeles escogidos aleatoriamente en color negro}
for Loop := 0 to 1000 do
begin
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
PByte(Longint(BitsPtr)+Random(128)*128+Random(128))^ := 0;
end;
{Copia los valores de bits del DIB directamente en el mapa de bits del DDB}
SetDIBits(Form1.Canvas.Handle, TheBitmap, 0, 128, BitsPtr, DibInfo^,
DIB_RGB_COLORS);
{Copia el mapa de bits al rea de dibujo del formulario}
BitBlt(Form1.Canvas.Handle, (Form1.Width div 2) - 64, 8, 128, 128,
Offscreen, 0, 0, SRCCOPY);
355
Figura 5-20:
La imagen
DDB fue
asignada
desde bits
almacenados
en un DIB
DIB_RGB_COLORS
SetDIBitsToDevice
Descripcin
El campo bmiColors del registro TBitmapInfo es un array de
ndices de 16 bits en la paleta actual del contexto de
dispositivo especificado. Este valor no debe ser usado si el
mapa de bits va a ser guardado en disco.
El campo bmiColors del registro TBitmapInfo es un array de
valores de colores RGB literales.
Windows.Pas
Sintaxis
SetDIBitsToDevice(
DC: HDC;
DestX: Integer;
DestY: Integer;
Width: DWORD;
Height: DWORD;
SrcX: Integer;
SrcY: Integer;
n StartScan: UINT;
NumScans: UINT;
Bits: Pointer;
5
Captulo
Valor
DIB_PAL_COLORS
356
Captulo 5
var BitsInfo: TBitmapInfo; {puntero al registro de datos del mapa de bits DIB}
Usage: UINT
{opciones de tipo de color}
): Integer;
{devuelve el nmero de lneas de barrido copiadas}
Descripcin
Esta funcin copia pxeles desde la seccin especificada de la imagen DIB al contexto
de dispositivo de destino. En el caso de mapas de bits independientes del dispositivo de
gran tamao, la operacin de copia se puede realizar por partes, llamando
repetidamente a SetDIBitsToDevice, pasndole cada vez una porcin diferente del DIB
a travs de los parmetros nStartScan y NumScans. Observe que la velocidad ptima de
copia de un mapa de bits se obtiene cuando los bits del mapa de bits DIB especifican
ndices dentro de la paleta del sistema. Esta funcin fallar cuando sea llamada por un
proceso que corra en segundo plano mientras que un proceso MS-DOS est
ejecutndose a pantalla completa en primer plano.
Parmetros
DC: El contexto de dispositivo sobre el cual la imagen DIB es copiada y mostrada.
DestX: La coordenada horizontal de la esquina superior izquierda del rectngulo de
destino en el contexto de dispositivo de destino, en unidades lgicas.
DestY: La coordenada vertical de la esquina superior izquierda del rectngulo de
destino en el contexto de dispositivo de destino, en unidades lgicas.
Width: El ancho de la imagen DIB, en unidades lgicas.
Height: la altura de la imagen DIB, en unidades lgicas
SrcX: La coordenada horizontal de la esquina inferior izquierda del DIB, en unidades
lgicas.
SrcY: La coordenada vertical de la esquina inferior izquierda del DIB, en unidades
lgicas.
nStartScan: Especifica la lnea de barrido de inicio de la imagen DIB (a la que apunta
el parmetro Bits) a partir de la cual se realizar la copia.
NumScans: Especifica la cantidad de lneas de barrido a copiar al destino, desde la
imagen a la que apunta el parmetro Bits.
Bits: Puntero a la imagen DIB, en forma de un array de bytes.
BitsInfo: Puntero a un registro TBitmapInfo que describe las caractersticas del DIB,
incluyendo informacin sobre sus dimensiones y tabla de colores. El registro
TBitmapInfo se define de la siguiente forma:
TBitmapInfo = packed record
bmiHeader: TBitmapInfoHeader; {informacin de encabezamiento}
bmiColors: array[0..0] of TRGBQuad;
{tabla de colores usada por el mapa de bits}
end;
357
Vase adems
SetDIBits, StretchDIBits
Ejemplo
Vea el Listado 5-9 bajo CreateDIBSection.
5
Captulo
Usage: Valor que indica el tipo de informacin sobre el color almacenada en el campo
bmiColors del registro TBitmapInfo al que apunta el parmetro BitsInfo. Este parmetro
puede tomar un valor de la Tabla 5-16.
358
Captulo 5
DIB_RGB_COLORS
SetStretchBltMode
Descripcin
El campo bmiColors del registro TBitmapInfo es un array de
ndices de 16 bits en la paleta actual del contexto de
dispositivo especificado. Este valor no debe ser usado si el
mapa de bits va a ser guardado en disco.
El campo bmiColors del registro TBitmapInfo es un array de
valores de colores RGB literales.
Windows.Pas
Sintaxis
SetStretchBltMode(
DC: HDC;
p2: Integer
): Integer;
Descripcin
Esta funcin asigna el modo de escalado de mapas de bits del contexto de dispositivo
especificado. Este modo define cmo las filas y columnas de un mapa de bits son
aadidas o eliminadas cuando la funcin StretchBlt sea utilizada.
Parmetros
DC: Manejador del contexto de dispositivo cuyo modo de escalado de mapas de bits va
a ser modificado.
p2: El identificador del nuevo modo de escalado de mapas de bits. Este parmetro
puede tomar un valor de la Tabla 5-17. El controlador de vdeo puede soportar modos
de escalado adicionales.
Vase adems
GetStretchBltMode, SetBrushOrgEx, StretchBlt
Ejemplo
Vea el Listado 5-15 bajo LoadBitmap.
359
COLORONCOLOR
HALFTONE
STRETCH_ANDSCANS
STRETCH_DELETESCANS
STRETCH_HALFTONE
STRETCH_ORSCANS
WHITEONBLACK
StretchBlt
Descripcin
Ejecuta una operacin booleana and usando los valores de
color para pxeles existentes y eliminados. Si el mapa de
bits es monocromtico, este modo mantiene los pxeles
negros a expensas de los blancos.
Borra pxeles sin hacer ningn intento de mantener
informacin sobre ellos.
Mapea pxeles del mapa de bits de origen en bloques de
pxeles sobre el mapa de bits de destino. El color del pxel
destino es el promedio de los colores de los pxeles de
origen. Este modo requiere ms tiempo de procesamiento
que otros, pero produce imgenes de mejor calidad. Si
este modo es utilizado, la aplicacin tiene que llamar a la
funcin SetBrushOrgEx para reinicializar la brocha original,
u ocurrir un desalineamiento de la brocha.
Equivalente a BLACKONWHITE.
Equivalente a COLORONCOLOR.
Equivalente a HALFTONE.
Equivalente a WHITEONBLACK.
Ejecuta una operacin booleana or usando los valores de
los colores para pxeles eliminados y existentes. Si el mapa
de bits es monocromtico, este modo mantiene los pxeles
blancos a expensas de los negros.
Windows.Pas
Sintaxis
{manejador del contexto de dispositivo de destino}
{coordenada horizontal del rectngulo de destino}
{coordenada vertical del rectngulo de destino}
{ancho del rectngulo de destino}
{altura del rectngulo de destino}
{manejador del contexto de dispositivo de origen}
{coordenada horizontal del rectngulo de origen}
{coordenada vertical del rectngulo de origen}
{ancho del rectngulo de origen}
{altura del rectngulo de origen}
{cdigo de la operacin de barrido}
{devuelve TRUE o FALSE}
5
Captulo
StretchBlt(
DestDC: HDC;
X: Integer;
Y: Integer;
Width: Integer;
Height: Integer;
SrcDC: HDC;
XSrc: Integer;
YSrc: Integer;
SrcWidth: Integer;
SrcHeight: Integer;
ROP: DWORD
): BOOL;
360
Captulo 5
Descripcin
Esta funcin copia un rectngulo de pxeles del mapa de bits del contexto de
dispositivo de origen especificado, en el mapa de bits del contexto de dispositivo de
destino. El rea del mapa de bits copiado puede ser ampliada o reducida como se desee.
El modo de escalamiento del contexto de dispositivo de destino, que se asigna
mediante la funcin SetStretchBltMode, determina cmo el mapa de bits ser ampliado
o reducido. Si los formatos de colores de los contextos de dispositivos de origen y
destino difieren, esta funcin convierte el formato de colores del contexto de
dispositivo de origen al formato de colores del contexto de dispositivo de destino. Si la
operacin de barrido especificada indica se deben mezclar colores de los contextos de
origen y de destino, la mezcla tiene lugar despus de que el mapa de bits de origen es
ampliado o reducido. Tenga en cuenta que si los signos del ancho o altura del origen y
el destino son diferentes, StretchBlt crear una imagen espejo del mapa de bits
resultante.
Parmetros
DestDC: Manejador del contexto de dispositivo al cual son copiados los pxeles.
X: La coordenada horizontal de la esquina superior izquierda del rectngulo de destino
en el contexto de dispositivo de destino, en unidades lgicas.
Y: La coordenada vertical de la esquina superior izquierda del rectngulo de destino en
el contexto de dispositivo de destino, en unidades lgicas.
Width: El ancho del rectngulo de destino, en unidades lgicas.
Height: La altura del rectngulo de destino, en unidades lgicas.
SrcDC: Manejador del contexto de dispositivo desde el cual los pxeles son copiados.
No puede ser el manejador de un contexto de dispositivo de metafichero.
XSrc: La coordenada horizontal de la esquina superior izquierda del rectngulo de
origen en el contexto de dispositivo de origen, en unidades lgicas.
YSrc: La coordenada vertical de la esquina superior izquierda del rectngulo de origen
en el contexto de dispositivo de origen, en unidades lgicas.
SrcWidth: El ancho del rectngulo de origen, en unidades lgicas.
SrcHeight: La altura del rectngulo de origen, en unidades lgicas.
ROP: Un cdigo de operacin de barrido que determina cmo son combinados los
colores de los pxeles en la imagen de origen, con los colores de los pxeles en el
contexto de dispositivo de destino. Este parmetro puede tomar un valor de la Tabla
5-18.
361
Vase adems
BitBlt, GetDC, CreateCompatibleDC, CreateBitmap, LoadBitmap, SetStretchBltMode
Ejemplo
Vea el Listado 5-16 bajo LoadImage y otros ejemplos a lo largo de este libro.
Tabla 5-18: Valores del parmetro ROP de StretchBlt
DSTINVERT
MERGECOPY
MERGEPAINT
NOTSRCCOPY
NOTSRCERASE
PATCOPY
PATINVERT
PATPAINT
SRCAND
SRCCOPY
SRCERASE
Descripcin
Rellena los pxeles del rectngulo especificado en el destino
con el color especificado en el ndice 0 de la paleta fsica. Por
defecto este color es el negro.
Invierte los colores de los pxeles del rectngulo especificado
en el destino.
Combina los colores de los pxeles del rectngulo de origen
con los colores de los pxeles del patrn de la brocha
seleccionada en el contexto de dispositivo de destino, usando
el operador booleano and.
Invierte los colores de los pxeles del rectngulo de origen y
los combina con los colores de los pxeles del rectngulo
destino, usando el operador booleano or.
Invierte los colores de los pxeles del rectngulo de origen y
los copia en el rectngulo de destino.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano or y luego
invierte el color resultante.
Copia el patrn de la brocha seleccionada en el contexto de
dispositivo de destino directamente en el destino.
Combina los colores de los pxeles del patrn de la brocha
seleccionada en el contexto de dispositivo de destino, con los
colores de los pxeles en el destino, usando el operador
booleano xor.
Combina los colores del patrn de la brocha seleccionada en
el contexto de dispositivo de destino con los colores
invertidos de los pxeles del rectngulo de origen, usando el
operador booleano or, y entonces combina el resultado con
los colores de los pxeles del rectngulo de destino, usando el
operador booleano or.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano and.
Copia los colores de los pxeles del rectngulo de origen
directamente en el rectngulo de destino.
Combina los colores de los pxeles del rectngulo de origen
con los colores invertidos del rectngulo de destino, usando el
operador booleano and.
5
Captulo
Valor
BLACKNESS
362
Captulo 5
Valor
SRCINVERT
SRCPAINT
WHITENESS
StretchDIBits
Descripcin
Combina los colores de los pxeles de los rectngulos de
origen y destino, usando el operador booleano xor.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano or.
Rellena los pxeles del rectngulo especificado en el destino
con el color especificado en el ndice 255 de la paleta fsica.
Por defecto este color es el blanco.
Windows.Pas
Sintaxis
StretchDIBits(
DC: HDC;
{manejador de contexto de dispositivo}
DestX: Integer;
{coordenada horizontal del rectngulo de destino}
DestY: Integer;
{coordenada vertical del rectngulo de destino}
DestWidth: Integer;
{ancho del rectngulo de destino}
DestHeight: Integer;
{altura del rectngulo de destino}
SrcX: Integer;
{coordenada horizontal del rectngulo de origen}
SrcY: Integer;
{coordenada vertical del rectngulo de origen}
SrcWidth: Integer;
{ancho del rectngulo de origen}
SrcHeight: Integer;
{altura del rectngulo de origen}
Bits: Pointer;
{puntero a los valores de los bits del mapa de bits}
var BitsInfo: TBitmapInfo; {puntero al registro del DIB}
Usage: UINT;
{opciones de tipo de color}
ROP: DWORD
{cdigo de la operacin de barrido}
): Integer;
{devuelve el nmero de lneas de barrido copiadas}
Descripcin
Esta funcin copia pxeles del rea rectangular especificada de la imagen DIB en el
rea rectangular especificada del contexto de dispositivo de destino. El rea del mapa
de bits copiado puede ser ampliada o reducida como se desee. El modo de escalamiento
del contexto de dispositivo de destino, que se asigna mediante la funcin
SetStretchBltMode, determina cmo el mapa de bits ser ampliado o reducido. Observe
que la velocidad de copia ptima del mapa de bits se obtiene cuando los bits del mapa
de bits DIB especifican ndices en la paleta del sistema. Tenga en cuenta que si los
signos del ancho o altura del origen y el destino son diferentes, StretchDIBits crear
una imagen espejo del mapa de bits resultante. Esta funcin har una copia fiable de la
imagen del mapa de bits sobre un contexto de dispositivo de impresora.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual la imagen DIB es copiada y
mostrada.
363
5
Captulo
364
Captulo 5
Vase adems
SetDIBits, SetDIBitsToDevice, SetStretchBltMode
Ejemplo
Vea el Listado 5-9 bajo CreateDIBSection.
Tabla 5-19: Valores del parmetro Usage de StretchDIBits
Valor
DIB_PAL_COLORS
DIB_RGB_COLORS
Descripcin
El campo bmiColors del registro TBitmapInfo es un array de
ndices de 16 bits en la paleta actual del contexto de
dispositivo especificado. Este valor no debe ser usado si el
mapa de bits va a ser guardado en disco.
El campo bmiColors del registro TBitmapInfo es un array de
valores de colores RGB literales.
Descripcin
Rellena los pxeles del rectngulo especificado en el destino
con el color especificado en el ndice 0 de la paleta fsica. Por
defecto este color es el negro.
Valor
DSTINVERT
MERGECOPY
MERGEPAINT
NOTSRCCOPY
NOTSRCERASE
PATCOPY
PATINVERT
PATPAINT
SRCAND
SRCCOPY
SRCERASE
SRCINVERT
SRCPAINT
WHITENESS
365
Descripcin
Invierte los colores de los pxeles del rectngulo especificado
en el destino.
Combina los colores de los pxeles del rectngulo de origen
con los colores de los pxeles del patrn de la brocha
seleccionada en el contexto de dispositivo de destino, usando
el operador booleano and.
Invierte los colores de los pxeles del rectngulo de origen y
los combina con los colores de los pxeles del rectngulo
destino, usando el operador booleano or.
Invierte los colores de los pxeles del rectngulo de origen y
los copia en el rectngulo de destino.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano or y luego
invierte el color resultante.
Copia el patrn de la brocha seleccionada en el contexto de
dispositivo de destino directamente en el destino.
Combina los colores de los pxeles del patrn de la brocha
seleccionada en el contexto de dispositivo de destino, con los
colores de los pxeles en el destino, usando el operador
booleano xor.
Combina los colores del patrn de la brocha seleccionada en
el contexto de dispositivo de destino con los colores
invertidos de los pxeles del rectngulo de origen, usando el
operador booleano or, y entonces combina el resultado con
los colores de los pxeles del rectngulo de destino, usando el
operador booleano or.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano and.
Copia los colores de los pxeles del rectngulo de origen
directamente en el rectngulo destino.
Combina los colores de los pxeles del rectngulo de origen
con los colores invertidos del rectngulo destino, usando el
operador booleano and.
Combina los colores de los pxeles de los rectngulos de
origen y destino, usando el operador booleano xor.
Combina los colores de los pxeles de los rectngulos de
origen y destino usando el operador booleano or.
Rellena los pxeles del rectngulo especificado en el destino
con el color especificado en el ndice 255 de la paleta fsica.
Por defecto este color es el blanco.
5
Captulo
367
Captulo 6
Cursores de edicin
Listado 6-1: Creando un cursor de edicin que sea una caja negra slida
procedure TForm1.Button1Click(Sender: TObject);
begin
{Tenemos que seleccionar la ventana en la que queremos escribir. Cuando esta
ventana recibe el foco manualmente (por ejemplo, debido al uso de la tecla
Tab), Delphi asigna automticamente el cursor de edicin apropiado}
6
Captulo
368
Captulo 6
Memo1.SetFocus;
{Oculta el cursor de edicin actual}
HideCaret(0);
{Destruye el cursor de edicin actual}
DestroyCaret;
{Crea el nuevo cursor de edicin (con forma de caja negra slida)}
CreateCaret(Memo1.Handle, 0, 10, 12);
{Muestra la imagen del nuevo cursor de edicin}
ShowCaret(0);
end;
Figura 6-1:
El cursor de
edicin en
forma de caja
negra
Figura 6-2: El
icono y la
imagen del
cursor son la
composicin
de mscaras
and y or
Imagen
Masc.
and
Masc.
or
369
Primero, la mscara and es combinada con la imagen del fondo sobre el dispositivo de
contexto de destino, usando el operador booleano and. Los pxeles blancos de la
mscara and preservarn aquellos pxeles en el destino, mientras los pxeles negros de
la mscara and cambiarn los pxeles en el destino a negro labrando de este modo un
espacio para la imagen final, como en la siguiente imagen:
Figura 6-3:
El primer
paso
combina la
mscara and
con el
destino
Figura 6-4:
El segundo
paso
combina la
mscara or
con el
destino
Una vez que la mscara and es combinada con el destino, la mscara or es combinada
con el fondo resultante de la operacin anterior utilizando el operador booleano or. Los
pxeles negros de la mscara or preservarn los pxeles correspondientes en el destino,
mientras que los pxeles coloreados, que coincidirn con los pxeles negros creados en
el primer paso, aparecern tal cual se muestran en la mscara or, crendose de este
modo una imagen final con la ilusin de pxeles transparentes, como la siguiente:
Es este mtodo de mezclar mapas de bits el que permite a los iconos y cursores tener
formas irregulares, mostrando el fondo a travs de reas transparentes. La misma
tcnica puede ser usada para mostrar cualquier mapa de bits de forma transparente,
utilizando la funcin BitBlt y los cdigos de operaciones de barrido SRCAND y
SRCPAINT. La funcin GetIconInfo puede ser usada para recuperar las mscaras and y
or, tanto de iconos como de cursores.
// almacena un icono
6
Captulo
370
Captulo 6
CurBitmap: TBitmap;
implementation
{$R *.DFM}
procedure TForm1.FileListBox1DblClick(Sender: TObject);
begin
{Abrir el fichero seleccionado como un icono
(Esto convierte automticamente mapas de bits en iconos)}
CurIcon.Handle := ExtractIcon(hInstance, PChar(FileListBox1.FileName), 0);
{Habilitar el botn de guardar imagen}
Button1.Enabled := TRUE;
{Borrar el cuadro de dibujo}
PaintBox1.Canvas.Brush.Color := clBtnFace;
PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
{Si el usuario quiere convertir iconos en mapas de bits...}
if RadioButton1.Checked then
begin
{...borrar la imagen actual del mapa de bits}
CurBitmap.Canvas.Brush.Color := clBtnFace;
CurBitmap.Canvas.FillRect(PaintBox1.ClientRect);
{Dibujar el icono sobre el mapa de bits}
DrawIcon(CurBitmap.Canvas.Handle, 0, 0, CurIcon.Handle);
{Mostrar la imagen del mapa de bits}
PaintBox1.Canvas.Draw((PaintBox1.Width div 2) - 16,
(PaintBox1.Height div 2) - 16, CurBitmap);
end
else
{Mostrar el icono}
DrawIcon(PaintBox1.Canvas.Handle, (PaintBox1.Width div 2) - 16,
(PaintBox1.Height div 2) - 16, CurIcon.Handle);
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
{Si el usuario quiere convertir iconos en mapas de bits...}
if Sender = RadioButton1 then
begin
{...filtrar nicamente los iconos}
FileListBox1.Mask := '*.ico';
{En consecuencia, inicializar el dilogo de guardar imgenes}
SavePictureDialog1.Filter := 'Bitmaps (*.bmp)|*.bmp';
SavePictureDialog1.DefaultExt := '*.bmp';
end
else
begin
{De lo contario, filtrar slo los mapas de bits}
371
FileListBox1.Mask := '*.bmp';
{En consecuencia, inicializar el dilogo de guardar imgenes}
SavePictureDialog1.Filter := 'Icons (*.ico)|*.ico';
SavePictureDialog1.DefaultExt := '*.ico';
end;
{Borrar la imagen actual de cuadro de dibujo}
PaintBox1.Canvas.Brush.Color := clBtnFace;
PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
{Deshabilitar el botn de guardar imagen hasta que el usuario seleccione
un fichero a convertir}
Button1.Enabled := FALSE;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crear el icono que contendr el mapa de bits convertido}
CurIcon := TIcon.Create;
{Crear e inicializar el mapa de bits que contendr iconos convertidos}
CurBitmap := TBitmap.Create;
CurBitmap.Width := GetSystemMetrics(SM_CXICON);
CurBitmap.Height := GetSystemMetrics(SM_CYICON);
{Inicializar el dilogo de guardar imgenes para guardar mapas de bits}
SavePictureDialog1.Filter := 'Bitmaps (*.bmp)|*.bmp';
SavePictureDialog1.DefaultExt := '*.bmp';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{Borra el ltimo nombre de fichero especificado}
SavePictureDialog1.FileName := '';
{Mostrar cuadro de dilogo}
if SavePictureDialog1.Execute then
if RadioButton1.Checked then
{Como se indica, guardar el fichero como mapa de bits...}
CurBitmap.SaveToFile(SavePictureDialog1.FileName)
else
{...o icono}
CurIcon.SaveToFile(SavePictureDialog1.FileName);
end;
6
Captulo
372
Captulo 6
Figura 6-5:
Convirtiendo
un icono
Descripcin
Crea una copia de un icono existente.
Crea un nuevo cursor de edicin.
Crea un nuevo cursor.
Crea un nuevo icono.
Crea un nuevo icono o cursor desde un recurso.
Crea un nuevo icono o cursor desde un recurso con
un ancho y altura especficos.
Crea un icono o cursor desde un registro de datos.
Destruye un cursor de edicin.
Destruye un cursor.
Destruye un icono.
Dibuja un icono en una ubicacin especifica.
Dibuja un icono o cursor en una ubicacin especfica.
Recupera un manejador de icono del fichero
ejecutable asociado con un fichero especfico.
Recupera un manejador de icono desde un fichero
especfico.
Recupera un manejador de los iconos pequeo y
grande de un fichero especfico.
Recupera un manejador del cursor actual.
Recupera informacin sobre un icono o cursor.
Oculta un cursor de edicin.
Carga un cursor desde los recursos de un ejecutable.
LoadCursorFromFile
LoadIcon
LookupIconIdFromDirectory
LookupIconIdFromDirectoryEx
SetCursor
SetSystemCursor
ShowCaret
ShowCursor
CopyIcon
373
Windows.Pas
Sintaxis
CopyIcon(
hIcon: HICON
): HICON;
Descripcin
Esta funcin hace un duplicado del icono especificado, devolviendo su manejador. Esto
puede ser usado para copiar iconos pertenecientes a otros mdulos.
Parmetros
hIcon: Manejador del icono a copiar.
Vase adems
DrawIcon, DrawIconEx
Ejemplo
6
Captulo
374
Captulo 6
{...y lo muestra}
DrawIcon(PaintBox1.Canvas.Handle, (PaintBox1.Width div 2) - 16,
(PaintBox1.Height div 2) - 16, IconCopy);
end;
Figura 6-6:
El icono de la
aplicacin
duplicado
CreateCaret
Windows.Pas
Sintaxis
CreateCaret(
hWnd: HWND;
hBmp: HBITMAP;
nWidth: Integer;
nHeight: Integer
): BOOL;
Descripcin
Esta funcin crea una nueva imagen para el cursor de edicin. El cursor de edicin es
asignado a la ventana hWnd y puede ser una lnea, un bloque o un mapa de bits. Si un
mapa de bits es especificado, las dimensiones del mapa de bits determinan el ancho y la
altura del nuevo cursor de edicin. En caso contrario, el ancho y la altura estarn en
trminos de unidades lgicas y las dimensiones exactas dependen del modo de
mapeado activo. El desarrollador puede recuperar el ancho y altura predeterminados de
los cursores de edicin llamando a la funcin GetSystemMetrics, utilizando las
constantes SM_CXBORDER y SM_CYBORDER. La funcin CreateCaret destruye
automticamente la imagen anterior del cursor de edicin, y el nuevo cursor de edicin
no ser visible hasta que se haga una llamada a la funcin ShowCaret.
Parmetros
hWnd: Manejador de la ventana que poseer el cursor de edicin.
hBmp: Manejador del mapa de bits a utilizar como cursor de edicin. Si este parmetro
es cero, el cursor de edicin ser un rectngulo slido. Si a este parmetro (hBmp) se le
asigna 1, el cursor de edicin ser gris.
375
Vase adems
CreateBitmap, CreateDIBitmap, DestroyCaret, GetSystemMetrics, HideCaret,
LoadBitmap, LoadImage, ShowCaret
Ejemplo
Listado 6-4: Creando un nuevo cursor de edicin
procedure TForm1.Button1Click(Sender: TObject);
var
TheCaretBitmap: HBitmap;
// manejador de bitmap para cursor de edicin
begin
{Carga el mapa de bits del cursor de edicin desde un fichero externo}
TheCaretBitmap := LoadImage(0, 'NewCaret.bmp', IMAGE_BITMAP, 0, 0,
LR_DEFAULTSIZE or LR_LOADFROMFILE);
{Debemos enfocar la ventana en la que queremos escribir. Cuando esta ventana
reciba el foco manualmente (por ejemplo, mediante la tecla Tab), Delphi
automticamente reasignar el cursor de edicin adecuado}
Memo1.SetFocus;
{Oculta el cursor de edicin actual}
HideCaret(0);
{Destruye el cursor de edicin actual}
DestroyCaret;
6
Captulo
376
Captulo 6
Figura 6-7:
El nuevo
cursor de
edicin
CreateCursor
Windows.Pas
Sintaxis
CreateCursor(
hInst: HINST;
xHotSpot: Integer;
yHotSpot: Integer;
nWidth: Integer;
nHeight: Integer;
pvANDPlane: Pointer;
pvXORPlane: Pointer
): HCURSOR;
Descripcin
Esta funcin crea un nuevo cursor con las dimensiones, imagen y punto caliente
especificados. Este cursor puede ser aadido al array de cursores de pantalla de Delphi
para hacerlo persistente.
Parmetros
hInst: Manejador de la instancia actual de la aplicacin.
xHotSpot: La coordenada horizontal del punto caliente del cursor.
yHotSpot: La coordenada vertical del punto caliente del cursor.
nWidth: El ancho del cursor en pxeles. Utilice GetSystemMetrics(SM_CXCURSOR)
para determinar el ancho de cursor soportado por el controlador de vdeo.
nHeight: La altura del cursor en pxeles. Utilice GetSystemMetrics(SM_CYCURSOR)
para determinar la altura de cursor soportada por el controlador de vdeo.
pvANDPlane: Puntero a un array de bytes que contienen los valores de los bits para la
mscara and del cursor. Este array contiene informacin con el formato de un mapa de
bits monocromtico dependiente del dispositivo.
377
pvXORPlane: Puntero a un array de bytes que contienen los valores de los bits para la
mscara xor del cursor. Este array contiene informacin con el formato de un mapa de
bits monocromtico dependiente del dispositivo.
Vase adems
CreateIcon, DestroyCursor, GetCursor, GetSystemMetrics, SetCursor
Ejemplo
Listado 6-5: Creando un nuevo cursor
var
Form1: TForm1;
OldCursor: HCURSOR;
NewCursor: HCURSOR;
implementation
procedure TForm1.Button1Click(Sender: TObject);
var
MaskSize: Integer;
// almacena el tamao calculado del cursor
AndMask,
// arrays de bits del cursor
XorMask: ^Byte;
AndImage,
// mapas de bits usados para definir la forma del cursor
XorImage: TBitmap;
begin
{Calcula el tamao de los arrays de bits del cursor}
MaskSize := (GetSystemMetrics(SM_CXICON) div 8) * GetSystemMetrics(SM_CYICON);
{Crea el mapa de bits usado para definir la forma de la mscara and}
AndImage := TBitmap.Create;
with AndImage do
begin
{Estamos creando un cursor blanco y negro}
Monochrome := TRUE;
6
Captulo
378
Captulo 6
Canvas.LineTo(0,Height);
end;
{Crea el mapa de bits usado para definir la forma de la mscara xor}
XorImage := TBitmap.Create;
with XorImage do
begin
{Estamos creando un cursor blanco y negro}
Monochrome := TRUE;
{Asigna las dimensiones del cursor}
Width := GetSystemMetrics(SM_CXICON);
Height := GetSystemMetrics(SM_CYICON);
{Rellena el mapa de bits de negro}
Canvas.Brush.Color := clBlack;
Canvas.Pen.Color := clBlack;
Canvas.FillRect(Canvas.ClipRect);
end;
{Reserva la memoria para los arrays}
GetMem(AndMask, MaskSize);
GetMem(XorMask, MaskSize);
{Transfiere las imgenes a los arrays}
GetBitmapBits(AndImage.Handle, MaskSize, AndMask);
GetBitmapBits(XorImage.Handle, MaskSize, XorMask);
{Crea un nuevo cursor basado en las imgenes transferidas a los arrays}
NewCursor := CreateCursor(hInstance, 0, 0, GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON), AndMask, XorMask);
{Si el cursor de la clase de ventana no es cero, SetCursor tendr xito, pero el
cursor ser reinicializado al cursor de la clase tan pronto como sea movido el
ratn. Por eso tenemos que asignar cero al cursor de la clase del botn y al
formulario}
SetClassLong(Form1.Handle, GCL_HCURSOR, 0);
SetClassLong(Button1.Handle, GCL_HCURSOR, 0);
{Asigna la nueva forma del cursor}
SetCursor(NewCursor);
{Los mapas de bits temporales ya no son necesarios}
AndImage.Free;
XorImage.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Recupera y guarda un manejador del cursor original}
OldCursor := GetCursor;
end;
379
Figura 6-8:
El nuevo
cursor
CreateIcon
Windows.Pas
Sintaxis
CreateIcon(
hInstance: HINST;
nWidth: Integer;
nHeight: Integer;
cPlanes: Byte;
cBitsPixel: Byte;
lpbANDbits: Pointer;
lpbXORbits: Pointer
): HICON;
Descripcin
Crea dinmicamente un nuevo icono con las dimensiones e imagen especificadas.
Parmetros
hInstance: Manejador de la instancia de la aplicacin que crea el icono.
nWidth: El ancho del icono en pxeles. A este parmetro hay que asignarle el valor
devuelto por GetSystemMetrics(SM_CXICON).
6
Captulo
nHeight: La altura del icono en pxeles. A este parmetro hay que asignarle el valor
devuelto por GetSystemMetrics(SM_CYICON).
380
Captulo 6
lpbANDbits: Puntero a un array de bytes que contiene la imagen de la mscara and del
icono. La informacin de la imagen contenida en este array tiene que describir un
mapa de bits monocromtico.
lpbXORbits: Puntero a un array de bytes que contiene la imagen de la mscara xor del
icono. La informacin de imagen contenida en este array puede describir un mapa de
bits monocromtico o un mapa de bits a colores dependiente del dispositivo.
Vase adems
CreateIconFromResource, CreateIconFromResourceEx, CreateIconIndirect, DrawIcon,
DrawIconEx, GetSystemMetrics, LoadIcon
Ejemplo
Listado 6-6: Creando un icono en tiempo de ejecucin
procedure TForm1.Button1Click(Sender: TObject);
var
AndMaskSize,
// almacena el tamao calculado del icono
XorMaskSize: Integer;
AndMask,
XorMask: ^Byte;
AndImage,
// mapas de bits usados para definir la forma del icono
XorImage: TBitmap;
begin
{Calcula el tamao de los arrays de bits del icono}
XorMaskSize := GetSystemMetrics(SM_CXICON) * GetSystemMetrics(SM_CYICON);
{La mscara AND es un mapa de bits monocromtico. De esta manera, cada bit
representa un pxel; se divide el ancho entre 8 para obtener el nmero correcto
de bytes}
AndMaskSize := (GetSystemMetrics(SM_CXICON) div 8) * GetSystemMetrics(SM_CYICON);
{Crea el mapa de bits usado para definir la forma de la mscara XOR}
XorImage := TBitmap.Create;
with XorImage do
begin
{Asigna las dimensiones a partir de las indicadas por el sistema}
Width := GetSystemMetrics(SM_CXICON);
Height := GetSystemMetrics(SM_CYICON);
{Rellena el fondo con negro}
Canvas.Brush.Color := clBlack;
Canvas.FillRect(Canvas.ClipRect);
381
6
Captulo
382
Captulo 6
Figura 6-9:
El nuevo icono
CreateIconFromResource
Windows.Pas
Sintaxis
CreateIconFromResource(
pResBits: PByte;
dwResSize: DWORD;
fIcon: BOOL;
dwVer: DWORD
): HICON;
Descripcin
Esta funcin crea un nuevo icono o un nuevo cursor a partir de los bits de un recurso
que definen la imagen del icono o cursor.
Parmetros
pResBits: Puntero a un buffer que contiene los bits de recurso del icono o cursor. El
valor devuelto por las funciones LoadResource o LookupIconIdFromDirectory puede
ser usado como valor de este parmetro.
dwResSize: El tamao del buffer al que apunta el parmetro pResBits, en bytes.
fIcon: Opcin que indica si se desea crear un icono o un cursor. El valor TRUE hace
que la funcin cree un icono; FALSE hace que la funcin cree un cursor.
dwVer: Especifica el nmero de la versin del formato de icono o cursor. Las
aplicaciones Win32 deben asignar a este parmetro el valor $30000.
383
Vase adems
CreateIcon, CreateIconFromResourceEx, CreateIconIndirect, LoadResource, LookupIconIdFromDirectory, LookupIconIdFromDirectoryEx
Ejemplo
Listado 6-7: Creando un icono desde la informacin de recurso
procedure TForm1.Button1Click(Sender: TObject);
var
IconBits: HGLOBAL;
// manejador de la imagen del icono
IconBitsPtr: Pointer;
// puntero a la imagen de un icono
ResHandle: HRSRC;
// manejador de la informacin de recurso del icono
ResId: Integer;
// almacena el id del recurso para el icono
TheIcon: HICON;
// manejador del icono creado
begin
{Recupera un manejador del recurso del icono}
ResHandle := FindResource(0, 'TARGET', RT_GROUP_ICON);
{Recupera un manejador de la imagen del recurso del icono}
IconBits := LoadResource(0, ResHandle);
{Recupera un puntero a la imagen del icono}
IconBitsPtr := LockResource(IconBits);
{Busca el icono adecuado para el dispositivo de visualizacin actual}
ResId := LookupIconIdFromDirectory(IconBitsPtr, TRUE);
{Recupera un manejador de este icono}
ResHandle := FindResource(0, MakeIntResource(ResId), RT_ICON);
{Carga la imagen del recurso del icono}
IconBits := LoadResource(0, ResHandle);
{Recupera un puntero a la imagen del icono}
IconBitsPtr := LockResource(IconBits);
{Crea un nuevo icono desde la informacin correcta de recurso del icono}
TheIcon := CreateIconFromResource(IconBitsPtr, SizeOfResource(0, ResHandle),
TRUE, $30000);
{Muestra el icono}
DrawIcon(PaintBox1.Canvas.Handle,
PaintBox1.Width div 2-(GetSystemMetrics(SM_CXICON) div 2),
PaintBox1.Height div 2-(GetSystemMetrics(SM_CYICON) div 2), TheIcon);
end;
Captulo
384
Captulo 6
Figura 6-10:
El nuevo icono
CreateIconFromResourceEx
Windows.Pas
Sintaxis
CreateIconFromResourceEx(
pResBits: PByte;
dwResSize: DWORD;
fIcon: BOOL;
dwVer: DWORD;
cxDesired: Integer;
cyDesired: Integer;
Flags: UINT
): HICON;
Descripcin
Esta funcin crea un nuevo icono o cursor a partir de los bits del recurso especificado
que definen la imagen del icono o cursor. A diferencia de la funcin
CreateIconFromResource, esta funcin permite al desarrollador determinar las
dimensiones y el formato de colores del icono o cursor.
Parmetros
pResBits: Puntero a un buffer que contiene los bits del recurso del icono o cursor. El
valor devuelto por las funciones LoadResource o LookupIconIdFromDirectory puede
ser utilizado como valor de este parmetro.
dwResSize: El tamao del buffer al que apunta el parmetro pResBits, en bytes.
fIcon: Opcin que indica si se desea crear un icono o un cursor. El valor TRUE hace
que la funcin cree un icono; FALSE hace que la funcin cree un cursor.
dwVer: Especifica el nmero de la versin del formato de icono o cursor. Las
aplicaciones Win32 deben asignar a este parmetro el valor $30000.
cxDesired: Especifica el ancho preferido del icono o cursor, en pxeles. Si este
parmetro es cero, la funcin utiliza el valor devuelto por
GetSystemMetrics(SM_CXICON).
385
Vase adems
CreateIcon, CreateIconFromResource, CreateIconIndirect, LoadResource,
LookupIconIdFromDirectory, LookupIconIdFromDirectoryEx
Ejemplo
Listado 6-8: Ms opciones para la creacin de un icono desde la informacin de recurso
procedure TForm1.Button1Click(Sender: TObject);
var
IconBits: HGLOBAL;
// manejador de la imagen de un icono
IconBitsPtr: Pointer;
// puntero a la imagen del icono
ResHandle: HRSRC;
// manejador de la informacin de recurso del icono
ResId: Integer;
// almacena el id del recurso del icono
TheIcon: HICON;
// manejador del icono creado
begin
{Recupera un manejador del recurso del icono}
ResHandle := FindResource(0, 'TARGET', RT_GROUP_ICON);
{Recupera un manejador de la imagen del recurso del icono}
IconBits := LoadResource(0, ResHandle);
{Recupera un puntero a la imagen del icono}
IconBitsPtr := LockResource(IconBits);
{Busca el icono ms adecuado para el dispositivo de visualizacin actual}
ResId := LookupIconIdFromDirectoryEx(IconBitsPtr, TRUE,
0, 0, LR_DEFAULTCOLOR);
{Recupera un manejador para este icono}
ResHandle := FindResource(0, MakeIntResource(ResId), RT_ICON);
6
Captulo
386
Captulo 6
CreateIconIndirect
Descripcin
Crea un cursor o icono en colores, usando los colores
predefinidos del sistema.
Crea un cursor o icono monocromtico.
Windows.Pas
Sintaxis
CreateIconIndirect(
var pIconInfo: TIconInfo {puntero a registro de informacin del icono}
): HICON;
{devuelve un manejador de icono}
Descripcin
Esta funcin crea dinmicamente un nuevo icono con las dimensiones e imgenes
definidas en la variable pIconInfo. Despus de crear el icono, la aplicacin tiene que
gestionar los mapas de bits usados en la definicin del icono y eliminarlos cuando
dejen de ser necesarios. Los iconos creados mediante esta funcin tienen que ser
eliminados utilizando la funcin DestroyIcon.
Parmetros
pIconInfo: Puntero a un registro TIconInfo que describe la imagen del icono. El registro
TIconInfo se define como:
TIconInfo = packed record
fIcon: BOOL;
xHotspot: DWORD;
yHotspot: DWORD;
hbmMask: HBITMAP;
hbmColor: HBITMAP;
end;
Consulte la funcin GetIconInfo para ver una descripcin de los campos del registro.
387
Vase adems
CreateIcon, CreateIconFromResource, CreateIconFromResourceEx, DrawIcon, DrawIconEx, DestroyIcon, LoadIcon
Ejemplo
Listado 6-9: Creando un icono indirectamente
var
Form1: TForm1;
NewIcon: HICON;
implementation
procedure TForm1.Button1Click(Sender: TObject);
var
AndImage,
// mapas de bits usados para definir la forma del icono
XorImage: TBitmap;
IconInfo: TIconInfo; // el registro de informacin del icono
begin
{Crea el mapa de bits usado para definir la forma de la mscara XOR}
XorImage := TBitmap.Create;
with XorImage do
begin
{Asigna las dimensiones predefinidas del sistema}
Width := GetSystemMetrics(SM_CXICON);
Height := GetSystemMetrics(SM_CYICON);
{Rellena el fondo con negro}
Canvas.Brush.Color := clBlack;
Canvas.FillRect(Canvas.ClipRect);
{Dibuja una caja roja}
Canvas.Brush.Color := clRed;
Canvas.Pen.Color := clBlack;
Canvas.FillRect(Rect(5, 5, GetSystemMetrics(SM_CXICON) - 5,
GetSystemMetrics(SM_CYICON) - 5));
end;
{Crea el mapa de bits usado para definir la forma de la mscara AND}
AndImage := TBitmap.Create;
with AndImage do
begin
{La mscara AND es siempre en blanco y negro}
Monochrome := TRUE;
6
Captulo
388
Captulo 6
{Dibuja una caja negra del mismo tamao que la roja en la mscara XOR}
Canvas.Brush.Color := clBlack;
Canvas.Pen.Color := clBlack;
Canvas.FillRect(Rect(5, 5, GetSystemMetrics(SM_CXICON) - 5,
GetSystemMetrics(SM_CYICON) - 5));
end;
{Inicializa el registro para definir el nuevo icono}
IconInfo.fIcon := TRUE;
IconInfo.xHotspot := 0;
IconInfo.yHotspot := 0;
IconInfo.hbmMask := AndImage.Handle;
IconInfo.hbmColor := XorImage.Handle;
{Crea un nuevo icono basado en la informacin del registro del icono}
NewIcon := CreateIconIndirect(IconInfo);
{Hace que el icono de la aplicacin apunte a este nuevo icono}
Application.Icon.Handle := NewIcon;
{Muestra el icono sobre el formulario}
DrawIcon(PaintBox1.Canvas.Handle,
PaintBox1.Width div 2 - (GetSystemMetrics(SM_CXICON) div 2),
PaintBox1.Height div 2 - (GetSystemMetrics(SM_CYICON) div 2), NewIcon);
{Se eliminan los mapas de bits temporales}
AndImage.Free;
XorImage.Free;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Elimina el nuevo icono}
DestroyIcon(NewIcon);
end;
DestroyCaret
Windows.Pas
Sintaxis
DestroyCaret: BOOL;
Descripcin
Esta funcin elimina la figura actual del cursor de edicin, lo libera de la ventana y lo
quita de la pantalla. Si un mapa de bits fue usado para definir la forma del cursor de
edicin, el mapa de bits no es liberado. DestroyCaret fallar si la ventana que posee el
cursor de edicin no pertenece a la tarea actual.
389
Vase adems
CreateCaret, HideCaret, ShowCaret
Ejemplo
Vea el Listado 6-4 bajo CreateCaret.
DestroyCursor
Windows.Pas
Sintaxis
DestroyCursor(
hCursor: HICON
): BOOL;
Descripcin
Esta funcin destruye el cursor identificado por el manejador del cursor especificado y
libera su memoria. Esta funcin slo debe ser utilizada para destruir cursores creados
con la funcin CreateCursor.
Parmetros
hCursor: Manejador del cursor que ser destruido. Este manejador de cursor no deber
estar en uso cuando la funcin sea llamada.
Vase adems
CreateCursor
Ejemplo
6
Captulo
390
Captulo 6
DestroyIcon
Windows.Pas
Sintaxis
DestroyIcon(
hIcon: HICON
): BOOL;
Descripcin
Esta funcin destruye el icono identificado por el manejador del icono especificado y
libera su memoria. Esta funcin debe ser utilizada solamente para destruir iconos
creados con la funcin CreateIconIndirect.
Parmetros
hIcon: Un manejador del icono que ser destruido. Este manejador del icono no deber
estar en uso cuando la funcin sea llamada.
Vase adems
CreateIconIndirect
Ejemplo
Vea el Listado 6-9 bajo CreateIconIndirect.
DrawIcon
Windows.Pas
Sintaxis
DrawIcon(
hDC: HDC;
X: Integer;
Y: Integer;
hIcon: HICON
): BOOL;
Descripcin
Esta funcin dibuja un icono o cursor (incluyendo cursores animados), sobre el
contexto de dispositivo especificado.
391
Parmetros
hDC: Manejador del contexto de dispositivo sobre el cual el icono o cursor ser
dibujado.
X: Indica la posicin horizontal de la esquina superior izquierda del icono o cursor
dentro del contexto de dispositivo especificado, de acuerdo al modo de mapeado actual.
Y: Indica la posicin vertical de la esquina superior izquierda del icono o cursor dentro
del contexto de dispositivo especificado, de acuerdo al modo de mapeado actual.
hIcon: Manejador del icono o cursor que ser dibujado.
Vase adems
DrawIconEx, LoadCursor, LoadIcon, LoadImage
Ejemplo
Vea el Listado 6-6 bajo CreateIcon.
DrawIconEx
Windows.Pas
Sintaxis
{manejador de contexto de dispositivo}
{coordenada horizontal para mostrar el icono}
{coordenada vertical para mostrar el icono}
{manejador del icono a mostrar}
{ancho del icono}
{altura del icono}
{ndice de cuadro para un cursor animado}
{manejador de brocha}
{opcin de modo de presentacin del icono}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin dibuja un icono o cursor (incluyendo cursores animados), sobre el
contexto de dispositivo especificado. El icono o cursor puede ser ampliado o reducido
como se desee.
6
Captulo
DrawIconEx(
hdc: HDC;
xLeft: Integer;
yTop: Integer;
hIcon: HICON;
cxWidth: Integer;
cyWidth: Integer;
iStepIfAniCur: UINT;
hbrFlickerFreeDraw: HBRUSH;
diFlags: UINT
): BOOL;
392
Captulo 6
Parmetros
hdc: Manejador del contexto de dispositivo sobre el cual ser dibujado el icono o
cursor.
xLeft: Indica la posicin horizontal de la esquina superior izquierda del icono o cursor
dentro del contexto de dispositivo especificado, de acuerdo al modo de mapeado actual.
yTop: Indica la posicin vertical de la esquina superior izquierda del icono o cursor
dentro del contexto de dispositivo especificado, de acuerdo al modo de mapeado actual.
hIcon: Manejador del icono o cursor que ser dibujado.
cxWidth: Especifica el ancho con que debe ser dibujado el icono o cursor, en unidades
lgicas. Si este parmetro es cero y al parmetro diFlags se le asigna
DI_DEFAULTSIZE, la funcin utiliza los valores predefinidos del sistema
SM_CXICON o SM_CXCURSOR para el ancho. Si este parmetro es cero y al
parmetro diFlags no se le asigna DI_DEFAULTSIZE, la funcin utiliza el ancho actual
del icono o cursor.
cyWidth: Especifica la altura con que debe ser dibujado el icono o cursor, en unidades
lgicas. Si este parmetro es cero y al parmetro diFlags se le asigna
DI_DEFAULTSIZE, la funcin utiliza los valores predefinidos del sistema
SM_CYICON o SM_CYCURSOR para la altura. Si este parmetro es cero y al
parmetro diFlags no se le asigna DI_DEFAULTSIZE, la funcin utiliza la altura actual
del icono o cursor.
iStepIfAniCur: Especifica qu cuadro del cursor animado se desea dibujar. Si el
parmetro hIcon no corresponde a un manejador de un icono animado, este parmetro
es ignorado.
hbrFlickerFreeDraw: Manejador de una brocha. Si el manejador de la brocha es vlido,
la funcin crea un mapa de bits fuera de pantalla usando la brocha para el color del
fondo, dibuja el icono o cursor en este mapa de bits fuera de pantalla y entonces lo
copia sobre el contexto de dispositivo especificado por el parmetro hdc. Esto elimina
cualquier parpadeo cuando el icono o cursor sea mostrado. Si este parmetro es cero, el
icono o cursor es dibujado directamente en el contexto de dispositivo especificado.
diFlags: Indicador que controla el comportamiento de dibujo. Este parmetro puede
tomar uno o ms valores de la Tabla 6-3.
Vase adems
DrawIcon, LoadCursor, LoadIcon, LoadImage
393
Ejemplo
Vea el Listado 6-14 bajo LoadCursorFromFile.
Tabla 6-3: Valores del parmetro diFlags de DrawIconEx
Valor
DI_COMPAT
DI_DEFAULTSIZE
DI_IMAGE
DI_MASK
DI_NORMAL
ExtractAssociatedIcon
Descripcin
Dibuja la imagen del cursor por defecto para el cursor estndar
especificado, incluso si el cursor ha sido reemplazado mediante
una llamada a la funcin SetSystemCursor.
Dibuja el icono o cursor con las medidas predefinidas por el
sistema para el ancho y altura de iconos y cursores.
Dibuja slo la mscara or del icono o cursor.
Dibuja slo mscara and del icono o cursor.
Combina los valores DI_IMAGE y DI_MASK para dibujar el
cursor o icono en la forma en que son mostrados normalmente.
ShellAPI.Pas
Sintaxis
ExtractAssociatedIcon(
hInst: HINST;
lpIconPath: PChar;
var lpiIcon: Word
): HICON;
Descripcin
Esta funcin devuelve el manejador de un icono extrado del fichero especificado por el
parmetro lpIconPath. Si este parmetro no apunta a un fichero ejecutable, el icono es
extrado del fichero ejecutable asociado con el fichero especificado. Si este fichero no
tiene una aplicacin asociada, la funcin devuelve el manejador de un icono
predeterminado asignado por Windows. Adicionalmente, si el nombre de fichero
especifica un fichero de mapa de bits o cursor, esta funcin crear un icono utilizando
la imagen del fichero y devolver su manejador.
Parmetros
hInst: Manejador de instancia de la aplicacin.
lpiIcon: Puntero a una variable que contiene el ndice del icono a extraer. El ndice est
basado en cero, de manera que un valor cero recuperar el primer icono del fichero.
6
Captulo
lpIconPath: Puntero a una cadena terminada en nulo que contiene el nombre de fichero
del cual extraer el icono.
394
Captulo 6
Vase adems
DrawIcon, DrawIconEx, ExtractIcon, LoadIcon
Ejemplo
Listado 6-10: Extrayendo iconos asociados con un fichero
procedure TForm1.FileListBox1Click(Sender: TObject);
var
IconIndex: Word;
TheIcon: TIcon;
begin
{Extrae el primer icono encontrado}
IconIndex := 0;
{Crea el objeto de icono temporal}
TheIcon := TIcon.Create;
{Extrae el icono del ejecutable asociado con el fichero seleccionado}
TheIcon.Handle := ExtractAssociatedIcon(hInstance, PChar(FileListBox1.FileName),
IconIndex);
{Copia el icono en el objeto imagen}
Image1.Picture.Assign(TheIcon);
{Libera el objeto de icono temporal}
TheIcon.Free;
end;
Figura 6-11:
Un icono
asociado con
un fichero
ExtractIcon
Sintaxis
ExtractIcon(
ShellAPI.Pas
hInst: HINST;
lpszExeFileName: PChar;
nIconIndex: UINT
): HICON;
395
Descripcin
Esta funcin devuelve un manejador de un icono extrado de un fichero ejecutable,
DLL, o fichero de icono. Adicionalmente, si el nombre de fichero especifica un fichero
de mapa de bits o cursor, la funcin crear un icono utilizando la imagen y devolver
su manejador. Esta funcin puede ser usada para convertir mapas de bits o cursores en
iconos.
Parmetros
hInst: Manejador de instancia de la aplicacin.
lpszExeFileName: Puntero a una cadena de caracteres terminada en nulo que contiene
el nombre de fichero desde el cual extraer el icono.
nIconIndex: El ndice del icono a recuperar. El ndice es de base cero, de manera que
un valor 0 recuperar el primer icono del fichero, si existe alguno. Si este valor es -1, el
valor devuelto ser la cantidad total de iconos almacenados en el fichero.
Vase adems
DrawIcon, DrawIconEx, ExtractAssociatedIcon, LoadIcon
Ejemplo
Listado 6-11: Extrayendo el icono de un fichero
6
Captulo
396
Captulo 6
Image1.Picture.Assign(TheIcon);
{Libera el objeto icono}
TheIcon.Free;
end;
Figura 6-12:
El icono
extrado
ExtractIconEx
ShellAPI.Pas
Sintaxis
ExtractIconEx(
lpszFile: PChar;
nIconIndex: Integer;
var phiconLarge: HICON;
var phiconSmall: HICON;
nIcons: UINT
): UINT;
Descripcin
Esta funcin devuelve un manejador de los iconos grande y pequeo almacenados en
un ejecutable, una DLL o un fichero de iconos.
Parmetros
lpszFile: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre
de fichero de un ejecutable, una DLL o un fichero de iconos, desde el cual extraer los
iconos.
nIconIndex: El ndice del icono a recuperar. El ndice es basado en cero, de manera que
un valor cero recuperar el primer icono grande o pequeo en el fichero, si alguno
existe. Si este valor es -1, el valor devuelto ser la cantidad total de iconos
almacenados en el fichero.
phiconLarge: Puntero a un manejador de icono. Si la funcin tiene xito, a travs de
este parmetro se devolver el manejador de un icono grande extrado del fichero dado.
397
Vase adems
DrawIcon, DrawIconEx, ExtractIcon, LoadIcon
Ejemplo
Listado 6-12: Extrayendo iconos grandes y pequeos
var
Form1: TForm1;
LargeIconsBitmap: TBitmap;
SmallIconsBitmap: TBitmap;
implementation
{$R *.DFM}
procedure TForm1.FileListBox1DblClick(Sender: TObject);
var
NumIcons: Integer;
// almacena la cantidad de iconos
LIcon: HICON;
// almacena los manejadores de los iconos extrados
SIcon: HICON;
LoopCount: Integer;
// contador de bucle
begin
{Determina el nmero de iconos almacenados en el fichero}
NumIcons := ExtractIconEx(PChar(FileListBox1.FileName), -1, LIcon, SIcon, 0);
{Muestra esta cantidad}
Label4.Caption := 'Total Number of Icons: ' + IntToStr(NumIcons);
6
Captulo
{Redimensiona las imgenes y borra las reas de dibujo de los mapas de bits
fuera de pantalla. Aadimos un 1 al ancho en caso de que no haya iconos. Esto
evita que la altura de estos objetos sea reiniciada a 1.}
Image1.Width := NumIcons * 40 + 1;
Image2.Width := NumIcons * 40 + 1;
LargeIconsBitmap.Width := NumIcons * 40 + 1;
LargeIconsBitmap.Canvas.FillRect(LargeIconsBitmap.Canvas.ClipRect);
SmallIconsBitmap.Width := NumIcons * 40 + 1;
398
Captulo 6
SmallIconsBitmap.Canvas.FillRect(SmallIconsBitmap.Canvas.ClipRect);
{Extrae cada icono grande y pequeo del fichero}
for LoopCount:=0 to NumIcons-1 do
begin
{Busca el icono en la aplicacin seleccionada, si existe}
ExtractIconEx(PChar(FileListBox1.FileName), LoopCount, LIcon, SIcon, 1);
{Muestra el icono grande}
DrawIcon(LargeIconsBitmap.Canvas.Handle, (LoopCount*40) + 4, 2, LIcon);
{Dibuja el icono pequeo a las dimensiones correctas}
DrawIconEx(SmallIconsBitmap.Canvas.Handle, (LoopCount * 40) + 4, 2, SIcon,
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
0, 0, DI_NORMAL);
end;
{Asigna los mapas de bits fuera de pantalla a las imgenes a mostrar}
Image1.Picture.Bitmap.Assign(LargeIconsBitmap);
Image2.Picture.Bitmap.Assign(SmallIconsBitmap);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crea los mapas de bits fuera de pantalla para contener imgenes de los iconos}
LargeIconsBitmap := TBitmap.Create;
LargeIconsBitmap.Height := 53;
LargeIconsBitmap.Width := 40;
SmallIconsBitmap:=TBitmap.Create;
SmallIconsBitmap.Height := 53;
Figura 6-13:
Los iconos
grandes y
pequeos
extrados de
un fichero
399
SmallIconsBitmap.Width := 40;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Libera los mapas de bits fuera de pantalla}
LargeIconsBitmap.Free;
SmallIconsBitmap.Free;
end;
GetCursor
Windows.Pas
Sintaxis
GetCursor: HCURSOR;
Descripcin
Esta funcin recupera un manejador del cursor actual.
Vase adems
CreateCursor, SetCursor
Ejemplo
Vea el Listado 6-5 bajo CreateCursor.
GetIconInfo
Windows.Pas
Sintaxis
GetIconInfo(
hIcon: HICON;
var piconinfo: TIconInfo
): BOOL;
Descripcin
Parmetros
hIcon: Manejador de un icono o cursor cuya informacin ser recuperada. Para
recuperar informacin sobre un icono o cursor estndar, a este parmetro se le puede
asignar un valor de la Tabla 6-4. Consulte la funcin LoadCursor para obtener una
explicacin detallada de los valores del cursor.
6
Captulo
400
Captulo 6
Vase adems
CreateIcon, CreateIconFromResource, CreateIconIndirect, DestroyIcon, DrawIcon,
DrawIconEx, LoadIcon
Ejemplo
Listado 6-13: Recuperando informacin sobre iconos y cursores del sistema
procedure TForm1.ComboBox1Change(Sender: TObject);
var
TheIcon: HICON;
// almacena un icono
401
TheCursor: HCURSOR;
// almacena un cursor
TheIconInfo: TIconInfo;
6
Captulo
402
Captulo 6
Figura 6-14:
La informacin
sobre el icono
o cursor
Descripcin
El icono por defecto de la aplicacin.
El icono de informacin del sistema.
El icono de error del sistema.
El icono de exclamacin del sistema.
Equivalente a IDI_ERROR.
Equivalente a IDI_ASTERISK.
El icono de interrogacin del sistema.
Equivalente a IDI_EXCLAMATION.
El icono del logotipo de Windows.
El cursor predeterminado (flecha).
El cursor identificado por la clave IBeam.
El cursor identificado por la clave Wait.
El cursor identificado por la clave Crosshair.
El cursor identificado por la clave UpArrow.
El cursor identificado por la clave SizeNWSE.
Valor
IDC_SIZENESW
IDC_SIZEWE
IDC_SIZENS
IDC_SIZEALL
IDC_NO
IDC_APPSTARTING
IDC_HELP
HideCaret
403
Descripcin
El cursor identificado por la clave SizeNESW.
El cursor identificado por la clave SizeWE.
El cursor identificado por la clave SizeNS.
El cursor identificado por la clave SizeAll.
El cursor identificado por la clave No.
El cursor identificado por la clave AppStarting.
El cursor identificado por la clave Help.
Windows.Pas
Sintaxis
HideCaret(
hWnd: HWND
): BOOL;
Descripcin
Esta funcin oculta el cursor de edicin de la pantalla, pero no lo destruye ni pierde el
punto de insercin. El ocultamiento del cursor de edicin es acumulativo. Por cada vez
que la funcin HideCaret sea llamada, deber realizarse una llamada a la funcin
ShowCaret para que el cursor de edicin sea mostrado de nuevo.
Parmetros
hWnd: Manejador de la ventana que posee el cursor de edicin. Si a este parmetro se
le asigna FALSE, la funcin busca todas las ventanas pertenecientes a la tarea actual. Si
ninguna ventana de la tarea actual posee el cursor de edicin, la funcin HideCaret
falla.
Vase adems
CreateCaret, DestroyCaret, ShowCaret
Ejemplo
LoadCursor
Sintaxis
LoadCursor(
Windows.Pas
6
Captulo
404
Captulo 6
hInstance: HINST;
lpCursorName: PAnsiChar
): HCURSOR;
{manejador de instancia}
{identificador o nombre del recurso del cursor}
{devuelve un manejador de cursor}
Descripcin
Esta funcin recupera un manejador de cursor desde los recursos de cursor
almacenados en el fichero ejecutable asociado con el manejador de instancia dado. Si el
cursor no est actualmente cargado, esta funcin cargar el recurso de cursor
especificado y devolver su manejador; en caso contrario, devolver un manejador del
cursor existente.
Parmetros
hInstance: Manejador de instancia del mdulo cuyo fichero ejecutable contiene el
recurso de cursor que ser cargado.
lpCursorName: Puntero a una cadena de caracteres terminada en nulo que contiene el
nombre del recurso de cursor a cargar. La funcin MakeIntResource puede ser usada
con un identificador de recurso para ofrecer un valor para este parmetro. Para cargar
uno de los cursores definidos por el usuario, se deber asignar cero (0) al parmetro
hInstance y asignar a este parmetro a un valor de la Tabla 6-5. Los cursores definidos
por el usuario se especifican en la configuracin del ratn en el Panel de Control, y son
almacenados en el registro de Windows bajo la entrada HKEY_CURRENT_USER\Control Panel\Cursors.
Vase adems
GetCursor, GetIconInfo, LoadImage, SetCursor, ShowCursor
Ejemplo
Vea el Listado 6-13 bajo GetIconInfo.
Tabla 6-5: Valores del parmetro lpCursorName de LoadCursor
Valor
IDC_APPSTARTING
IDC_ARROW
IDC_CROSS
IDC_HELP
IDC_IBEAM
IDC_NO
IDC_SIZEALL
Descripcin
El cursor identificado por la clave AppStarting.
El cursor identificado por la clave Arrow.
El cursor identificado por la clave Crosshair.
El cursor identificado por la clave Help.
El cursor identificado por la clave IBeam.
El cursor identificado por la clave No.
El cursor identificado por la clave SizeAll.
Valor
IDC_SIZENESW
IDC_SIZENS
IDC_SIZENWSE
IDC_SIZEWE
IDC_UPARROW
IDC_WAIT
LoadCursorFromFile
405
Descripcin
El cursor identificado por la clave SizeNESW.
El cursor identificado por la clave SizeNS.
El cursor identificado por la clave SizeNWSE.
El cursor identificado por la clave SizeWE.
El cursor identificado por la clave UpArrow.
El cursor identificado por la clave Wait.
Windows.Pas
Sintaxis
LoadCursorFromFile(
lpFileName: PAnsiChar
): HCURSOR;
Descripcin
Esta funcin crea un cursor a partir de los datos almacenados en el fichero
especificado, devolviendo un manejador del nuevo cursor. El fichero puede ser un
fichero de cursor normal (*.cur), o puede contener un cursor animado (*.ani).
Parmetros
lpFileName: Cadena de caracteres terminada en nulo que identifica el fichero de cursor
usado para crear el cursor.
Vase adems
LoadCursor, SetCursor, SetSystemCursor
Ejemplo
Listado 6-14: Cargando un cursor desde un fichero
6
Captulo
406
Captulo 6
TheCursor := LoadCursorFromFile(PChar(FileListBox1.FileName));
{Dibuja el cursor en el rea de dibujo de Image1}
DrawIconEx(Image1.Canvas.Handle, 35, 35, TheCursor, 0, 0, 0, 0,
DI_DEFAULTSIZE or DI_NORMAL);
{El cursor no es necesario y lo eliminamos}
DeleteObject(TheCursor);
end;
Figura 6-15:
El cursor
cargado
LoadIcon
Windows.Pas
Sintaxis
LoadIcon(
hInstance: HINST;
lpIconName: PChar
): HICON;
{manejador de instancia}
{nombre de recurso de icono}
{devuelve un manejador de icono}
Descripcin
Esta funcin recupera un manejador de un icono desde los recursos almacenados en el
fichero ejecutable asociado con el manejador de instancia especificado. Si el icono no
est actualmente cargado, esta funcin cargar el recurso de icono especificado y
devolver su manejador; en caso contrario, devolver un manejador del icono existente.
El icono tiene que tener las dimensiones predeterminadas por el sistema para los iconos
(que pueden obtenerse llamando a GetSystemMetrics con los valores SM_CXICON y
SM_CYICON). Utilice la funcin LoadImage para cargar iconos de dimensiones
diferentes.
Parmetros
hInstance: Manejador del mdulo de instancia cuyo fichero ejecutable contiene el
recurso de icono que se desea cargar.
lpIconName: Puntero a una cadena de caracteres terminada en nulo que contiene el
nombre del recurso de icono a cargar. La funcin MakeIntResource puede ser usada con
un identificador de recurso para ofrecer un valor para este parmetro. Para cargar uno
de los iconos predefinidos usados por el API Win32, asigne cero al parmetro
hInstance y asigne a este parmetro uno de los valores de la Tabla 6-6.
407
Vase adems
CreateIcon, LoadImage
Ejemplo
Vea el Listado 6-13 bajo GetIconInfo.
Tabla 6-6: Valores del parmetro lpIconName de LoadIcon
Valor
IDI_APPLICATION
IDI_ASTERISK
IDI_ERROR
IDI_EXCLAMATION
IDI_HAND
IDI_INFORMATION
IDI_QUESTION
IDI_WARNING
IDI_WINLOGO
LookupIconIdFromDirectory
Descripcin
El icono por defecto de la aplicacin.
El icono de informacin del sistema.
El icono de error del sistema.
El icono de exclamacin del sistema.
Equivalente a IDI_ERROR.
Equivalente a IDI_ASTERISK.
El icono de interrogacin del sistema.
Equivalente a IDI_EXCLAMATION.
El icono del logotipo de Windows.
Windows.Pas
Sintaxis
LookupIconIdFromDirectory(
pResBits: PByte;
fIcon: BOOL
): Integer;
Descripcin
6
Captulo
408
Captulo 6
Parmetros
pResBits: Puntero a los bits de un recurso de icono o cursor. Utilice el valor devuelto
por la funcin LockResource para este parmetro.
fIcon: Un valor que indica si se desea un icono o un cursor. Un valor TRUE indica que
se debe hallar un icono; FALSE indica un cursor.
Vase adems
CreateIconFromResource, FindResource, FindResourceEx, LoadCursor,
LookupIconIdFromDirectoryEx
Ejemplo
Vea el Listado 6-7 bajo CreateIconFromResource.
LookupIconIdFromDirectoryEx
Windows.Pas
Sintaxis
LookupIconIdFromDirectoryEx(
pResBits: PByte;
fIcon: BOOL
cxDesired: Integer;
cyDesired: Integer;
Flags: UINT
): Integer;
Descripcin
Esta funcin busca en la informacin de recursos de iconos o cursores para encontrar el
icono o cursor ms apropiado para el dispositivo de visualizacin actual. Est prevista
para usarse con ficheros de recursos que contengan imgenes de iconos y cursores en
formatos dependientes del dispositivo e independientes del dispositivo. El valor
devuelto por esta funcin puede ser usado con MakeIntResource y FindResource para
ubicar el cursor o icono en los recursos del mdulo. A diferencia de la funcin
LookupIconIdFromDirectory, esta funcin permite al desarrollador especificar las
dimensiones y formato de colores del icono o cursor.
Parmetros
pResBits: Puntero a los bits de un recurso de icono o cursor. Utilice el valor devuelto
por la funcin LockResource para este parmetro.
409
fIcon: Un valor que indica si se desea un icono o un cursor. Un valor TRUE indica que
se debe hallar un icono; FALSE indica un cursor.
cxDesired: Especifica el ancho preferido para el icono o cursor en pxeles. Si este
parmetro es cero, la funcin usa el valor devuelto por
GetSystemMetrics(SM_CXICON).
cyDesired: Especifica la altura preferida para el icono o cursor en pxeles. Si este
parmetro es cero, la funcin usa el valor devuelto por
GetSystemMetrics(SM_CYICON).
Flags: Un valor que indica el formato de colores para el icono o cursor. Este parmetro
puede tomar un valor de la Tabla 6-7.
Vase adems
CreateIconFromResourceEx, FindResource, FindResourceEx, LoadCursor,
LookupIconIdFromDirectory
Ejemplo
Vea el Listado 6-8 bajo CreateIconFromResourceEx.
Tabla 6-7: Valores del parmetro Flags de LookupIconIdFromDirectoryEx
Valor
LR_DEFAULTCOLOR
LR_MONOCHROME
SetCursor
Descripcin
Crea un cursor o icono a colores, usando los colores por
defecto del sistema.
Crea un cursor o icono monocromtico.
Windows.Pas
Sintaxis
{manejador de cursor}
{devuelve manejador del cursor anterior}
Descripcin
Esta funcin asigna a la forma del cursor del ratn el cursor asociado con el manejador
de cursor especificado. Un nuevo cursor es asignado slo si es diferente del actual.
Cuando se usa la funcin SetCursor para cambiar el cursor, el cursor de la clase de
ventana a la que pertenecen la ventana de la aplicacin y sus ventanas hijas tiene que
6
Captulo
SetCursor(
hCursor: HICON
): HCURSOR;
410
Captulo 6
Parmetros
hCursor: Manejador del cursor que reemplaza la forma del cursor actual del ratn. Este
manejador de cursor debe haber sido obtenido de una llamada a las funciones
CreateCursor, LoadCursor o LoadImage. Adicionalmente, el ancho y la altura del
cursor tienen que corresponderse con los devueltos por la funcin GetSystemMetrics, y
su profundidad de color tiene que ser igual o menor que la profundidad de color del
dispositivo de visualizacin actual.
Vase adems
CreateCursor, GetCursor, ShowCursor
Ejemplo
Vea el Listado 6-5 bajo CreateCursor.
SetSystemCursor
Windows.Pas
Sintaxis
SetSystemCursor(
hcur: HICON;
id: DWORD
): BOOL;
Descripcin
Esta funcin reemplaza la imagen del cursor del sistema especificado, con la imagen
del cursor identificado por el parmetro hcur. El registro de Windows no es actualizado
con esta nueva seleccin de cursor, y el cursor original del sistema ser restaurado la
prxima vez que Windows sea iniciado.
Parmetros
hcur: Manejador del cursor que reemplazar al cursor del sistema especificado.
id: Un identificador de cursor del sistema. Determina el cursor del sistema que ser
reemplazado por el cursor especificado por el parmetro hcur. Este parmetro puede
tomar un valor de la Tabla 6-8.
411
Vase adems
CreateCursor, GetCursor, LoadCursor, LoadCursorFromFile, SetCursor
Ejemplo
Listado 6-15: Asignando un nuevo cursor del sistema
var
Form1: TForm1;
CurSysCursor: HCURSOR;
Figura 6-16:
El nuevo
cursor del
sistema
6
Captulo
Valor
OCR_APPSTARTING
OCR_CROSS
OCR_IBEAM
OCR_NO
OCR_NORMAL
OCR_SIZEALL
OCR_SIZENESW
412
Captulo 6
Valor
OCR_SIZENS
OCR_SIZENWSE
OCR_SIZEWE
OCR_UP
OCR_WAIT
ShowCaret
Descripcin
El cursor de redimensionamiento vertical.
El cursor de redimensionamiento de noroeste a sureste.
El cursor de redimensionamiento horizontal.
El cursor de flecha hacia arriba.
El cursor de reloj de arena.
Windows.Pas
Sintaxis
ShowCaret(
hWnd: HWND
): BOOL;
{manejador de ventana}
{devuelve TRUE o FALSE}
Descripcin
Muestra el cursor de edicin en la pantalla en el punto de insercin actual. El cursor de
edicin aparece slo si la ventana especificada lo posee, si tiene forma no vaca y si la
funcin HideCaret no ha sido llamada dos o ms veces secuencialmente. El
ocultamiento del cursor de edicin es acumulativo. Por cada vez que la funcin
HideCaret sea llamada, deber realizarse una llamada a la funcin ShowCaret para que
el cursor de edicin sea mostrado de nuevo.
Parmetros
hWnd: Manejador de la ventana propietaria del cursor de edicin. Si a este parmetro se
le asigna FALSE, la funcin busca en todas las ventanas pertenecientes a la tarea
actual. Si ninguna ventana de la tarea actual posee el cursor de edicin, la funcin
ShowCaret falla.
Vase adems
CreateCaret, DestroyCaret, HideCaret
Ejemplo
Vea el Listado 6-4 bajo CreateCaret.
ShowCursor
413
Windows.Pas
Sintaxis
ShowCursor(
bShow: BOOL
): Integer;
Descripcin
Esta funcin muestra u oculta el cursor, incrementando o decrementando un contador
interno asociado al dispositivo de visualizacin. Cuando este contador interno se hace
menor que cero (0), el cursor del ratn es ocultado. Si hay un ratn instalado en el
sistema, el valor inicial del contador es 0; en caso contrario, su valor inicial es -1.
Parmetros
bShow: Un valor booleano que indica si el contador interno del dispositivo de
visualizacin debe ser incrementado o decrementado. Un valor TRUE incrementa el
contador; FALSE lo decrementa.
Vase adems
GetCursor, GetCursorPos, SetCursor, SetCursorPos
Ejemplo
Listado 6-16: Ocultando y mostrando el cursor
6
Captulo
414
Captulo 6
Figura 6-17:
El contador
asociado al
cursor
Funciones de paleta
415
Captulo 7
Funciones de paleta
El color es una parte muy importante de la interfaz de usuario. Permite comunicar
datos de una forma muy intuitiva y efectiva y enriquece el atractivo esttico general de
la aplicacin. Los sistemas informticos actuales incorporan hardware de vdeo que
puede soportar millones de colores. Si bien es comn que los usuarios dispongan de
controladores de vdeo de ms de 256 colores, es una buena prctica desarrollar las
aplicaciones para 256 colores, que es la profundidad de color ms comnmente
soportada en los ordenadores de hoy, por increible que parezca. Adicionalmente, la
mayora de los juegos a pantalla completa se desarrollan para controladores de vdeo de
256 colores, para lograr una mayor velocidad y poder realizar efectos especiales de
animacin sin necesidad de disponer de hardware especializado. Como resultado, la
mayora de las funciones de este captulo sern intiles cuando los controladores de
vdeo sean configurados con una profundidad de ms de 256 colores.
Las funciones de este captulo muestran el trabajo con colores y paletas de colores en
modo de vdeo de 256 colores. La mayora de los ejemplos en este captulo slo
funcionarn en caso de que el controlador de video sean configurado para 256 colores.
Captulo
416
Captulo 7
Paletas de identidad
Muchas aplicaciones, como los juegos o las utilidades de manipulacin de imgenes,
tienen que tener un control explcito sobre dnde son mapeadas sus entradas de paleta
en la paleta del sistema. En tales situaciones, la aplicacin puede crear lo que se conoce
como una paleta de identidad. Para crear una paleta de identidad, comience por
preparar una paleta lgica de 256 entradas. Utilice la funcin GetSystemPaletteEntries
para recuperar las 10 primeras y 10 ltimas entradas de la paleta del sistema y
colocarlas en las 10 primeras y 10 ltimas entradas de la paleta lgica. A continuacin,
asigne a los 236 colores restantes de la paleta lgica los colores deseados, utilizando la
opcin PC_NOCOLLAPSE en el campo peFlags del registro TPaletteEntry para cada
entrada de la paleta. Cuando esta paleta sea realizada, los primeros y ltimos diez
colores mapearn directamente los colores estticos del sistema, y los 236 restantes
sern colocados en las entradas no usadas sin ningn tipo de mapeado a los colores
existentes.
Especificadores de colores
Los colores dentro de una paleta se identifican mediante especificadores de colores.
Un especificador de color es un valor de 32 bits que puede indicar la intensidad relativa
de los componentes rojo, verde y azul del color en los 3 bytes menos significativos, o
puede contener un ndice de paleta especfico en el byte menos significativo. El byte
ms significativo determina cmo los otros 3 bytes sern interpretados, segn se indica
en la Tabla 7-1. Un especificador de color puede ser utilizado en cualquier funcin de
paleta donde se requiera un valor de tipo COLORREF, TColor, o DWORD.
417
$01
$02
Descripcin
Indica que los 3 bytes menos significativos contienen los valores relativos
de la intensidad de los componentes de color azul, verde y rojo. El
especificador de color ser:
$00bbggrr
Este especificador de color producir un color obtenido mediante la
combinacin de los veinte colores estticos que genere la aproximacin
ms cercana al color requerido.
Indica que el byte menos significativo especifica un ndice de la paleta
lgica actualmente realizada. El especificador de color ser:
$010000nn
Este especificador de color producir el color almacenado en el ndice
indicado de la paleta lgica activa (realizada).
Indica que los 3 bytes menos significativos contienen los valores relativos
de la intensidad de los componentes azul, verde y rojo del color. El
especificador de color ser:
$02bbggrr
Este especificador de color producir el color de la paleta lgica activa
(realizada) que ms se aproxime al color requerido.
implementation
{$R *.DFM}
{Enlaza la funcin GetSystemPaletteEntries}
function GetSystemPaletteEntries; external gdi32 name 'GetSystemPaletteEntries';
procedure TForm1.FormCreate(Sender: TObject);
var
ThePalette: PLogPalette;
// registro de definicin de paleta lgica
iLoop: Integer;
// contador de bucle
begin
7
Captulo
Funciones de paleta
418
Captulo 7
419
Figura 7-1:
Las diferentes
formas de
especificacin
de colores
Funciones de paleta
Este captulo describe las siguientes funciones de paleta:
Tabla 7-2: Funciones de paleta
Funcin
AnimatePalette
CreateHalftonePalette
CreatePalette
GetBValue
GetDIBColorTable
GetEnhMetaFilePaletteEntries
Descripcin
Reemplaza entradas en una paleta lgica.
Crea una paleta de tonos intermedios.
Crea una paleta lgica.
Recupera la intensidad del azul de un especificador de
color.
Recupera la paleta de colores de un mapa de bits
independiente del dispositivo.
Recupera la paleta de colores de un metafichero
mejorado.
7
Captulo
Funciones de paleta
420
Captulo 7
Funcin
GetGValue
Descripcin
Recupera la intensidad del verde de un especificador
de color.
Recupera el especificador de color de la paleta del
sistema que ms se acerca al color indicado.
Recupera el ndice de la paleta lgica activa (realizada)
que ms se acerca al color indicado.
Recupera un rango de entradas de paleta de una
paleta lgica.
Recupera la intensidad del rojo de un especificador de
color.
Recupera el especificador de color para el sistema de
colores indicado.
Recupera un rango de entradas de paleta de la paleta
del sistema.
Indica si la paleta del sistema contiene colores
estticos.
Recupera un especificador de color de un ndice
especfico de la paleta lgica actualmente activa.
Recupera el especificador de color de la paleta lgica
actualmente activa que ms se acerca al color
indicado.
Realiza una paleta lgica en la paleta del sistema.
Modifica el tamao de la paleta lgica.
Recupera un especificador de color para el color
requerido que ser generado mediante la
combinacin de los 20 colores estticos.
Selecciona una paleta lgica en un contexto de
dispositivo.
Asigna la paleta de colores de un mapa de bits
independiente del dispositivo.
Asigna un rango de entradas de paleta en una paleta
lgica.
Asigna un color de sistema al especificador de color
indicado.
Cambia el nmero de colores estticos usados por la
paleta del sistema.
GetNearestColor
GetNearestPaletteIndex
GetPaletteEntries
GetRValue
GetSysColor
GetSystemPaletteEntries
GetSystemPaletteUse
PaletteIndex
PaletteRGB
RealizePalette
ResizePalette
RGB
SelectPalette
SetDIBColorTable
SetPaletteEntries
SetSysColor
SetSystemPaletteUse
AnimatePalette
Windows.Pas
Sintaxis
AnimatePalette(
p1: HPALETTE;
p2: UINT;
p3: UINT;
p4: PPaletteEntry
): BOOL;
421
Descripcin
Esta funcin reemplaza entradas de colores en la paleta lgica especificada, con las
nuevas entradas a las que apunta el parmetro p4. Slo sern reemplazadas aquellas
entradas de la paleta lgica especificada que tengan asignado PC_RESERVED en el
campo peFlags.
Parmetros
p1: Manejador de la paleta lgica cuyas entradas sern reemplazadas.
p2: Especifica el ndice de la paleta lgica a partir de donde comenzar la sustitucin
de entradas.
p3: Especifica la cantidad de entradas de paleta que sern reemplazadas.
p4: Puntero a un array de registros TPaletteEntry que reemplazarn las entradas
especificadas en la paleta lgica. El registro TPaletteEntry se define como:
TPaletteEntry = packed record
peRed: Byte;
{intensidad del color rojo}
peGreen: Byte;
{intensidad del color verde}
peBlue: Byte;
{intensidad del color azul}
peFlags: Byte;
{opciones de uso de entrada de paleta}
end;
Consulte la funcin CreatePalette para ver una descripcin de este registro.
Vase adems
CreatePalette, SelectPalette
Ejemplo
Listado 7-2: Animacin del gradiente de color
{OJO! Delphi importa incorrectamente la funcin GetSystemPaletteEntries.
Esta es la declaracin que brinda toda la funcionalidad accesible mediante
esta funcin del API}
function GetSystemPaletteEntries(DC: HDC; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
7
Captulo
Funciones de paleta
422
Captulo 7
var
Form1: TForm1;
FormPalette: HPALETTE;
// almacena la nueva paleta lgica
AnimPalette: array[0..31] of TPaletteEntry; // entradas de paleta
implementation
{Enlace en la funcin GetSystemPaletteEntries}
function GetSystemPaletteEntries; external gdi32 name 'GetSystemPaletteEntries';
function TForm1.GetPalette: HPALETTE;
begin
{Cada vez que al formulario se le pide su paleta devuelve la nueva paleta lgica}
Result := FormPalette;
end;
procedure TForm1.CreateThePalette;
var
ThePalette: PLogPalette;
// almacena un registro de paleta lgica
iLoop: Integer;
// contador de bucle
begin
{Reserva memoria suficiente para almacenar los colores de las 10 primeras
entradas de la paleta del sistema, ms 32 nuestros}
GetMem(ThePalette, SizeOf(TLogPalette) + 42 * SizeOf(TPaletteEntry));
{Obtiene las primeras 10 entradas de la paleta del sistema}
GetSystemPaletteEntries(Form1.Canvas.Handle, 0, 10,
@(ThePalette^.palPalEntry));
{Inicializa informacin de la paleta}
ThePalette^.palVersion := $300;
ThePalette^.palNumEntries := 42;
{Crea una paleta de gradiente rojo}
for iLoop := 0 to 31 do
begin
ThePalette^.palPalEntry[iLoop + 10].peRed
ThePalette^.palPalEntry[iLoop + 10].peGreen
ThePalette^.palPalEntry[iLoop + 10].peBlue
ThePalette^.palPalEntry[iLoop + 10].peFlags
:=
:=
:=
:=
423
begin
{Crea la nueva paleta lgica}
CreateThePalette;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{Comienza la animacin de la paleta}
Timer1.Enabled := TRUE;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
iLoop: Integer; // contador de bucle
begin
{Selecciona y activa la nueva paleta de gradiente rojo}
SelectPalette(Canvas.Handle, FormPalette, FALSE);
RealizePalette(Canvas.Handle);
{Dibuja una serie de rectngulos que muestran el gradiente rojo}
for iLoop := 0 to 31 do
begin
Canvas.Brush.Color := PaletteIndex(iLoop + 10);
Canvas.FillRect(Rect(30, iLoop * 10 + 56, 290, (iLoop * 10) + 76));
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
PaletteEntry: TPALETTEENTRY;
// almacenamiento temporal de entradas de paleta
iLoop: Integer;
// contador de bucle
begin
{El array AnimPalette comienza como un duplicado exacto de la paleta lgica.
Rotamos las entradas de paleta desde el principio hasta el final del array,
guardando antes la primera entrada en el array...}
PaletteEntry := AnimPalette[0];
{...moviendo todas las dems entradas una posicin hacia el inicio...}
for iLoop := 0 to 30 do
AnimPalette[iLoop] := AnimPalette[iLoop + 1];
{...y colocando la antigua primera entrada en la ltima entrada del array}
AnimPalette[31] := PaletteEntry;
{Ahora colocamos el nuevo array de entradas de paleta en la zona exacta de la
paleta lgica donde antes asignamos el gradiente rojo. Los resultados visuales
sern muy agradables.}
AnimatePalette(FormPalette, 10, 42, @AnimPalette);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{No necesitamos ya la paleta lgica y la eliminamos}
DeleteObject(FormPalette);
7
Captulo
Funciones de paleta
424
Captulo 7
end;
Figura 7-2:
Un gradiente
de color en
movimiento
CreateHalftonePalette
Windows.Pas
Sintaxis
CreateHalftonePalette(
DC: HDC
): HPALETTE;
Descripcin
Esta funcin crea una paleta lgica para el contexto de dispositivo especificado. Una
paleta de medios tonos debe ser creada cuando una aplicacin utiliza la funcin
SetStretchBltMode con la opcin de modo de escalamiento HALFTONE. Esta paleta
debe ser seleccionada y activada en el contexto de dispositivo antes de que las
funciones StretchBlt o StretchDIBits sean llamadas. Cuando la paleta ya no sea
necesaria, deber ser eliminada usando la funcin DeleteObject.
Parmetros
DC: Manejador de un contexto de dispositivo usado como referencia para los colores
de la paleta de medios tonos.
425
Vase adems
CreatePalette, DeleteObject, RealizePalette, SelectPalette, SetStretchBltMode,
StretchDIBits, StretchBlt
Ejemplo
Listado 7-3: Creando una paleta de medios tonos
{OJO! Delphi importa incorrectamente la funcin GetPaletteEntries.
Aqu est la declaracin correcta, que brinda toda la funcionalidad
accesible mediante esta funcin del API}
function GetPaletteEntries(Palette: HPALETTE; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
var
Form1: TForm1;
SysPalette: array[0..255] of TPaletteEntry; // entradas de paleta
FormPalette: HPALETTE;
// manejador de paleta lgica
implementation
{$R *.DFM}
{Enlace de la funcin GetPaletteEntries}
function GetPaletteEntries; external gdi32 name 'GetPaletteEntries';
function TForm1.GetPalette: HPALETTE;
begin
{Cuando al formulario se le pide que devuelva su paleta, devuelve la paleta
lgica creada por la aplicacin}
Result := FormPalette;
end;
procedure TForm1.SetThePalette;
begin
{Crea una paleta de colores de medios tonos}
FormPalette := CreateHalftonePalette(Form1.Canvas.Handle);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
iLoop: Integer;
// variable de control de bucle general
begin
{Crea la paleta de medios tonos}
SetThePalette;
{Selecciona y activa la paleta de medios tonos en el contexto de dispositivo
del formulario}
SelectPalette(Canvas.Handle, FormPalette, FALSE);
RealizePalette(Canvas.Handle);
{Recupera los valores de los colores de la paleta de medios tonos}
GetPaletteEntries(FormPalette, 0, 256, @SysPalette);
7
Captulo
Funciones de paleta
426
Captulo 7
' + IntToStr(iLoop));
IntToStr(SysPalette[iLoop].peRed));
IntToStr(SysPalette[iLoop].peGreen));
IntToStr(SysPalette[iLoop].peBlue));
case SysPalette[iLoop].peFlags of
PC_EXPLICIT:
ListBox1.Items.Add('
Flags: PC_EXPLICIT');
PC_NOCOLLAPSE: ListBox1.Items.Add('
Flags: PC_NOCOLLAPSE');
PC_RESERVED:
ListBox1.Items.Add('
Flags: PC_RESERVED');
else ListBox1.Items.Add('
Flags: NULL');
end;
end;
end;
Figura 7-3:
La paleta de
medios tonos
procedure TForm1.FormPaint(Sender: TObject);
var
iOutLoop, iInLoop: Integer;
// variables de control de bucles
begin
{Selecciona y activa la paleta de medios tonos en el contexto de dispositivo
del formulario}
SelectPalette(Canvas.Handle, FormPalette, FALSE);
RealizePalette(Canvas.Handle);
{Dibuja una serie de rectngulos para mostrar la paleta de medios tonos}
for iOutLoop := 0 to 15 do
for iInLoop := 0 to 15 do
begin
Canvas.Brush.Color := PaletteIndex((iOutLoop * 16) + iInLoop);
427
CreatePalette
Windows.Pas
Sintaxis
CreatePalette(
const LogPalette: TLogPalette {puntero a registro TLogPalette}
): HPalette;
{devuelve un manejador de paleta lgica}
Descripcin
Esta funcin crea una paleta lgica a partir de la descripcin de la paleta de colores
contenida en el registro de tipo TLogPalette al que apunta el parmetro LogPalette.
Esta nueva paleta puede ser utilizada en las funciones SelectPalette y RealizePalette.
Cuando la paleta ya no sea necesaria, deber ser eliminada llamando a la funcin
DeleteObject.
Parmetros
LogPalette: Puntero al registro TLogPalette que contiene informacin sobre el formato
y los colores de la paleta deseada. El registro TLogPalette se define como:
TLogPalette = packed record
palVersion: Word;
{nmero de versin de la paleta}
palNumEntries: Word;
{cantidad de entradas de la paleta}
palPalEntry: array[0..0] of TPaletteEntry;
{entradas de la paleta}
end;
palVersion: Especifica el nmero de versin de la paleta de Windows. En el
momento en que se escribe este libro, a este campo se le debe asignar siempre el
valor $300.
palNumEntries: Especifica la cantidad de entradas deseadas en la paleta lgica.
palPalEntry: Un array de registros de tipo TPaletteEntry. Estos registros definen
la intensidad de los colores rojo, verde y azul, y el tratamiento de la entrada de
paleta para cada entrada en la paleta lgica de colores. Los colores en este array
deben colocarse en orden descendente de importancia, ya que las primeras
entradas son las que ms probablemente entren a la paleta del sistema. El registro
TPaletteEntry se define como:
7
Captulo
Funciones de paleta
428
Captulo 7
Vase adems
DeleteObject, RealizePalette, SelectPalette
Ejemplo
Listado 7-4: Creando una nueva paleta
{OJO! Delphi importa incorrectamente la funcin GetPaletteEntries.
Aqu est la declaracin correcta, que brinda toda la funcionalidad accesible
mediante esta funcin del API}
function GetPaletteEntries(Palette: HPALETTE; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
OJO! Delphi importa incorrectamente la funcin GetSystemPaletteEntries.
Aqu est la declaracin correcta, que brinda toda la funcionalidad accesible
mediante esta funcin del API}
function GetSystemPaletteEntries(DC: HDC; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
var
Form1: TForm1;
FormPalette: HPALETTE;
implementation
{$R *.DFM}
{Enlace de la funcin GetPaletteEntries}
function GetPaletteEntries; external gdi32 name GetPaletteEntries;
{Enlace de la funcin GetSystemPaletteEntries}
429
7
Captulo
Funciones de paleta
430
Captulo 7
{Crea la paleta}
FormPalette := CreatePalette(ThePalette^);
{Libera la memoria temporal}
FreeMem(ThePalette, SizeOf(TLogPalette) + 42 * SizeOf(TPaletteEntry));
end;
procedure TForm1.DisplayPaletteEntries;
var
PaletteEntries: array[0..31] of TPaletteEntry; // entradas de paleta
iLoop: Integer;
begin
{Obtiene nuestras 32 entradas de la paleta lgica}
GetPaletteEntries(FormPalette, 10, 32, @PaletteEntries);
{Muestra la informacin de la entrada de paleta}
ListBox1.Items.Clear;
for iLoop := 0 to 31 do
begin
ListBox1.Items.Add('Palette slot: ' + IntToStr(iLoop+10));
ListBox1.Items.Add('
Red: ' + IntToStr(PaletteEntries[iLoop].peRed));
ListBox1.Items.Add('
Green: ' + IntToStr(PaletteEntries[iLoop].peGreen));
ListBox1.Items.Add('
Blue: ' + IntToStr(PaletteEntries[iLoop].peBlue));
case PaletteEntries[iLoop].peFlags of
PC_EXPLICIT:
ListBox1.Items.Add('
Flags: PC_EXPLICIT');
PC_NOCOLLAPSE: ListBox1.Items.Add('
Flags: PC_NOCOLLAPSE');
PC_RESERVED:
ListBox1.Items.Add('
Flags: PC_RESERVED');
else ListBox1.Items.Add('
Flags: NULL');
end;
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
OldPalette: HPALETTE;
// manejador de la paleta anterior
iLoop: Integer;
// variable de control de bucle
begin
{Selecciona nuestra nueva paleta lgica en el contexto de dispositivo}
OldPalette := SelectPalette(Canvas.Handle, FormPalette, FALSE);
{Mapea nuestra paleta lgica en la paleta del sistema}
RealizePalette(Canvas.Handle);
{Muestra el gradiente rojo}
for iLoop := 0 to 31 do
begin
Canvas.Brush.Color := $01000000 or iLoop + 10;
Canvas.FillRect(Rect(10, iLoop * 10 + 16, 260, (iLoop * 10) + 36));
end;
{Selecciona la paleta previa en el contexto de dispositivo}
SelectPalette(Canvas.Handle, OldPalette, FALSE);
end;
Figura 7-4:
La paleta
gradiente
431
7
Captulo
Funciones de paleta
432
Captulo 7
PC_RESERVED
GetBValue
Descripcin
Indica que el byte menos significativo de la entrada de la paleta
lgica designa un ndice de la paleta del sistema.
Indica que esta entrada de color ser ubicada en una entrada
de la paleta del sistema no usada. No ser mapeada en otra
entrada de color si una entrada duplicada ya existe en la paleta
lgica. Si no queda ninguna entrada sin usar de la paleta del
sistema, el color es mapeado normalmente como si ningn
valor peFlags hubiera sido especificado. Otros colores pueden
ser mapeados a esta entrada de color de la manera normal.
Indica que esta entrada de color es usada para animacin de
paleta. Ser ubicada en una entrada sin usar de la paleta del
sistema y no ser mapeada en otra entrada de color si un
duplicado ya existe en la paleta lgica. Otros colores no
pueden ser mapeados a esta entrada de color si son idnticos.
Si no quedan entradas sin usar en la paleta del sistema, esta
entrada de color no ser ubicada en dicha paleta y por esta
razn ser inaccesible.
Windows.Pas
Sintaxis
GetBValue(
rgb: DWORD
): Byte;
Descripcin
Esta funcin recupera el valor de la intensidad del color azul del especificador de color
de 32 bits indicado.
Parmetros
rgb: El especificador de color de 32 bits cuya intensidad del color azul es recuperada.
Vase adems
GetGValue, GetRValue, PaletteIndex, PaletteRGB, RGB
433
Ejemplo
Listado 7-5: Mostrando la intensidad de los colores rojo, verde y azul
procedure TForm1.ColorGrid1Change(Sender: TObject);
begin
{Muestra la intensidad del rojo, verde y azul del color seleccionado}
Label4.Caption := IntToStr(GetRValue(ColorGrid1.ForegroundColor));
Label5.Caption := IntToStr(GetGValue(ColorGrid1.ForegroundColor));
Label6.Caption := IntToStr(GetBValue(ColorGrid1.ForegroundColor));
end;
Figura 7-5:
Los valores de
intensidad de
los colores
bsicos
GetDIBColorTable
Windows.Pas
Sintaxis
GetDIBColorTable(
DC: HDC;
{manejador de contexto de dispositivo con DIB seleccionado}
p2: UINT;
{ndice de paleta de la primera entrada a recuperar}
p3: UINT;
{cantidad de entradas de paleta a recuperar}
var RGBQuadStructs {puntero a buffer que recibe un array de TRGBQuad}
): UINT;
{devuelve la cantidad de entradas de paleta recuperadas}
Descripcin
Esta funcin recupera un rango especfico de entradas de paleta de colores desde el
mapa de bits independiente de dispositivo actualmente seleccionado en el contexto de
dispositivo identificado por el parmetro DC. Estas entradas estn en la forma de un
array de registros TRGBQuad, almacenado en el buffer al que apunta el parmetro
RGBQuadStructs. Esta funcin es til slo para DIBs que tienen un formato de color de
1, 4, u 8 bits por pxel, debido a que los DIBs con un formato de color superior a 8 bits
por pxel no contienen una paleta de colores.
Parmetros
DC: Manejador de un contexto de dispositivo. El DIB desde el cual las entradas de la
paleta de colores van a ser recuperados tiene que estar seleccionado en este contexto de
dispositivo.
p2: Especifica el ndice (basado en cero) de la primera entrada de la paleta a recuperar.
7
Captulo
Funciones de paleta
434
Captulo 7
Vase adems
CreatePalette, CreateDIBSection, SelectObject, SetDIBColorTable, SetPaletteEntries
Ejemplo
Listado 7-6: Recuperando una paleta de colores de un mapa de bits independiente del
dispositivo
var
Form1: TForm1;
FormPalette: HPALETTE;
implementation
function TForm1.GetPalette: HPALETTE;
begin
{Cuando al formulario se le pide la paleta de colores, devuelve la paleta
creada por la aplicacin}
Result := FormPalette;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ThePalette: PLogPalette;
// un registro de datos de una paleta lgica
begin
{Reserva suficiente memoria para crear una paleta lgica de 256 colores}
435
7
Captulo
Funciones de paleta
436
Captulo 7
{Asigna la paleta del formulario para que se corresponda con la del DIB}
SetPaletteEntries(FormPalette, 10, NumColors, PalEntries);
{Selecciona y activa esta nueva paleta}
TheDC := GetDC(Form1.Handle);
SelectPalette(TheDC, FormPalette, FALSE);
RealizePalette(TheDC);
{Inicializa el cuadro de lista para mostrar la informacin de la paleta}
ListBox1.Items.Clear;
ListBox1.Items.Add('Number of colors: ' + IntToStr(NumColors));
{Dibuja una rejilla con celdas coloreadas que representan la paleta del DIB
seleccionado. Debido a que slo 236 colores pueden ser asignados a la paleta
del sistema, este cdigo no mostrar los primeros y ltimos 10 colores de la
paleta lgica}
for OutLoop := 0 to 15 do
for InLoop := 0 to 15 do
begin
if ((OutLoop*16)+InLoop > NumColors-1) or ((OutLoop*16)+InLoop > 245) then
{Si hay menos de 236 colores o se trata de los ltimos 10 colores,
muestra un cuadrado negro slido}
NewBrush := CreateSolidBrush(clBlack)
else
begin
{Muestra los valores de los colores para este ndice de paleta}
ListBox1.Items.Add('Index: ' + IntToStr((OutLoop*16) + InLoop));
ListBox1.Items.Add('
Red: ' + IntToStr(Colors[
(OutLoop*16) + InLoop].rgbRed));
ListBox1.Items.Add(' Green: ' + IntToStr(Colors[
(OutLoop*16) + InLoop].rgbGreen));
ListBox1.Items.Add('
Blue: ' + IntToStr(Colors[
(OutLoop*16) + InLoop].rgbBlue));
{Crea una brocha coloreada para este ndice de paleta especifico,
saltndose los primeros 10 colores del sistema}
NewBrush := CreateSolidBrush($01000000 or (OutLoop*16) + InLoop+10);
end;
{Selecciona la nueva brocha en el contexto de dispositivo}
OldBrush := SelectObject(TheDC, NewBrush);
{Dibuja un rectngulo usando el color especifico del ndice de la paleta}
Rectangle(TheDC, (InLoop*15) + 15, (OutLoop*15) + 256,
(InLoop*15) + 30, (OutLoop*15) + 271);
{Elimina la brocha coloreada}
SelectObject(TheDC, OldBrush);
DeleteObject(NewBrush);
end;
{Libera el contexto de dispositivo}
ReleaseDC(Form1.Handle, TheDC);
end;
Funciones de paleta
437
Captulo
Figura 7-6:
Mostrando la
paleta de
colores de un
DIB
GetEnhMetaFilePaletteEntries
Windows.Pas
Sintaxis
GetEnhMetaFilePaletteEntries(
p1: HENHMETAFILE;
p2: UINT;
p3: Pointer
): UINT;
Descripcin
Esta funcin recupera la cantidad especificada de entradas de paleta del metafichero
mejorado indicado por el parmetro p1, si ste contiene una paleta. Las entradas
recuperadas siempre comienzan en el ndice 0 de la tabla de entradas de paleta del
metafichero mejorado. Una vez que las entradas de paleta son recuperadas, el
desarrollador puede usar las funciones CreatePalette, SelectPalette y RealizePalette
antes de llamar a la funcin PlayEnhMetaFile para mostrar el metafichero mejorado en
sus colores originales.
Parmetros
p1: Manejador de un metafichero mejorado cuyas entradas de paleta sern recuperadas.
p2: Especifica la cantidad de entradas de la paleta a recuperar.
438
Captulo 7
p3: Puntero a un buffer que recibe un array de registros de tipo TPaletteEntry que
describen los valores de los colores de las entradas de paleta del metafichero. Este
buffer tiene que ser lo suficientemente grande para almacenar el nmero de registros
TPaletteEntry indicado por el parmetro p2. Si a este parmetro se le asigna nil y el
metafichero mejorado especificado contiene una paleta de colores, la funcin devuelve
la cantidad de entradas en la paleta del metafichero. El registro TPaletteEntry se define
como:
TPaletteEntry = packed record
peRed: Byte;
{intensidad del color rojo}
peGreen: Byte;
{intensidad del color verde}
peBlue: Byte;
{intensidad del color azul}
peFlags: Byte;
{opciones de tratamiento de entradas de paleta}
end;
Consulte la funcin CreatePalette para ver una descripcin de esta estructura de datos.
Vase adems
CreatePalette, GetEnhMetaFile, PlayEnhMetaFile, RealizePalette, SelectPalette
Ejemplo
Listado 7-7: Recuperando una paleta de colores de un metafichero mejorado
procedure TForm1.FileListBox1Click(Sender: TObject);
var
TheMetafile: HENHMETAFILE;
// manejador de un metafichero mejorado
MetafilePalette: PLogPalette;
// registro de paleta lgica
MetafilePaletteHandle: HPALETTE;
// manejador de una paleta
NumPaletteEntries: Integer;
// cantidad de entradas en la paleta
iLoop: Integer;
// variable de control de bucle
begin
{Borra la ltima imagen en el panel de dibujo}
PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);
{Abre el metafichero seleccionado}
TheMetafile := GetEnhMetaFile(PChar(FileListBox1.FileName));
{Recupera el nmero de entradas en esta paleta de metafichero}
NumPaletteEntries := GetEnhMetaFilePaletteEntries(TheMetafile, 0, nil);
{Reserva memoria para crear una paleta lgica lo suficientemente grande para
todas las entradas de paleta del metafichero}
439
GetMem(MetafilePalette, SizeOf(TLogPalette) +
NumPaletteEntries * SizeOf(TPaletteEntry));
{Si hay entradas en el metafichero, las recupera}
if NumPaletteEntries>0 then
GetEnhMetaFilePaletteEntries(TheMetafile, NumPaletteEntries,
@(MetafilePalette^.palPalEntry));
{Inicializa la informacin apropiada de la paleta lgica}
MetafilePalette^.palVersion := $300;
MetafilePalette^.palNumEntries := NumPaletteEntries;
{Crea una paleta lgica basada en la paleta del metafichero mejorado}
MetafilePaletteHandle := CreatePalette(MetafilePalette^);
{Selecciona y activa esta paleta en el rea de dibujo del formulario}
SelectPalette(Form1.Canvas.Handle, MetafilePaletteHandle, FALSE);
RealizePalette(Form1.Canvas.Handle);
{Ahora muestra el metafichero mejorado. Este metafichero se ejecutar usando
sus colores originales}
PlayEnhMetaFile(PaintBox1.Canvas.Handle, TheMetafile, PaintBox1.BoundsRect);
{Inicializa el cuadro de lista para mostrar las entradas de la paleta}
ListBox1.Items.Clear;
ListBox1.Items.Add('Palette Entries: ' + IntToStr(NumPaletteEntries));
{Muestra las entradas de paletas del metafichero mejorado}
for iLoop := 0 to NumPaletteEntries-1 do
begin
ListBox1.Items.Add('Palette slot: ' + IntToStr(iLoop));
ListBox1.Items.Add('
Red: ' + IntToStr(
MetafilePalette^.palPalEntry[iLoop].peRed));
ListBox1.Items.Add('
Green: ' + IntToStr(
MetafilePalette^.palPalEntry[iLoop].peGreen));
ListBox1.Items.Add('
Blue: ' + IntToStr(
MetafilePalette^.palPalEntry[iLoop].peBlue));
case MetafilePalette^.palPalEntry[iLoop].peFlags of
PC_EXPLICIT:
ListBox1.Items.Add('
Flags: PC_EXPLICIT');
PC_NOCOLLAPSE: ListBox1.Items.Add('
Flags: PC_NOCOLLAPSE');
PC_RESERVED:
ListBox1.Items.Add('
Flags: PC_RESERVED');
else ListBox1.Items.Add('
Flags: NULL');
end;
end;
{El registro de datos de la paleta ya no es necesario, liberamos su memoria}
FreeMem(MetafilePalette, SizeOf(TLogPalette) +
NumPaletteEntries * SizeOf(TPaletteEntry));
{El metafichero mejorado ya no es necesario, lo eliminamos}
DeleteEnhMetaFile(TheMetafile);
DeleteObject(MetafilePaletteHandle);
7
Captulo
Funciones de paleta
440
Captulo 7
Figura 7-7:
Mostrando un
metafichero
mejorado en
sus colores
originales
GetGValue
Windows.Pas
Sintaxis
GetGValue(
rgb: DWORD
): Byte;
Descripcin
Esta funcin recupera la intensidad del color verde del especificador de color de 32 bits
indicado.
Parmetros
rgb: El especificador de color de 32 bits cuya intensidad del color verde ser
recuperada.
Vase adems
GetBValue, GetRValue, PaletteIndex, PaletteRGB, RGB
Ejemplo
Vea el Listado 7-5 bajo GetBValue.
GetNearestColor
441
Windows.Pas
Sintaxis
GetNearestColor(
DC: HDC;
p2: COLORREF
): COLORREF;
Descripcin
Esta funcin devuelve el especificador de color de 32 bits de la paleta de colores del
sistema asociada al contexto de dispositivo con el color ms cercano al especificador
de color indicado por el parmetro p2.
Parmetros
DC: Manejador del contexto de dispositivo en cuya paleta del sistema asociada se
buscar el color ms cercano al requerido.
p2: Especificador de color de 32 bits que representa el color requerido.
Vase adems
GetNearestPaletteIndex, RGB
Ejemplo
Listado 7-8: Hallando el color ms cercano
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
{Mostrar los atributos del color solicitado}
Label1.Caption := 'Red: ' + IntToStr(ScrollBar1.Position);
Label2.Caption := 'Green: ' + IntToStr(ScrollBar2.Position);
Label3.Caption := 'Blue: ' + IntToStr(ScrollBar3.Position);
{Colorear la primera forma con el color solicitado}
Shape1.Brush.Color := RGB(ScrollBar1.Position,
ScrollBar2.Position,
ScrollBar3.Position);
{Halla el color puro ms cercano al solicitado en la paleta del sistema}
Shape2.Brush.Color := GetNearestColor(Canvas.Handle, Shape1.Brush.Color);
end;
7
Captulo
Funciones de paleta
442
Captulo 7
Figura 7-8:
Mostrando el
color ms
cercano
GetNearestPaletteIndex
Windows.Pas
Sintaxis
GetNearestPaletteIndex(
p1: HPALETTE;
p2: COLORREF
): UINT;
Descripcin
Esta funcin devuelve el ndice de la entrada de color ms cercano al color solicitado
(especificado en el parmetro p2) de la paleta lgica indicada en el parmetro p1.
Observe que si la paleta lgica contiene entradas de paleta que contienen el valor
PC_EXPLICIT en el campo peFlags, el valor devuelto es indefinido.
Parmetros
p1: Manejador de la paleta lgica en la que se busca el color que ms se acerca al color
solicitado.
p2: Un valor de color RGB explcito de 32 bits que representa el color solicitado.
Vase adems
GetNearestColor, GetPaletteEntries, GetSystemPaletteEntries, PaletteRGB, RGB
443
Ejemplo
Listado 7-9: Hallando el ndice de la paleta para el color ms cercano al requerido
{OJO! Delphi importa incorrectamente la funcin GetSystemPaletteEntries.
Aqu est la declaracin correcta, que ofrece acceso a toda la funcionalidad
accesible con esta funcin del API}
function GetSystemPaletteEntries(DC: HDC; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
var
Form1: TForm1;
SysPalette: array[0..255] of TPaletteEntry;
FormPalette: HPALETTE;
implementation
{Enlace de la funcin GetSystemPaletteEntries}
function GetSystemPaletteEntries; external gdi32 name 'GetSystemPaletteEntries';
function TForm1.GetPalette: HPalette;
begin
{Cuando se solicita la paleta al formulario, ste devuelve la paleta creada
por la aplicacin}
Result := FormPalette;
end;
procedure TForm1.SetThePalette;
var
ThePalette: PLogPalette;
// registro de paleta lgica
begin
{Reserva memoria para una paleta de 256 entradas de colores}
GetMem(ThePalette, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry));
{Recupera las entradas de paleta de la paleta del sistema}
GetSystemPaletteEntries(Form1.Canvas.Handle, 0, 256,
@(ThePalette^.palPalEntry));
{Inicializa la informacin apropiada de la paleta lgica}
ThePalette^.palVersion := $300;
ThePalette^.palNumEntries := 256;
{Crea un duplicado exacto de la actual paleta del sistema}
FormPalette := CreatePalette(ThePalette^);
{No necesitamos ya la memoria del registro de la paleta lgica y la liberamos}
FreeMem(ThePalette, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry));
end;
procedure TForm1.FormCreate(Sender: TObject);
var
iLoop: Integer;
// contador de bucle
begin
7
Captulo
Funciones de paleta
Funciones de paleta
444
445
Figura 7-9:
El ndice de la
paleta para el
color ms
cercano
GetPaletteEntries
Windows.Pas
Sintaxis
GetPaletteEntries(
Palette: HPALETTE;
StartIndex: UINT;
NumEntries: UINT;
PaletteEntries: Pointer
): UINT;
7
Captulo
Funciones de paleta
446
Captulo 7
Descripcin
Esta funcin recupera un rango de entradas de paleta de la paleta lgica especificada.
Estas entradas de paleta son devueltas en forma de un array de registros TPaletteEntry
a travs del buffer al que apunta el parmetro PaletteEntries.
Parmetros
Palette: Manejador de la paleta lgica del que las entradas de paleta son recuperadas.
StartIndex: El ndice (de base cero) de la primera entrada a recuperar de la paleta
lgica.
NumEntries: Especifica la cantidad de entradas a recuperar. Si la paleta lgica contiene
menos entradas que las indicadas por este parmetro, el resto de las entradas en el
buffer al que apunta el parmetro PaletteEntries no son alteradas.
PaletteEntries: Puntero a un buffer que recibe un array de registros TPaletteEntry que
describen los valores de los colores recuperados de la entradas de la paleta lgica
especificada. Este buffer tiene que ser lo suficientemente grande para almacenar la
cantidad de registros TPaletteEntry indicados por el parmetro NumEntries. Si a este
parmetro se le asigna nil, la funcin devuelve la cantidad de entradas en la paleta
lgica especificada. El registro TPaletteEntry se define como:
TPaletteEntry = packed record
peRed: Byte;
{intensidad del color rojo}
peGreen: Byte;
{intensidad del color verde}
peBlue: Byte;
{intensidad del color azul}
peFlags: Byte;
{opciones de tratamiento de entradas de paleta}
end;
Consulte la funcin CreatePalette para ver una descripcin de este registro.
Vase adems
CreatePalette, GetSystemPaletteEntries, RealizePalette, SelectPalette,
SetPaletteEntries
Ejemplo
Vea el Listado 7-4 bajo CreatePalette o el Listado 7-3 bajo CreateHalftonePalette.
GetRValue
447
Windows.Pas
Sintaxis
GetRValue(
rgb: DWORD
): Byte;
Descripcin
Esta funcin recupera el valor de la intensidad del color rojo del especificador de color
de 32 bits indicado.
Parmetros
rgb: El especificador de color de 32 bits cuya intensidad del color rojo es recuperada.
Vase adems
GetBValue, GetGValue, PaletteIndex, PaletteRGB, RGB
Ejemplo
Vea el Listado 7-5 bajo GetBValue.
GetSysColor
Windows.Pas
Sintaxis
GetSysColor(
nIndex: Integer
): DWORD;
Descripcin
Esta funcin recupera el valor RGB del color asociado al elemento de visualizacin
especificado. El indicador de elemento de visualizacin nIndex identifica a una de las
diferentes partes de una ventana, cada una de las cuales es asociada con uno de los 20
colores estticos definidos por el sistema.
Parmetros
nIndex: Especifica un elemento de visualizacin cuyo valor de color RGB ser
recuperado. Este parmetro puede tomar un valor de la Tabla 7-4.
7
Captulo
Funciones de paleta
448
Captulo 7
Vase adems
GetBValue, GetGValue, GetRValue, GetSystemPaletteEntries, PaletteRGB, RGB,
SetSysColors
Ejemplo
Listado 7-10: Recuperando y estableciendo el sistema de colores del elemento de
visualizacin
{Array de constantes con todos los elementos de visualizacin accesibles}
const
DisplayElements: array[0..24] of Integer = (COLOR_3DDKSHADOW,COLOR_3DLIGHT,
COLOR_ACTIVEBORDER,COLOR_ACTIVECAPTION,
COLOR_APPWORKSPACE,COLOR_BACKGROUND,
COLOR_BTNFACE,COLOR_BTNHIGHLIGHT,
COLOR_BTNSHADOW,COLOR_BTNTEXT,
COLOR_CAPTIONTEXT,COLOR_GRAYTEXT,
COLOR_HIGHLIGHT,COLOR_HIGHLIGHTTEXT,
COLOR_INACTIVEBORDER,COLOR_INACTIVECAPTION,
COLOR_INACTIVECAPTIONTEXT,COLOR_INFOBK,
COLOR_INFOTEXT,COLOR_MENU,COLOR_MENUTEXT,
COLOR_SCROLLBAR,COLOR_WINDOW,
COLOR_WINDOWFRAME,COLOR_WINDOWTEXT);
implementation
procedure TForm1.ComboBox1Change(Sender: TObject);
var
DisplayColor: TColor;
// almacena el color de sistema del elemento
begin
{Recupera el color del elemento de visualizacin seleccionado}
DisplayColor := GetSysColor(DisplayElements[ComboBox1.ItemIndex]);
{Ajusta la posicin
ScrollBar1.Position
ScrollBar2.Position
ScrollBar3.Position
end;
de
:=
:=
:=
la barra de desplazamiento}
GetRValue(DisplayColor);
GetGValue(DisplayColor);
GetBValue(DisplayColor);
449
Figura 7-10:
El nuevo color
del sistema
Descripcin
El color de la sombra oscura para elementos de
visualizacin tridimensionales.
El color del borde iluminado resaltado para
elementos de visualizacin tridimensionales.
El color del borde de la ventana activa.
El color de la barra de ttulo de la ventana activa.
El color de fondo usado en la interfaz de
aplicaciones multidocumentos (MDI).
El color del escritorio.
El color de la superficie de los botones.
El color de los botones resaltados.
El color del borde sombreado de los botones.
El color del texto de los botones.
7
Captulo
Funciones de paleta
450
Captulo 7
Valor
COLOR_CAPTIONTEXT
Descripcin
El color del texto usado en la barra de ttulo, el
cuadro de redimensionamiento y las cajas de flecha
de las barras de desplazamiento.
COLOR_GRAYTEXT
El color del texto deshabilitado. Ser puesto a cero
si el controlador de vdeo no puede soportar gris
slido.
COLOR_HIGHLIGHT
El color usado para los elementos seleccionados en
un control.
COLOR_HIGHLIGHTTEXT
El color usado para el texto de los elementos
seleccionados en un control.
COLOR_INACTIVEBORDER
El color del borde de una ventana inactiva.
COLOR_INACTIVECAPTION
El color de la barra de ttulo de una ventana inactiva.
COLOR_INACTIVECAPTIONTEXT El color del texto en una barra de ttulo inactiva.
COLOR_INFOBK
El color de fondo para los controles de las
indicaciones.
COLOR_INFOTEXT
El color del texto para los controles de las
indicaciones.
COLOR_MENU
El color de fondo de los mens.
COLOR_MENUTEXT
El color del texto de los mens.
COLOR_SCROLLBAR
El color del rea gris de la barra de
desplazamiento.
COLOR_WINDOW
El color de fondo de una ventana.
COLOR_WINDOWFRAME
El color del marco de una ventana.
COLOR_WINDOWTEXT
El color del texto de una ventana.
GetSystemPaletteEntries
Windows.Pas
Sintaxis
GetSystemPaletteEntries(
DC: HDC;
StartIndex: UINT;
NumEntries: UINT;
PaletteEntries: Pointer
): UINT;
Descripcin
Esta funcin recupera el rango especificado de entradas de paleta de la paleta del
sistema asociada con el contexto de dispositivo identificado por el parmetro DC.
Parmetros
DC: Manejador de un contexto de dispositivo. Las entradas de la paleta de colores son
recuperadas de la paleta del sistema asociada con este contexto de dispositivo.
451
Vase adems
GetPaletteEntries, GetSystemPaletteUse, RealizePalette, SelectPalette,
SetSystemPaletteUse
Ejemplo
Listado 7-11: Recuperando entradas de la paleta del sistema
{OJO! Delphi importa incorrectamente la funcin GetSystemPaletteEntries.
Aqu est la declaracin correcta, que ofrece toda la funcionalidad accesible
con esta funcin del API}
function GetSystemPaletteEntries(DC: HDC; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
var
Form1: TForm1;
SysPalette: array[0..255] of TPaletteEntry; // almacena la paleta del sistema
// recuperada
FormPalette: HPALETTE;
// manejador de paleta lgica
implementation
7
Captulo
Funciones de paleta
452
Captulo 7
453
{Muestra los atributos de color para las 256 entradas en la paleta del sistema}
for iLoop := 0 to 255 do
begin
ListBox1.Items.Add('Palette slot: ' + IntToStr(iLoop));
ListBox1.Items.Add('
Red: ' + IntToStr(SysPalette[iLoop].peRed));
ListBox1.Items.Add('
Green: ' + IntToStr(SysPalette[iLoop].peGreen));
ListBox1.Items.Add('
Blue: ' + IntToStr(SysPalette[iLoop].peBlue));
case SysPalette[iLoop].peFlags of
PC_EXPLICIT:
ListBox1.Items.Add('
Flags: PC_EXPLICIT');
PC_NOCOLLAPSE: ListBox1.Items.Add('
Flags: PC_NOCOLLAPSE');
PC_RESERVED:
ListBox1.Items.Add('
Flags: PC_RESERVED');
else ListBox1.Items.Add('
Flags: NULL');
end;
end;
end;
Figura 7-11:
La paleta
activa del
sistema
procedure TForm1.FormPaint(Sender: TObject);
var
iOutLoop, iInLoop: Integer; // variables de control de bucle
begin
{Selecciona y activa la paleta lgica en el contexto de dispositivo del
formulario}
SelectPalette(Canvas.Handle, FormPalette, FALSE);
RealizePalette(Canvas.Handle);
{Dibuja una serie de rectngulos para mostrar la paleta del sistema}
for iOutLoop := 0 to 15 do
for iInLoop := 0 to 15 do
begin
Canvas.Brush.Color := PaletteIndex((iOutLoop*16) + iInLoop);
7
Captulo
Funciones de paleta
454
Captulo 7
GetSystemPaletteUse
Windows.Pas
Sintaxis
GetSystemPaletteUse(
DC: HDC
): UINT;
Descripcin
Esta funcin recupera un valor que indica el estado de utilizacin de los colores
estticos de la paleta del sistema asociada con el contexto de dispositivo asociado.
Parmetros
DC: Manejador al contexto de dispositivo cuyo estado de la paleta del sistema ser
recuperado. Debe ser un contexto de dispositivo que soporte paletas de colores.
Vase adems
GetSystemPaletteEntries, RealizePalette, SelectPalette, SetSystemPaletteUse
Ejemplo
Vea el Listado 7-11 bajo GetSystemPaletteEntries.
Tabla 7-5: Valores que devuelve GetSystemPaletteUse
Valor
SYSPAL_NOSTATIC
SYSPAL_STATIC
SYSPAL_ERROR
Descripcin
La paleta del sistema contiene slo dos colores estticos:
blanco y negro.
La paleta del sistema contiene los colores estticos por
defecto. Estos colores no cambiarn cuando la paleta sea
realizada. Este es el estado por defecto de la paleta del
sistema.
El contexto de dispositivo especificado no es vlido o no
soporta paletas de colores.
Funciones de paleta
455
Windows.Pas
Sintaxis
PaletteIndex(
i: Word
): COLORREF;
Descripcin
Esta funcin convierte un ndice de entrada de paleta explcito en un especificador de
color de 32 bits. Este valor puede ser usado en funciones que esperan un especificador
de color para indicar a las funciones el uso del color hallado en el ndice de paleta
lgica especificado. Esta funcin es equivalente a usar el operador booleano or con un
ndice de paleta explcito y el valor $01000000 para especificar un ndice de paleta
lgica.
Parmetros
i: El ndice de la entrada deseada en la paleta lgica.
Vase adems
CreatePalette, PaletteRGB, RGB
Ejemplo
Vea el Listado 7-11 bajo GetSystemPaletteEntries.
PaletteRGB
Windows.Pas
Sintaxis
PaletteRGB(
r: Byte;
g: Byte;
b: Byte
): COLORREF;
Descripcin
Esta funcin devuelve un especificador de color de 32 bits que contiene el color ms
cercano al color solicitado de la paleta lgica actualmente realizada. Este nmero
contiene un $02 en el byte ms significativo y los valores del rojo, el verde y el azul en
los 3 bytes menos significativos de la entrada del color ms cercano en la paleta lgica.
Esta funcin es equivalente a la funcin GetNearestColor.
Captulo
PaletteIndex
456
Captulo 7
Parmetros
r: Especifica la intensidad del color rojo. Tiene que ser un valor entre 0 y 255.
g: Especifica la intensidad del color verde. Tiene que ser un valor entre 0 y 255.
b: Especifica la intensidad del color azul. Tiene que ser un valor entre 0 y 255.
Vase adems
CreatePalette, PaletteIndex, RGB
Ejemplo
Listado 7-12: Hallando el color ms cercano
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
{Colorea la figura con el color especificado difuminado}
Shape1.Brush.Color := RGB(ScrollBar1.Position, ScrollBar2.Position,
ScrollBar3.Position);
{Colorea la figura con el color en la paleta actual ms cercano al solicitado}
Shape2.Brush.Color := PaletteRGB(ScrollBar1.Position, ScrollBar2.Position,
ScrollBar3.Position);
end;
Figura 7-12:
Busca un color
correspondiente
RealizePalette
Windows.Pas
Sintaxis
RealizePalette(
DC: HDC
): UINT;
457
Descripcin
Esta funcin mapea las entradas de la paleta lgica asociada con el contexto de
dispositivo especificado en la paleta del sistema del dispositivo asociado con el
contexto de dispositivo. Si el parmetro DC identifica un contexto de dispositivo en
memoria, la paleta lgica es mapeada en la paleta de colores del mapa de bits
seleccionado en el contexto de dispositivo. Si el parmetro DC identifica un contexto
de dispositivo de visualizacin, la paleta lgica es mapeada en la paleta fsica del
dispositivo. Una paleta lgica tiene que ser asociada con el contexto de dispositivo
usando la funcin SelectPalette antes de llamar a RealizePalette.
El proceso de hacer corresponder los colores que tiene lugar cuando RealizePalette es
llamada depende de si la paleta del contexto de dispositivo es una paleta de primer
plano o de fondo. El estado de la paleta es determinado cuando la funcin SelectPalette
es llamada. Si la paleta es una paleta de fondo, las entradas de la paleta lgica son
mapeadas a las entradas ms cercanas de la paleta del sistema y ninguna entrada de la
paleta del sistema es reemplazada. Este es el comportamiento por defecto para las
aplicaciones que se ejecutan en segundo plano. Si la paleta es una paleta de primer
plano, las entradas de la paleta lgica son an mapeadas a las entradas ms cercanas en
la paleta del sistema. Si una correspondencia exacta es hallada, esa entrada de la paleta
lgica es mapeada a la correspondiente entrada en la paleta del sistema. Sin embargo, si
no se encuentra una correspondencia exacta, a la primera entrada sin usar en la paleta
del sistema se le asignan los valores de los colores de la entrada en la paleta lgica.
Este comportamiento puede verse afectado por los valores del campo peFlags de la
entrada de la paleta. Consulte la funcin CreatePalette para ms detalles.
Parmetros
DC: Manejador de un contexto de dispositivo cuya paleta lgica asociada es mapeada a
la paleta del sistema del dispositivo que el contexto de dispositivo representa.
Vase adems
CreatePalette, SelectPalette
Ejemplo
Vea el Listado 7-4 bajo CreatePalette, y otros muchos ejemplos a lo largo de este
captulo.
7
Captulo
Funciones de paleta
458
Captulo 7
ResizePalette
Windows.Pas
Sintaxis
ResizePalette(
p1: HPALETTE;
p2: UINT
): BOOL;
Descripcin
Esta funcin incrementa o decrementa la cantidad de entradas de paleta en la paleta
lgica especificada. Si la paleta lgica es incrementada en tamao, las nuevas entradas
de la paleta son inicializadas a negro y a su campo peFlags se les asigna cero.
Parmetros
p1: Manejador de la paleta lgica cuya cantidad de entradas ser modificada.
p2: La nueva cantidad de entradas que la paleta lgica contendr.
Vase adems
CreatePalette, RealizePalette, SelectPalette
Ejemplo
Listado 7-13: Redimensionando una paleta
{OJO! Delphi importa incorrectamente la funcin GetSystemPaletteEntries.
Aqu est la declaracin correcta, que brinda toda la funcionalidad accesible
con esta funcin del API}
function GetSystemPaletteEntries(DC: HDC; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
var
Form1: TForm1;
FormPalette: HPALETTE;
// manejador de paleta lgica
implementation
{Enlace de la funcin GetSystemPaletteEntries}
function GetSystemPaletteEntries; external gdi32 name 'GetSystemPaletteEntries';
function TForm1.GetPalette: HPALETTE;
begin
{Cuando se pide al formulario su paleta, ste devuelve la nueva paleta lgica}
Result := FormPalette;
end;
459
7
Captulo
Funciones de paleta
460
Captulo 7
begin
Canvas.Brush.Color := $01000000 or iLoop + 10;
Canvas.FillRect(Rect(10, iLoop*10 + 16, 260, iLoop*10 + 36));
end;
{Selecciona la paleta previa en el contexto de dispositivo}
SelectPalette(Canvas.Handle, OldPalette, FALSE);
end;
Figura 7-13:
La paleta
redimensionada
procedure TForm1.Button1Click(Sender: TObject);
var
PaletteEntries: array[0..9] of TPaletteEntry; // almacena entradas de paleta
iLoop: Integer;
begin
ResizePalette(FormPalette, 42);
{Muestra un gradiente verde}
for iLoop := 0 to 9 do
begin
PaletteEntries[iLoop].peRed
PaletteEntries[iLoop].peGreen
PaletteEntries[iLoop].peBlue
PaletteEntries[iLoop].peFlags
end;
:=
:=
:=
:=
0;
255 - ((255 div 32) * iLoop);
0;
PC_NOCOLLAPSE;
Funciones de paleta
461
RGB
Windows.Pas
Sintaxis
RGB(
r: Byte;
g: Byte;
b: Byte
): COLORREF;
Descripcin
Esta funcin devuelve un especificador de color de 32 bits que contiene un $00 en el
byte ms significativo y los valores de los colores rojo, verde y azul en los 3 menos
significativos. Windows muestra este color difuminando los 20 colores del sistema para
obtener el color ms cercano al solicitado.
Parmetros
r: Especifica la intensidad del color rojo. Tiene que ser un valor entre 0 y 255.
g: Especifica la intensidad del color verde. Tiene que ser un valor entre 0 y 255.
b: Especifica la intensidad del color azul. Tiene que ser un valor entre 0 y 255.
Vase adems
CreatePalette, PaletteIndex, PaletteRGB
Ejemplo
Vea el Listado 7-8 bajo GetNearestColor y el Listado 7-12 bajo PaletteRGB.
SelectPalette
Sintaxis
SelectPalette(
Windows.Pas
Captulo
Invalidate;
end;
462
Captulo 7
DC: HDC;
{manejador del contexto de dispositivo}
Palette: HPALETTE;
{manejador de paleta lgica}
ForceBackground: Bool
{indicador del modo de paleta}
): HPALETTE;
{devuelve un manejador de la paleta seleccionada
anteriormente}
Descripcin
Esta funcin asocia una paleta lgica con el contexto de dispositivo especificado. Una
paleta lgica puede ser asociada con mltiples contextos de dispositivos, pero un
cambio en la paleta lgica afectar a los contextos de dispositivos asociados con ella.
Parmetros
DC: Manejador del contexto de dispositivo que ser asociado con la paleta lgica
especificada.
Palette: Manejador de una paleta lgica.
ForceBackground: Indica si la paleta lgica es una paleta de primer plano o de fondo.
Un valor TRUE indica que la paleta es de fondo. Cuando la funcin RealizePalette es
llamada, las entradas de la paleta lgica son mapeadas a las entradas correspondientes
ms cercanas en la paleta del sistema y ninguna entrada en la paleta del sistema es
reemplazada. Este es el comportamiento por defecto para aplicaciones que se ejecutan
en segundo plano. Un valor FALSE indica que la paleta es una paleta de primer plano.
Cuando la funcin RealizePalette es llamada, las entradas de la paleta lgica son
igualmente mapeadas a las entradas correspondientes ms cercanas en la paleta del
sistema. Si una correspondencia exacta es hallada, esa entrada de la paleta lgica es
mapeada a la correspondiente entrada en la paleta del sistema. Sin embargo, si no se
encuentra una correspondencia exacta, a la primera entrada, sin usar en la paleta del
sistema, se le asignan los valores de los colores de la entrada en la paleta lgica. Este
comportamiento puede verse afectado por los valores del campo peFlags de la entrada
de la paleta. Consulte la funcin CreatePalette para ms detalles.
Vase adems
CreatePalette, RealizePalette
Ejemplo
Vea el Listado 7-4 bajo CreatePalette, y muchos otros ejemplos a lo largo de este
captulo.
SetDIBColorTable
463
Windows.Pas
Sintaxis
SetDIBColorTable(
DC: HDC;
p2: UINT;
p3: UINT;
var RGBQuadStructs
): UINT;
Descripcin
Esta funcin reemplaza el rango especificado de entradas en la paleta de colores en
mapa de bits independiente del dispositivo actualmente seleccionado en el contexto de
dispositivo identificado por el parmetro DC, con las entradas a las que apunta el
parmetro RGBQuadStructs. Esta funcin es til slo para DIBs que tengan un formato
de color de 1, 4, u 8 bits por pxel, ya que los DIBs con formatos de color superiores a
8 bits por pxel no contienen una paleta de colores.
Parmetros
DC: Manejador de contexto de dispositivo. El DIB cuya paleta de colores va a ser
modificada tiene que estar seleccionado en este contexto de dispositivo.
p2: Especifica el ndice (con base cero) de la primera entrada en la paleta del colores
del DIB que ser modificada.
p3: Especifica la cantidad de entradas de paleta del DIB a modificar.
RGBQuadStructs: Puntero a un array de registros TRGBQuad que describen los valores
de colores que reemplazan las entradas de paleta en el DIB especificado. Este array
tiene que almacenar, al menos, la cantidad de registros TRGBQuad indicada por el
parmetro p3. El registro TRGBQuad se define como:
TRGBQuad = packed record
rgbBlue: Byte;
rgbGreen: Byte;
rgbRed: Byte;
rgbReserved: Byte;
end;
7
Captulo
Funciones de paleta
464
Captulo 7
Vase adems
CreateDIBSection, CreatePalette, GetDIBColorTable
Ejemplo
Listado 7-14: Modificando la tabla de colores de un mapa de bits independiente del
dispositivo
procedure TForm1.Button1Click(Sender: TObject);
var
Dib: TBitmap;
// mapa de bits DIB
NewColors: array[0..63] of TRGBQuad; // nueva tabla de colores del DIB
OffscreenDC: HDC;
// manejador de un DC fuera de pantalla
OldBitmap: HBITMAP;
// manejador del mapa de bits del DC
iLoop: Integer;
// un contador de bucle general
begin
{Los objetos TBitmap de Delphi encapsulan un DIB. Creamos un mapa de bits y lo
cargamos en una imagen de mapa de bits de prueba}
Dib := TBitmap.Create;
Dib.LoadFromFile('Gradient.bmp');
{Crea un gradiente verde en el array NewColors}
for iLoop := 0 to 63 do
begin
NewColors[iLoop].rgbBlue := 0;
NewColors[iLoop].rgbGreen := (256 div 64)*iLoop;
NewColors[iLoop].rgbRed := 0;
NewColors[iLoop].rgbReserved := 0;
end;
{Crea un contexto de dispositivo fuera de pantalla compatible con el dispositivo
de visualizacin}
OffscreenDC := CreateCompatibleDC(0);
{Selecciona el DIB en este contexto de dispositivo}
OldBitmap := SelectObject(OffscreenDC, Dib.Handle);
{Reemplaza su tabla de colores con los colores del nuevo gradiente verde}
SetDIBColorTable(OffscreenDC, 0, 64, NewColors);
{Selecciona el mapa de bits previo en el DC fuera de pantalla}
SelectObject(OffscreenDC, OldBitmap);
{El DC fuera de pantalla ya no es necesario y lo eliminamos}
DeleteDC(OffscreenDC);
{La tabla de colores del DIB ha sido modificada, as que lo guardamos en disco}
Dib.SaveToFile('NewGrad.bmp');
Dib.Free;
{Carga y muestra el DIB con su nueva tabla de colores}
Image1.Picture.Bitmap.LoadFromFile('NewGrad.bmp');
Label1.Caption := 'After';
Funciones de paleta
465
7
Captulo
end;
Figura 7-14:
Esta tabla de
colores del
DIB ha sido
modificada
SetPaletteEntries
Windows.Pas
Sintaxis
SetPaletteEntries(
Palette: HPALETTE;
StartIndex: UINT;
NumEntries: UINT;
var PaletteEntries
): UINT;
Descripcin
Esta funcin reemplaza un rango de entradas en la paleta de colores en la paleta lgica
especificada, con los valores en el array de registros TPaletteEntry al que apunta el
parmetro PaletteEntries. Una vez que las entradas de la paleta han sido reemplazadas,
la funcin RealizePalette tiene que ser llamada para que los cambios tengan efecto.
Parmetros
Palette: Manejador de la paleta lgica cuyas entradas de paleta van a ser reemplazadas.
StartIndex: El ndice, basado en cero, de la primera entrada a reemplazar en la paleta
lgica.
NumEntries: Especifica la cantidad de entradas a reemplazar.
PaletteEntries: Puntero a un array de registros de tipo TPaletteEntry que describen los
valores de los colores que reemplazan las entradas en la paleta lgica especificada. Este
array tiene que almacenar al menos la cantidad de registros TPaletteEntry que indica el
parmetro NumEntries. El registro TPaletteEntry se define como:
466
Captulo 7
Vase adems
CreatePalette, GetPaletteEntries, RealizePalette, SelectPalette
Ejemplo
Vea el Listado 7-4 bajo CreatePalette.
SetSysColors
Windows.Pas
Sintaxis
SetSysColors(
cElements: Integer;
const lpaElements;
const lpaRgbValues
): BOOL;
Descripcin
Esta funcin reemplaza los valores de los colores RGB de los elementos de
visualizacin del sistema especificados en el parmetro lpaElements, con los valores de
colores RGB explcitos almacenados en el array al que apunta el parmetro
lpaRgbValues. Un elemento de visualizacin identifica varias partes de una ventana y
su color se asocia con uno de los 20 colores estticos definidos por el sistema. Cuando
el color de un elemento de visualizacin es cambiado, su color de sistema asociado es
tambin cambiado. Los arrays a los que apuntan los parmetros lpaElements y
lpaRgbValues deben contener la misma cantidad de entradas. Esta funcin hace que un
mensaje WM_SYSCOLORCHANGE sea enviado a todas las ventanas informndoles del
cambio, y que Windows redibuje apropiadamente la parte afectada de esas ventanas.
Estos nuevos colores del sistema estarn activos solamente durante la sesin actual de
Windows y sern restaurados a sus valores previos cuando Windows sea reiniciado.
467
Parmetros
cElements: Especifica la cantidad de elementos de visualizacin en el array al que
apunta el parmetro lpaElements.
lpaElements: Puntero a un array de enteros. Cada elemento en el array identifica un
elemento de visualizacin cuyo color ser cambiado y contiene uno de los valores de la
Tabla 7-6.
lpaRgbValues: Puntero a un array de enteros largos. Cada elemento en este array se
corresponde con un elemento en el array lpaElements en la misma posicin y contiene
los nuevos valores de colores RGB de 32 bits explcitos para este elemento de
visualizacin.
Vase adems
GetBValue, GetGValue, GetRValue, GetSysColor, GetSystemPaletteEntries,
PaletteRGB, RGB
Ejemplo
Vea el Listado 7-10 bajo GetSysColor.
Tabla 7-6: Valores de los elementos del parmetro lpaElements de SetSysColors
Valor
COLOR_3DDKSHADOW
COLOR_3DLIGHT
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNHIGHLIGHT
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
Descripcin
El color de la sombra oscura para elementos de
visualizacin tridimensionales.
El borde iluminado para elementos de visualizacin
tridimensionales.
El color del borde de la ventana activa.
El color de la barra de ttulo de la ventana activa.
El color de fondo usado en las aplicaciones de
interfaz multidocumento (MDI).
El color del escritorio.
El color de la superficie de los botones.
El color de los botones resaltados.
El color del borde sombreado de los botones.
El color del texto de los botones.
El color del texto usado en barras de ttulo, caja de
redimensionamiento y caja de la flecha de las
barras de desplazamiento.
7
Captulo
Funciones de paleta
468
Captulo 7
Valor
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_INACTIVECAPTIONTEXT
COLOR_INFOBK
COLOR_INFOTEXT
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT
SetSystemPaletteUse
Descripcin
El color del texto deshabilitado. Este ser puesto a
cero si el controlador de vdeo no puede soportar
gris slido.
El color usado para los elementos seleccionados
en un control.
El color usado para el texto de los elementos
seleccionados en un control.
El color del borde de una ventana inactiva.
El color de la barra de ttulo de una ventana
inactiva.
El color del texto de una barra de ttulo inactiva.
El color de fondo de los controles de indicaciones.
El color del texto de los controles de indicaciones.
El color del fondo de los mens.
El color del texto usado en los mens.
El color del rea gris de las barras de
desplazamiento.
El color del fondo de las ventanas.
El color del marco de las ventanas.
El color del texto usado en las ventanas.
Windows.Pas
Sintaxis
SetSystemPaletteUse(
DC: HDC
p2: UINT
): UINT;
Descripcin
Esta funcin establece el estado de los colores estticos de la paleta de sistema
asociada con el contexto de dispositivo asociado. Por defecto, el sistema contiene 20
colores estticos que no sern cambiados cuando cualquier paleta lgica sea realizada.
Parmetros
DC: Manejador del contexto de dispositivo para el cual el estado de la paleta del
sistema asociada ser modificado. Debe ser obligatoriamente un contexto de
dispositivo que soporte paletas de colores.
p2: Valor que especifica el nuevo estado de los colores estticos de la paleta del
sistema. Puede ser un valor de la Tabla 7-7.
469
Vase adems
GetSysColor, GetSystemPaletteUse, RealizePalette, SelectPalette, SetPaletteEntries,
SetSysColors
Ejemplo
Listado 7-15: Usando 254 colores en la paleta del sistema
{OJO! Delphi importa incorrectamente la funcin GetSystemPaletteEntries.
Aqu est la declaracin correcta, que brinda toda la funcionalidad accesible
con esta funcin del API}
function GetSystemPaletteEntries(DC: HDC; StartIndex, NumEntries: UINT;
PaletteEntries: Pointer): UINT; stdcall;
var
Form1: TForm1;
SysPalette: array[0..255] of TPaletteEntry;
FormPalette: HPALETTE;
implementation
{Enlace de la funcin GetSystemPaletteEntries}
function GetSystemPaletteEntries; external gdi32 name 'GetSystemPaletteEntries';
procedure TForm1.SetThePalette;
var
ThePalette: PLogPalette; // puntero a la descripcin de la paleta lgica
iLoop: Integer;
// contador de bucle
TheDC: HDC;
// manejador de contexto de dispositivo
begin
{Reserva suficiente memoria para una paleta lgica de 256 colores}
GetMem(ThePalette, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry));
{Recupera un manejador del contexto de dispositivo del formulario}
TheDC := GetDC(Form1.Handle);
{Recupera las entradas actuales de la paleta del sistema}
GetSystemPaletteEntries(TheDC, 0, 256, @(ThePalette^.palPalEntry));
{Establece que la paleta del sistema slo use 2 colores estticos}
SetSystemPaletteUse(TheDC, SYSPAL_NOSTATIC);
{Inicializa la informacin de la paleta lgica apropiada}
ThePalette^.palVersion := $300;
ThePalette^.palNumEntries := 256;
7
Captulo
Funciones de paleta
470
Captulo 7
' + IntToStr(iLoop));
IntToStr(SysPalette[iLoop].peRed));
IntToStr(SysPalette[iLoop].peGreen));
IntToStr(SysPalette[iLoop].peBlue));
case SysPalette[iLoop].peFlags of
PC_EXPLICIT:
ListBox1.Items.Add('
Flags: PC_EXPLICIT');
PC_NOCOLLAPSE: ListBox1.Items.Add('
Flags: PC_NOCOLLAPSE');
PC_RESERVED:
ListBox1.Items.Add('
Flags: PC_RESERVED');
else ListBox1.Items.Add('
Flags: NULL');
end;
end;
{Borra el manejador del contexto de dispositivo}
ReleaseDC(Form1.Handle, TheDC);
end;
procedure TForm1.FormPaint(Sender: TObject);
var
iOutLoop, iInLoop: Integer;
// contadores de bucles
TheDC: HDC;
// manejador de contexto de dispositivo
OldBrush, NewBrush: HBRUSH;
// manejadores de brochas
begin
{Obtiene un manejador del contexto de dispositivo del formulario}
TheDC := GetDC(Form1.Handle);
{Selecciona y activa la nueva paleta lgica}
SelectPalette(TheDC, FormPalette, FALSE);
RealizePalette(TheDC);
{Dibuja una rejilla de rectngulos que muestra la paleta lgica actual,
la cual es un duplicado exacto de la paleta del sistema}
for iOutLoop := 0 to 15 do
for iInLoop := 0 to 15 do
begin
{Usa ndices de paleta explcitos}
NewBrush := CreateSolidBrush($01000000 or (iOutLoop*16) + iInLoop);
OldBrush := SelectObject(TheDC, NewBrush);
Rectangle(TheDC, (iInLoop*20) + 15, (iOutLoop*20) + 32,
(iInLoop*20) + 35, (iOutLoop*20) + 52);
SelectObject(TheDC, OldBrush);
DeleteObject(NewBrush);
end;
{Elimina el manejador del contexto de dispositivo}
ReleaseDC(Form1.Handle, TheDC);
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
TheDC: HDC;
// manejador de contexto de dispositivo
begin
{Reinicia los colores estticos a los 20 colores estticos por defecto}
TheDC := GetDC(Form1.Handle);
SetSystemPaletteUse(TheDC, SYSPAL_STATIC);
ReleaseDC(Form1.Handle, TheDC);
{Elimina la paleta lgica}
DeleteObject(FormPalette);
471
7
Captulo
Funciones de paleta
472
Captulo 7
end;
Figura 7-15:
Una paleta
roja
Descripcin
La paleta del sistema contiene slo dos colores estticos:
negro y blanco.
La paleta del sistema contiene los colores estticos por
defecto. Estos colores no cambiarn cuando una paleta
sea realizada. Este es el estado por defecto de la paleta
del sistema.
473
Captulo 8
Dibujar texto en pantalla es la funcin ms comn realizada por Windows en casi todas
las aplicaciones. Por eso las funciones del API para manipular y mostrar texto son
numerosas y robustas. Si bien Delphi encapsula algunas de las funciones de salida de
texto del API, los desarrolladores de Delphi pueden extender ampliamente las
capacidades de dibujar texto de una aplicacin utilizando las funciones descritas en este
captulo.
Fuentes
Actualmente Windows soporta tres tipos de fuentes: de barrido (raster), vectoriales y
True Type. Las diferencias entre los tipos de fuentes radica en el mtodo mediante el
cual el patrn de la fuente define la forma de un carcter. Un patrn para una fuente de
barrido es un mapa de bits de un tamao especfico que contiene una imagen para cada
carcter individual. Las fuentes vectoriales almacenan sus patrones como una serie de
puntos de terminacin usados para crear segmentos de lneas que definen el contorno
de un carcter. Los patrones de las fuentes True Type son almacenados como una serie
de lneas, curvas e indicaciones que son usados para dibujar el contorno del carcter.
Debido al hecho de que las fuentes de barrido almacenan sus patrones como mapas de
bits, estas fuentes pierden mucha resolucin cuando son escaladas. Las fuentes
vectoriales pueden generalmente ser escaladas hacia arriba o hacia abajo, pero
comenzarn a perder su resolucin cuando sean escaladas por debajo de su tamao
original y adems sern dibujadas ms lentamente. Sin embargo, las fuentes True Type
pueden ser dibujadas relativamente rpido porque el subsistema GDI est optimizado
para ello. Adicionalmente, las indicaciones almacenadas en las definiciones del patrn
de las fuentes True Type ofrecen correcciones de escalamiento para las curvas y lneas
del trazado del carcter, permitiendo a las fuentes True Type ser escaladas a cualquier
tamao sin perdida de resolucin.
Familias de fuentes
Windows categoriza todas las fuentes en cinco familias. Una familia de fuentes es una
coleccin de fuentes que comparten atributos similares de ancho de trazos y serif.
8
Captulo
474
Captulo 8
Cuando se est considerando elegir una fuente, las familias de fuentes permiten al
desarrollador indicar el estilo general deseado, dejando a Windows la seleccin de la
fuente. Por ejemplo, usando la funcin apropiada y especificando slo una familia de
fuentes, el desarrollador puede enumerar todas las fuentes de smbolos instaladas en el
sistema. Las familias de fuentes tambin permiten al desarrollador crear una fuente
lgica basada nicamente en caractersticas especficas, permitiendo as a Windows
seleccionar la fuente ms apropiada de la familia de fuentes indicada, basndose en las
caractersticas sealadas.
Las cinco categoras de familias de fuentes definidas por Windows son:
Tabla 8-1: Familias de fuentes
Nombre Familia
Decorative
Constante
FF_DECORATIVE
Modern
FF_MODERN
Roman
FF_ROMAN
Script
FF_SCRIPT
Swiss
FF_SWISS
Descripcin
Indica una fuente decorativa, como la Old
English.
Indica una fuente monoespaciada con ancho
constante de trazos, con o sin serifs, como la
Courier New.
Indica una fuente proporcional con ancho
variable de trazos, que contiene serifs, como
la Times New Roman.
Indica una fuente que simula la manuscrita,
como la Brush Script.
Indica una fuente proporcional con ancho
variable de trazos, sin serifs, como la Arial.
Conjuntos de caracteres
Por definicin, una fuente define la imagen de cada carcter individual dentro de una
coleccin de caracteres. Esta coleccin de caracteres es llamada un conjunto de
caracteres. Cada conjunto de caracteres contiene smbolos, nmeros, signos de
puntuacin, letras y otras imgenes imprimibles o visualizables de un lenguaje escrito,
con cada carcter identificado por un nmero.
Hay cinco conjuntos de caracteres principales: Windows, Unicode, OEM, Symbol y
especfico del fabricante. El conjunto de caracteres de Windows es equivalente al
conjunto de caracteres ANSI. El conjunto de caracteres Unicode es usado para
lenguajes orientales que contienen cientos de smbolos en sus alfabetos y en la
actualidad es el nico conjunto de caracteres que usa dos bytes para identificar un
carcter simple. El conjunto de caracteres OEM es generalmente equivalente al
conjunto de caracteres de Windows, exceptuando que usualmente contiene caracteres
en los rangos superiores e inferiores del espacio de caracteres imprimibles, que slo
pueden ser mostrados en una sesin de DOS a pantalla completa. El conjunto de
caracteres Symbol contiene caracteres tiles para la representacin de ecuaciones
475
En muchos casos, una fuente definir un carcter por defecto. Cuando una cadena
contiene un carcter que no est definido en el conjunto de caracteres de la fuente
seleccionada en un contexto de dispositivo, el carcter por defecto sustituir al carcter
no definido cuando el texto sea mostrado. La mayora de las fuentes True Type definen
el carcter por defecto como un rectngulo no rellenado ().
Captulo
Gua externa
Gua interna
Alto
Figura 8-1:
Las
dimensiones
de un patrn
Ascenso
Lnea base
Descenso
476
Captulo 8
datos de la imagen del patrn. Estas dimensiones de los caracteres pueden ser
recuperadas llamando las funciones GetOutlineTextMetrics o GetTextMetrics. Las
medidas recuperadas por estas funciones estarn en unidades lgicas, de modo que sus
valores actuales dependern del modo de mapeado del contexto de dispositivo
especificado en la funcin llamada.
477
Incrustacin de fuentes
El desarrollador de la fuente puede no permitir que la fuente sea incrustada. Una fuente
puede permitir ser incrustada nicamente en un contexto de-slo-lectura. Si un
documento contiene una fuente incrustada de-slo-lectura, el documento puede ser
visualizado o impreso, pero no puede ser modificado ni la fuente ser desincrustada para
instalarla permanentemente en el sistema. Algunas fuentes pueden tener licencia de
lectura-escritura, lo que indica que la fuente puede ser incrustada en un documento e
instalada permanentemente en el sistema de destino. Una aplicacin puede determinar
el estado de incrustacin de una fuente usando la funcin GetOutlineTextMetrics. En
cualquier caso, a menos de que se disponga de un permiso especfico del creador de las
fuentes, stas pueden ser incrustadas solamente en un documento y no pueden ser
incrustadas en una aplicacin, ni una aplicacin puede ser distribuida con documentos
que contengan fuentes incrustadas.
Para incrustar una fuente en un documento, la aplicacin tiene que recuperar los datos
del fichero de fuente completo, llamando a la funcin GetFontData con el valor cero
(0) en los parmetros p2 y p3. Los datos de la fuente deben ser grabados entonces en el
fichero de salida junto con el texto del documento, en el formato de fichero
determinado por la aplicacin. Tradicionalmente, las aplicaciones utilizan un formato
de fichero que contiene el nombre de cada fuente incrustada en el documento y una
indicacin de la licencia de-slo-lectura o de lectura-escritura. Observe que si una
fuente de-slo-lectura es incrustada en un documento, deber ser encriptada, aunque el
algoritmo de encriptacin no tiene que ser demasiado complejo.
Cuando la aplicacin abre un documento que contiene una fuente incrustada, debe
primero determinar si la fuente permite una incrustacin de-slo-lectura o de
lectura-escritura. Los datos de la fuente son entonces extrados del fichero del
documento y guardados en el disco mediante funciones de manipulacin de ficheros,
tales como CreateFile y WriteFile. Si la fuente es de lectura-escritura, puede ser
escrita directamente a un fichero con extensin .TTF en el subdirectorio Fonts bajo el
directorio Windows, para instalar la fuente permanentemente en el sistema. Si la fuente
es de-slo-lectura, tiene que ser encriptada y grabada en un fichero oculto. Este fichero
oculto no debe tener extensin .TTF. Una vez que la fuente de-slo-lectura es extrada
y escrita en el disco, puede ser instalada en la tabla de fuentes interna de Windows
mediante las funciones CreateScalableFontResource y AddFontResource,
especificando un valor 1 para el parmetro p1 de la funcin
CreateScalableFontResource, para indicar una fuente de-slo-lectura. Observe que las
fuentes de-slo-lectura no sern identificadas por las funciones EnumFontFamilies o
8
Captulo
478
Captulo 8
479
fichero contienen el nmero de bytes que tiene el texto del documento. Despus
de estos bytes, los prximos 4 bytes indican cuntos bytes ocupa la informacin
de la fuente True Type embebida. Por eso, escribiremos los primeros cuatro
bytes del documento como un entero que contiene el tamao del texto y luego los
bytes que contiene el texto del documento}
WriteFile(SavedFile, TextSize, SizeOf(TextSize), BytesWritten, nil);
WriteFile(SavedFile, TheText^, TextSize, BytesWritten, nil);
{En este punto, la fuente seleccionada debe ser chequeada para ver si permite
ser incrustada. Si la fuente no permite ser incrustada, el documento debe ser
simplemente guardado y se debe omitir el siguiente cdigo. Si la fuente permite
ser incrustada en un formato de-slo-lectura, una vez que los datos son
recuperados debern ser encriptados antes de ser guardados en el fichero del
documento}
{Recupera el tamao del buffer necesario para almacenar los datos de la fuente}
FontDataSize := GetFontData(MemoDC, 0, 0, nil, 0);
{Reserva la memoria necesaria}
GetMem(FontData, FontDataSize);
{Recupera el fichero de datos de la fuente completo}
GetFontData(MemoDC, 0, 0, FontData, FontDataSize);
{Ahora, escribe un entero que indica cuntos bytes contienen los datos de la
fuente y luego escribe esos bytes que conforman los datos de la fuente}
WriteFile(SavedFile, FontDataSize, SizeOf(FontDataSize), BytesWritten, nil);
WriteFile(SavedFile, FontData^, FontDataSize, BytesWritten, nil);
{Selecciona la fuente original en el contexto de dispositivo y borra el DC}
SelectObject(MemoDC, OldFont);
ReleaseDC(Memo1.Handle, MemoDC);
{Descarga los buffers para forzar que el fichero sea escrito en el disco}
FlushFileBuffers(SavedFile);
{Cierra el manejador del fichero}
CloseHandle(SavedFile);
{El fichero ha sido guardado, se libera la memoria que ya no es necesaria}
FreeMem(TheText, TextSize);
FreeMem(FontData, FontDataSize);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
SavedFile: THandle;
// manejador del fichero abierto
8
Captulo
{Para obtener los datos del fichero de fuente para su incrustacin, la fuente
debe ser seleccionada en un contexto de dispositivo. Recuperamos el contexto
de dispositivo del memo, pero debido a que esto devuelve un DC comn con
atributos por defecto, tenemos que seleccionar la fuente del memo en el
contexto de dispositivo recuperado.}
MemoDC := GetDC(Memo1.Handle);
OldFont := SelectObject(MemoDC, Memo1.Font.Handle);
480
Captulo 8
TextSize: LongInt;
// el tamao del texto en el memo
TheText: PChar;
// almacena el texto en el memo
BytesRead: DWORD;
// el nmero de bytes ledos del fichero
BytesWritten: DWORD;
// el nmero de bytes escritos en el fichero
FontData: Pointer;
// apunta a los datos de la fuente
FontDataSize: Integer;
// tamao de los datos de la fuente
NewFontFile: THandle;
// manejador del fichero de la fuente
CurDir: array[0..MAX_PATH] of Char; // almacena la ruta del directorio actual
begin
{Abre el documento que contiene la fuente incrustada}
SavedFile := CreateFile('ProprietaryFileFormat.PFF', GENERIC_READ, 0, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or
FILE_FLAG_SEQUENTIAL_SCAN, 0);
{Lee el nmero de bytes que ocupa el texto del documento}
ReadFile(SavedFile, TextSize, SizeOf(TextSize), BytesRead, nil);
{Reserva el tamao de buffer necesario para almacenar el texto del documento}
GetMem(TheText, TextSize);
{Inicializa el buffer con caracteres nulos}
FillMemory(TheText, TextSize, 0);
{Asigna explcitamente al puntero del fichero la direccin siguiente a los
cuatro primeros bytes, as la lectura comienza al principio del texto del
documento}
SetFilePointer(SavedFile, SizeOf(TextSize), nil, FILE_BEGIN);
{Lee desde el fichero la cantidad indicada de bytes del texto}
ReadFile(SavedFile, TheText^, TextSize, BytesRead, nil);
{Asigna explcitamente al puntero del fichero la direccin siguiente al texto
del documento. Este debe ahora estar apuntando al entero que indica el tamao
de los datos de la fuente incrustada}
SetFilePointer(SavedFile, SizeOf(TextSize) + TextSize, nil, FILE_BEGIN);
{Lee el tamao de los datos de la fuente incrustada}
ReadFile(SavedFile, FontDataSize, SizeOf(FontData), BytesRead, nil);
{Recupera suficiente memoria para almacenar los datos de la fuente}
GetMem(FontData, FontDataSize);
{Asigna explcitamente al puntero del fichero la direccin siguiente a los
cuatro bytes que contienen el tamao de los datos de la fuente. Este debe
estar ahora apuntando al principio de los datos de la fuente}
SetFilePointer(SavedFile, SizeOf(TextSize) + TextSize + SizeOf(FontData),
nil, FILE_BEGIN);
{Lee los datos de la fuente en el buffer de los datos fuente}
ReadFile(SavedFile, FontData^, FontDataSize, BytesRead, nil);
{Cierra el fichero del documento}
CloseHandle(SavedFile);
481
8
Captulo
482
Captulo 8
Figura 8-2:
Este
documento
usa una fuente
incrustada
True Type
Descripcin
Aade el recurso de fuente contenido en el fichero
especificado a la tabla de fuentes interna de Windows.
Crea una fuente lgica.
Crea un fuente lgica basada en la informacin
especificada en un registro de datos.
Crea un fichero de recursos de fuentes desde un
fichero de fuentes True Type.
Dibuja texto formateado sobre el contexto de
dispositivo dentro del rectngulo especificado.
Funcin
DrawTextEx
EnumFontFamilies
EnumFontFamiliesEx
GetCharABCWidths
GetCharWidth
GetFontData
GetGlyphOutline
GetKerningPairs
GetOutlineTextMetrics
GetRasterizerCaps
GetTabbedTextExtent
GetTextAlign
GetTextCharacterExtra
GetTextColor
GetTextExtentExPoint
GetTextExtentPoint32
GetTextFace
GetTextMetrics
RemoveFontResource
SetTextAlign
SetTextCharacterExtra
SetTextColor
SetTextJustification
TabbedTextOut
TextOut
483
Descripcin
Dibuja texto formateado sobre el contexto de
dispositivo dentro del rectngulo especificado, de
acuerdo con el ancho de margen indicado.
Enumera las fuentes instaladas.
Enumera las fuentes instaladas que se corresponden
con las caractersticas de fuentes especificadas.
Recupera el ancho y espaciado de caracteres para
fuentes True Type.
Recupera el ancho de caracteres.
Recupera la informacin del fichero de fuentes True
Type.
Recupera un mapa de bits o delinea un carcter True
Type.
Recupera pares de kerning de caracteres.
Recupera medidas de texto para fuentes True Type.
Recupera informacin concerniente a la accesibilidad de
fuentes True Type.
Recupera el ancho y alto de una cadena de caracteres
que contiene tabulaciones.
Recupera la alineacin del texto.
Recupera el espaciado entre caracteres.
Recupera el color usado para dibujar texto.
Recupera la cantidad de caracteres en una cadena que
se adecuar a un espacio especificado.
Recupera el ancho y altura de una cadena especificada.
Recupera el nombre de una fuente seleccionada en un
contexto de dispositivo.
Recupera las medidas del texto para una fuente.
Elimina un recurso de fuente de la tabla interna de
fuentes de Windows.
Asigna el modo de alineacin de texto.
Asigna el espaciado entre caracteres.
Asigna el color usado para dibujar texto.
Asigna el modo de justificacin de texto.
Dibuja una cadena sobre un contexto de dispositivo,
expandiendo las tabulaciones.
Dibuja texto sobre un contexto de dispositivo.
8
Captulo
484
Captulo 8
AddFontResource
Windows.Pas
Sintaxis
AddFontResource(
p1: PChar
): Integer;
Descripcin
Esta funcin aade el recurso de fuentes contenido en el fichero de recursos de fuente
especificado, a la tabla interna de fuentes del sistema, haciendo la fuente accesible a
todas las aplicaciones. Si la fuente es aadida exitosamente a la tabla interna, la
aplicacin que aade la fuente debe informar a las dems aplicaciones del cambio. Esto
es llevado a cabo enviando el mensaje WM_FONTCHANGE mediante la funcin
SendMessage, especificando HWND_BROADCAST como valor para el parmetro
hWnd. Cuando la fuente deje de ser necesaria, deber ser borrada de la tabla interna de
fuentes del sistema llamando a la funcin RemoveFontResource.
Parmetros
p1: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del
recurso de fuentes a aadir. El fichero especificado puede contener recursos de fuentes
(*.FON), una fuente en bruto en mapa de bits (*.FNT), informacin en bruto de fuente
True Type (*.TTF) o un recurso de fuentes True Type (*.FOT).
Vase adems
CreateScalableFontResource, GetFontData, RemoveFontResource
Ejemplo
Vea el Listado 8-4 bajo CreateScalableFontResource.
CreateFont
Windows.Pas
Sintaxis
CreateFont(
nHeight: Integer;
nWidth: Integer;
nEscapement: Integer;
nOrientation: Integer;
fnWeight: Integer;
fdwItalic: DWORD;
fdwUnderline: DWORD;
fdwStrikeOut: DWORD;
fdwCharSet: DWORD;
fdwOutputPrecision: DWORD;
fdwClipPrecision: DWORD;
fdwQuality: DWORD;
fdwPitchAndFamily: DWORD;
lpszFace: PChar
): HFONT;
485
{grosor de la negrita}
{indicador de itlica}
{indicador del subrayado}
{indicador de tachado}
{conjunto de caracteres}
{indicador de precisin de salida}
{opciones de precisin de recorte}
{indicador de calidad de salida}
{opciones de pitch y familia de fuente}
{nombre del tipo de letra}
{devuelve un manejador de la nueva fuente}
Descripcin
Esta funcin crea una fuente lgica que se corresponde con los atributos de fuente
especificados. Esta fuente puede ser seleccionada en un contexto de dispositivo que
soporte funciones de salida de texto. Cuando la fuente deje de ser necesaria, deber ser
eliminada llamando a la funcin DeleteObject.
Parmetros
nHeight: Especifica la altura del carcter o de las celdas de caracteres de la fuente. La
altura del carcter es la medida del valor de la altura de la celda del carcter, menos el
valor de la gua interna. Este valor se expresa en unidades lgicas y depender del
modo de mapeado actual. El mapeador de fuentes de Windows interpreta el valor del
parmetro nHeight segn se describe en la Tabla 8-3 y recuperar la fuente ms grande
disponible, hasta el tamao especificado. Para el modo de mapeado MM_TEXT, utilice
la siguiente frmula para expresar la altura de una fuente para un tamao de punto
especfico:
nHeight := -MulDiv(PointSize, GetDeviceCaps(hDeviceContext, LOGPIXELSY), 72);
nWidth: Especifica el ancho promedio de los caracteres dentro de la fuente. Este valor
se expresa en unidades lgicas y depender del modo de mapeado actual. Si a este
parmetro se le asigna cero, el mapeador de fuentes de Windows elegir una fuente
apropiada, basndose en el valor absoluto de la diferencia entre la relacin de aspecto
del dispositivo actual y la relacin de aspecto digitalizada de todas las fuentes
apropiadas.
nEscapement: Especifica el ngulo entre la lnea base de una lnea de texto y el eje X,
en dcimas de grado. Bajo Windows NT, si al modo grfico se le asigna
GM_ADVANCED, el ngulo de una lnea de texto y el ngulo de cada carcter dentro
de esa lnea de texto pueden ser asignados independientemente. Si al modo grfico se
le asigna GM_COMPATIBLE, el parmetro nEscapement especifica el ngulo para
ambos, la lnea de texto y los caracteres dentro de ella, y a los parmetros nEscapement
y nOrientation se les debe asignar el mismo valor. Bajo Windows 95/98, el parmetro
nEscapement siempre especifica el ngulo para ambos, la lnea de texto y los caracteres
8
Captulo
486
Captulo 8
487
valor de la tabla de opciones de familia de fuentes (Tabla 8-10). Los valores de estas
tablas son combinados mediante el operador booleano or. El pitch describe cmo vara
el ancho de los patrones de caracteres individuales, y la familia describe la apariencia
general de la fuente. Si el nombre del tipo de letra especificado es inaccesible, la
funcin devuelve la fuente ms cercana que pertenezca a la familia especificada.
Vase adems
CreateFontIndirect, DeleteObject, SelectObject, EnumFontFamilies,
EnumFontFamiliesEx
Ejemplo
Listado 8-2: Creando varias fuentes
procedure TForm1.FormPaint(Sender: TObject);
var
NewFont, OldFont: HFont;
// almacena las fuentes antigua y nueva
begin
{Pone el modo de fondo en transparente}
SetBkMode(Form1.Canvas.Handle, TRANSPARENT);
{Crea una fuente en negrita}
NewFont := CreateFont(-MulDiv(16, GetDeviceCaps(Form1.Canvas.Handle,
LOGPIXELSY), 72), 0, 0, 0, FW_BOLD, 0, 0, 0,
DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or
FF_DONTCARE, 'Arial');
{Selecciona la fuente en el contexto de dispositivo del formulario}
OldFont := SelectObject(Form1.Canvas.Handle, NewFont);
{Muestra una lnea de texto}
TextOut(Form1.Canvas.Handle, 8, Label1.Top + Label1.Height, 'Delphi Rocks!',
Length('Delphi Rocks!'));
{Selecciona la antigua fuente en el contexto de dispositivo y elimina la nueva}
SelectObject(Form1.Canvas.Handle, OldFont);
8
Captulo
lpszFace: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre
del tipo de letra de la fuente. El nombre del tipo de letra no puede exceder los 32
caracteres de largo, incluyendo el terminador nulo. Utilice la funcin
EnumFontFamilies para recuperar una lista de todos los nombres de tipos de letra de
fuentes instaladas. Si a este parmetro se le asigna nil, el mapeador de fuentes de Windows elegir la primera fuente de la familia de fuentes especificada que se corresponda
con los atributos especificados.
488
Captulo 8
DeleteObject(NewFont);
{Crea una fuente tachada}
NewFont := CreateFont(-MulDiv(16, GetDeviceCaps(Form1.Canvas.Handle,
LOGPIXELSY), 72), 0, 0, 0, FW_DONTCARE, 0, 0, 1,
DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or
FF_ROMAN, '');
{Selecciona la fuente en el contexto de dispositivo del formulario}
OldFont := SelectObject(Form1.Canvas.Handle, NewFont);
{Muestra una lnea de texto}
TextOut(Form1.Canvas.Handle, 8, Label2.Top + Label2.Height, 'Delphi Rocks!',
Length('Delphi Rocks!'));
{Selecciona la antigua fuente en el contexto de dispositivo y elimina la nueva}
SelectObject(Form1.Canvas.Handle, OldFont);
DeleteObject(NewFont);
{Crea una fuente subrayada}
NewFont := CreateFont(-MulDiv(16, GetDeviceCaps(Form1.Canvas.Handle,
LOGPIXELSY), 72), 0, 0, 0, FW_DONTCARE, 0, 1, 0,
DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or
FF_DECORATIVE, '');
{Selecciona la fuente en el contexto de dispositivo del formulario}
OldFont := SelectObject(Form1.Canvas.Handle, NewFont);
{Muestra una lnea}
TextOut(Form1.Canvas.Handle, 8, Label3.Top + Label3.Height, 'Delphi Rocks!',
Length('Delphi Rocks!'));
{Selecciona la antigua fuente en el contexto de dispositivo y elimina la nueva}
SelectObject(Form1.Canvas.Handle, OldFont);
DeleteObject(NewFont);
{Crea una fuente itlica}
NewFont := CreateFont(-MulDiv(16, GetDeviceCaps(Form1.Canvas.Handle,
LOGPIXELSY), 72), 0, 0, 0, FW_DONTCARE, 1, 0, 0,
DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or
FF_SCRIPT, '');
{Selecciona la fuente en el contexto de dispositivo del formulario}
OldFont := SelectObject(Form1.Canvas.Handle, NewFont);
{Muestra una lnea de texto}
TextOut(Form1.Canvas.Handle, 8, Label4.Top + Label4.Height, 'Delphi Rocks!',
Length('Delphi Rocks!'));
{Selecciona la vieja fuente en el contexto de dispositivo y borra la nueva}
489
SelectObject(Form1.Canvas.Handle, OldFont);
DeleteObject(NewFont);
end;
8
Captulo
Figura 8-3:
Varias fuentes
creadas con la
funcin
CreateFont
nHeight=0
nHeight<0
Descripcin
El mapeador de fuentes convierte el valor de nHeight a
unidades del dispositivo, haciendo corresponder el resultado
con la altura de celda de las fuentes accesibles.
El mapeador de fuentes usa una altura de fuente por defecto
para buscar una fuente adecuada.
El mapeador de fuentes convierte el valor de nHeight a
unidades del dispositivo, haciendo corresponder el valor
absoluto del resultado con la altura de los caracteres de las
fuentes accesibles.
Descripcin
Utiliza el grosor por defecto de la negrita (0).
Trazo de fuente extrafino (100).
Trazo de fuente fino (200).
Negrita con grosor ligeramente inferior a lo normal (300).
Negrita normal (400).
Negrita con grosor ligeramente superior a lo normal (500).
Negrita ligera (600).
Negrita (700).
Negrita extra (800).
Negrita extragruesa (900).
490
Captulo 8
Descripcin
El conjunto de caracteres ANSI.
El conjunto de caracteres por defecto.
El conjunto de caracteres Symbol.
El conjunto de caracteres Shift-JIS.
El conjunto de caracteres GB2312.
El conjunto de caracteres coreano.
El conjunto de caracteres chino.
El conjunto de caracteres original del fabricante del
equipo.
Slo Windows 95/98: El conjunto de caracteres Johab.
Slo Windows 95/98: El conjunto de caracteres hebreo.
Slo Windows 95/98: El conjunto de caracteres arbigo.
Slo Windows 95/98: El conjunto de caracteres griego.
Slo Windows 95/98: El conjunto de caracteres turco.
Slo Windows 95/98: El conjunto de caracteres
vietnamita.
Slo Windows 95/98: El conjunto de caracteres Thai.
Slo Windows 95/98: El conjunto de caracteres de
Europa del Este.
Slo Windows 95/98: El conjunto de caracteres cirlico.
Slo Windows 95/98: El conjunto de caracteres
Macintosh.
Slo Windows 95/98: El conjunto de caracteres bltico.
Descripcin
El comportamiento por defecto del mapeador de
fuentes.
Elige una fuente de dispositivo cuando existe ms de
una fuente con el nombre especificado.
Slo Windows NT: Elige una fuente True Type o de
otros tipos basados en vectores.
Elige una fuente de barrido cuando existe ms de una
fuente con el nombre especificado.
Slo Windows NT: No usado por el mapeador de
fuentes. Sin embargo, este indicador es devuelto cuando
son enumeradas fuentes True Type u otras fuentes
vectoriales.
Slo Windows 95/98: Elige una fuente de las fuentes
basadas en vectores.
OUT_TT_PRECIS
491
Descripcin
Elige una fuente slo de las fuentes True Type. Si no
existen ninguna fuente True Type, el mapeador de
fuentes retorna al comportamiento por defecto.
Elige una fuente True Type cuando existe ms de una
fuente con el nombre especificado.
Descripcin
El comportamiento predeterminado del recorte.
Este indicador es usado slo durante la enumeracin de
fuentes.
Este indicador tiene que ser incluido cuando se usa una
fuente incrustada de-slo-lectura.
Especifica que la rotacin de la fuente es dependiente
del sistema de coordenadas. Si este indicador no es
especificado, las fuentes de dispositivo siempre rotarn
en sentido contrario a las manecillas del reloj.
PROOF_QUALITY
Descripcin
Utiliza la calidad predeterminada de la fuente.
El escalamiento de las fuentes de barrido est habilitado
y las fuentes negritas, itlicas, subrayadas y tachadas
sern construidas cuando se necesiten. La
correspondencia exacta de los atributos es ms
importante que la calidad de la fuente.
El escalamiento de las fuentes de barrido est
deshabilitado y se elige la fuente con un tamao fsico
ms cercano al especificado. Las fuentes negritas,
itlicas, subrayadas y tachadas sern construidas cuando
se necesiten. La calidad de la fuente es ms importante
que la correspondencia exacta de los atributos.
Descripcin
Utiliza el pitch predeterminado de la fuente.
El ancho de todos los patrones de caracteres es el
mismo.
El ancho de los patrones de los caracteres vara en
dependencia de la imagen individual del patrn.
8
Captulo
Valor
OUT_TT_ONLY_PRECIS
492
Captulo 8
CreateFontIndirect
Descripcin
Indica una fuente decorativa, como Old English.
El estilo general de la fuente es desconocido o no es
importante.
Indica una fuente monoespaciada con trazos de ancho
consistentes, con o sin serifs, como Courier New.
Indica una fuente proporcional con trazos de ancho variable
y con serifs, como Times New Roman.
Indica una fuente que imita el manuscrito, como Brush
Script.
Indica una fuente proporcional con trazos de ancho variable
y sin serifs, como Arial.
Windows.Pas
Sintaxis
CreateFontIndirect(
const p1: TLogFont
): HFONT;
Descripcin
Esta funcin crea una fuente lgica, hacindole corresponder los atributos de fuente
especificados en el registro TLogFont al que apunta el parmetro p1. Esta fuente puede
ser seleccionada en cualquier contexto de dispositivo que soporte funciones de salida
de texto. Cuando la fuente deje de ser necesaria, deber ser eliminada usando la
funcin DeleteObject.
Parmetros
p1: Puntero a un registro TLogFont que describe los atributos de la fuente deseada. El
registro TLogFont se define como:
TLogFont = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
493
lfOutPrecision: Byte;
{indicador de precisin de salida}
lfClipPrecision: Byte;
{indicador de precisin de recorte}
lfQuality: Byte;
{indicador de calidad de salida}
lfPitchAndFamily: Byte;
{indicador de pitch y familia}
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
{nombre del tipo de letra}
end;
8
Captulo
494
Captulo 8
495
Vase adems
CreateFont, DeleteObject, EnumFontFamilies, EnumFontFamiliesEx, SelectObject
8
Captulo
Ejemplo
496
Captulo 8
Figura 8-4:
Una fuente
rotada
nHeight=0
nHeight<0
Descripcin
El mapeador de fuentes convierte el valor de nHeight a
unidades del dispositivo, haciendo corresponder el resultado
con la altura de celda de las fuentes accesibles.
El mapeador de fuentes usa una altura de fuente por defecto
para buscar una fuente adecuada.
El mapeador de fuentes convierte el valor de nHeight a
unidades del dispositivo, haciendo corresponder el valor
absoluto del resultado con la altura de los caracteres de las
fuentes accesibles.
Descripcin
Utiliza el grosor por defecto de la negrita (0).
Trazo de fuente extrafino (100).
Trazo de fuente fino (200).
Negrita con grosor ligeramente inferior a lo normal (300).
Negrita normal (400).
Negrita con grosor ligeramente superior a lo normal (500).
Negrita ligera (600).
Negrita (700).
Negrita extra (800).
Negrita extragruesa (900).
497
JOHAB_CHARSET
HEBREW_CHARSET
ARABIC_CHARSET
GREEK_CHARSET
TURKISH_CHARSET
VIETNAMESE_CHARSET
THAI_CHARSET
EASTEUROPE_CHARSET
RUSSIAN_CHARSET
MAC_CHARSET
BALTIC_CHARSET
Descripcin
El conjunto de caracteres ANSI.
El conjunto de caracteres por defecto.
El conjunto de caracteres Symbol.
El conjunto de caracteres Shift-JIS.
El conjunto de caracteres GB2312.
El conjunto de caracteres coreano.
El conjunto de caracteres chino.
El conjunto de caracteres original del fabricante del
equipo.
Slo Windows 95/98: El conjunto de caracteres Johab.
Slo Windows 95/98: El conjunto de caracteres hebreo.
Slo Windows 95/98: El conjunto de caracteres arbigo.
Slo Windows 95/98: El conjunto de caracteres griego.
Slo Windows 95/98: El conjunto de caracteres turco.
Slo Windows 95/98: El conjunto de caracteres
vietnamita.
Slo Windows 95/98: El conjunto de caracteres Thai.
Slo Windows 95/98: El conjunto de caracteres de
Europa del Este.
Slo Windows 95/98: El conjunto de caracteres cirlico.
Slo Windows 95/98: El conjunto de caracteres
Macintosh.
Slo Windows 95/98: El conjunto de caracteres bltico.
Descripcin
El comportamiento por defecto del mapeador de
fuentes.
Elige una fuente de dispositivo cuando existe ms de
una fuente con el nombre especificado.
Slo Windows NT: Elige una fuente True Type o de
otros tipos basados en vectores.
Elige una fuente de barrido cuando existe ms de una
fuente con el nombre especificado.
8
Captulo
Valor
ANSI_CHARSET
DEFAULT_CHARSET
SYMBOL_CHARSET
SHIFTJIS_CHARSET
GB2312_CHARSET
HANGEUL_CHARSET
CHINESEBIG5_CHARSET
OEM_CHARSET
498
Captulo 8
Valor
OUT_STROKE_PRECIS
OUT_TT_ONLY_PRECIS
OUT_TT_PRECIS
Descripcin
Slo Windows NT: No usado por el mapeador de
fuentes. Sin embargo, este indicador es devuelto cuando
son enumeradas fuentes True Type u otras fuentes
vectoriales.
Slo Windows 95/98: Elige una fuente de las fuentes
basadas en vectores.
Elige una fuente slo de las fuentes True Type. Si no
existen ninguna fuente True Type, el mapeador de
fuentes retorna al comportamiento por defecto.
Elige una fuente True Type cuando existe ms de una
fuente con el nombre especificado.
Descripcin
El comportamiento predeterminado del recorte.
Este indicador es usado slo durante la enumeracin de
fuentes.
Este indicador tiene que ser incluido cuando se usa una
fuente incrustada de-slo-lectura.
Especifica que la rotacin de la fuente es dependiente
del sistema de coordenadas. Si este indicador no es
especificado, las fuentes de dispositivo siempre rotarn
en sentido contrario a las manecillas del reloj.
PROOF_QUALITY
Descripcin
Utiliza la calidad predeterminada de la fuente.
El escalamiento de las fuentes de barrido est habilitado
y las fuentes negritas, itlicas, subrayadas y tachadas
sern construidas cuando se necesiten. La
correspondencia exacta de los atributos es ms
importante que la calidad de la fuente.
El escalamiento de las fuentes de barrido est
deshabilitado y se elige la fuente con un tamao fsico
ms cercano al especificado. Las fuentes negritas,
itlicas, subrayadas y tachadas sern construidas cuando
se necesiten. La calidad de la fuente es ms importante
que la correspondencia exacta de los atributos.
499
VARIABLE_PITCH
Descripcin
Indica una fuente decorativa, como Old English.
El estilo general de la fuente es desconocido o no es
importante.
Indica una fuente monoespaciada con trazos de ancho
consistentes, con o sin serifs, como Courier New.
Indica una fuente proporcional con trazos de ancho variable
y con serifs, como Times New Roman.
Indica una fuente que imita los caracteres manuscritos, como
Brush Script.
Indica una fuente proporcional con trazos de ancho variable
y sin serifs, como Arial.
CreateScalableFontResource
Windows.Pas
Sintaxis
CreateScalableFontResource(
p1: DWORD;
{indicador de slo lectura}
p2: PChar;
{nombre de fichero de recursos de la fuente}
p3: PChar;
{nombre de fichero de la fuente escalable}
p4: PChar
{ruta de fichero de la fuente escalable}
): BOOL;
{devuelve TRUE o FALSE}
Descripcin
Esta funcin es usada para crear un fichero de recursos de fuente que puede ser
utilizado luego por la funcin AddFontResource para aadir fuentes True Type a la
tabla de fuentes interna de Windows, lo que har accesible a todas las aplicaciones la
fuente True Type. Cuando una aplicacin termina de utiliza la fuente True Type, deber
eliminarla del sistema llamando a la funcin RemoveFontResource.
8
Captulo
Valor
DEFAULT_PITCH
FIXED_PITCH
500
Captulo 8
Parmetros
p1: Indica si la fuente es de slo lectura. Si a este parmetro se le asigna cero, la fuente
tiene permiso de lectura y escritura. El valor 1 indica que se trata de una fuente
de-slo-lectura y la fuente ser ocultada en otras aplicaciones, y adems no aparecer
en las listas de fuentes devueltas por las funciones EnumFontFamilies o
EnumFontFamiliesEx.
p2: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de
fichero y la extensin (normalmente .FOT) del fichero de recursos de fuente que ser
creado por esta funcin.
p3: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del
fichero de fuente True Type que ser utilizado para crear el fichero de recursos de
fuente escalable. Si esta cadena contiene nicamente el nombre de fichero y la
extensin, el parmetro p4 deber apuntar a una cadena que contenga la ruta del fichero
especificado.
p4: Puntero a una cadena de caracteres terminada en nulo con la ruta del fichero de
fuentes escalables. Si el nombre de fichero especificado en el parmetro p3 contiene
un nombre de fichero con la ruta incluida, a este parmetro debe asignrsele nil.
Vase adems
AddFontResource, EnumFontFamilies, EnumFontFamiliesEx, RemoveFontResource
Ejemplo
Listado 8-4: Instalando una nueva fuente True Type
{==============================================================================
La fuente Ventilate usada en este ejemplo fue generosamente donada por su dueo
Copyright 1997, Brian J. Bonislawsky - Astigmatic One Eye. Usada con permiso.
Astigmatic One Eye es un gran proveedor de shareware y freeware de fuentes de
todo tipo. Visite su sitio http://www.comptechdev.com/cavop/aoe/
==============================================================================}
procedure TForm1.FormCreate(Sender: TObject);
var
CurDir: array[0..MAX_PATH] of Char;
// almacena el directorio actual
begin
{Recupera el directorio actual}
GetCurrentDirectory(MAX_PATH, @CurDir[0]);
{Crea el fichero de recursos de fuentes}
CreateScalableFontResource(0, PChar(CurDir + '\Ventilat.fot'),
PChar(CurDir + '\Ventilat.ttf'),
501
nil);
{Aade la fuente a la tabla interna de fuentes de Windows, hacindola
accesible a cualquier aplicacin}
AddFontResource(PChar(CurDir + '\ventilat.fot'));
{Informa a todas las aplicaciones del cambio en la tabla de fuentes}
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
end;
Figura 8-5:
Usando la
nueva fuente
8
Captulo
502
Captulo 8
DrawText
Windows.Pas
Sintaxis
DrawText(
hDC: HDC;
lpString: PChar;
nCount: Integer;
var lpRect: TRect;
uFormat: UINT
): Integer;
Descripcin
Esta funcin dibuja la cadena de texto indicada por lpString sobre el contexto de
dispositivo especificado por el parmetro hDC. El texto es dibujado dentro del
rectngulo especificado y es formateado de acuerdo a las opciones de formato
especificadas en el parmetro uFormat. Para dibujar el texto se utilizan la fuente, color
del texto, color del fondo y modo del fondo seleccionados en el contexto de
dispositivo. A menos que se indique lo contrario mediante un indicador de formato
especfico, se asume que el texto tiene mltiples lneas y ser recortado en los lmites
del rectngulo especificado.
Observe que las cadenas que contienen el carcter de prefijo mnemotcnico (&)
provocarn que se subraye el carcter siguiente a cada &, y dos prefijos
mnemotcnicos seguidos sern interpretados como un carcter & literal.
Parmetros
hDC: Manejador del contexto de dispositivo sobre el cual el texto ser dibujado.
lpString: Puntero a una cadena de caracteres terminada en nulo que contiene el texto
que ser dibujado.
nCount: Especifica la longitud de la cadena a la que apunta el parmetro lpString, en
caracteres. Si a este parmetro se le asigna -1, se asume que la cadena a la que apunta
el parmetro lpString es una cadena de caracteres terminada en nulo y la funcin
calcular automticamente el longitud de la cadena.
lpRect: Especifica las coordenadas del rectngulo, en unidades lgicas, dentro del cual
ser dibujado y formateado el texto.
uFormat: Conjunto de indicadores que especifican cmo el texto ser mostrado y
formateado dentro del rectngulo especificado. Este parmetro puede contener uno o
ms valores de la Tabla 8-19.
503
Vase adems
DrawTextEx, GrayString, TabbedTextOut, TextOut
Ejemplo
Listado 8-5: Dibujando texto formateado
8
Captulo
504
Captulo 8
Figura 8-6:
Salida de texto
formateado
DT_CALCRECT
DT_CENTER
DT_EDITCONTROL
DT_END_ELLIPSIS
DT_EXPANDTABS
DT_EXTERNALLEADING
DT_LEFT
Descripcin
El texto a dibujar ser justificado al borde inferior del
rectngulo. Este indicador tiene que ser combinado con el
indicador DT_SINGLELINE.
Determina automticamente el ancho y la altura del
rectngulo. Para textos de mltiples lneas, el borde inferior
del rectngulo es extendido de forma que incluya la ltima
lnea del texto. Para textos de una sola lnea, el borde
derecho del rectngulo es extendido de forma que incluya el
ltimo carcter del texto. La funcin devuelve la altura del
texto, pero el texto no es dibujado.
Centra el texto horizontalmente dentro del rectngulo.
Duplica el comportamiento de mostrar texto de un control
de edicin. Especficamente, la funcin no dibujar la ltima
lnea de texto si sta es visible slo parcialmente.
Si la cadena es demasiado larga para ser mostrada
completamente dentro del rectngulo especificado, este
indicador hace que la funcin reemplace los caracteres al
final de la cadena con puntos suspensivos (), de manera
que la cadena resultante quepa en el rectngulo.
Los caracteres de tabulacin (Tab) son expandidos cuando el
texto es dibujado. Por defecto, un carcter de tabulacin se
expande en 8 caracteres.
La altura de la fuente devuelta incluir el valor de la gua
externa para la fuente seleccionada.
El texto es justificado al borde izquierdo del rectngulo.
Valor
DT_MODIFYSTRING
DT_NOCLIP
DT_NOPREFIX
DT_PATH_ELLIPSIS
DT_RIGHT
DT_RTLREADING
DT_SINGLELINE
DT_TABSTOP
DT_TOP
DT_VCENTER
DT_WORDBREAK
505
Descripcin
Modifica la cadena especificada para que se corresponda con
el texto mostrado. Este indicador es til solamente cuando
se combina con DT_END_ELLIPSES o DT_PATH_ELLIPSIS.
Hace que el texto sea dibujado sin recortarlo a los lmites
del rectngulo. Esto tiene un efecto colateral de mejora en
el rendimiento.
Desactiva el tratamiento de los caracteres de prefijo
mnemotcnico. Especficamente, cualquier carcter de
prefijo mnemotcnico (&) en la cadena ser interpretado
literalmente y no har que el siguiente caracter sea
subrayado.
Si la cadena es demasiado larga para ser mostrada
completamente dentro del rectngulo especificado, este
indicador hace que la funcin reemplace los caracteres en la
mitad de la cadena con puntos suspensivos (), de manera
que la cadena resultante quepa en el rectngulo. Si la cadena
contiene contrabarras (\), como en el caso de una ruta, la
funcin intentar preservar tanto texto como sea posible a
partir de la ltima contrabarra en la cadena.
El texto es justificado al borde derecho del rectngulo.
Dibuja el texto de derecha a izquierda. Este indicador puede
usarse solamente cuando la fuente seleccionada en el
contexto de dispositivo especificado es una fuente hebrea o
arbiga; en caso contrario, es ignorado.
El texto especificado es interpretado como una lnea simple,
y los caracteres de retorno de carro y cambio de lnea son
ignorados.
Indica la cantidad de caracteres que resultan de la expansin
de las tabulaciones. Al byte ms significativo de la palabra
menos significativa del parmetro uFormat (bits 8-15) se le
debe asignar la cantidad de caracteres a los que las
tabulaciones son expandidas.
El texto es justificado al borde superior del rectngulo. Este
indicador tiene que ser combinado con el indicador
DT_SINGLELINE.
Centra el texto verticalmente dentro de la ventana.
Implementa un algoritmo de cambio de lnea tal que
cualquier palabra que se extienda ms all del borde del
rectngulo provocar que un cambio de lnea sea insertado
en el texto, con la palabra de ruptura dibujada en la siguiente
lnea.
8
Captulo
506
Captulo 8
DrawTextEx
Windows.Pas
Sintaxis
DrawTextEx(
DC: HDC;
lpchText: PChar;
cchText: Integer;
var p4: TRect;
dwDTFormat: UINT;
DTParams: PDrawTextParams
): Integer;
Descripcin
Esta funcin dibuja la cadena de texto indicada por el parmetro lpchText sobre el
contexto de dispositivo especificado por el parmetro DC. El texto es dibujado dentro
del rectngulo especificado y es formateado de acuerdo a las opciones de formato
especificadas en el parmetro dwDTFormat y a las opciones adicionales especificadas
por el parmetro DTParams. Para dibujar el texto se utilizan la fuente, color del texto,
color del fondo y modo del fondo seleccionados en el contexto de dispositivo. A menos
que se indique lo contrario mediante un indicador de formato especfico, se asume que
el texto tiene mltiples lneas y ser recortado en los lmites del rectngulo
especificado.
Observe que las cadenas que contienen el carcter de prefijo mnemotcnico (&)
provocarn que se subraye el carcter siguiente a cada &, y dos prefijos
mnemotcnicos seguidos sern interpretados como un carcter & literal.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el texto ser dibujado.
lpchText: Puntero a una cadena de caracteres terminada en nulo que contiene el texto
que ser dibujado.
cchText: Especifica la longitud de la cadena a la que apunta el parmetro lpchText, en
caracteres. Si a este parmetro se le asigna -1, se asume que la cadena a la que apunta
el parmetro lpchText es una cadena de caracteres terminada en nulo y la funcin
calcula automticamente la longitud de esa cadena.
p4: Especifica las coordenadas del rectngulo, en unidades lgicas, dentro del cual el
texto ser dibujado y formateado.
dwDTFormat: Conjunto de indicadores que determinan cmo el texto ser mostrado y
formateado dentro del rectngulo especificado. Este parmetro puede contener uno o
ms valores de la Tabla 8-20.
DTParams: Puntero al registro TDrawTextParams que contiene opciones adicionales
de formato del texto. Si a este parmetro se le asigna nil, la funcin DrawTextEx se
comportar exactamente igual que DrawText. El registro TDrawTextParams se define:
507
Vase adems
DrawText, GrayString, TabbedTextOut, TextOut
Ejemplo
Listado 8-6: Dibujando texto con mrgenes1
{Cadena larga que ser dibujada}
const
TheString = 'The companion CD-ROM that accompanies this book is a multimedia' +
' experience containing all of the source code from the book, a complete' +
' Delphi Syntax compliant help file, shareware, freeware, and an assortment' +
' of third party development and evaluation tools. Using the CD-Browser you' +
' can navigate through the CD and choose which applications and chapter code' +
' to install with a single mouse click. Using the CD browser is simple; on' +
' a Windows 95 or Windows NT system, simply insert the CD and the browser' +
' will begin automatically.';
8
Captulo
508
Captulo 8
var
Form1: TForm1;
ResizingMargins: Boolean;
implementation
{$R *.DFM}
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
BoundingRect: TRect;
// el rectngulo lmite de formato del texto
DrawingParams: TDrawTextParams; // opciones adicionales de formato de texto
begin
with PaintBox1.Canvas do
begin
{Borra la ltima imagen}
Brush.Color := clWhite;
FillRect(ClipRect);
{El rectngulo de formato de texto es del tamao de la caja de dibujo}
BoundingRect := ClipRect;
with DrawingParams do
begin
{Selecciona el tamao de la estructura de parmetros de formato adicionales}
cbSize := SizeOf(TDrawTextParams);
{Inicializa la longitud de las tabulaciones y los mrgenes}
iTabLength := 0;
iLeftMargin := (Panel1.Left - PaintBox1.Left);
iRightMargin := 200 - Panel2.Width;
end;
{Dibuja el texto con mrgenes}
DrawTextEx(PaintBox1.Canvas.Handle, TheString, Length(TheString),
BoundingRect, DT_WORDBREAK, @DrawingParams);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{No redimensionamos los mrgenes inicialmente}
ResizingMargins := FALSE;
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
{El usuario est arrastrando un panel y redimensionando los mrgenes}
ResizingMargins := TRUE;
end;
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
509
Figura 8-7:
Texto
formateado
con mrgenes
8
Captulo
510
Captulo 8
DT_CALCRECT
DT_CENTER
DT_EDITCONTROL
DT_END_ELLIPSIS
DT_EXPANDTABS
DT_EXTERNALLEADING
DT_LEFT
DT_MODIFYSTRING
DT_NOCLIP
DT_NOPREFIX
DT_PATH_ELLIPSIS
DT_RIGHT
Descripcin
El texto a dibujar ser justificado al borde inferior del
rectngulo. Este indicador tiene que ser combinado con el
indicador DT_SINGLELINE.
Determina automticamente el ancho y la altura del
rectngulo. Para textos de mltiples lneas, el borde inferior
del rectngulo es extendido de forma que incluya la ltima
lnea del texto. Para textos de una sola lnea, el borde
derecho del rectngulo es extendido de forma que incluya el
ltimo carcter del texto. La funcin devuelve la altura del
texto, pero el texto no es dibujado.
Centra el texto horizontalmente dentro del rectngulo.
Duplica el comportamiento de mostrar texto de un control
de edicin. Especficamente, la funcin no dibujar la ltima
lnea de texto si sta es visible slo parcialmente.
Si la cadena es demasiado larga para ser mostrada
completamente dentro del rectngulo especificado, este
indicador hace que la funcin reemplace los caracteres al
final de la cadena con puntos suspensivos (), de manera
que la cadena resultante quepa en el rectngulo.
Los caracteres de tabulacin (Tab) son expandidos cuando el
texto es dibujado. Por defecto, un carcter de tabulacin se
expande en 8 caracteres.
La altura de la fuente devuelta incluir el valor de la gua
externa para la fuente seleccionada.
El texto es justificado al borde izquierdo del rectngulo.
Modifica la cadena especificada para que se corresponda con
el texto mostrado. Este indicador es til solamente cuando
se combina con DT_END_ELLIPSES o DT_PATH_ELLIPSIS.
Hace que el texto sea dibujado sin recortarlo a los lmites
del rectngulo. Esto tiene un efecto colateral de mejora en
el rendimiento.
Desactiva el tratamiento de los caracteres de prefijo
mnemotcnico. Especficamente, cualquier carcter de
prefijo mnemotcnico (&) en la cadena ser interpretado
literalmente, y no subrayar el siguiente caracter.
Si la cadena es demasiado larga para ser mostrada
completamente dentro del rectngulo especificado, este
indicador hace que la funcin reemplace los caracteres en la
mitad de la cadena con puntos suspensivos (), de manera
que la cadena resultante quepa en el rectngulo. Si la cadena
contiene contrabarras (\), como en el caso de una ruta, la
funcin intentar preservar tanto texto como sea posible a
partir de la ltima contrabarra en la cadena.
El texto es justificado al borde derecho del rectngulo.
Valor
DT_RTLREADING
DT_SINGLELINE
DT_TABSTOP
DT_TOP
DT_VCENTER
DT_WORDBREAK
EnumFontFamilies
511
Descripcin
Dibuja el texto de derecha a izquierda . Este indicador
puede usarse solamente cuando la fuente seleccionada en el
contexto de dispositivo especificado es una fuente hebrea o
arbiga; en caso contrario, es ignorado.
El texto especificado es interpretado como una lnea simple,
y los caracteres de retorno de carro y cambio de lnea son
ignorados.
Indica la cantidad de caracteres que resultan de la expansin
de las tabulaciones. Al byte ms significativo de la palabra
menos significativa del parmetro dwDTFormat (bits 8-15)
se le debe asignar la cantidad de caracteres a los que las
tabulaciones son expandidas.
El texto es justificado al borde superior del rectngulo. Este
indicador tiene que ser combinado con el indicador
DT_SINGLELINE.
Centra el texto verticalmente dentro de la ventana.
Implementa un algoritmo de cambio de lnea tal que
cualquier palabra que se extienda ms all del borde del
rectngulo provocar que un cambio de lnea sea insertado
en el texto, con la palabra de ruptura dibujada en la siguiente
lnea.
Windows.Pas
Sintaxis
EnumFontFamilies(
DC: HDC;
p2: PChar;
p3: TFNFontEnumProc;
p4: LPARAM
): BOOL;
Descripcin
Esta funcin suministra la informacin asociada a cada fuente accesible en el contexto
de dispositivo DC con el nombre del tipo de letra especificado por el parmetro p2 a
una funcin de respuesta definida por la aplicacin. En la enumeracin se incluyen las
fuentes True Type, de barrido y vectoriales, pero se excluye cualquier fuente True Type
de-slo-lectura. La enumeracin continuar hasta que todas las fuentes hayan sido
enumeradas o hasta que la funcin de respuesta devuelva cero.
Parmetros
DC: Manejador del contexto de dispositivo cuyas fuentes sern enumeradas. La funcin
enumera todas las fuentes accesibles en el contexto de dispositivo especificado.
8
Captulo
512
Captulo 8
p2: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del
tipo de letra cuyas fuentes asociadas sern enumeradas. Si a este parmetro se le asigna
nil, la funcin enumera slo una fuente, aleatoriamente seleccionada, de cada nombre
de tipo de letra disponible.
p3: La direccin de la funcin de respuesta definida por la aplicacin.
p4: Contiene un valor de 32 bits definido por la aplicacin, que es pasado a la funcin
de enumeracin.
Descripcin
Esta funcin recibe punteros a registros de tipos TEnumLogFont y TNewTextMetric
para cada fuente enumerada, y puede ejecutar cualquier tarea deseada.
Parmetros
LogFont: Puntero a un registro TEnumLogFont que contiene los atributos de fuente
lgica para la fuente actualmente enumerada. El registro TEnumLogFont se define
como:
TEnumLogFont = packed record
elfLogFont: TLogFont;
{informacin de la fuente lgica}
elfFullName: array[0..LF_FULLFACESIZE - 1] of AnsiChar;
{nombre completo de la fuente}
elfStyle: array[0..LF_FACESIZE - 1] of AnsiChar; {estilo de la fuente}
end;
elfLogFont: Especifica un registro TLogFont que describe los atributos lgicos de
la fuente. El registro TLogFont se define como:
TLogFont = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
{altura de la fuente}
{ancho de caracteres}
{ngulo de escape}
513
lfOrientation: Longint;
{ngulo de la lnea base}
lfWeight: Longint;
{grosor de la negrita}
lfItalic: Byte;
{indicador de itlica}
lfUnderline: Byte;
{indicador de subrayado}
lfStrikeOut: Byte;
{indicador de tachado}
lfCharSet: Byte;
{conjunto de caracteres}
lfOutPrecision: Byte;
{indicador de precisin}
lfClipPrecision: Byte;
{precisin de recorte}
lfQuality: Byte;
{indicador de calidad}
lfPitchAndFamily: Byte;
{pitch y familia de fuentes}
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
{nombre del tipo de letra de la fuente}
end;
Consulte la funcin CreateFontIndirect para ver una descripcin de este registro.
elfFullName: Cadena de caracteres terminada en nulo que contiene el nombre
completo (que es nico) de la fuente enumerada.
elfStyle: Cadena de caracteres terminada en nulo que contiene el estilo de la
fuente.
TextMetrics: Puntero a un registro TNewTextMetric que contiene los atributos fsicos de
la fuente. Observe que si la fuente actualmente enumerada no es una fuente True Type,
este parmetro apuntar a un registro TTextMetric. Todas las medidas devueltas en este
registro estn en unidades lgicas y dependen del modo de mapeado actual del contexto
de dispositivo especificado. El registro TNewTextMetric se define como:
TNewTextMetric = record
tmHeight: Longint;
tmAscent: Longint;
tmDescent: Longint;
tmInternalLeading: Longint;
tmExternalLeading: Longint;
tmAveCharWidth: Longint;
tmMaxCharWidth: Longint;
tmWeight: Longint;
tmOverhang: Longint;
tmDigitizedAspectX: Longint;
tmDigitizedAspectY: Longint;
tmFirstChar: AnsiChar;
tmLastChar: AnsiChar;
tmDefaultChar: AnsiChar;
tmBreakChar: AnsiChar;
tmItalic: Byte;
tmUnderlined: Byte;
tmStruckOut: Byte;
tmPitchAndFamily: Byte;
8
Captulo
514
Captulo 8
tmCharSet: Byte;
ntmFlags: DWORD;
ntmSizeEM: UINT;
ntmCellHeight: UINT;
ntmAvgWidth: UINT;
{conjunto de caracteres}
{atributos de la mscara de bits}
{tamao de la pica cuadrada, en unidades
tericas}
{altura de la celda, en unidades tericas}
{ancho promedio del carcter, en
unidades tericas}
end;
Excepto por los ltimos cuatro campos, este registro es idntico a TTextMetric.
Consulte la funcin GetTextMetrics para ver una descripcin del registro
TTextMetric. Los nuevos campos incluidos en TNewTextMetric son:
ntmFlags: Una mscara de bits que especifica varios atributos de la fuente. Cada
bit de la mscara identifica un atributo de fuente diferente, como se describe en la
Tabla 8-21. Si se selecciona un bit, ese atributo estar presente en la fuente
actualmente enumerada.
ntmSizeEM: Especifica el tamao de la pica cuadrada de la fuente, en unidades
tericas (notional units). La unidad terica es la unidad para la cual la fuente fue
creada originalmente.
ntmCellHeight: Especifica la altura de la celda de un carcter para la fuente, en
unidades tericas.
ntmAvgWidth: Especifica el ancho del carcter promedio para la fuente, en
unidades tericas.
FontType: Especifica una serie de opciones que indican el tipo de la fuente que est
siendo enumerada. Este parmetro puede contener uno o ms valores de la Tabla 8-22.
Observe que si no estn presentes el indicador RASTER_FONTTYPE ni el indicador
TRUETYPE_FONTTYPE, la fuente enumerada es vectorial.
lParam: Especifica el valor de 32 bits definido por la aplicacin pasado a la funcin
EnumFontFamilies en el parmetro p4.
Vase adems
CreateFontIndirect, EnumFontFamiliesEx, GetTextMetrics
Ejemplo
Listado 8-7: Enumeracin de fuentes accesibles
{El prototipo de la funcin de respuesta}
function FontEnumProc(LogFont: PEnumLogFont; TextMetrics: PNewTextMetric;
FontType: Integer; lParam: LPARAM): Integer; stdcall;
var
515
Form1: TForm1;
implementation
{$R *.DFM}
8
Captulo
516
Captulo 8
Figura 8-8:
Los nombres
de fuente
accesibles
Tabla 8-21: Valores de los bits del campo TextMetrics.ntmFlags de la funcin de respuesta
EnumFontFamProc
Posicin del bit
0
1
2
3
4
5
Descripcin
Indica una fuente itlica.
Indica una fuente subrayada.
Indica una fuente en imagen inversa.
Indica una fuente contorneada.
Indica una fuente tachada.
Indica una fuente negrita.
EnumFontFamiliesEx
Descripcin
Indica una fuente residente en el dispositivo, o que el
dispositivo soporta descarga de fuentes True Type.
Indica una fuente de barrido o de mapa de bits.
Indica una fuente True Type.
Windows.Pas
Sintaxis
EnumFontFamiliesEx(
DC: HDC;
var p2: TLogFont;
p3: TFNFontEnumProc;
p4: LPARAM;
p5: DWORD
): BOOL;
Descripcin
Esta funcin suministra la informacin asociada a cada fuente accesible en el contexto
de dispositivo DC cuyos atributos coincidan con los especificados en el parmetro p2,
de tipo TLogFont, a una funcin de respuesta definida por la aplicacin. En la
517
Parmetros
{altura de la fuente en
unidades lgicas}
lfWidth: Longint;
{ancho del caracter en
unidades lgicas}
lfEscapement: Longint;
{ngulo de escape}
lfOrientation: Longint;
{ngulo de la lnea base}
lfWeight: Longint;
{grosor de la negrita}
lfItalic: Byte;
{indicador de itlica}
lfUnderline: Byte;
{indicador de subrayado}
lfStrikeOut: Byte;
{indicador de tachado}
lfCharSet: Byte;
{conjunto de caracteres}
lfOutPrecision: Byte;
{indicador de precisin}
lfClipPrecision: Byte;
{precisin de recorte}
lfQuality: Byte;
{indicador de calidad}
lfPitchAndFamily: Byte;
{pitch y familia de fuentes}
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
{nombre del tipo de letra de
la fuente}
end;
Consulte la funcin CreateFontIndirect para ver una descripcin de este registro. Slo
los campos lfCharSet, lfFaceName y lfPitchAndFamily determinan el comportamiento
de la funcin EnumFontFamiliesEx.
lfCharSet: Si a este parmetro se le asigna DEFAULT_CHARSET, la funcin
enumera todas las fuentes en todos los conjuntos de caracteres. Si a este campo se
le asigna un conjunto de caracteres especfico, slo las fuentes que definen
caracteres para ese conjunto sern enumeradas.
lfFaceName: Si a este campo se le asigna una cadena vaca, una fuente,
seleccionada aleatoriamente, de cada tipo de letra es enumerada. Si a este campo
se le asigna un nombre de tipo de letra vlido, slo las fuentes con ese tipo de
letra sern enumeradas.
lfPitchAndFamily: Este campo es usado solamente con fuentes hebreas o
arbigas, y hay que asignarle cero para cualquier otro tipo de fuente. Para
8
Captulo
DC: Manejador del contexto de dispositivo cuyas fuentes sern enumeradas. La funcin
enumera todas las fuentes accesibles en el contexto de dispositivo especificado.
518
Captulo 8
Descripcin
Esta funcin recibe punteros a registros de tipo TEnumLogFontEx y TNewTextMetricEx
para cada fuente enumerada, y puede ejecutar cualquier tarea deseada.
Parmetros
LogFont: Puntero a un registro TEnumLogFontEx que contiene los atributos de fuente
lgica para la fuente actualmente enumerada. El registro TEnumLogFontEx se define
como:
TEnumLogFontEx = packed record
elfLogFont: TLogFont;
{informacin de la fuente lgica}
elfFullName: array[0..LF_FULLFACESIZE - 1] of Char;
{nombre completo de la fuente}
elfStyle: array[0..LF_FACESIZE - 1] of Char;
{estilo de la fuente}
elfScript: array[0..LF_FACESIZE - 1] of Char;
{guin de la fuente}
end;
elfLogFont: Especifica un registro TLogFont que describe los atributos lgicos de
la fuente. Consulte la funcin CreateFontIndirect para ver una descripcin de
este registro.
elfFullName: Cadena de caracteres terminada en nulo que contiene el nombre
completo (que es nico) de la fuente enumerada.
519
8
Captulo
520
Captulo 8
end;
Consulte la funcin EnumFontFamilies para ver una descripcin de este registro.
ntmFontSig: Un registro TFontSignature que identifica las pginas de cdigo y
los subrangos Unicode para los cuales la fuente actualmente enumerada ofrece
patrones de imgenes. El registro TFontSignature se define como:
TFontSignature = packed record
fsUsb: array[0..3] of DWORD;
fsCsb: array[0..1] of DWORD;
end;
fsUsb: Una mscara de 128 bits que identifica uno de 126 posibles
subrangos de Unicode, donde cada bit, excepto los dos ms significativos,
identifica un subrango simple. El bit ms significativo siempre est activo,
y el segundo ms significativo actualmente no se utiliza y siempre es 0.
fsCsb: Una mscara de 64 bits que identifica un conjunto de caracteres
especfico o una pgina de cdigos, donde cada bit identifica una nica
pgina de cdigos. La doble palabra menos significativa especifica pginas
de cdigos de Windows y la doble palabra ms significativa pginas de
cdigos no Windows. Las pginas de cdigos para cada bit individual se
listan en la Tabla 8-23.
FontType: Especifica una serie de opciones que indican el tipo de fuente que est
siendo enumerada. Este parmetro puede contener uno o ms valores de la Tabla 8-24.
Observe que si no estn presentes el indicador RASTER_FONTTYPE ni el indicador
TRUETYPE_FONTTYPE, la fuente enumerada es vectorial.
lParam: Especifica el valor de 32 bits definido por la aplicacin pasado a la funcin
EnumFontFamiliesEx en el parmetro p4.
Vase adems
CreateFontIndirect, EnumFontFamilies, GetTextMetrics
Ejemplo
Listado 8-8: Enumerando slo las fuentes de smbolos
{El prototipo de la funcin de respuesta}
function FontEnumExProc(LogFont: PEnumLogFontEx; TextMetrics: PNewTextMetric;
FontType: Integer; lParam: LPARAM): Integer; stdcall;
var
Form1: TForm1;
521
implementation
{$R *.DFM}
Figura 8-9:
Todas las
fuentes de
smbolos
accesibles
8
Captulo
522
Captulo 8
Pg. Cdigos
1252
1250
1251
1253
1254
1255
1256
1257
874
932
936
949
950
869
866
865
864
863
862
861
860
857
855
852
776
737
708
850
437
Descripcin
Latin 1 (Europa Occidental).
Latin 2 (Europa del Este).
Cirlico.
Griego.
Turco.
Hebreo.
Arbigo.
Bltico.
Reservado para ANSI.
Tailands.
JIS/Japn.
Caracteres chinos simplificados.
Coreano Unificado (Hangeul).
Caracteres chinos tradicionales.
Reservado para uso alterno de ANSI y OEM.
Reservado por el sistema.
Reserved para OEM.
Griego IBM.
Ruso MS-DOS.
Nrdico MS-DOS.
Arbigo.
Francs Canadiense MS-DOS.
Hebreo.
Islands MS-DOS.
Portugus MS-DOS.
Turco IBM.
Cirlico IBM.
Latin 2.
Bltico.
Griego.
Arbigo (ASMO 708).
WE/Latin 1.
Estados Unidos.
523
RASTER_FONTTYPE
TRUETYPE_FONTTYPE
GetCharABCWidths
Descripcin
Indica una fuente residente en el dispositivo, o que el
dispositivo soporta la descarga de fuentes True Type.
Indica una fuente de barrido o mapa de bits.
Indica una fuente True Type.
Windows.Pas
Sintaxis
GetCharABCWidths(
DC: HDC;
p2: UINT;
p3: UINT;
const ABCStructs
): BOOL;
Descripcin
Esta funcin recupera varios valores de ancho y espaciado de caracteres para la fuente
True Type actualmente seleccionada en el contexto de dispositivo identificado por el
parmetro DC. Estos valores son recuperados para un rango de caracteres consecutivos
dentro de la fuente. Para cada carcter en el rango, el registro TABC correspondiente en
el array de registros TABC al que apunta el parmetro ABCStructs, recibe tres valores
de ancho. El valor de espaciado A es la distancia que se aade a la posicin actual
antes de ubicar el prximo patrn del carcter cuando se est escribiendo una lnea de
texto. El valor de espaciado B es el ancho actual del patrn del carcter. El valor de
espaciado C es la distancia que se aade a la derecha del patrn para ofrecer espacios
para la separacin de los caracteres. Valores de espaciado A y C negativos, indican
una fuente con un desplazamiento hacia abajo o hacia arriba.
Tenga en cuenta que esta funcin es aplicable nicamente a fuentes True Type. Para
recuperar el ancho de fuentes que no sean True Type utilice la funcin GetCharWidth.
Parmetros
DC: Manejador del contexto de dispositivo cuyos anchos de caracteres para la fuente
actualmente seleccionada sern recuperados.
p2: Especifica el valor del primer carcter en el rango de caracteres.
p3: Especifica el valor del ltimo carcter en el rango de caracteres.
ABCStructs: Puntero a un array de registros de tipo TABC que recibir los anchos de
espaciado ABC de cada carcter en el rango especificado. Debe haber al menos tantos
8
Captulo
Valor
DEVICE_FONTTYPE
524
Captulo 8
registros TABC en el array como caracteres en el rango definido por los parmetros p2
y p3. El registro TABC se define como:
TABC = packed record
abcA: Integer;
abcB: UINT;
abcC: Integer;
end;
{desplazamiento inicial}
{ancho del patrn}
{espacio en blanco}
Vase adems
GetCharWidth, GetOutlineTextMetrics, GetTextMetrics
Ejemplo
Listado 8-9: Recuperando los anchos ABC para todas las letras maysculas
procedure TForm1.FormActivate(Sender: TObject);
var
CharWidths: array[0..25] of TABC;
// almacena anchos ABC de caracteres
Count: Integer;
// variable de control de bucle
begin
{Inicializa la rejilla de cadenas}
StringGrid1.Cells[0,0] := 'Character';
StringGrid1.Cells[1,0] := '''A'' Width';
StringGrid1.Cells[2,0] := '''B'' Width';
StringGrid1.Cells[3,0] := '''C'' Width';
525
end;
end;
Figura 8-10:
El ancho ABC
de las letras
maysculas
GetCharWidth
Windows.Pas
Sintaxis
GetCharWidth(
DC: HDC;
p2: UINT;
p3: UINT;
const Widths
): BOOL;
Descripcin
Esta funcin recupera el ancho de cada carcter en el rango de caracteres indicado para
la fuente actualmente seleccionada en el contexto de dispositivo identificado por el
parmetro DC. Para cada carcter en el rango, el ancho del carcter se deposita en el
entero correspondiente en el array de enteros al que apunta el parmetro Widths. Esta
funcin es til tanto para fuentes True Type como no True Type. Sin embargo, las
fuentes True Type deben utilizar la funcin GetCharABCWidths para recuperar valores
ms exactos.
Parmetros
DC: Manejador del contexto de dispositivo cuyos anchos de caracteres para la fuente
actualmente seleccionada sern recuperados.
p2: Especifica el valor del primer carcter en el rango de caracteres.
p3: Especifica el valor del ltimo carcter en el rango de caracteres.
Widths: Puntero a un array de enteros que recibe el ancho de cada carcter en el rango
especificado. Debe haber tantos enteros en el array como caracteres en el rango
definido por los parmetros p2 y p3.
Captulo
526
Captulo 8
Vase adems
GetCharABCWidths, GetTextExtentExPoint, GetTextExtentPoint32
Ejemplo
Listado 8-10: Recuperando anchos de caracteres para las maysculas
procedure TForm1.FormActivate(Sender: TObject);
var
CharWidths: array[0..25] of Integer;
// almacena los anchos de los caracteres
Count: Integer;
// variable de control de bucle
begin
{Inicializa la rejilla de cadenas}
StringGrid1.Cells[0,0] := 'Character';
StringGrid1.Cells[1,0] := 'Width';
{Recupera los anchos de las maysculas}
GetCharWidth(Form1.Canvas.Handle, Ord('A'), Ord('Z'), CharWidths);
{Muestra los anchos de los caracteres}
for Count := 0 to 26 do
begin
StringGrid1.Cells[0, Count+1] := Char(Ord('A') + Count);
StringGrid1.Cells[1, Count+1] := IntToStr(CharWidths[Count]);
end;
end;
Figura 8-11:
Los anchos de
las maysculas
GetFontData
Windows.Pas
Sintaxis
GetFontData(
DC: HDC;
p2: DWORD;
p3: DWORD;
p4: Pointer;
p5: DWORD
): DWORD;
527
Descripcin
Esta funcin recupera informacin de la tabla de medidas de las fuentes especificada
por el parmetro p2, para la fuente True Type seleccionada en el contexto de
dispositivo identificada por el parmetro DC. GetFontData puede ser utilizada para
recuperar un fichero completo de fuentes True Type, con el objetivo de incrustar una
fuente en un documento.
DC: Manejador del contexto de dispositivo en el que est seleccionada la fuente cuya
informacin ser recuperada.
p2: Especifica la tabla de medidas de la fuente desde la cual se recuperarn datos. Las
tablas de medidas de las fuentes True Type se describen en las especificaciones de
ficheros de fuentes True Type, publicadas por Microsoft. Si a este parmetro se le
asigna cero, la funcin recupera informacin comenzando desde el inicio del fichero de
fuentes.
p3: Especifica el desplazamiento desde el inicio de la tabla de medidas especificada, a
partir de dnde la funcin comenzar a recuperar informacin. Si a este parmetro se le
asigna cero, la funcin recupera informacin comenzando desde el inicio de la tabla de
medidas especificada.
p4: Puntero a un buffer que recibir la informacin recuperada. Si a este parmetro se
le asigna nil, la funcin devuelve el tamao del buffer necesario para almacenar la
informacin solicitada.
p5: Especifica la cantidad de informacin a recuperar, en bytes. Si a este parmetro se
le asigna cero, la funcin devuelve el tamao de la tabla de medidas especificada por el
parmetro p2.
Vase adems
AddFontResource, CreateScalableFontResource, GetTextMetrics,
RemoveFontResource
Ejemplo
Vea el Listado 8-1, que muestra cmo incrustar una fuente.
GetGlyphOutline
Sintaxis
GetGlyphOutline(
Windows.Pas
8
Captulo
Parmetros
528
Captulo 8
DC: HDC ;
p2: UINT;
p3: UINT;
const p4: TGlyphMetrics;
p5: DWORD;
p6: Pointer;
const p7: TMat2
): DWORD;
Descripcin
Esta funcin recupera la informacin de delineado del carcter especificado para la
fuente True Type seleccionada en el contexto de dispositivo identificado por el
parmetro DC. La informacin de delineado recuperada se obtiene en la forma de un
mapa de bits monocromtico o de una serie de lneas y curvas que describen la forma
nativa del patrn. Esta informacin se almacena en el buffer a la que apunta el
parmetro p6.
Parmetros
DC: Manejador del contexto de dispositivo cuya fuente True Type actualmente
seleccionada es utilizada cuando se recupera la informacin de delineado.
p2: Identifica el cdigo del carcter cuyo delineado ser recuperado.
p3: Especifica el formato de la informacin de delineado. Este parmetro contiene un
valor de la Tabla 8-25.
p4: Puntero a un registro TGlyphMetrics que recibe la informacin concerniente a los
atributos fsicos del patrn del carcter. El registro TGlyphMetrics se define de la
siguiente manera:
TGlyphMetrics = packed record
gmBlackBoxX: UINT;
{ancho del rectngulo ms pequeo}
gmBlackBoxY: UINT;
{altura del rectngulo ms pequeo}
gmptGlyphOrigin: TPoint; {origen del rectngulo ms pequeo}
gmCellIncX: SHORT;
{desplazamiento horizontal del prximo carcter}
gmCellIncY: SHORT;
{desplazamiento vertical del prximo carcter}
end;
gmBlackBoxX: Indica el ancho del rectngulo ms pequeo en el que cabra
completamente la imagen del patrn, en unidades de dispositivo.
gmBlackBoxY: Indica la altura del rectngulo ms pequeo en el que cabra
completamente la imagen del patrn, en unidades de dispositivo.
gmptGlyphOrigin: Indica las coordenadas horizontal y vertical, dentro de la celda
del carcter, del origen del rectngulo ms pequeo en el que cabra
completamente la imagen del patrn, en unidades del dispositivo.
529
p6: Puntero al buffer que recibe la informacin de delineado del patrn. Si a este
parmetro se le asigna nil, la funcin devuelve el tamao necesario para el buffer.
p7: Puntero a un registro TMat2 que define una matriz de transformacin 3 x 3 que se
utiliza para rotar la fuente en cualquier ngulo. El registro TMat2 se define como:
TMat2 = packed record
eM11: TFixed;
eM12: TFixed;
eM21: TFixed;
eM22: TFixed;
end;
{parte fraccionaria}
{parte entera}
end;
fract: Identifica la parte fraccionaria del nmero real.
value: Identifica la parte entera del nmero real.
8
Captulo
p5: Especifica el tamao del buffer de datos al que apunta el parmetro p6. Si este
parmetro es cero, la funcin devuelve el tamao necesario para el buffer.
530
Captulo 8
Vase adems
GetOutlineTextMetrics
Ejemplo
Listado 8-11: Recuperando mapas de bits de patrones de caracteres
var
Form1: TForm1;
SelectedChar: Byte;
Angle: Integer;
implementation
{$R *.DFM}
function MakeFixed(Value: Double): TFixed;
var
TheValue: longint; // variable de almacenamiento intermedio
begin
{Convierte el nmero indicado en un registro TFixed}
TheValue := Trunc(Value*65536);
Result := TFixed(Longint(TheValue));
end;
procedure DrawGlyph;
var
BitmapSize: Longint;
// tamao necesario del mapa de bits
BitmapBits: Pointer;
// un puntero al mapa de bits
BitmapInfo: Windows.TBitmap;
// informacin del mapa de bits de Windows
GlyphBitmap: HBITMAP;
// manejador del mapa de bits final
GlyphMetrics: TGlyphMetrics;
// informacin sobre medidas del patrn
Matrix: TMat2;
// matriz de rotacin
begin
{Inicializa la matriz de rotacin. Observe que los valores de todos los ngulos
deben convertirse a radianes}
Matrix.eM11 := MakeFixed(Cos(Angle * (PI/180)));
Matrix.eM12 := MakeFixed(Sin(Angle * (PI/180)));
Matrix.eM21 := MakeFixed(-Sin(Angle * (PI/180)));
Matrix.eM22 := MakeFixed(Cos(Angle * (PI/180)));
{Recupera el tamao requerido por el mapa de bits}
BitmapSize := GetGlyphOutline(Form1.Canvas.Handle, SelectedChar, GGO_BITMAP,
GlyphMetrics, 0, nil, Matrix);
{Reserva memoria suficiente para almacenar el mapa de bits}
GetMem(BitmapBits, BitmapSize);
{Recupera el mapa de bits del patrn}
GetGlyphOutline(Form1.Canvas.Handle, SelectedChar, GGO_BITMAP, GlyphMetrics,
BitmapSize, BitmapBits, Matrix);
{Inicializa el registro BitmapInfo para crear un mapa de bits de Windows}
with BitmapInfo do
begin
bmType := 0;
bmWidth := (GlyphMetrics.gmBlackBoxX + 31) and not 31;
bmHeight := GlyphMetrics.gmBlackBoxY;
bmWidthBytes := bmWidth shr 3;
bmPlanes := 1;
bmBitsPixel := 1;
bmBits := BitmapBits;
end;
{Crea el mapa de bits de Windows}
GlyphBitmap := CreateBitmapIndirect(BitmapInfo);
{Asigna el mapa de bits final a la imagen para mostrar}
Form1.Image1.Picture.Bitmap.Handle := GlyphBitmap;
Form1.Image1.Picture.Bitmap.Width := GlyphMetrics.gmBlackBoxX;
{Libera la memoria reservada para el mapa de bits}
FreeMem(BitmapBits, BitmapSize);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crea el mapa de bits de la imagen e inicializa las variables}
Image1.Picture.Bitmap := TBitmap.Create;
SelectedChar := Ord('A');
Angle := 0;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
{Dibuja el mapa de bits en la activacin}
DrawGlyph;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
{Selecciona el carcter y dibuja su mapa de bits}
SelectedChar := Ord(PChar(TSpeedButton(Sender).Caption)[0]);
DrawGlyph;
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
{Cambia el ngulo de rotacin y actualiza la pantalla}
Angle := ScrollBar1.Position;
Label2.Caption := IntToStr(Angle);
DrawGlyph;
end;
531
8
Captulo
532
Captulo 8
Figure 8-12:
El patrn
rotado
GGO_NATIVE
GGO_METRICS
GetKerningPairs
Descripcin
Recupera el delineado del patrn en forma de mapa de bits
monocromtico por filas y alineado a frontera de doble
palabra.
Recupera el delineado del patrn en su formato nativo (una
serie de lneas y curvas), medidas en unidades de diseo de
la fuente. El parmetro p7 es ignorado.
Recupera solamente la informacin de TGlyphMetrics para
el parmetro p4.
Windows.Pas
Sintaxis
GetKerningPairs(
DC: HDC;
Count: DWORD;
var KerningPairs
): DWORD;
Descripcin
Esta funcin recupera las parejas de kerning (kerning pairs) de caracteres para la
fuente actualmente seleccionada en el contexto de dispositivo identificado por el
parmetro DC.
Parmetros
DC: Manejador del contexto de dispositivo de cuya fuente actualmente seleccionada
sern recuperadas las parejas de kerning de caracteres.
Count: Indica la cantidad de registros TKerningPair en el array al que apunta el
parmetro KerningPairs. Si la fuente seleccionada contiene ms parejas de kerning
que los que este parmetro indica, la funcin falla.
533
Vase adems
GetTextCharacterExtra, SetTextCharacterExtra
Ejemplo
Listado 8-12: Recuperando las parejas de kerning para la fuente actualmente seleccionada
{OJO! Delphi importa incorrectamente esta funcin; debemos reimportarla
manualmente para obtener toda la funcionalidad que nos ofrece esta funcin}
function GetKerningPairs(DC: HDC; Count: DWORD;
KerningPairs: Pointer): DWORD; stdcall;
var
Form1: TForm1;
implementation
{$R *.DFM}
{Importacin de la funcin}
function GetKerningPairs; external gdi32 name 'GetKerningPairs';
procedure TForm1.FormActivate(Sender: TObject);
type
TKerningPairs = array[0..0] of TKerningPair; // parejas de kerning
var
FaceName: array[0..255] of Char; // nombre de fuente de la letra seleccionada
8
Captulo
534
Captulo 8
KerningPairs: ^TKerningPairs;
// puntero al array de parejas
NumPairs: DWORD;
// almacena el nmero parejas
Count: Integer;
// variable de control de bucle
begin
{Recupera el nombre de la fuente actualmente seleccionada y la muestra}
GetTextFace(Form1.Canvas.Handle, 255, @FaceName[0]);
Label2.Caption := FaceName;
{Recupera el nmero total de parejas de kerning en la fuente seleccionada}
NumPairs := GetKerningPairs(Form1.Canvas.Handle, 0, nil);
{Reserva memoria suficiente para almacenar todas las parejas}
GetMem(KerningPairs, SizeOf(TKerningPair)*NumPairs);
{Recupera las parejas de kerning para la fuente}
GetKerningPairs(Form1.Canvas.Handle, NumPairs, KerningPairs);
{Muestra todas las parejas y sus valores de kerning}
Memo1.Lines.Clear;
Memo1.Lines.Add('Pair' + #9 + 'Kern Amount');
for Count := 0 to NumPairs-1 do
Memo1.Lines.Add(Char(KerningPairs^[Count].wFirst) +
Char(KerningPairs^[Count].wSecond) + #9 +
IntToStr(KerningPairs^[Count].iKernAmount));
{Libera la memoria del array de parejas}
FreeMem(KerningPairs,SizeOf(TKerningPair) * NumPairs);
end;
Figura 8-13:
Las parejas de
kerning
GetOutlineTextMetrics
Windows.Pas
Sintaxis
GetOutlineTextMetrics(
DC: HDC;
p2: UINT;
OTMetricStructs: Pointer
): UINT;
535
Descripcin
Esta funcin recupera informacin sobre las medidas, tales como la altura, ascenso,
descenso y otras medidas fsicas slo para la fuente True Type actualmente
seleccionada en el contexto de dispositivo identificado por el parmetro DC. Esta
funcin ofrece informacin especfica a las fuentes True Type, en adicin a la
informacin recuperada por la funcin GetTextMetrics.
DC: Manejador del contexto de dispositivo de cuya fuente True Type actualmente
seleccionada son recuperadas las medidas de texto.
p2: Especifica el tamao del buffer al que apunta el parmetro OTMetricStructs, en
bytes.
OTMetricStructs: Puntero a un buffer que recibe un registro TOutlineTextMetric que
describe las medidas de texto de la fuente True Type. Si a este parmetro se le asigna
nil, la funcin devuelve el tamao necesario para el buffer. Debido a que al final de este
registro se almacenan cadenas de caracteres, su tamao es variable. El desarrollador
debe llamar inicialmente a la funcin para determinar el tamao apropiado y entonces
reservar el buffer dinmicamente. Observe que las dimensiones devueltas en los
campos de este registro se expresan en unidades lgicas y dependen del modo de
mapeado del contexto de dispositivo especificado. El registro TOutlineTextMetric se
define como:
TOutlineTextMetric = record
otmSize: UINT;
otmTextMetrics: TTextMetric;
otmFiller: Byte;
otmPanoseNumber: TPanose;
otmfsSelection: UINT;
otmfsType: UINT;
otmsCharSlopeRise: Integer;
otmsCharSlopeRun: Integer;
otmItalicAngle: Integer;
otmEMSquare: UINT;
otmAscent: Integer;
otmDescent: Integer;
otmLineGap: UINT;
otmsCapEmHeight: UINT;
otmsXHeight: UINT;
otmrcFontBox: TRect;
otmMacAscent: Integer;
otmMacDescent: Integer;
otmMacLineGap: UINT;
8
Captulo
Parmetros
536
Captulo 8
otmusMinimumPPEM: UINT;
otmptSubscriptSize: TPoint;
otmptSubscriptOffset: TPoint;
otmptSuperscriptSize: TPoint;
OtmptSuperscriptOffset: Tpoint;
otmsStrikeoutSize: UINT;
otmsStrikeoutPosition: Integer;
otmsUnderscoreSize: Integer;
otmsUnderscorePosition: Integer;
otmpFamilyName: PAnsiChar;
otmpFaceName: PAnsiChar;
otmpStyleName: PAnsiChar;
otmpFullName: PAnsiChar;
end;
otmSize: Especifica el tamao del registro TOutlineTextMetric reservado, en
bytes.
otmTextMetrics: Especifica un registro TTextMetric que contiene informacin
fsica adicional para la fuente. El registro TTextMetric se define como:
TTextMetric = record
tmHeight: Longint;
tmAscent: Longint;
tmDescent: Longint;
tmInternalLeading: Longint;
tmExternalLeading: Longint;
tmAveCharWidth: Longint;
tmMaxCharWidth: Longint;
tmWeight: Longint;
tmOverhang: Longint;
tmDigitizedAspectX: Longint;
tmDigitizedAspectY: Longint;
tmFirstChar: AnsiChar;
tmLastChar: AnsiChar;
tmDefaultChar: AnsiChar;
tmBreakChar: AnsiChar;
tmItalic: Byte;
tmUnderlined: Byte;
tmStruckOut: Byte;
tmPitchAndFamily: Byte;
tmCharSet: Byte;
end;
{altura de un carcter}
{ascenso de un carcter}
{descenso de un carcter}
{gua interna}
{gua externa}
{ancho promedio de un carcter}
{ancho mximo de un carcter}
{grosor de la negrita}
{ancho que sobresale}
{aspecto horizontal}
{aspecto vertical}
{primer carcter}
{ltimo carcter}
{carcter por defecto}
{carcter de ruptura de palabras}
{indicador de itlica}
{indicador de subrayado}
{indicador de tachado}
{indicador de pitch y familia de fuentes}
{conjunto de caracteres}
537
8
Captulo
538
Captulo 8
otmfsType: Especifica una mscara de bits que indica los atributos de licencia de
la fuente. Si el bit 1 est seleccionado, la fuente no puede ser incrustada en un
documento; si no est seleccionado, se puede incrustar. Si el bit 2 est
seleccionado, la fuente puede ser incrustada solamente como una fuente
de-slo-lectura.
otmsCharSlopeRise: Conjuntamente con el campo otmsCharSlopeRun, este valor
especifica el numerador de la relacin usada para crear un cursor en itlica que
tenga la misma inclinacin que la fuente itlica, como se indica en el campo
otmItalicAngle.
otmsCharSlopeRun: Conjuntamente con el campo otmsCharSlopeRise, este valor
especifica el denominador de la relacin usada para crear un cursor en itlica que
tenga la misma inclinacin que la fuente itlica, como se indica en el campo
otmItalicAngle.
otmItalicAngle: Especifica el ngulo de la itlica para la fuente, en dcimas de
grado, rotando en direccin contraria a las manecillas del reloj, desde la vertical.
La mayora de las fuentes tienen un valor negativo que indica una fuente
inclinada a la derecha. Este campo tiene valor cero para fuentes no itlica.
otmEMSquare: Especifica las dimensiones horizontal y vertical, en unidades
lgicas, de la pica cuadrada de la fuente.
otmAscent: El valor tipogrfico que especifica la dimensin mxima en la cual
los caracteres en esta fuente se elevan por encima de la lnea base.
otmDescent: El valor tipogrfico que especifica la dimensin mxima en la cual
los caracteres en esta fuente descienden por debajo de la lnea base.
otmLineGap: Especifica el espaciado tipogrfico de la lnea.
otmsCapEmHeight: Este campo ya no se utiliza.
otmsXHeight: Este campo ya no se utiliza.
otmrcFontBox: Especifica el rectngulo lmite de la fuente.
otmMacAscent: La dimensin mxima en la cual los caracteres en esta fuente se
elevan por encima de la lnea base en un ordenador Macintosh.
otmMacDescent: La dimensin mxima en la cual los caracteres en esta fuente
descienden por debajo de la lnea base en un ordenador Macintosh.
otmMacLineGap: El espaciado de lnea usado por esta fuente en un ordenador
Macintosh.
otmusMinimumPPEM: Especifica el tamao ms pequeo recomendado de la
fuente, en pxeles por pica cuadrada.
otmptSubscriptSize: Un registro TPoint que especifica el ancho y la altura
recomendados para el estilo subndice.
otmptSubscriptOffset: Un registro TPoint que especifica el desplazamiento
horizontal y vertical recomendados para el estilo subndice, desde el origen del
carcter hasta el origen del subndice.
539
Vase adems
GetGlyphOutline, GetTextMetrics
Ejemplo
Listado 8-13: Recuperando medidas del texto de una fuente True Type
{Nota: el formulario debe tener una fuente True Type seleccionada antes para que
este ejemplo funcione correctamente}
procedure TForm1.FormActivate(Sender: TObject);
var
FontInfo: POutlineTextMetric;
// puntero a informacin de medidas de texto
FaceName: array[0..255] of Char;
// nombre de la fuente
TheSize: LongInt;
// tamao requerido del buffer
begin
{Recupera y muestra el nombre de la fuente seleccionada}
8
Captulo
540
Captulo 8
541
ANSI');
Default');
Symbol');
ShiftJis');
GB2312');
Hangeul');
Chinese Big5');
OEM');
8
Captulo
{Indica atributos
CheckBox1.Checked
CheckBox2.Checked
CheckBox3.Checked
542
Captulo 8
Family
Family
Family
Family
Family
Family
Weight:
Weight:
Weight:
Weight:
Weight:
Weight:
Weight:
Weight:
Weight:
Weight:
Weight:
Weight:
Type:
Type:
Type:
Type:
Type:
Type:
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Serif
Any');
No fit');
Text and display');
Script');
Decorative');
Pictorial');
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Style:
Any');
No fit');
Cove');
Obtuse cove');
Square cove');
Obtuse square cove');
Square');
Thin');
Bone');
Exaggerated');
Triangle');
Normal sans serif');
Obtuse sans serif');
Perp sans serif');
Flared');
Rounded');
Any');
No fit');
Very light');
Light');
Thin');
Book');
Medium');
Demi');
Bold');
Heavy');
Black');
Nord');
Add('
Add('
Add('
Add('
Proportion:
Proportion:
Proportion:
Proportion:
Contrast:
Contrast:
Contrast:
Contrast:
Contrast:
Contrast:
Contrast:
Contrast:
Contrast:
Contrast:
Condensed');
Very expanded');
Very condensed');
Monospaced');
Any');
No fit');
None');
Very low');
Low');
Medium low');
Medium');
Medium high');
High');
Very high');
variation:
variation:
variation:
variation:
variation:
variation:
variation:
variation:
variation:
543
Any');
No fit');
Gradual diagonal');
Gradual transition');
Gradual vertical');
Gradual horizontal');
Rapid vertical');
Rapid horizontal');
Instant vertical');
Any');
No fit');
Straight horizontal');
Straight wedge');
Straight vertical');
Straight single-serif');
Straight double-serif');
Nonstraight +
Nonstraight wedge');
Nonstraight vertical');
Nonstraight '+
Nonstraight '+
8
Captulo
PAN_PROP_CONDENSED:
PAN_PROP_VERY_EXPANDED:
PAN_PROP_VERY_CONDENSED:
PAN_PROP_MONOSPACED:
end;
544
Captulo 8
PAN_NO_FIT:
PAN_LETT_NORMAL_CONTACT:
PAN_LETT_NORMAL_WEIGHTED:
PAN_LETT_NORMAL_BOXED:
PAN_LETT_NORMAL_FLATTENED:
PAN_LETT_NORMAL_ROUNDED:
PAN_LETT_NORMAL_OFF_CENTER:
PAN_LETT_NORMAL_SQUARE:
PAN_LETT_OBLIQUE_CONTACT:
PAN_LETT_OBLIQUE_WEIGHTED:
PAN_LETT_OBLIQUE_BOXED:
PAN_LETT_OBLIQUE_FLATTENED:
PAN_LETT_OBLIQUE_ROUNDED:
PAN_LETT_OBLIQUE_OFF_CENTER:
PAN_LETT_OBLIQUE_SQUARE:
end;
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Add('
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
Letter
form:
form:
form:
form:
form:
form:
form:
form:
form:
form:
form:
form:
form:
form:
form:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
Midline:
XHeight:
XHeight:
XHeight:
XHeight:
XHeight:
XHeight:
XHeight:
XHeight:
No fit');
Normal contact');
Normal weighted');
Normal boxed');
Normal flattened');
Normal rounded');
Normal off center');
Normal square');
Oblique contact');
Oblique weighted');
Oblique boxed');
Oblique flattened');
Oblique rounded');
Oblique off center');
Oblique square');
Any');
No fit');
Standard trimmed');
Standard pointed');
Standard serifed');
High trimmed');
High pointed');
High serifed');
Constant trimmed');
Constant pointed');
Constant serifed');
Low trimmed');
Low pointed');
Low serifed');
Any');
No fit');
Constant small');
Constant standard');
Constant large');
Ducking small');
Ducking standard');
Ducking large');
545
8
Captulo
546
Captulo 8
Descripcin
Cualquier familia.
No hay coincidencia.
Familia de texto y presentacin.
Familia Script.
Familia Decorative.
Familia Pictorial.
547
Descripcin
Cualquier negrita.
No hay coincidencia.
Negrita muy ligera.
Negrita ligera.
Negrita delgada.
Negrita Book.
Negrita Medium.
Demibold.
Negrita.
Negrita Heavy.
Negrita Black.
Negrita Nord.
8
Captulo
Valor
PAN_ANY
PAN_NO_FIT
PAN_SERIF_COVE
PAN_SERIF_OBTUSE_COVE
PAN_SERIF_SQUARE_COVE
PAN_SERIF_OBTUSE_SQUARE_COVE
PAN_SERIF_SQUARE
PAN_SERIF_THIN
PAN_SERIF_BONE
PAN_SERIF_EXAGGERATED
PAN_SERIF_TRIANGLE
PAN_SERIF_NORMAL_SANS
PAN_SERIF_OBTUSE_SANS
PAN_SERIF_PERP_SANS
PAN_SERIF_FLARED
PAN_SERIF_ROUNDED
548
Captulo 8
Descripcin
Cualquier proporcin.
No hay coincidencia.
Proporcin Old style.
Proporcin Modern.
Proporcin Even width.
Proporcin Expanded.
Proporcin Condensed.
Proporcin Very expanded.
Proporcin Very condensed.
Proporcin Monospaced.
Descripcin
Cualquier contraste.
No hay coincidencia.
Sin contraste.
Contraste muy bajo.
Contraste bajo.
Contraste medio bajo.
Contraste medio.
Contrate medio alto.
Contraste alto.
Contraste muy alto.
Descripcin
Cualquier variacin de trazo.
No hay coincidencia.
Variacin diagonal gradual del trazo.
Variacin transiccional gradual del trazo.
Variacin vertical gradual del trazo.
Variacin horizontal gradual del trazo.
Variacin vertical rpida del trazo.
Variacin horizontal rpida del trazo.
Variacin vertical instantnea del trazo.
549
Descripcin
Cualquier forma de letra.
No hay coincidencia.
Letra normal contacto.
Letra normal ponderada.
Letra normal rectangular.
Letra normal aplanada.
Letra normal redondeada.
Letra normal descentrada.
Letra normal cuadrada.
Letra oblicua de contacto.
Letra oblicua ponderada.
Letra oblicua rectangular.
Letra oblicua aplanada.
Letra oblicua redondeada.
Letra oblicua descentrada.
Letra oblicua cuadrada.
8
Captulo
Valor
PAN_ANY
PAN_NO_FIT
PAN_STRAIGHT_ARMS_HORZ
PAN_STRAIGHT_ARMS_WEDGE
PAN_STRAIGHT_ARMS_VERT
PAN_STRAIGHT_ARMS_SINGLE_SERIF
PAN_STRAIGHT_ARMS_DOUBLE_SERIF
PAN_BENT_ARMS_HORZ
PAN_BENT_ARMS_WEDGE
PAN_BENT_ARMS_VERT
PAN_BENT_ARMS_SINGLE_SERIF
PAN_BENT_ARMS_DOUBLE_SERIF
550
Captulo 8
Descripcin
Cualquier lnea media.
No hay coincidencia.
Lnea media estndar recortada.
Lnea media estndar punteada.
Lnea media estndar con serif.
Lnea media alta recortada.
Lnea media alta punteada.
Lnea media alta con serif.
Lnea media constante recortada.
Lnea media constante punteada.
Lnea media constante con serif.
Lnea media baja recortada.
Lnea media baja punteada.
Lnea media baja con serif.
Descripcin
Cualquer altura X.
No hay coincidencia.
Altura X constante pequea.
Altura X constante estndar.
Altura X constante grande.
Cursiva con altura X pequea.
Cursiva con altura X estndar.
Cursiva con altura X grande.
Descripcin
Indica una fuente itlica.
Indica una fuente con subrayado.
Indica una fuente negativa.
Indica una fuente delineada.
Indica una fuente tachada.
Indica una fuente negrita.
GetRasterizerCaps
551
Windows.Pas
Sintaxis
GetRasterizerCaps(
var p1: TRasterizerStatus; {puntero a registro TRasterizerStatus}
p2: UINT
{tamao del registro TRasterizerStatus}
): BOOL;
{devuelve TRUE o FALSE}
Parmetros
p1: Puntero a un registro TRasterizerStatus que recibe informacin concerniente a la
accesibilidad de las fuentes True Type en el sistema. El registro TRasterizerStatus se
define como:
TRasterizerStatus = packed record
nSize: SHORT;
{tamao del registro TRasterizerStatus}
wFlags: SHORT;
{indicadores de accesibilidad de True Type}
nLanguageID: SHORT;
{identificador de idioma}
end;
nSize: Especifica el tamao del registro TRasterizerStatus, en bytes. A este campo
se le debe asignar SizeOf(TRasterizerStatus).
wFlags: Una serie de indicadores que especifican la disponibilidad de fuentes
True Type. Este campo puede contener uno o ms valores de la Tabla 8-37.
nLanguageID: Especifica el identificador de idioma, segn se indica en el fichero
del sistema Setup.inf.
p2: Especifica el nmero de bytes a copiar en el registro TRasterizerStatus. La cantidad
de bytes copiados ser el valor de este parmetro o el tamao del registro
TRasterizerStatus, el que sea menor.
Vase adems
GetOutlineTextMetrics, GetTextMetrics
Ejemplo
Vea el Listado 8-7 bajo EnumFontFamilies.
8
Captulo
Descripcin
552
Captulo 8
GetTabbedTextExtent
Descripcin
Al menos una fuente True Type est instalada y es accesible.
Las fuentes True Type son soportadas por el sistema.
Windows.Pas
Sintaxis
GetTabbedTextExtent(
hDC: HDC;
{manejador de contexto de dispositivo}
lpString: PChar;
{cadena cuyas dimensiones sern determinadas}
nCount: Integer;
{cantidad de caracteres en la cadena}
nTabPositions: Integer;
{cantidad de tabulaciones}
lpnTabStopPositions: Pointer
{puntero a un array de posiciones de tabulacin}
): DWORD;
{devuelve el ancho y la altura de la cadena}
Descripcin
Esta funcin devuelve el ancho y la altura que necesitar para su visualizacin una
cadena que contiene caracteres de tabulacin. La fuente actualmente seleccionada en el
contexto de dispositivo especificado es utilizada para determinar las dimensiones de la
cadena, y cualquier carcter de tabulacin en la cadena es expandido hasta la parada de
tabulacin que se indica en el array al que apunta el parmetro lpnTabStopPositions.
La regin de recorte actual del contexto de dispositivo especificado no afecta a las
dimensiones calculadas. En los casos en que una cadena que contenga parejas de kerning sea mostrada sobre un dispositivo que soporte el kerning, las dimensiones devueltas
por esta funcin pueden no corresponderse con la suma de las dimensiones individuales
de los caracteres en la cadena.
Parmetros
hDC: Manejador del contexto de dispositivo cuya fuente actualmente seleccionada es
usada para determinar la longitud de la cadena.
lpString: Puntero a una cadena de caracteres terminada en nulo que contiene el texto
con caracteres de tabulacin.
nCount: Especifica la longitud de la cadena a la que apunta el parmetro lpString, en
caracteres.
nTabPositions: Especifica la cantidad de entradas en el array de paradas de tabulacin
al que apunta el parmetro lpnTabStopPositions.
lpnTabStopPositions: Puntero a un array de enteros. Cada entrada en el array indica
una posicin (parada) de tabulacin, en unidades del dispositivo. Las paradas de
tabulacin tienen que ser colocadas en un orden creciente, con la ms pequea como
primera entrada en el array. Si a este parmetro se le asigna nil y el parmetro
553
nTabPositions tiene valor cero, los caracteres de tabulacin son expandidos a ocho
veces el ancho promedio de los caracteres de la fuente seleccionada.
GetTextExtentPoint32, TabbedTextOut
Ejemplo
Vea el Listado 8-17 bajo TabbedTextOut.
GetTextAlign
Windows.Pas
Sintaxis
GetTextAlign(
DC: HDC
): UINT;
Descripcin
Esta funcin recupera un conjunto de indicadores de las caractersticas de alineacin de
texto actuales para el contexto de dispositivo especificado. La alineacin se ejecuta en
base a un rectngulo lmite que rodea los caracteres de la cadena a mostrar. Las
dimensiones del rectngulo lmite para una cadena pueden ser recuperadas llamando a
GetTextExtentPoint32. La alineacin de texto se basa en el punto de comienzo de la
cadena, segn se define en las funciones de salida de texto tales como TextOut.
Parmetros
DC: Manejador del contexto de dispositivo cuya alineacin de texto ser recuperada.
8
Captulo
Vase adems
554
Captulo 8
Vase adems
DrawText, DrawTextEx, GetTextExtentPoint32, SetTextAlign, TextOut
Ejemplo
Vea el Listado 8-16 bajo SetTextAlign.
Tabla 8-38: Valores que devuelve GetTextAlign
Valor
TA_BASELINE
TA_BOTTOM
TA_TOP
TA_CENTER
TA_LEFT
TA_RIGHT
TA_RTLREADING
TA_NOUPDATECP
TA_UPDATECP
VTA_BASELINE
VTA_CENTER
Descripcin
El punto de comienzo est sobre la lnea base del texto.
El punto de comienzo est sobre el borde inferior del
rectngulo lmite del texto.
El punto de comienzo est sobre el borde superior del
rectngulo lmite del texto.
El punto de comienzo es el centro horizontal del rectngulo
lmite del texto.
El punto de comienzo est a la izquierda del rectngulo lmite
del texto.
El punto de comienzo est a la derecha del rectngulo lmite del
texto.
Slo Windows 95/98: Indica que el orden de lectura del texto es
de derecha a izquierda. Este valor slo tiene sentido cuando la
fuente seleccionada es hebrea o arbiga.
La posicin actual no se actualiza despus de dibujar texto.
La posicin actual se actualiza despus de dibujar texto.
Slo para fuentes de lnea base vertical: El punto de comienzo
est sobre la lnea base del texto.
Solo para fuentes de lnea base vertical: El punto de comienzo es
el centro vertical del rectngulo lmite del texto.
GetTextCharacterExtra
555
Windows.Pas
Sintaxis
{manejador de contexto de dispositivo}
{devuelve el espaciado entre caracteres}
Descripcin
Esta funcin recupera la cantidad de espacio extra, en unidades lgicas, que se aade
entre caracteres cuando se dibuja una lnea de texto sobre el contexto de dispositivo
especificado.
Parmetros
DC: Manejador del contexto de dispositivo cuyo valor de espaciado extra entre
caracteres ser recuperado.
Vase adems
DrawText, DrawTextEx, SetTextCharacterExtra, TextOut
Ejemplo
Vea el Listado 8-16 bajo SetTextAlign.
GetTextColor
Windows.Pas
Sintaxis
GetTextColor(
DC: HDC
): COLORREF;
Descripcin
Esta funcin recupera el color actual usado cuando se dibuja texto sobre el contexto de
dispositivo identificado por el parmetro DC.
Parmetros
DC: Manejador del contexto de dispositivo cuyo color de texto ser recuperado.
8
Captulo
GetTextCharacterExtra(
DC: HDC
): Integer;
556
Captulo 8
Vase adems
SetTextColor, TextOut
Ejemplo
Vea el Listado 8-16 bajo SetTextAlign.
GetTextExtentExPoint
Windows.Pas
Sintaxis
GetTextExtentExPoint(
DC: HDC;
p2: PChar;
p3: Integer;
p4: Integer;
p5: PInteger;
p6: Pointer;
var p7: TSize
): BOOL;
Descripcin
Esta funcin recupera la cantidad mxima de caracteres de la cadena a la que apunta el
parmetro p2, que cabrn dentro del ancho mximo permitido, especificado por el
parmetro p4. Adicionalmente, la funcin rellena un array de enteros cuyos elementos
se corresponden con cada carcter de la cadena con el desplazamiento desde el
principio de la cadena al principio del carcter cuando sea dibujado sobre el contexto
de dispositivo DC. La fuente actualmente seleccionada en el contexto de dispositivo
especificado es utilizada para determinar el mximo permitido de caracteres y
desplazamientos.
Parmetros
DC: Manejador del contexto de dispositivo cuya fuente seleccionada es utilizada para
determinar la dimensin del texto.
p2: Puntero a una cadena de caracteres terminada en nulo cuyas extensiones de texto
sern recuperadas.
p3: Especifica el tamao de la cadena a la que apunta el parmetro p2, en bytes.
p4: Especifica el ancho mximo permitido de la cadena de salida sobre el contexto de
dispositivo, en unidades lgicas.
p5: Puntero a un entero que recibir la cantidad mxima de caracteres que cabrn en el
espacio lgico del contexto de dispositivo identificado mediante el parmetro p4. Si a
este parmetro se le asigna nil, el parmetro p4 es ignorado.
557
p6: Puntero a un array de enteros que recibe las posiciones en las que estar situado
cada carcter individual de la cadena a la que apunta el parmetro p2. Cada entrada en
el array est asociada con el carcter en la posicin correspondiente de la cadena y
contiene el desplazamiento desde el principio de la cadena al origen del carcter
cuando es dibujado en la pantalla. Este desplazamiento caer siempre dentro del ancho
mximo especificado en el parmetro p4. Si bien debe haber tantas entradas en el array
como caracteres en la cadena p2, la funcin slo rellenar la cantidad de entradas del
array indicadas a travs del parmetro p5. A este parmetro se le puede asignar nil, si
las dimensiones individuales de los caracteres no son necesarias.
p7: Puntero a un registro TSize que recibe el ancho y la altura de la cadena
especificada, en unidades lgicas.
Vase adems
GetTextExtentPoint32
Ejemplo
Listado 8-14: Justificando texto por programa
{OJO! Delphi importa esta funcin incorrectamente. La reimportamos manualmente
para obtener su funcionalidad completa}
function GetTextExtentExPoint(DC: HDC; p2: PChar;
p3, p4: Integer; p5: PInteger; p6: Pointer; var p7: TSize): BOOL; stdcall;
var
Form1: TForm1;
implementation
{$R *.DFM}
{Reimportar la funcin}
function GetTextExtentExPoint; external gdi32 name 'GetTextExtentExPointA';
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
TheString: PChar;
// almacena la cadena de salida
StrPointer: PChar;
// puntero a la cadena de salida
DisplayString: PChar;
// almacena la cadena actualmente mostrada
MaxChars: Integer;
// recibe el mximo de caracteres visualizables
StringSize: TSize;
// recibe las dimensiones de la cadena
LineNum: Integer;
// un contador de nmero de lneas
ExtraSpace: Integer;
// almacena el espacio extra a aadir
NumBreaks: Integer;
// almacena el nmero de espacios en una cadena
Count: Integer;
// variable de control de bucle
8
Captulo
558
Captulo 8
begin
{Borra la imagen del rea de dibujo del cuadro de dibujo}
with PaintBox1.Canvas do
begin
Brush.Color := clWhite;
FillRect(ClipRect);
end;
{Inicializa la cadena original}
TheString:='Delphi is the most awesome Windows development environment ever!';
{Inicializa el nmero de lneas y el puntero de la cadena}
LineNum := 0;
StrPointer := TheString;
{Recupera suficiente memoria para la cadena mostrada}
GetMem(DisplayString, Length(TheString));
{Recorre la cadena hasta que es mostrada completamente}
while Length(StrPointer) > 0 do
begin
{Recupera la cantidad mxima de caracteres que caben en una lnea del paintbox}
GetTextExtentExPoint(PaintBox1.Canvas.Handle, TheString,
Length(TheString), PaintBox1.Width, @MaxChars,
nil, StringSize);
{Si el resto de la cadena supera lo que puede ser mostrado en una lnea y el
ltimo carcter a mostrar no es un espacio, continua decrementando el mximo
de caracteres visualizables hasta que se encuentra un espacio}
while (Length(StrPointer) > MaxChars) and (StrPointer[MaxChars] <> ' ') do
Inc(MaxChars, -1);
{Copia solamente la cantidad calculada de caracteres en la cadena visualizable.
Esta nueva cadena debe caber dentro del paintbox sin dividir ninguna palabra}
StrLCopy(DisplayString, StrPointer, MaxChars);
{Si el resto de la cadena supera lo que se puede mostrar, mueve el puntero de
la cadena ms all del final de la cadena visualizable; en caso contrario,
hace apuntar el puntero de la cadena a una cadena vaca}
if Length(StrPointer) > MaxChars then
StrPointer := @StrPointer[MaxChars+1]
else
StrPointer := #0;
{Recupera el ancho y altura de la cadena}
GetTextExtentPoint32(PaintBox1.Canvas.Handle, DisplayString,
Length(DisplayString), StringSize);
{Para justificar el texto de manera que llene la lnea completa, calcula la
cantidad de espacio entre el tamao de la cadena y el ancho del paintbox}
ExtraSpace := PaintBox1.Width - StringSize.cx;
{Cuenta el nmero de caracteres de ruptura en la cadena mostrada. Observe que
se asume que el carcter de ruptura es un espacio (' ')}
559
NumBreaks := 0;
for Count := 0 to Length(DisplayString) - 1 do
if DisplayString[Count] = ' ' then
Inc(NumBreaks);
Figura 8-15:
El texto
justificado
GetTextExtentPoint32
Windows.Pas
Sintaxis
GetTextExtentPoint32(
DC: HDC;
Str: PChar;
Count: Integer;
var Size: TSize
): BOOL;
Descripcin
Esta funcin recupera el ancho y la altura de la cadena a la que apunta el parmetro Str,
en unidades lgicas. El ancho y la altura se calculan en base a los atributos de la cadena
8
Captulo
560
Captulo 8
Parmetros
DC: Manejador del contexto de dispositivo cuya fuente actualmente seleccionada es
usada para determinar el ancho y altura de la cadena.
Str: Puntero a una cadena cuyo ancho y altura sern recuperados. No tiene que ser una
cadena de caracteres terminada en nulo, ya que el parmetro Count especifica la
longitud.
Count: Especifica la cantidad de caracteres que hay en la cadena a la que apunta el
parmetro Str.
Size: Puntero a un registro TSize que recibe el ancho y la altura de la cadena
especificada, basado en los atributos de la fuente seleccionada en el contexto de
dispositivo especificado.
Vase adems
GetTabbedTextExtent, GetTextExtentExPoint, SetTextCharacterExtra
Ejemplo
Vea el Listado 8-14 bajo GetTextExtentExPoint.
GetTextFace
Windows.Pas
Sintaxis
GetTextFace(
DC: HDC;
Count: Integer;
Buffer: PChar
): Integer;
Descripcin
Esta funcin recupera el nombre del tipo de letra de la fuente actualmente seleccionada
en el contexto de dispositivo identificado por el parmetro DC.
561
Parmetros
DC: Manejador del contexto de dispositivo cuyo nombre de tipo de letra actualmente
seleccionada ser recuperada.
Count: Especifica el tamao del buffer al que apunta el parmetro Buffer, en caracteres.
Si el nombre del tipo de letra recuperado es ms largo que el valor especificado por
este parmetro, la cadena es truncada.
Vase adems
EnumFontFamilies, EnumFontFamiliesEx, GetTextAlign, GetTextColor, GetTextMetrics
Ejemplo
Vea el Listado 8-15 bajo GetTextMetrics.
GetTextMetrics
Windows.Pas
Sintaxis
GetTextMetrics(
DC: HDC;
var TM: TTextMetric
): BOOL;
Descripcin
Esta funcin recupera informacin sobre las medidas, tales como altura, ascenso,
descenso y otras medidas fsicas, para la fuente seleccionada en el contexto de
dispositivo identificado por el parmetro DC.
Parmetros
DC: Manejador del contexto de dispositivo cuyas medidas de la fuente actualmente
seleccionada sern recuperadas.
TM: Puntero a un registro TTextMetric que recibe las medidas fsicas y otros atributos
de la fuente seleccionada en el contexto de dispositivo especificado. Observe que todas
8
Captulo
562
Captulo 8
las medidas estn en unidades lgicas y son dependientes del modo de mapeado del
contexto de dispositivo. El registro TTextMetric se define como:
TNewTextMetric = record
tmHeight: Longint;
tmAscent: Longint;
tmDescent: Longint;
tmInternalLeading: Longint;
tmExternalLeading: Longint;
tmAveCharWidth: Longint;
tmMaxCharWidth: Longint;
tmWeight: Longint;
tmOverhang: Longint;
tmDigitizedAspectX: Longint;
tmDigitizedAspectY: Longint;
tmFirstChar: AnsiChar;
tmLastChar: AnsiChar;
tmDefaultChar: AnsiChar;
tmBreakChar: AnsiChar;
tmItalic: Byte;
tmUnderlined: Byte;
tmStruckOut: Byte;
tmPitchAndFamily: Byte;
tmCharSet: Byte;
end;
563
Vase adems
EnumFontFamilies, EnumFontFamiliesEx, GetTextAlign, GetTextExtentExPoint,
GetTextExtentPoint32, GetTextFace, SetTextJustification
8
Captulo
564
Captulo 8
Ejemplo
Listado 8-15: Recuperando informacin sobre las medidas de la fuente
procedure TForm1.FormActivate(Sender: TObject);
var
FontInfo: TTextMetric;
// informacin sobre las medidas de la fuente
FaceName: array[0..255] of Char; // nombre de la fuente
begin
{Recupera el nombre de la fuente actualmente seleccionada y la muestra}
GetTextFace(Form1.Canvas.Handle, 256, FaceName);
Label2.Caption := FaceName;
{Recupera los atributos fsicos de la fuente seleccionada}
GetTextMetrics(Form1.Canvas.Handle, FontInfo);
{Limpia el cuadro de lista y comienza a mostrar los atributos de la fuente}
ListBox1.Items.Clear;
with FontInfo, ListBox1.Items do
begin
{Muestra las diferentes medidas de la fuente}
Label15.Caption := IntToStr(tmHeight);
Label14.Caption := IntToStr(tmAscent);
Label13.Caption := IntToStr(tmDescent);
Label12.Caption := IntToStr(tmInternalLeading);
Label11.Caption := IntToStr(tmExternalLeading);
{Muestra el ancho promedio y mximo de los caracteres}
Add('Average Char Width: ' + IntToStr(tmAveCharWidth));
Add('Max Char Width: ' + IntToStr(tmMaxCharWidth));
{Muestra los atributos de la negrita}
case tmWeight of
FW_DONTCARE:
Add('Weight: Don't care');
FW_THIN:
Add('Weight: Thin');
FW_EXTRALIGHT: Add('Weight: Extra light');
FW_LIGHT:
Add('Weight: Light');
FW_NORMAL:
Add('Weight: Normal');
FW_MEDIUM:
Add('Weight: Medium');
FW_SEMIBOLD:
Add('Weight: Semibold');
FW_BOLD:
Add('Weight: Bold');
FW_EXTRABOLD: Add('Weight: Extra bold');
FW_HEAVY:
Add('Weight: Heavy');
end;
{Muestra el ancho que sobresale}
Add('Overhang: ' + IntToStr(tmOverhang));
{Muestra los aspectos horizontal y vertical. Nota: Hay un error en la funcin
GetTextMetrics que provoca que estos dos valores sean intercambiados. El
valor AspectX es devuelto en el campo AspectY y viceversa}
Add('Digitized Aspect X: ' + IntToStr(tmDigitizedAspectY));
Add('Digitized Aspect Y: ' + IntToStr(tmDigitizedAspectX));
565
ANSI');
Default');
Symbol');
ShiftJis');
GB2312');
Hangeul');
Chinese Big5');
OEM');
8
Captulo
566
Captulo 8
Figura 8-16:
La informacin
de las medidas
de la fuente
actual
Descripcin
Trazo de fuente extrafino (100).
Trazo de fuente fino (200).
Negrita con grosor ligeramente inferior a lo normal (300).
Negrita normal (400).
Negrita con grosor ligeramente superior a lo normal (500).
Negrita ligera (600).
Negrita (700).
Negrita extra (800).
Negrita extragruesa (900).
Descripcin
Si este indicador est presente, la fuente es de pitch variable. Si
no est presente, la fuente es de pitch fijo, o monoespaciada.
Indica una fuente vectorial.
Indica una fuente True Type.
Indica una fuente de dispositivo.
Descripcin
Indica una fuente decorativa, como Old English.
El estilo general de la fuente es desconocido o no es
importante.
Indica una fuente monoespaciada con trazos de ancho
consistentes, con o sin serifs, como Courier New.
FF_SCRIPT
FF_SWISS
567
Descripcin
Indica una fuente proporcional con trazos de ancho variable y
con serifs, como Times New Roman.
Indica una fuente que imita el manuscrito, como Brush Script.
Indica una fuente proporcional con trazos de ancho variable y
sin serifs, como Arial.
RemoveFontResource
Descripcin
El conjunto de caracteres ANSI.
El conjunto de caracteres por defecto.
El conjunto de caracteres Symbol.
El conjunto de caracteres Shift-JIS.
El conjunto de caracteres GB2312.
El conjunto de caracteres coreano.
El conjunto de caracteres chino.
El conjunto de caracteres original del fabricante del equipo.
Slo Windows 95/98: El conjunto de caracteres Johab.
Slo Windows 95/98: El conjunto de caracteres hebreo.
Slo Windows 95/98: El conjunto de caracteres arbigo.
Slo Windows 95/98: El conjunto de caracteres griego.
Slo Windows 95/98: El conjunto de caracteres turco.
Slo Windows 95/98: El conjunto de caracteres vietnamita.
Slo Windows 95/98: El conjunto de caracteres Thai.
Slo Windows 95/98: El conjunto de caracteres de Europa del
Este.
Slo Windows 95/98: El conjunto de caracteres cirlico.
Slo Windows 95/98: El conjunto de caracteres Macintosh.
Slo Windows 95/98: El conjunto de caracteres bltico.
Windows.Pas
Sintaxis
RemoveFontResource(
p1: PChar
): BOOL;
8
Captulo
Valor
FF_ROMAN
568
Captulo 8
Descripcin
Esta funcin elimina los recursos de fuentes contenidos en el fichero de recursos de
fuentes especificado de la tabla interna de fuentes del sistema. Si la fuente es eliminada
con xito, la aplicacin que la elimin debe informar a las dems aplicaciones del
cambio. Esto se logra enviando un mensaje WM_FONTCHANGE mediante la funcin
SendMessage, especificando HWND_BROADCAST como valor del parmetro hWnd.
El recurso de fuente no ser eliminado hasta que no sea deseleccionado de cualquier
contexto de dispositivo.
Parmetros
p1: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del
fichero de recursos de fuentes cuyos recursos de fuentes sern eliminados de la tabla
interna de fuentes del sistema.
Vase adems
AddFontResource, CreateScalableFontResource, GetFontData, WM_FONTCHANGE
Ejemplo
Vea el Listado 8-4 bajo CreateScalableFontResource.
SetTextAlign
Windows.Pas
Sintaxis
SetTextAlign(
DC: HDC;
Flags: UINT
): UINT;
Descripcin
Esta funcin selecciona los atributos de alineacin usados cuando se dibuja texto sobre
el contexto de dispositivo especificado. La alineacin se ejecuta en base a un
rectngulo lmite que rodea los caracteres de la cadena a mostrar. Las dimensiones del
rectngulo lmite para una cadena pueden ser recuperadas llamando a
GetTextExtentPoint32. La alineacin de texto se basa en el punto de comienzo de la
cadena, segn se define en las funciones de salida de texto tales como TextOut.
Parmetros
DC: Manejador del contexto de dispositivo cuya alineacin de texto ser establecida.
569
Flags: Una combinacin de valores que indican el nuevo modo de alineacin de texto
para el contexto de dispositivo especificado. A este parmetro se le pueden asignar uno
o ms valores de la Tabla 8-43, combinndolos mediante el operador booleano or. Sin
embargo, slo puede elegirse UN indicador de aquellos que modifican la alineacin
horizontal o vertical, y slo UN indicador de aquellos que modifican la posicin actual.
Vase adems
DrawText, DrawTextEx, GetTextAlign, TabbedTextOut, TextOut
Ejemplo
Listado 8-16: Manipulando texto
var
Form1: TForm1;
HorzAlignmentValue: UINT;
VertAlignmentValue: UINT;
IntercharacterSpacing: Integer;
// alineacin horizontal
// alineacin vertical
// espaciado entre caracteres
implementation
{$R *.DFM}
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
TextAlignment: UINT;
// almacena la alineacin de texto
begin
{Asigna la alineacin de texto}
SetTextAlign(PaintBox1.Canvas.Handle,
HorzAlignmentValue or VertAlignmentValue);
{Selecciona el espaciado entre caracteres}
SetTextCharacterExtra(PaintBox1.Canvas.Handle, SpinEdit1.Value);
{Recupera y muestra el espaciado actual entre caracteres}
Label7.Caption := IntToStr(GetTextCharacterExtra(PaintBox1.Canvas.Handle));
{Selecciona el color del texto}
SetTextColor(PaintBox1.Canvas.Handle, ColorGrid1.ForegroundColor);
{Recupera y muestra el color actual del texto}
Label9.Caption := IntToHex(GetTextColor(PaintBox1.Canvas.Handle), 8);
{Dibuja algn texto (afectado por alineacin, espaciado y color) en el
contexto de dispositivo}
TextOut(PaintBox1.Canvas.Handle, PaintBox1.Width div 2,
PaintBox1.Height div 2, 'ABCabc', Length('ABCabc'));
8
Captulo
Si esta funcin tiene xito, devuelve las opciones de alineacin de texto anteriores; en
caso contrario, devuelve GDI_ERROR. Para obtener informacin ms amplia sobre
posibles errores, se debe llamar a la funcin GetLastError.
570
Captulo 8
571
Captulo
8
Figura 8-17:
Propiedades
de alineacin,
color y
espaciado
extra del texto
TA_NOUPDATECP
TA_UPDATECP
VTA_BASELINE
VTA_CENTER
Descripcin
El punto de comienzo est sobre la lnea base del texto.
El punto de comienzo est sobre el borde inferior del
rectngulo lmite del texto.
El punto de comienzo est sobre el borde superior del
rectngulo lmite del texto.
El punto de comienzo es el centro horizontal del rectngulo
lmite del texto.
El punto de comienzo est a la izquierda del rectngulo lmite
del texto.
El punto de comienzo est a la derecha del rectngulo lmite del
texto.
Slo Windows 95/98: Indica que el orden de lectura del texto es
de derecha a izquierda. Este valor slo tiene sentido cuando la
fuente seleccionada es hebrea o arbiga.
La posicin actual no se actualiza despus de dibujar texto.
La posicin actual se actualiza despus de dibujar texto.
Slo para fuentes de lnea base vertical: El punto de comienzo
est sobre la lnea base del texto.
Solo para fuentes de lnea base vertical: El punto de comienzo es
el centro vertical del rectngulo lmite del texto.
572
Captulo 8
SetTextCharacterExtra
Windows.Pas
Sintaxis
SetTextCharacterExtra(
DC: HDC;
CharExtra: Integer
): Integer;
Descripcin
Esta funcin selecciona la cantidad de espacio extra, en unidades lgicas, que se aade
entre caracteres cuando se dibuja una lnea de texto sobre el contexto de dispositivo
especificado.
Parmetros
DC: Manejador del contexto de dispositivo cuyo espaciado extra entre caracteres ser
establecido.
CharExtra: Especifica la cantidad de espacio a aadir entre caracteres, en unidades
lgicas. Si al modo de mapeado del contexto de dispositivo no se le asigna MM_TEXT,
este valor ser convertido al modo de mapeado actual y redondeado a la cantidad de
pxeles ms cercana.
Vase adems
DrawText, DrawTextEx, GetTextCharacterExtra, TextOut
Ejemplo
Vea el Listado 8-16 bajo SetTextAlign.
SetTextColor
Windows.Pas
Sintaxis
SetTextColor(
DC: HDC;
Color: COLORREF
): COLORREF;
Descripcin
Esta funcin selecciona el color a utilizar cuando se dibuje texto sobre el contexto de
dispositivo identificado por el parmetro DC.
573
Parmetros
DC: Manejador del contexto de dispositivo cuyo color de texto ser establecido.
Color: Especificador de color de 32 bits que define el nuevo color para dibujar el texto.
El color que realmente ser usado es el ms cercano al especificado en la paleta activa
del contexto de dispositivo especificado.
Si la funcin tiene xito, devuelve el especificador del color de texto anterior; en caso
contrario, devuelve CLR_INVALID. Para obtener informacin ms amplia sobre
posibles errores, se debe llamar a la funcin GetLastError.
Vase adems
DrawText, DrawTextEx, GetTextColor, RealizePalette, RGB, SetBkColor, SetBkMode,
TabbedTextOut, TextOut
Ejemplo
Vea el Listado 8-16 bajo SetTextAlign.
SetTextJustification
Windows.Pas
Sintaxis
SetTextJustification(
DC: HDC;
BreakExtra: Integer;
BreakCount: Integer
): Integer;
Descripcin
Esta funcin especifica la cantidad de espacio extra, en unidades lgicas, que debe ser
aadido a cada carcter de ruptura cuando se dibujan cadenas de caracteres en el
contexto de dispositivo especificado. La mayora de las fuentes utilizan como carcter
de ruptura el espacio ( ), pero algunas fuentes no latinas pueden definir un carcter
diferente. Utilice la funcin GetTextMetrics para recuperar cualquier carcter de
ruptura especfico definido para la fuente. La funcin GetTextExtentPoint32 puede ser
usada para recuperar el ancho del texto de salida, de manera que el espaciado extra
apropiado pueda ser determinado. La funcin TextOut distribuye el espaciado extra
proporcionalmente entre los caracteres de ruptura de una lnea de texto de salida.
Parmetros
DC: Manejador del contexto de dispositivo cuyo espaciado extra para justificacin de
de texto ser seleccionado.
8
Captulo
574
Captulo 8
BreakExtra: Especifica el total de espacio extra que ser aadido a las lneas de salida
de texto, en unidades lgicas. Si el modo de mapeado del contexto de dispositivo actual
no es MM_TEXT, este valor ser convertido al modo de mapeado actual y redondeado a
la cantidad de pxeles ms cercana.
BreakCount: Especifica la cantidad total de caracteres de ruptura en la cadena que ser
justificada.
Vase adems
DrawText, DrawTextEx, GetTextExtentExPoint, GetTextExtentPoint32, GetTextMetrics,
TextOut
Ejemplo
Vea el Listado 8-14 bajo GetTextExtentExPoint.
TabbedTextOut
Windows.Pas
Sintaxis
TabbedTextOut(
hDC: HDC;
{manejador de contexto de dispositivo}
X: Integer;
{origen horizontal del texto}
Y: Integer;
{origen vertical del texto}
lpString: PChar;
{cadena a dibujar sobre el contexto de dispositivo}
nCount: Integer;
{nmero de caracteres en la cadena}
nTabPositions: Integer;
{nmero de entradas en el array de tabulaciones}
lpnTabStopPositions: Pointer
{puntero a un array de posiciones de tabulacin}
nTabOrigin: Integer
{origen horizontal de las tabulaciones}
): Longint;
{devuelve las dimensiones de la cadena}
Descripcin
Esta funcin muestra la cadena de caracteres apuntada por lpString sobre el contexto
de dispositivo identificado por el parmetro hDC, expandiendo cualquier carcter de
tabulacin en la cadena a la parada de tabulacin indicada en el array de enteros al que
apunta el parmetro lpnTabStopPositions. Las tabulaciones son expandidas a los
valores en este array cuando son encontradas, con el primer carcter de tabulacin en
la cadena expandido a la posicin indicada por la primera entrada del array, el segundo
carcter de tabulacin en la cadena expandido a la posicin indicada por la segunda
entrada en el array, y as sucesivamente. La fuente actualmente seleccionada en el
contexto de dispositivo es utilizada para dibujar el texto. La funcin no actualizar la
575
posicin actual, a menos que la funcin SetTextAlign haya sido llamada antes con la
opcin TA_UPDATECP especificada.
Parmetros
hDC: Manejador del contexto de dispositivo sobre el cual el texto es dibujado.
Vase adems
DrawText, DrawTextEx, GetTabbedTextExtent, GrayString, SetTextAlign, TextOut
Ejemplo
Listado 8-17: Mostrando texto en forma de tabla
{OJO! Delphi importa incorrectamente estas funciones. Tenemos que importarlas
manualmente para obtener toda su funcionalidad}
8
Captulo
576
Captulo 8
577
3, @TabStops, 0);
end;
8
Captulo
Figura 8-18:
Salida de texto
con
tabulaciones
TextOut
Windows.Pas
Sintaxis
TextOut(
DC: HDC;
X: Integer;
Y: Integer;
Str: PChar;
Count: Integer
): BOOL;
Descripcin
Esta funcin muestra la cadena de texto especificada sobre el contexto de dispositivo
identificado por el parametro DC. La fuente actualmente seleccionada en el contexto de
dispositivo es utilizada para dibujar el texto. La funcin no actualizar la posicin
actual, a menos que la funcin SetTextAlign haya sido llamada antes con la opcin
TA_UPDATECP especificada.
Parmetros
DC: Manejador del contexto de dispositivo sobre el cual el texto es dibujado.
X: La coordenada horizontal de la lnea de texto de salida, en unidades lgicas. Si la
posicin actual del contexto de dispositivo va a ser actualizada, este parmetro ser
ignorado en las llamadas subsiguientes.
578
Captulo 8
Vase adems
DrawText, DrawTextEx, GetTextAlign, SetTextAlign, TabbedTextOut
Ejemplo
Vea el Listado 8-2 bajo CreateFont, y otros ejemplos a lo largo de este captulo.
Funciones de recursos
579
Captulo 9
Funciones de recursos
Tenga en cuenta que algunos ejemplos de este captulo tendrn listados adicionales
para los ficheros de descripcin de recursos.
Creando recursos
Para usar recursos, el desarrollador tiene primero que crear un fichero de descripcin
de recursos (resource script file). Estos ficheros son algo ms que simples ficheros de
texto con extensin .RC. Un fichero de descripcin de recursos puede ser creado
manualmente usando el Bloc de Notas. Sin embargo, Borland ofrece un producto
llamado Resource Workshop1 que permite simplificar enormemente la creacin de
ficheros de recursos. Este producto incluye editores para todos los tipos estndar de
recursos, tales como mapas de bits, y permite crear ficheros de recursos compilados
tanto para aplicaciones de 16 bits como para aplicaciones de 32 bits. La descripcin de
esta herramienta de creacin de recursos va ms all del alcance de este libro.
9
Captulo
580
Captulo 9
Una vez que un fichero de descripcin de recursos ha sido creado, debe ser compilado
a un formato binario que es utilizado por el enlazador de Delphi para incrustar los
recursos en un fichero ejecutable. El Resource Workshop puede compilar ficheros de
recursos desde su entorno integrado. Para aquellos que no posean este producto, Delphi
incluye un compilador de recursos de lnea de comandos DOS, llamado BRCC32.EXE,
ubicado en directorio BIN. Para compilar un fichero de descripcin de recursos, pase el
nombre del fichero como argumento a BRCC32 en la lnea de comandos (por ejemplo,
BRCC32 <ficheroDescripcinRecursos>.RC). Esto crear un fichero con el mismo
nombre del fichero fuente, pero con extensin .RES. Este fichero contiene los recursos
binarios compilados que sern enlazados con la aplicacin.
Funciones de recursos
581
Usando recursos
Descripcin
Carga un recurso de mapa de bits, devolviendo un manejador de
mapa de bits.
Carga un recurso de cursor, devolviendo un manejador de
cursor.
Carga un recurso de icono, devolviendo un manejador de icono.
Carga un recurso de icono, cursor, o mapa de bits, devolviendo
un manejador de icono, cursor, o mapa de bits.
Carga un recurso de cadena desde una tabla de cadenas,
almacenndola en un buffer de cadena de caracteres terminada
en nulo.
9
Captulo
Para hacer uso de un recurso, una aplicacin tiene primero que recuperar un manejador
mediante las funciones FindResource o FindResourceEx. Entonces se debe cargar el
recurso en memoria pasndole este manejador a la funcin LoadResource, que a su vez
devuelve un manejador del bloque de memoria global que contiene el recurso. Por
ltimo, la aplicacin debe recuperar un puntero al recurso, pasndole el manejador de
memoria global obtenido a la funcin LockResource. Observe que bajo el API Win32
ya no es necesario desbloquear un recurso bloqueado o liberar un recurso cargado
mediante la funcin LoadResource.
582
Captulo 9
Los recursos definidos por el usuario de mltiples lneas (compuestos) son tambin
muy fciles de crear y usar. En este caso, se debe utilizar el tipo de recurso estndar
Funciones de recursos
583
RCDATA define un recurso multilinea de usuario, y los valores que se coloquen entre
los bloques BEGIN y END de tales definiciones de recursos pueden contener los datos
que se deseen. Repetimos que no existe otra forma de cargar estos recursos que la
secuencia FindResource, LoadResource y LockResource. Al igual que en el caso de
los recursos definidos por el usuario de una sola lnea, la aplicacin debe tener un
conocimiento profundo del formato de los datos del recurso. El siguiente ejemplo
muestra cmo usar recursos definidos por el usuario de mltiples lneas.
Listado 9-3: Fichero de recursos definidos por el usuario de mltiples lneas
CustomInfo RCDATA
BEGIN
0x0000001B,
"John Ayres\0",
"Lead Author\0",
END
implementation
{$R *.DFM}
{$R CustomInfo.RES}
procedure TForm1.Button1Click(Sender: TObject);
var
TheResource: HRSRC;
// manejador del recurso
TheInfo: Pointer;
// puntero al recurso
begin
{Encuentra y carga el recurso que deber ser un recurso multilnea, definido por
el usuario}
TheResource := LoadResource(hInstance, FindResource(hInstance, 'CustomInfo',
RT_RCDATA));
{Recupera un puntero al recurso}
TheInfo := LockResource(TheResource);
{Extrae el primer elemento del recurso definido por el usuario (una edad)}
Label1.Caption := IntToStr(LongInt(TheInfo^));
{Extrae el segundo elemento del recurso definido por el usuario (un nombre en
forma de cadena de caracteres terminada en nulo)}
TheInfo := Pointer(LongInt(TheInfo) + SizeOf(LongInt));
Label2.Caption := PChar(TheInfo);
{Extrae el tercer elemento del recurso definido por el usuario (un ttulo en
forma de una cadena de caracteres terminada en nulo). Observe que aadimos uno a
la longitud de la cadena anterior para posicionar el puntero ms all del
terminador nulo de la primera cadena.}
TheInfo := Pointer(LongInt(TheInfo) + StrLen(TheInfo) + 1);
Label3.Caption := PChar(TheInfo);
end;
9
Captulo
584
Captulo 9
Figura 9-1:
El recurso
definido por el
usuario
Funciones de recursos
En este captulo se describen las siguientes funciones de recursos:
Tabla 9-2: Funciones de recursos
Funcin
EnumResourceLanguages
EnumResourceNames
EnumResourceTypes
FindResource
FindResourceEx
LoadResource
LoadString
LockResource
MakeIntResource
SizeofResource
EnumResourceLanguages
Descripcin
Enumera todos los idiomas en los cuales un recurso
especfico est disponible.
Enumera todos los recursos accesibles de un tipo de
recursos especfico.
Enumera todos los tipos de recursos accesibles en un
mdulo especfico.
Encuentra un recurso especfico.
Encuentra un recurso especfico para un idioma
especfico.
Carga un recurso.
Carga una cadena desde una tabla de cadenas.
Obtiene un puntero a los datos de un recurso.
Convierte un identificador de recurso entero en un valor
adecuado para ser usado en las funciones de recursos.
Recupera el tamao de un recurso.
Windows.Pas
Sintaxis
EnumResourceLanguages(
hModule: HMODULE;
lpType: Pchar;
lpName: Pchar;
lpEnumFunc: ENUMRESLANGPROC;
lParam: LongInt
): BOOL;
Funciones de recursos
585
Descripcin
Esta funcin enumera todos los recursos que se corresponden con el tipo y nombre
especificado, para todos los idiomas en los cuales el recurso est disponible, pasando el
idioma de cada recurso hallado a la funcin de respuesta a la que apunta el parmetro
lpEnumFunc. La enumeracin continuar hasta que la funcin de respuesta devuelva el
valor FALSE o todos los recursos hayan sido enumerados.
Parmetros
hModule: Especifica el manejador de instancia del mdulo que contiene los recursos
que sern enumerados. Si a este parmetro se le asigna cero, la funcin enumera los
recursos asociados con el proceso que hace la llamada.
lpName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre
del recurso a enumerar. Para especificar un recurso mediante su identificador entero, la
palabra ms significativa del puntero deber ser cero, y la menos significativa deber
contener el valor del identificador del recurso. Ese valor puede construirse usando la
funcin MakeIntResource. Alternativamente, un recurso puede expresarse en forma de
una cadena de caracteres en la que el primer carcter es la almohadilla (#), seguida
por el identificador entero del recurso (por ejemplo, #256).
lpEnumFunc: Puntero a la funcin de respuesta, que ser llamada una vez por cada
recurso que se corresponda con el nombre y tipo especificados.
lParam: Un valor de 32 bits definido por la aplicacin que es pasado a la funcin de
respuesta.
9
Captulo
lpType: Puntero a una cadena de caracteres terminada en nulo que contiene el tipo de
recurso a enumerar. Este parmetro puede apuntar a una cadena que contiene un tipo de
recurso definido por el usuario, o puede contener un valor de la Tabla 9-3. Para
especificar un tipo de recurso mediante su identificador entero, la palabra ms
significativa del puntero deber ser cero, y la menos significativa deber contener el
valor del identificador del tipo de recurso. Ese valor puede construirse usando la
funcin MakeIntResource. Alternativamente, un tipo de recurso puede expresarse en
forma de una cadena de caracteres en la que el primer carcter es la almohadilla (#),
seguida por el identificador entero del tipo de recurso (por ejemplo, #256).
586
Captulo 9
lpszName: PChar;
wIDLanguage: LANGID;
lParam: LongInt
):BOOL;
Descripcin
Esta funcin de respuesta recibe un identificador de idioma por cada idioma en el que
un nombre y tipo de recurso especficos estn disponibles. Esta funcin de respuesta
puede ejecutar cualquier tarea que se estime necesaria.
Parmetros
hModule: Manejador de instancia del mdulo que contiene los recursos que sern
enumerados, pasado a travs del parmetro hModule de la funcin
EnumResourceLanguages.
lpszType: Puntero a una cadena de caracteres terminada en nulo que contiene el tipo de
recurso a enumerar, pasado a travs del parmetro lpType de la funcin
EnumResourceLanguages. Si el tipo de recurso es especificado en forma de un
identificador entero, la palabra ms significativa de este puntero tendr valor cero, y la
palabra menos significativa contendr el identificador entero del tipo de recurso.
lpszName: Puntero a una cadena de caracteres terminada en nulo que contiene el
nombre del recurso a enumerar, pasado a travs del parmetro lpName de la funcin
EnumResourceLanguages. Si el tipo de recurso es especificado en forma de un
identificador entero, la palabra ms significativa de este puntero tendr valor cero y la
palabra menos significativa contendr el identificador entero del recurso.
wIDLanguage: El identificador de idioma de un idioma para el que est disponible el
recurso indicado.
lParam: El valor de 32 bits definido por la aplicacin pasado a travs del parmetro
lParam de la funcin EnumResourceLanguages. Este valor se suministra para uso
especfico de la aplicacin dentro de la funcin de respuesta.
Vase adems
EnumResourceNames, EnumResourceTypes
Ejemplo
Listado 9-5: Fichero de recursos multilinge
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
Hello BITMAP "hienglsh.bmp"
Funciones de recursos
587
Listado 9-6: Enumerando todos los idiomas en que un recurso especfico est disponible
var
Form1: TForm1;
NumResources: Integer;
9
Captulo
588
Captulo 9
Figura 9-2:
Todos los
idiomas en los
que un
recurso de
mapa de bits
especfico est
disponible
Descripcin
Un recurso de tabla de aceleradores.
Un recurso de cursor animado.
Un recurso de icono animado.
Un recurso de mapa de bits.
Funciones de recursos
RT_CURSOR
RT_DIALOG
RT_FONT
RT_FONTDIR
RT_GROUP_CURSOR
RT_GROUP_ICON
RT_ICON
RT_MENU
RT_MESSAGETABLE
RT_RCDATA
RT_STRING
RT_VERSION
EnumResourceNames
589
Windows.Pas
EnumResourceNames(
hModule: HMODULE;
lpType: PChar;
lpEnumFunc: ENUMRESNAMEPROC;
lParam: Longint
): BOOL;
Descripcin
Esta funcin enumera todos los recursos del tipo especificado por el parmetro lpType,
pasando el nombre de cada recurso encontrado a la funcin de respuesta a la que apunta
el parmetro lpEnumFunc. Los recursos continuarn siendo enumerados hasta que la
funcin de respuesta devuelva FALSE o todos los recursos hayan sido enumerados.
Parmetros
hModule: Manejador de instancia del mdulo que contiene los recursos a ser
enumerados. Si a este parmetro se le asigna cero, la funcin enumera los recursos
asociados al proceso que hace la llamada.
lpType: Puntero a una cadena de caracteres terminada en nulo que contiene el tipo de
recurso a enumerar. Este parmetro puede apuntar a una cadena que contiene un tipo de
recurso definido por el usuario, o puede contener un valor de la Tabla 9-4. Para
especificar un tipo de recurso mediante su identificador entero, la palabra ms
significativa del puntero deber ser cero, y la menos significativa deber contener el
valor del identificador del tipo de recurso. Ese valor puede construirse usando la
funcin MakeIntResource. Alternativamente, un tipo de recurso puede expresarse en
forma de una cadena de caracteres en la que el primer carcter es la almohadilla (#),
seguida por el identificador entero del tipo de recurso (por ejemplo, #256).
Captulo
Sintaxis
590
Captulo 9
lpEnumFunc: Puntero a una funcin de respuesta que ser llamada una vez por cada
recurso que se corresponda con el tipo especificado.
lParam: Un valor de 32 bits definido por la aplicacin que es pasado a la funcin de
respuesta.
Descripcin
Esta funcin recupera el nombre de cada recurso del tipo especificado por el parmetro
lpszType perteneciente al mdulo identificado por el parmetro hModule. Esta funcin
de respuesta puede ejecutar cualquier tarea que se estime necesaria.
Parmetros
hModule: Manejador de instancia del mdulo que contiene los recursos que sern
enumerados, pasado a travs del parmetro hModule de la funcin
EnumResourceNames.
lpszType: Puntero a una cadena de caracteres terminada en nulo que contiene el tipo de
recurso a enumerar, pasado a travs del parmetro lpType de la funcin
EnumResourceNames. Si el tipo de recurso es especificado en forma de un
identificador entero, la palabra ms significativa de este puntero tendr valor cero, y la
palabra menos significativa contendr el identificador entero del tipo de recurso.
lpszName: Puntero a una cadena de caracteres terminada en nulo que contiene el
nombre del recurso a enumerar, del tipo especificado a travs del parmetro lpszType.
Si el tipo de recurso es especificado en forma de un identificador entero, la palabra ms
significativa de este puntero tendr valor cero, y la palabra menos significativa
contendr el identificador entero del recurso.
lParam: El valor de 32 bits definido por la aplicacin pasado a travs del parmetro
lParam de la funcin EnumResourceNames. Este valor se suministra para uso
especfico de la aplicacin dentro de la funcin de respuesta.
Funciones de recursos
591
Vase adems
EnumResourceLanguages, EnumResourceTypes
Ejemplo
Consulte el Listado 9-7 bajo EnumResourceTypes.
Tabla 9-4: Valores del parmetro lpType de EnumResourceNames
y lpszType de EnumResNameProc.
EnumResourceTypes
Descripcin
Un recurso de tabla de aceleradores.
Un recurso de cursor animado.
Un recurso de icono animado.
Un recurso de mapa de bits.
Un recurso de cursor dependiente del hardware.
Un recurso de cuadro de dilogo.
Un recurso de fuente.
Un recurso de directorio de fuentes.
Un recurso de cursor independiente del hardware.
Un recurso de icono independiente del hardware.
Un recurso de icono dependiente del hardware.
Un recurso de men.
Un recurso de tabla de mensajes.
Un recurso definido por la aplicacin.
Un recurso de tabla de cadenas.
Un recurso de informacin de versin.
Windows.Pas
Sintaxis
EnumResourceTypes(
hModule: HMODULE;
{manejador de instancia del mdulo}
lpEnumFunc: ENUMRESTYPEPROC; {puntero a funcin de respuesta}
lParam: LongInt
{valor definido por la aplicacin}
): BOOL;
{devuelve TRUE o FALSE}
9
Captulo
Valor
RT_ACCELERATOR
RT_ANICURSOR
RT_ANIICON
RT_BITMAP
RT_CURSOR
RT_DIALOG
RT_FONT
RT_FONTDIR
RT_GROUP_CURSOR
RT_GROUP_ICON
RT_ICON
RT_MENU
RT_MESSAGETABLE
RT_RCDATA
RT_STRING
RT_VERSION
592
Captulo 9
Descripcin
Esta funcin recorre todos los recursos pertenecientes al mdulo identificado por el
parmetro hModule. Para cada tipo de recurso diferente que se encuentre en el mdulo,
se pasar una cadena de caracteres correspondiente al tipo de recurso a la funcin de
respuesta a la que apunta el parmetro lpEnumFunc. Los recursos continuarn siendo
enumerados hasta que la funcin de respuesta devuelva FALSE o todos los recursos
hayan sido enumerados.
Parmetros
hModule: Manejador de instancia del mdulo que contiene los recursos que sern
enumerados. Si a este parmetro se le asigna cero, la funcin enumera los recursos
asociados al proceso que hace la llamada.
lpEnumFunc: Puntero a la funcin de respuesta que ser llamada una vez por cada tipo
de recurso encontrado.
lParam: Un valor de 32 bits definido por la aplicacin, que es pasado a la funcin de
respuesta.
Descripcin
Esta funcin recibe una cadena de caracteres que contiene el nombre del tipo de
recurso para cada tipo de recurso diferente hallado en el mdulo identificado por el
parmetro hModule. Esta funcin de respuesta puede ejecutar cualquier tarea que se
estime necesaria.
Parmetros
hModule: Manejador de instancia del mdulo que contiene los recursos que sern
enumerados, pasado al parmetro hModule de la funcin EnumResourceTypes.
lpszType: Puntero a una cadena de caracteres terminada en nulo, que contiene un tipo
de recurso encontrado en el mdulo especificado. Esta cadena puede contener un
nombre de tipo de recurso definido por el usuario o un valor de la Tabla 9-5. Si el tipo
de recurso es especificado en forma de un identificador entero, la palabra ms
Funciones de recursos
593
Vase adems
EnumResourceLanguages, EnumResourceNames
Ejemplo
9
Captulo
Listado 9-7: Enumerando los tipos y nombres de todos los recursos incluidos
594
Captulo 9
LongInt(RT_FONTDIR)
LongInt(RT_FONT)
LongInt(RT_ACCELERATOR)
LongInt(RT_RCDATA)
LongInt(RT_MESSAGETABLE)
LongInt(RT_GROUP_CURSOR)
LongInt(RT_GROUP_ICON)
LongInt(RT_VERSION)
LongInt(RT_DLGINCLUDE)
LongInt(RT_PLUGPLAY)
LongInt(RT_VXD)
LongInt(RT_ANICURSOR)
LongInt(RT_ANIICON)
else
TypeName := lpszType;
end;
:
:
:
:
:
:
:
:
:
:
:
:
:
Typename
Typename
Typename
Typename
Typename
Typename
Typename
Typename
Typename
Typename
Typename
Typename
Typename
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
'Font Directory';
'Font';
'Accelerator';
'RC Data';
'Message Table';
'Cursor Group';
'Icon Group';
'Version Table';
'Dialog Include';
'Plug and Play';
'VXD';
'Animated Cursor';
'Animated Icon';
Figura 9-3:
Recursos
estndar
incluidos en
un proyecto
Delphi
Funciones de recursos
595
FindResource
Descripcin
Un recurso de tabla de aceleradores.
Un recurso de cursor animado.
Un recurso de icono animado.
Un recurso de mapa de bits.
Un recurso de cursor dependiente del hardware.
Un recurso de cuadro de dilogo.
Un recurso de fuente.
Un recurso de directorio de fuentes.
Un recurso de cursor independiente del hardware.
Un recurso de icono independiente del hardware.
Un recurso de icono dependiente del hardware.
Un recurso de men.
Un recurso de tabla de mensajes.
Un recurso definido por la aplicacin.
Un recurso de tabla de cadenas.
Un recurso de informacin de versin.
Windows.Pas
Sintaxis
FindResource(
hModule: HMODULE;
lpName: PChar;
lpType: PChar
): HRSRC;
Descripcin
Esta funcin localiza dentro del mdulo especificado por el parmetro hModule el
recurso con el nombre y el tipo indicados en los parmetros lpName y lpType. El
manejador devuelto por esta funcin es usado por la funcin LoadResource.
9
Captulo
Valor
RT_ACCELERATOR
RT_ANICURSOR
RT_ANIICON
RT_BITMAP
RT_CURSOR
RT_DIALOG
RT_FONT
RT_FONTDIR
RT_GROUP_CURSOR
RT_GROUP_ICON
RT_ICON
RT_MENU
RT_MESSAGETABLE
RT_RCDATA
RT_STRING
RT_VERSION
596
Captulo 9
Parmetros
hModule: Manejador de instancia del mdulo que contiene el recurso a buscar. Si a este
parmetro se le asigna cero, la funcin busca los recursos asociados al proceso que
hace la llamada.
lpName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre
del recurso a buscar. Para especificar un identificador entero de recurso, la palabra ms
significativa de este puntero deber ser cero, y la menos significativa deber contener
el identificador entero del nombre de recurso. Esto puede lograrse utilizando la funcin
MakeIntResource. Alternativamente, un identificador entero puede expresarse en forma
de una cadena de caracteres en la que el primer carcter es la almohadilla (#), seguida
por el identificador entero del tipo de recurso (por ejemplo, #256).
lpType: Puntero a una cadena de caracteres terminada en nulo que contiene el tipo del
recurso a encontrar. Este parmetro puede apuntar a una cadena que contiene un tipo de
recurso definido por el usuario, o puede contener un valor de la Tabla 9-6. Para
especificar un tipo de recurso mediante su identificador entero, la palabra ms
significativa del puntero deber ser cero, y la menos significativa deber contener el
valor del identificador del tipo de recurso. Ese valor puede construirse usando la
funcin MakeIntResource. Alternativamente, un identificador entero puede expresarse
en forma de una cadena de caracteres en la que el primer carcter es la almohadilla
(#), seguida por el identificador entero del tipo de recurso (por ejemplo, #256).
Vase adems
FindResourceEx, FormatMessage, LoadBitmap, LoadCursor, LoadIcon, LoadResource,
LoadString, LockResource, SizeofResource
Ejemplo
Consulte el Listado 9-2 y el Listado 9-4 bajo los ejemplos de recursos definidos por el
usuario en la introduccin del captulo.
Tabla 9-6: Valores del parmetro lpType de FindResource
Valor
RT_ACCELERATOR
RT_ANICURSOR
RT_ANIICON
RT_BITMAP
Descripcin
Un recurso de tabla de aceleradores.
Un recurso de cursor animado.
Un recurso de icono animado.
Un recurso de mapa de bits.
Funciones de recursos
RT_CURSOR
RT_DIALOG
RT_FONT
RT_FONTDIR
RT_GROUP_CURSOR
RT_GROUP_ICON
RT_ICON
RT_MENU
RT_MESSAGETABLE
RT_RCDATA
RT_STRING
RT_VERSION
FindResourceEx
597
Windows.Pas
FindResourceEx(
hModule: HMODULE;
lpType: PChar;
lpName: PChar;
wLanguage: Word
): HRSRC;
Descripcin
Esta funcin localiza dentro del mdulo especificado por el parmetro hModule el
recurso con el nombre, tipo e idioma indicados. El manejador devuelto por esta funcin
es usado por la funcin LoadResource.
Parmetros
hModule: Manejador de instancia del mdulo que contiene el recurso a buscar. Si a este
parmetro se le asigna cero, la funcin busca los recursos asociados al proceso que
hace la llamada.
lpType: Puntero a una cadena de caracteres terminada en nulo que contiene el tipo del
recurso a encontrar. Este parmetro puede apuntar a una cadena que contiene un tipo de
recurso definido por el usuario, o puede contener un valor de la Tabla 9-7. Para
especificar un tipo de recurso mediante su identificador entero, la palabra ms
significativa del puntero deber ser cero, y la menos significativa deber contener el
valor del identificador del tipo de recurso. Ese valor puede construirse usando la
funcin MakeIntResource. Alternativamente, un identificador entero puede expresarse
Captulo
Sintaxis
598
Captulo 9
Vase adems
FindResource, FormatMessage, LoadBitmap, LoadCursor, LoadIcon, LoadResource,
LoadString, LockResource, SizeofResource
Ejemplo
Consulte el Listado 9-6, correspondiente a la funcin EnumResourceLanguages.
Tabla 9-7: Valores del parmetro lpType de FindResourceEx
Valor
RT_ACCELERATOR
RT_ANICURSOR
RT_ANIICON
RT_BITMAP
RT_CURSOR
RT_DIALOG
RT_FONT
RT_FONTDIR
RT_GROUP_CURSOR
RT_GROUP_ICON
RT_ICON
RT_MENU
RT_MESSAGETABLE
Descripcin
Un recurso de tabla de aceleradores.
Un recurso de cursor animado.
Un recurso de icono animado.
Un recurso de mapa de bits.
Un recurso de cursor dependiente del hardware.
Un recurso de cuadro de dilogo.
Un recurso de fuente.
Un recurso de directorio de fuentes.
Un recurso de cursor independiente del hardware.
Un recurso de icono independiente del hardware.
Un recurso de icono dependiente del hardware.
Un recurso de men.
Un recurso de tabla de mensajes.
Funciones de recursos
RT_RCDATA
RT_STRING
RT_VERSION
599
LoadResource
Windows.Pas
Sintaxis
LoadResource(
hModule: HINST;
hResInfo: HRSRC
): HGLOBAL;
Descripcin
Parmetros
hModule: Manejador de instancia del mdulo que contiene el recurso que ser cargado.
Si a este parmetro se le asigna cero, la funcin carga el recurso desde el proceso que
hace la llamada.
hResInfo: Manejador del bloque de informacin del recurso. Este manejador es
recuperado por las funciones FindResource y FindResourceEx.
Vase adems
FindResource, FindResourceEx, LoadLibrary, LockResource, SizeofResource
Ejemplo
Consulte el Listado 9-11 bajo MakeIntResource.
LoadString
Sintaxis
LoadString(
Windows.Pas
9
Captulo
600
Captulo 9
hInstance: HINST;
uID: UINT;
lpBuffer: PChar;
nBufferMax: Integer
): Integer;
Descripcin
Esta funcin recupera la cadena asociada con el identificador entero especificado por
los recursos asociados al mdulo identificado por el parmetro hInstance. La funcin
aade un terminador nulo a la cadena cuando sta es colocada en el buffer.
Parmetros
hInstance: Manejador de instancia del mdulo que contiene la cadena que ser cargada.
Si a este parmetro se le asigna cero, la funcin carga la cadena desde los recursos del
proceso que hace la llamada.
uID: El identificador entero de la cadena a cargar.
lpBuffer: Puntero al buffer de cadena de caracteres terminada en nulo, reservado por la
aplicacin, que recibir el recurso de cadena.
nBufferMax: Especifica el tamao del buffer al que apunta el parmetro lpBuffer, en
caracteres. Si el recurso de cadena es ms largo que este valor, es truncado.
Vase adems
FindResource, FindResourceEx, LoadBitmap, LoadCursor, LoadIcon, LoadResource,
LockResource.
Ejemplo
Listado 9-8: Fichero de recursos que contiene una tabla de cadenas
STRINGTABLE
{
1, "An error has occurred."
2, "A really, really bad error has occurred."
3, "A massive, critical error has occurred."
}
Listado 9-9: Utilizando una tabla de cadenas para almacenar mensajes de error
implementation
{$R *.DFM}
{$R Strings.RES}
Funciones de recursos
601
9
Captulo
Figura 9-4:
La cadena
cargada
LockResource
Windows.Pas
Sintaxis
LockResource(
hResData: HGLOBAL
): Pointer;
Descripcin
Esta funcin bloquea un recurso en memoria, devolviendo un puntero al primer byte de
los datos del recurso. Esta funcin es llamada pasndole como parmetro el valor
devuelto por la funcin LoadResource. No es necesario desbloquear los recursos
bloqueados mediante esta funcin.
Parmetros
hResData: Manejador del bloque de memoria global que contiene los datos del recurso.
Este manejador es devuelto por la funcin LoadResource.
602
Captulo 9
Vase adems
FindResource, FindResourceEx, LoadResource
Ejemplo
Consulte el Listado 9-11, correspondiente a la funcin MakeIntResource.
MakeIntResource
Windows.Pas
Sintaxis
MakeIntResource(
wInteger: Integer
): PChar;
{identificador de recurso}
{devuelve el identificador del recurso}
Descripcin
Esta funcin convierte un identificador entero de recurso en un valor que puede ser
utilizado en los parmetros de nombres y tipos de recursos de las funciones del API.
Parmetros
wInteger: El identificador entero del recurso.
Vase adems
EnumResourceLanguages, EnumResourceNames, FindResource, FindResourceEx
Ejemplo
Listado 9-10: El fichero de recursos de ejemplo de MakeIntResource
#define CoolPic 256
CoolPic BITMAP "image6.bmp"
Funciones de recursos
603
{Encuentra y carga el recurso del mapa de bits, especificando el nombre como una
cadena identificada por el identificador entero del recurso}
ResHandle := LoadResource(hInstance, FindResource(hInstance, '#256',
RT_BITMAP));
{Recupera el tamao del recurso, esta vez, encuentra el recurso especificando el
nombre como un identificador entero usando MakeIntResource, este otro mtodo es
perfectamente correcto}
ResSize := SizeofResource(hInstance, FindResource(hInstance,
MakeIntResource(256), RT_BITMAP));
{Recupera un puntero a los datos del recurso}
ResPointer := LockResource(ResHandle);
{Crea un flujo en memoria e inicializa su tamao para almacenar el recurso
entero y la informacin del encabezamiento del fichero del mapa de bits}
InfoStream := TMemoryStream.Create;
InfoStream.SetSize(ResSize + SizeOf(TBitmapFileHeader));
{Escribe el encabezamiento del fichero del mapa de bits al flujo en memoria}
InfoStream.Write(FileHeader, SizeOf(TBitmapFileHeader));
{Escribe los datos del recurso al flujo en memoria}
InfoStream.Write(ResPointer^, ResSize);
{Reposiciona el puntero del flujo al principio}
InfoStream.Seek(0, 0);
9
Captulo
{Esta funcin carga un recurso de mapa de bits de 256 colores mientras mantiene
su paleta original. Esta funcionalidad est ahora presente en los mtodos
LoadFromResourceID y LoadFromResourceName de la clase TBitmap.
Este ejemplo debe ejecutarse bajo una configuracin de vdeo de 256 colores
para apreciar completamente sus efectos}
procedure TForm1.Button1Click(Sender: TObject);
var
ResHandle: HGLOBAL;
// manejador del recurso cargado
ResPointer: Pointer;
// puntero a los datos del recurso
FileHeader: TBitmapFileHeader; // almacena informacin sobre el encabezamiento
// del fichero de un mapa de bits
ResSize: LongInt;
// almacena el tamao del recurso
InfoStream: TMemoryStream;
// usado para cargar el recurso en un mapa de
// bits
begin
{Inicializa el encabezamiento del tipo del fichero con los caracteres 'BM'.
Este es el nico campo del encabezamiento del mapa de bits que requiere
inicializacin}
FileHeader.bfType := $4D42;
604
Captulo 9
Figura 9-5:
El recurso de
mapa de bits
cargado
SizeofResource
Windows.Pas
Sintaxis
SizeofResource(
hModule: HINST;
hResInfo: HRSRC
): DWORD;
Descripcin
Esta funcin recupera el tamao del recurso especificado por el parmetro hResInfo,
en bytes. Esta funcin utiliza como parmetro el manejador devuelto por las funciones
FindResource o FindResourceEx. El valor devuelto por esta funcin puede ser mayor
que el tamao real del recurso debido a la alineacin de la memoria.
Parmetros
hModule: Manejador de instancia del mdulo que contiene el recurso. Si a este
parmetro se le asigna cero, la funcin utiliza los recursos del proceso que hace la
llamada.
hResInfo: Manejador del recurso cuyo tamao se desea recuperar. Este manejador es
devuelto por las funciones FindResource y FindResourceEx.
Funciones de recursos
605
Vase adems
FindResource, FindResourceEx, LoadResource, LockResource
Ejemplo
Consulte el Listado 9-11 bajo MakeIntResource.
Captulo
607
Captulo 10
Funciones de movimiento de
ventanas
El API Win32 incluye un grupo de funciones que permiten al desarrollador controlar
desde su aplicacin el tamao y la posicin de las ventanas. Si bien una ventana puede
ser fcilmente movida o redimensionada utilizando las propiedades Left, Top, Width, o
Height de la clase TForm, estas funciones proporcionan al desarrollador un control que
se extiende mucho ms all de lo que Delphi ofrece.
Figura 10-1:
El orden Z de
las ventanas
10
Captulo
Orden Z
608
Captulo 10
Windows mantiene el orden Z de todas las ventanas en una lista nica. El orden Z de
una ventana est determinado por el orden en que apareci en la pantalla, en relacin
con las dems ventanas. Cuando una ventana es creada, es colocada sobre las ventanas
creadas previamente, de manera que la primera ventana creada est en el fondo del
orden Z y la ltima en la cima. Sin embargo, la posicin de las ventanas en la lista del
orden Z depende de su tipo. Todas las ventanas pueden ser clasificadas como sigue:
- Ventanas siempre visibles (topmost): Una ventana siempre visible solapa a todas las
dems que no tengan ese atributo. Esto se cumple incluso aunque la ventana no sea la
ventana activa o de primer plano. Este tipo de ventana contiene el atributo de estilo
extendido WS_EX_TOPMOST y aparece en el orden Z antes que todas las ventanas que
no lo tengan.
- Ventanas de nivel superior (top level): Una ventana de nivel superior es cualquier
ventana normal que no sea una ventana hija. Este tipo de ventana no contiene el
atributo de estilo extendido WS_EX_TOPMOST, y siempre estar solapada,
apareciendo siempre debajo de cualquier ventana visible.
- Ventanas hijas: Una ventana hija contiene el atributo de estilo WS_CHILD. Las
ventanas hijas tienen su propio orden Z dentro de una ventana madre, pero a nivel
general reflejan la misma posicin de orden Z que su ventana madre.
Cuando una ventana es activada, es colocada en la cima del orden Z de todas las
ventanas del mismo tipo, trayendo consigo a todas sus ventanas hijas. Si una ventana es
propietaria de otras ventanas, stas ltimas son colocadas encima de la ventana
activada en el orden Z, de manera que siempre son mostradas sobre sus propietarias.
Efectos especiales
Una utilizacin imaginativa de las funciones de movimiento de ventanas permite dar a
las aplicaciones un toque profesional. Por ejemplo, si una aplicacin ocupa un espacio
relativamente pequeo de la pantalla, pero tiene barras de herramientas flotantes u otras
ventanas emergentes que estn abiertas constantemente, el desarrollador puede usar las
funciones de movimiento de ventanas para hacer que la ventana de la barra de
herramientas se mueva junto con la ventana principal cuando el usuario arrastre sta a
una nueva posicin. Este es un efecto muy elegante que requiere muy pocas lneas de
cdigo. El siguiente ejemplo muestra el uso de esta tcnica.
Listado 10-1: Moviendo la barra de herramientas junto con su ventana propietaria
unit WinMoveU;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Unit2;
609
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{Declaraciones privadas}
{Debemos sobrescribir el mensaje WM_MOVE}
procedure WMMove(var Msg: TWMMove); message WM_MOVE;
public
{Declaraciones pblicas}
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender: TObject);
begin
{Muestra la ventana de la barra de herramientas}
Form2.Show;
end;
end.
Figura 10-2:
La ventana
principal y su
barra de
herramientas
10
Captulo
610
Captulo 10
AdjustWindowRect
Descripcin
Calcula el tamao de una ventana en base al tamao deseado
del rea cliente.
Calcula el tamao de una ventana con un estilo extendido en
base al tamao deseado del rea cliente.
Comienza un proceso de movimiento de varias ventanas
simultneamente.
Lleva la ventana especificada a la cima del orden Z.
Ordena las ventanas especificadas en cascada.
Minimiza la ventana especificada.
Define un nuevo tamao y posicin para la ventana
especificada.
Finaliza el proceso de mover varias ventanas
simultneamente.
Recupera el estado de presentacin y la posicin de la
ventana especificada.
Mueve una ventana.
Restaura una ventana desde un estado minimizado.
Asigna el estado de presentacin y la posicin de la ventana
especificada.
Cambia el tamao, posicin y orden Z de la ventana
especificada.
Cambia la visibilidad de todas las ventanas emergentes
propiedad de la ventana especificada.
Muestra una ventana.
Muestra una ventana e inmediatamente retorna a la funcin
que hizo la llamada.
Ordena las ventanas especificadas en cascada.
Windows.Pas
Sintaxis
AdjustWindowRect(
var lpRect: TRect;
dwStyle: DWORD;
bMenu: BOOL
): BOOL;
611
Descripcin
Calcula el tamao del rectngulo de la ventana a partir del tamao del rectngulo
cliente especificado en lpRect. El rectngulo de la ventana incluir el tamao del borde,
de la barra de ttulo y la barra de men. Este rectngulo puede ser usado con las
funciones CreateWindow o CreateWindowEx para crear una ventana con el tamao
exacto que se desea para el rea cliente. El resultado devuelto por esta funcin se
expresa en trminos de coordenadas de pantalla, e incluye las esquinas superior
izquierda e inferior derecha. Sin embargo, la funcin CreateWindow necesita esos
parmetros en trminos de una coordenada superior izquierda y el ancho y la altura de
la ventana. Por eso, el desarrollador debe restar la coordenada izquierda de la derecha
para obtener el ancho apropiado, y restar la coordenada superior de la inferior para
obtener la altura apropiada.
Parmetros
lpRect: La direccin del registro de tipo TRect que contiene las coordenadas superior
izquierda e inferior derecha del rea cliente, relativas a la pantalla. Si la funcin tiene
xito, esta informacin ser modificada para contener las coordenadas superior
izquierda e inferior derecha del rectngulo de la ventana que contiene el rea cliente
especificada, tambin relativa a la pantalla.
dwStyle: Un valor de 32 bits que indica los estilos de ventana utilizados por la ventana
especfica.
Vase adems
AdjustWindowRectEx, CreateWindow, CreateWindowEx
Ejemplo
Listado 10-2: Creando una ventana con un rea cliente de 300 x 300 pxeles
procedure TForm1.CreateParams(var Params: TCreateParams);
var
TheRect: TRect; // almacena las coordenadas del rectngulo
begin
{Rellena los parmetros estndar}
inherited CreateParams(Params);
{Nuestra ventana comenzar en las coordenadas 100,100 y su rectngulo cliente
tendr 300 pxeles de altura y 300 pxeles de ancho}
TheRect.Left := 100;
10
Captulo
bMenu: Si la ventana tiene un men, este parmetro debe valer TRUE; en caso
contrario, debe valer FALSE.
612
Captulo 10
TheRect.Top := 100;
TheRect.Right := 400;
TheRect.Bottom := 400;
{Ajusta las coordenadas del rectngulo a una ventana con un rea cliente
de 300 por 300 pxeles}
AdjustWindowRect(TheRect, Params.Style, FALSE);
{El resultado de AdjustWindowRect est en trminos de coordenadas exactas, pero
la funcin CreateWindowEx lo necesita en trminos de coordenadas superior
izquierda, y medidas de ancho y altura}
Params.X := TheRect.Left;
Params.Y := TheRect.Top;
Params.Width := TheRect.Right - TheRect.Left;
// ancho de la ventana
Params.Height := TheRect.Bottom - TheRect.Top;
// altura de la ventana
end;
Figura 10-3:
El resultado de
la funcin
AdjustWindow
Rect sobre la
ventana
AdjustWindowRectEx
Windows.Pas
Sintaxis
AdjustWindowRectEx(
var lpRect: TRect;
dwStyle: DWORD;
bMenu: BOOL
dwExStyle: DWORD
): BOOL;
Descripcin
Calcula el tamao del rectngulo de la ventana a partir del tamao del rectngulo
cliente especificado en lpRect. El rectngulo de la ventana incluir el tamao del borde,
de la barra de ttulo y la barra de men. Este rectngulo puede ser usado con las
613
Parmetros
lpRect: La direccin del registro de tipo TRect que contiene las coordenadas superior
izquierda e inferior derecha del rea cliente, relativas a la pantalla. Si la funcin tiene
xito, esta informacin ser modificada para contener las coordenadas superior
izquierda e inferior derecha del rectngulo de la ventana que contiene el rea cliente
especificada, tambin relativa a la pantalla.
dwStyle: Un valor de 32 bits que indica los estilos de ventana utilizados por la ventana
especfica.
bMenu: Si la ventana tiene un men, este parmetro debe valer TRUE; en caso
contrario, debe valer FALSE.
dwExStyle: Un valor de 32 bits que indica los estilos de ventana extendidos utilizados
por la ventana especificada.
Si la funcin tiene xito, devuelve TRUE; en caso contrario, devuelve FALSE. Para
obtener una informacin ms amplia sobre posibles errores, se debe llamar a la funcin
GetLastError.
Vase adems
AdjustWindowRect, CreateWindow, CreateWindowEx
Ejemplo
Listado 10-3: Asignando a una ventana con estilos extendidos un rea cliente de 300 x 300
pxeles
procedure TForm1.CreateParams(var Params: TCreateParams);
var
TheRect: TRect; // almacena las coordenadas del rectngulo
begin
{Rellena los parmetros estndar}
inherited CreateParams(Params);
{Nuestra ventana comenzar en las coordenadas 100,100 y el rectngulo cliente
tendr 300 pxeles de altura y 300 pxeles de ancho}
TheRect.Left := 100;
TheRect.Top := 100;
10
Captulo
614
Captulo 10
TheRect.Right := 400;
TheRect.Bottom := 400;
{Ajusta las coordenadas del rectngulo para lograr una ventana con un rea
cliente de 300 por 300 pxeles}
AdjustWindowRectEx(TheRect, Params.Style, FALSE, Params.ExStyle);
{El resultado de AdjustWindowRect est en trminos de coordenadas exactas, pero
la funcin CreateWindowEx lo necesita en trminos de coordenadas superior
izquierda y medidas del ancho y altura}
Params.X := TheRect.Left;
Params.Y := TheRect.Top;
Params.Width := TheRect.Right - TheRect.Left;
// ancho de la ventana
Params.Height := TheRect.Bottom - TheRect.Top;
// altura de la ventana
end;
BeginDeferWindowPos
Windows.Pas
Sintaxis
BeginDeferWindowPos(
nNumWindows: Integer
): HDWP;
Descripcin
Esta es la primera de una serie de funciones usadas para reposicionar y redimensionar
mltiples ventanas simultneamente, con un mnimo de refresco de pantalla. Esta
funcin reserva memoria para un registro interno que almacenar la posicin y el
tamao de las ventanas que sern modificadas. La funcin DeferWindowPos llenar
este registro con informacin relativa al nuevo tamao y posicin para cada ventana.
Finalmente, la funcin EndDeferWindowPos utiliza esa informacin para mover y
redimensionar las ventanas simultneamente. La pantalla no es actualizada hasta que la
funcin EndDeferWindowPos no es llamada.
Parmetros
nNumWindows: Especifica la cantidad de ventanas sobre las que se almacenar
informacin en un registro de posicin de mltiples ventanas. La funcin
DeferWindowPos puede incrementar el tamao de este registro si es necesario, pero si
no hay suficiente memoria para aumentar ese tamao, toda la secuencia fallar.
Vase adems
DeferWindowPos, EndDeferWindowPos, GetWindowPlacement, MoveWindow,
SetWindowPlacement, SetWindowPos, ShowWindow, WM_MOVE, WM_SIZE,
WM_WINDOWPOSCHANGED, WM_WINDOWPOSCHANGING
615
Ejemplo
Listado 10-4: Reposicionando mltiples ventanas
procedure TForm1.FormShow(Sender: TObject);
begin
{Muestra las otras dos ventanas}
Form2.Show;
Form3.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
WindowPosInfo: HDWP; // almacena el registro interno de posicin de ventanas
begin
{Reserva memoria para mover tres ventanas}
WindowPosInfo := BeginDeferWindowPos(3);
{Prepara la primera ventana}
WindowPosInfo:=DeferWindowPos(WindowPosInfo, Form1.Handle, HWND_NOTOPMOST,
50, 50, 400, 100, SWP_SHOWWINDOW);
{Prepara la segunda ventana}
WindowPosInfo:=DeferWindowPos(WindowPosInfo, Form2.Handle, HWND_NOTOPMOST,
50, 150, 400, 100, SWP_SHOWWINDOW);
Figura 10-4:
Las ventanas
reposicionadas
10
Captulo
616
Captulo 10
BringWindowToTop
Windows.Pas
Sintaxis
BringWindowToTop(
hWnd: HWND
): BOOL;
Descripcin
Esta funcin colocar la ventana especificada en la cima de su orden Z relativo,
situndola encima de las otras ventanas con el mismo orden Z (por ejemplo, una
ventana hija estar encima de otras ventanas hijas, una ventana de nivel superior estar
encima de otras ventanas de nivel superior y una ventana siempre visible estar encima
de otras ventanas siempre visibles). Si la ventana es de nivel superior o siempre visible,
ser activada, pero no ser restaurada desde un estado minimizado. Esta funcin no
puede utilizarse para convertir una ventana en una ventana siempre visible. Una
aplicacin debe llamar a SetForegroundWindow para convertirse en la aplicacin de
primer plano.
Parmetros
hWnd: Manejador de la ventana que ser colocada en la cima del orden Z.
Vase adems
EnableWindow, IsWindowVisible, SetActiveWindow, SetFocus, SetForegroundWindow,
SetWindowPos, WM_ENABLE, WM_SETFOCUS
Ejemplo
Listado 10-5: Modificando el orden Z de ventanas hijas
procedure TForm1.Button1Click(Sender: TObject);
begin
{Coloca a Panel1 en la cima del orden Z de las ventanas hijas}
BringWindowToTop(Panel1.Handle);
end;
617
Figura 10-5:
El orden Z
modificado
CascadeWindows
Windows.Pas
Sintaxis
{manejador de la ventana madre}
{opciones de control}
{rea rectangular para ordenar las ventanas}
{la cantidad de ventanas a ordenar}
{la direccin de un array de manejadores de ventana}
{devuelve la cantidad de ventanas ordenadas}
Descripcin
Esta funcin ordena en cascada las ventanas asociadas con los manejadores colocados
en el array lpKids o las ventanas hijas de la ventana especificada.
Parmetros
hwndParent: Manejador de la ventana madre. Si este parmetro es cero, el escritorio es
usado como ventana madre. Si la funcin va a ser utilizada para ordenar en cascada
ventanas hijas MDI, a este parmetro se le debe asignar la propiedad ClientHandle del
formulario particular.
wHow: Se le puede asignar MDITILE_SKIPDISABLED para no colocar en cascada las
ventanas hijas desactivadas. Si a este parmetro se le asigna cero, todas las ventanas
hijas sern ordenadas en cascada.
lpRect: Puntero a un registro TRect que describe un rea rectangular en coordenadas de
pantalla, dentro del cual las ventanas sern ordenadas. Si este parmetro es nil, se
utilizar el rea cliente de la ventana madre.
cKids: Indica la cantidad de elementos en el array lpKids. Si lpKids es nil, este
parmetro es ignorado.
10
Captulo
CascadeWindows(
hwndParent: HWND;
wHow: UINT;
lpRect: PRect;
cKids: UINT;
lpKids: Pointer
): WORD;
618
Captulo 10
lpKids: Puntero a un array de manejadores de ventanas que identifican las ventanas que
sern ordenadas. Si a este parmetro se le asigna nil, se ordenarn todas las ventanas
hijas de la ventana madre.
Vase adems
BeginDeferWindowPos, DeferWindowPos, EndDeferWindowPos, MoveWindow,
SetWindowPlacement, TileWindows, WM_MDICASCADE, WM_MDITILE
Ejemplo
Listado 10-6: Ordenando en cascada ventanas hijas MDI
procedure TForm1.Cascade1Click(Sender: TObject);
begin
{Esto ordenar todas las ventanas hijas MDI que no estn deshabilitadas}
CascadeWindows(Form1.ClientHandle, MDITILE_SKIPDISABLED, nil, 0, nil);
end;
Figura 10-6:
Ventanas hijas
MDI en
cascada
CloseWindow
Windows.Pas
Sintaxis
CloseWindow(
hWnd: HWND
): BOOL;
{manejador de ventana}
{devuelve TRUE o FALSE}
Descripcin
CloseWindow minimiza la ventana especificada, pero no la destruye.
Parmetros
hWnd: Manejador de la ventana que ser minimizada.
619
Vase adems
ArrangeIconicWindows, DestroyWindow, IsIconic, IsWindowVisible, IsZoomed,
OpenIcon, ShowWindow, WM_SIZE
Ejemplo
Listado 10-7: Ejemplo de CloseWindow usando OpenIcon e IsIconic
{Esto minimiza y restaura el formulario continuamente}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Si nuestro formulario est minimizado...}
if IsIconic(Form1.Handle) then
{...lo restaura...}
OpenIcon(Form1.Handle)
else
{...en caso contrario, lo minimiza}
CloseWindow(Form1.Handle);
end;
DeferWindowPos
Windows.Pas
10
DeferWindowPos(
hWinPosInfo: HDWP;
hWnd: HWND;
hWndInsertAfter: HWND;
X: Integer;
Y: Integer;
CX: Integer;
CY: Integer;
uFlags: UINT
): HDWP;
Descripcin
Esta funcin actualiza el registro de posicin de mltiples ventanas especificado,
asignando la nueva posicin y el nuevo tamao a la ventana indicada. Utilice la funcin
BeginDeferWindowPos para reservar memoria suficiente para este registro. La funcin
DeferWindowPos puede incrementar el tamao de este registro si es necesario, pero si
no hay suficiente memoria para ello, la secuencia entera fallar. Cuando la funcin
EndDeferWindowPos es llamada, Windows utiliza este registro para mover y
Captulo
Sintaxis
620
Captulo 10
Parmetros
hWinPosInfo: Manejador del registro de posicin de mltiples ventanas devuelto por
BeginDeferWindowPos o la llamada ms reciente a DeferWindowPos.
hWnd: Manejador de la ventana que ser movida o redimensionada.
hWndInsertAfter: Identifica a la ventana que preceder a la ventana reposicionada en el
orden Z. Puede ser un manejador de ventana o un valor de la Tabla 10-2. Este
parmetro es ignorado si la opcin SWP_NOZORDER se asigna al parmetro Flags. Si
a este parmetro se le asigna cero, la ventana ser ubicada en la cima del orden Z. Si el
orden Z de la posicin de una ventana es situado encima de todas las dems ventanas
siempre visibles, la ventana se convertir en una ventana siempre visible. Esto tiene el
mismo efecto que si se especifica la opcin HWND_TOPMOST para este parmetro.
X: La coordenada horizontal de la esquina superior izquierda de la ventana. Si esta
ventana es una ventana hija, las coordenadas son relativas al rea cliente de su ventana
madre.
Y: La coordenada vertical de la esquina superior izquierda de la ventana. Si esta
ventana es una ventana hija, las coordenadas son relativas al rea cliente de su ventana
madre.
CX: El nuevo ancho de la ventana, en pxeles.
CY: La nueva altura de la ventana, en pxeles.
uFlags: Especifica una combinacin de valores de la Tabla 10-3 que afectarn el
tamao y la posicin de la ventana. Dos o ms valores pueden ser combinados usando
el operador booleano or.
621
Vase adems
BeginDeferWindowPos, EndDeferWindowPos, GetWindowPlacement, MoveWindow,
SetWindowPlacement, SetWindowPos, ShowWindow, WM_MOVE, WM_SIZE,
WM_WINDOWPOSCHANGED, WM_WINDOWPOSCHANGING.
Ejemplo
Consulte el Listado 10-4 bajo BeginDeferWindowPos
Tabla 10-2: Valores del parmetro hWndInsertAfter de DeferWindowPos
HWND_NOTOPMOST
HWND_TOP
HWND_TOPMOST
Descripcin
Coloca la ventana en el fondo del orden Z. Si la ventana
era una ventana siempre visible, pierde ese estatus y es
situada debajo de las dems.
Coloca la ventana encima de todas las ventanas que no
sean siempre visibles, pero detrs de las siempre visibles.
Si la ventana no es siempre visible, esta opcin no tiene
efecto.
Coloca la ventana en la cima del orden Z.
Coloca la ventana encima de todas las ventanas que no
sean siempre visibles; mantendr su condicin de siempre
visible an cuando est desactivada.
SWP_HIDEWINDOW
SWP_NOACTIVATE
SWP_NOCOPYBITS
SWP_NOMOVE
SWP_NOOWNERZORDER
Descripcin
Dibuja el marco definido en la descripcin de la clase de la
ventana alrededor de la ventana.
Provoca que un mensaje WM_NCCALCSIZE sea enviado a
la ventana, an cuando el tamao de la ventana no est
cambiando.
Oculta la ventana.
No activa la ventana. Si esta opcin no es especificada, la
ventana es activada y movida a la cima del grupo de
ventanas siempre visibles o de ventanas no siempre
visibles, en dependencia del valor del parmetro
hWndInsertAfter.
Descarta el contenido del rea cliente. Si esta opcin no es
especificada, la parte vlida del rea cliente es guardada y
restaurada despus de que finalicen todos los movimientos
y redimensionamientos de ventanas.
Mantiene la posicin actual, ignorando los parmetros X e
Y.
No cambia la posicin de la ventana propietaria en el
orden Z.
10
Captulo
Valor
HWND_BOTTOM
622
Captulo 10
Valor
SWP_NOREDRAW
SWP_NOREPOSITION
SWP_NOSENDCHANGING
SWP_NOSIZE
SWP_NOZORDER
SWP_SHOWWINDOW
EndDeferWindowPos
Descripcin
Si esta opcin es especificada, no se redibuja la ventana y la
aplicacin tiene que invalidar o redibujar explcitamente
cualquier parte de la ventana que necesite ser redibujada,
incluyendo el rea no cliente y las barras de
desplazamiento.
Equivalente a la opcin SWP_NOOWNERZORDER.
La ventana no recibir los mensajes
WM_WINDOWPOSCHANGING.
Mantiene el tamao actual, ignorando los parmetros CX y
CY.
Mantiene el orden Z actual, haciendo que el parmetro
hWndInsertAfter sea ignorado.
Muestra la ventana.
Windows.Pas
Sintaxis
EndDeferWindowPos(
hWinPosInfo: HDWP
): BOOL;
Descripcin
Esta es la ltima funcin a llamar de una serie de funciones que se utilizan para mover
y redimensionar simultneamente mltiples ventanas con un mnimo de refresco de
pantalla. La funcin BeginDeferWindowPos es llamada primero para reservar memoria
para un registro de posicin de mltiples ventanas, que almacenar la nueva posicin y
el tamao de cada ventana a mover. A continuacin, se puede llamar a la funcin
DeferWindowPos para cada ventana a modificar. La funcin EndDeferWindowPos es
llamada en ltimo lugar. Esta funcin enva los mensajes
WM_WINDOWPOSCHANGING y WM_WINDOWPOSCHANGED a cada ventana y
actualiza la pantalla slo cuando todas las ventanas han sido modificadas.
Parmetros
hWinPosInfo: Manejador del registro interno de posicin de mltiples ventanas. Este
manejador es devuelto por las funciones BeginDeferWindowPos y DeferWindowPos.
623
Vase adems
BeginDeferWindowPos, DeferWindowPos, GetWindowPlacement, MoveWindow,
SetWindowPlacement, SetWindowPos, ShowWindow, WM_MOVE, WM_SIZE,
WM_WINDOWPOSCHANGED, WM_WINDOWPOSCHANGING,
Ejemplo
Consulte el Listado 10-4 bajo BeginDeferWindowPos.
GetWindowPlacement
Windows.Pas
Sintaxis
GetWindowPlacement(
hWnd: HWND;
WindowPlacement: PWindowPlacement
): BOOL;
{manejador de ventana}
{puntero a registro de posicin de
ventana}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin recupera el estado de visualizacin y las posiciones normal, minimizada y
maximizada de la ventana especificada.
Parmetros
WindowPlacement: Puntero a un registro de tipo TWindowPlacement que recibir el
estado actual y la informacin de posicin de la ventana. Este registro se define de la
siguiente manera:
TWindowPlacement = packed record
length: UINT;
flags: UINT;
showCmd: UINT;
ptMinPosition: TPoint;
ptMaxPosition: TPoint;
rcNormalPosition: TRect;
end;
10
Captulo
624
Captulo 10
Vase adems
SetWindowPlacement, SetWindowPos, ShowWindow
Ejemplo
Consulte el Listado 10-9 bajo SetWindowPlacement.
MoveWindow
Windows.Pas
Sintaxis
MoveWindow(
hWnd: HWND;
X: Integer;
Y: Integer;
nWidth: Integer;
nHeight: Integer;
bRepaint: BOOL
): BOOL;
Descripcin
Esta funcin cambia la posicin y dimensiones de la ventana especificada. Si la
ventana especificada es una ventana de nivel superior, las coordenadas son relativas a
la pantalla. Si la ventana especificada es una ventana hija, las coordenadas son relativas
al rea cliente de su ventana madre.
Esta funcin enva los siguientes mensajes a la ventana especificada:
WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE,
WM_SIZE y WM_NCCALCSIZE.
Parmetros
hWnd: Manejador de la ventana que ser modificada.
X: La nueva coordenada horizontal del lado izquierdo de la ventana.
Y: La nueva coordenada vertical del lado superior de la ventana.
nWidth: Especifica el nuevo ancho de la ventana.
nHeight: Especifica la nueva altura de la ventana.
bRepaint: Determina cmo la ventana ser redibujada. Si este parmetro es TRUE, la
funcin MoveWindow llama a la funcin UpdateWindow. Esta enva un mensaje
WM_PAINT a la ventana, causando que sta sea redibujada inmediatamente despus de
que la ventana sea movida. Si este parmetro es FALSE, no se realizar ninguna
actualizacin de la pantalla, incluyendo el rea no cliente completa y cualquier parte de
la ventana madre descubierta por una ventana hija. La aplicacin deber invalidar o
repintar explcitamente cualquier rea que necesite ser actualizada como resultado de la
llamada a la funcin MoveWindow. Un mensaje WM_PAINT es colocado en la cola de
625
Vase adems
BeginDeferWindowPos, DeferWindowPos, EndDeferWindowPos,
SetWindowPlacement, SetWindowPos
Ejemplo
Listado 10-8: Moviendo una ventana
procedure TForm1.Timer1Timer(Sender: TObject);
const
XPos: Integer = 5;
// posicin horizontal inicial
begin
{Incrementa la posicin horizontal}
Inc(XPos);
{Mueve el control de edicin a la derecha}
MoveWindow(Edit1.Handle, XPos, Edit1.Top, Edit1.Width, Edit1.Height, TRUE);
end;
Windows.Pas
Sintaxis
OpenIcon(
hWnd: HWND
): BOOL;
Descripcin
Esta funcin restaura y activa la ventana minimizada especificada. Un mensaje
WM_QUERYOPEN es enviado a la ventana cuando esta funcin es llamada.
Parmetros
hWnd: Manejador de la ventana que ser restaurada y activada.
Vase adems
ArrangeIconicWindows, CloseWindow, DestroyWindow, IsIconic, IsWindowVisible,
IsZoomed, ShowWindow, WM_SIZE, WM_QUERYOPEN
10
Captulo
OpenIcon
626
Captulo 10
Ejemplo
Consulte el Listado 10-7 bajo CloseWindow.
SetWindowPlacement
Windows.Pas
Sintaxis
SetWindowPlacement(
hWnd: HWND;
WindowPlacement: PWindowPlacement
): BOOL;
{manejador de ventana}
{puntero a un registro de posicin de la
ventana}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin selecciona el estado de presentacin y las coordenadas normal,
minimizada y maximizada de la ventana especificada.
Parmetros
hWnd: Manejador de la ventana cuya informacin de presentacin ser asignada.
WindowPlacement: Puntero a un registro de tipo TWindowPlacement que contiene el
estado de presentacin y la informacin sobre la ubicacin de la ventana. Este registro
se define de la siguiente manera:
TWindowPlacement = packed record
length: UINT;
flags: UINT;
showCmd: UINT;
ptMinPosition: TPoint;
ptMaxPosition: TPoint;
rcNormalPosition: TRect;
end;
627
Vase adems
GetWindowPlacement, SetWindowPos, ShowWindow
Ejemplo
Listado 10-9: Informacin sobre la ubicacin de una ventana
{Obtiene la ubicacin de la ventana}
procedure TForm1.Button1Click(Sender: TObject);
var
PlacementInfo: TWindowPlacement;
begin
{Primero tenemos que asignar el tamao del registro al campo Length}
PlacementInfo.Length := SizeOf(TWindowPlacement);
{Obtiene la informacin sobre la ubicacin de la ventana}
GetWindowPlacement(Form1.Handle, @PlacementInfo);
{vaca el cuadro de lista}
ListBox1.Items.Clear;
10
Captulo
628
Captulo 10
PlacementInfo.ptMinPosition.Y := 100;
PlacementInfo.ptMaxPosition.X := 50;
PlacementInfo.ptMaxPosition.Y := 50;
PlacementInfo.rcNormalPosition.Left := 100;
PlacementInfo.rcNormalPosition.Top := 100;
PlacementInfo.rcNormalPosition.Right := 250;
PlacementInfo.rcNormalPosition.Bottom := 250;
{Asigna la informacin de ubicacin de la ventana}
SetWindowPlacement(Form1.Handle, @PlacementInfo);
end;
Figura 10-7:
Obteniendo la
informacin
sobre la
ubicacin de
la ventana
WPF_SETMINPOSITION
Descripcin
La ventana ser maximizada la prxima vez que sea
restaurada, independientemente de si fue o no
maximizada antes de ser minimizada. Esto es vlido
solo para la prxima vez que la ventana sea restaurada
y cuando se asigne el valor SW_SHOWMINIMIZED al
campo ShowCmd. Esto no cambia el comportamiento
por defecto de la restauracin.
Las coordenadas de la ventana minimizada pueden ser
especificadas. Esta opcin tiene que ser incluida si se
asignan coordenadas al campo ptMinPosition.
SW_RESTORE
SW_SHOW
Descripcin
La ventana es ocultada y otra ventana es activada.
La ventana es minimizada y la siguiente ventana de
nivel superior en la lista de ventanas del sistema es
activada.
La ventana es activada y mostrada en su tamao y
posicin original.
La ventana es activada y mostrada en su tamao y
posicin actual.
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED
SW_SHOWMINNOACTIVE
SW_SHOWNA
SW_SHOWNOACTIVE
SW_SHOWNORMAL
SetWindowPos
629
Descripcin
La ventana es mostrada segn indique el campo
wShowWindow del registro TStartupInfo pasado a la
funcin CreateProcess que lanz la aplicacin. Esto es
usado para asignar el estado de presentacin inicial de
una ventana principal de una aplicacin. Esta opcin
debe ser usada cuando se muestra la ventana por
primera vez, si la aplicacin puede se ejecutada desde
un acceso directo. Esta opcin hace que la ventana
sea mostrada usando los atributos especificados en las
propiedades del acceso directo.
La ventana es activada y mostrada en estado
maximizado.
La ventana es activada y mostrada como un icono.
La ventana es mostrada como un icono. La ventana
activa permanece activa.
La ventana es mostrada en su estado actual. La
ventana activa permanece activa.
La ventana es mostrada en su estado ms reciente. La
ventana activa permanece activa.
Equivalente a SW_RESTORE.
10
Windows.Pas
Sintaxis
SetWindowPos(
hWnd: HWND;
hWndInsertAfter: HWND;
X: Integer;
Y: Integer;
CX: Integer;
CY: Integer;
uFlags: UINT
): BOOL;
Descripcin
Esta funcin cambia el tamao, posicin y orden Z de la ventana especificada. El orden
Z de ventanas hijas, emergentes y de nivel superior es determinado por el orden en el
que estas ventanas aparecen en pantalla. Una ventana siempre visible es la primera
ventana en el orden Z.
Observe que las ventanas que son propiedad de una ventana siempre visible sern
tambin convertidas en siempre visibles, de manera que aparezcan sobre su propietaria,
pero las ventanas propietarias de la ventana especificada no sern cambiadas. Por eso,
Captulo
Valor
SW_SHOWDEFAULT
630
Captulo 10
una ventana que no sea siempre visible puede ser propietaria de una ventana siempre
visible, pero una ventana siempre visible no puede ser propietaria de una ventana que
no lo sea. Si se quita el atributo de siempre visible a una ventana, las ventanas de su
propiedad tambin dejarn de ser siempre visibles.
Parmetros
hWnd: Manejador de la ventana que va a ser movida o redimensionada.
hWndInsertAfter: Identifica a la ventana que preceder a la ventana reposicionada en el
orden Z. Puede ser un manejador de ventana o un valor de la Tabla 10-6. Este
parmetro es ignorado si la opcin SWP_NOZORDER se asigna al parmetro Flags. Si
a este parmetro se le asigna cero, la ventana ser ubicada en la cima del orden Z. Si el
orden Z de la posicin de una ventana es situado encima de todas las dems ventanas
siempre visibles, la ventana se convertir en una ventana siempre visible. Esto tiene el
mismo efecto que si se especifica la opcin HWND_TOPMOST para este parmetro.
X: La coordenada horizontal de la esquina superior izquierda de la ventana. Si esta
ventana es una ventana hija, las coordenadas son relativas al rea cliente de su ventana
madre.
Y: La coordenada vertical de la esquina superior izquierda de la ventana. Si esta
ventana es una ventana hija, las coordenadas son relativas al rea cliente de su ventana
madre.
CX: El nuevo ancho de la ventana, en pxeles.
CY: La nueva altura de la ventana, en pxeles.
uFlags: Especifica una combinacin de valores de la Tabla 10-7 que afectarn al
tamao y a la posicin de la ventana. Dos o ms valores pueden ser combinados usando
el operador booleano or.
Vase adems
BeginDeferWindowPos, DeferWindowPos, EndDeferWindowPos, MoveWindow,
SetActiveWindow, SetForegroundWindow, SetWindowPlacement, ShowWindow,
WM_MOVE, WM_SIZE
Ejemplo
Listado 10-10: Asignando la posicin de la ventana
procedure TForm1.Button1Click(Sender: TObject);
begin
{Redimensiona el memo de modo que ocupe el rea cliente bajo el botn}
SetWindowPos(Memo1.Handle, 0, 0,
631
Figura 10-8:
El memo
reposicionado
HWND_NOTOPMOST
HWND_TOP
HWND_TOPMOST
Descripcin
Coloca la ventana en el fondo del orden Z. Si la ventana
era una ventana siempre visible, pierde ese estatus y es
situada debajo de las dems.
Coloca la ventana encima de todas las ventanas que no
sean siempre visibles, pero detrs de las siempre visibles.
Si la ventana no es siempre visible, esta opcin no tiene
efecto.
Coloca la ventana en la cima del orden Z.
Coloca la ventana encima de todas las ventanas que no
sean siempre visibles; mantendr su condicin de siempre
visible an cuando est desactivada.
SWP_HIDEWINDOW
SWP_NOACTIVATE
Descripcin
Dibuja el marco definido en la descripcin de la clase de la
ventana alrededor de la ventana.
Provoca que un mensaje WM_NCCALCSIZE sea enviado a
la ventana, an cuando el tamao de la ventana no est
cambiando.
Oculta la ventana.
No activa la ventana. Si esta opcin no es especificada, la
ventana es activada y movida a la cima del grupo de
ventanas siempre visibles o de ventanas no siempre
visibles, dependiendo del valor del parmetro
hWndInsertAfter.
10
Captulo
Valor
HWND_BOTTOM
632
Captulo 10
Valor
SWP_NOCOPYBITS
SWP_NOMOVE
SWP_NOOWNERZORDER
SWP_NOREDRAW
SWP_NOREPOSITION
SWP_NOSENDCHANGING
SWP_NOSIZE
SWP_NOZORDER
SWP_SHOWWINDOW
ShowOwnedPopups
Descripcin
Descarta el contenido del rea cliente. Si esta opcin no es
especificada, la parte vlida del rea cliente es guardada y
restaurada despus de que finalicen todos los movimientos
y redimensionamientos de ventanas.
Mantiene la posicin actual, ignorando los parmetros X e
Y.
No cambia la posicin de la ventana propietaria en el
orden Z.
Si esta opcin es especificada, no se redibuja la ventana y la
aplicacin tiene que invalidar o redibujar explcitamente
cualquier parte de la ventana que necesite ser redibujada,
incluyendo el rea no cliente y las barras de
desplazamiento.
Equivalente a la opcin SWP_NOOWNERZORDER.
La ventana no recibir los mensajes
WM_WINDOWPOSCHANGING.
Mantiene el tamao actual, ignorando los parmetros CX y
CY.
Mantiene el orden Z actual, haciendo que el parmetro
hWndInsertAfter sea ignorado.
Muestra la ventana.
Windows.Pas
Sintaxis
ShowOwnedPopups(
hWnd: HWND;
fShow: BOOL
): BOOL;
{manejador de ventana}
{opcin de visibilidad de la ventana}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin mostrar u ocultar todas las ventanas emergentes que sean propiedad de
la ventana especificada. Las ventanas emergentes slo sern mostradas si han sido
ocultadas previamente mediante una llamada a ShowOwnedPopups (una ventana
ocultada con la funcin ShowWindow no ser mostrada cuando se llame a
ShowOwnedPopups).
Parmetros
hWnd: Manejador de la ventana propietaria de las ventanas emergentes que sern
mostradas u ocultadas.
633
Vase adems
IsWindowVisible, SetWindowPos, ShowWindow
Ejemplo
Listado 10-11: Cambiando el estado de presentacin de ventanas emergentes
Este cdigo pertenece a la unidad del formulario principal:
var
Form1: TForm1;
ShowIt: Boolean;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
{Cambia la variable de estado de presentacin}
ShowIt := not ShowIt;
{Muestra u oculta todas las ventanas emergentes que son propiedad de la
ventana principal}
ShowOwnedPopups(Form1.Handle, ShowIt);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
{Muestra la segunda ventana cuando el programa arranca}
Form2.Show;
end;
initialization
{Inicializa la variable de cambio}
ShowIt:=TRUE;
end.
10
Captulo
uses Unit2;
634
Captulo 10
uses Unit2;
{Tenemos que sobrescribir CreateParams para asignar un propietario a la ventana}
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
{Rellena los parmetros de creacin por defecto}
inherited CreateParams(Params);
{Asigna la ventana principal como propietaria de esta ventana}
Params.WndParent := Form1.Handle;
end;
ShowWindow
Windows.Pas
Sintaxis
ShowWindow(
hWnd: HWND;
nCmdShow: Integer
): BOOL;
{manejador de ventana}
{estado de presentacin de la ventana}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin establece el estado de presentacin de la ventana especificada. Cuando se
muestra la ventana principal de una aplicacin, el desarrollador debe especificar la
opcin SW_SHOWDEFAULT. Esto mostrar la ventana segn se indica en la
informacin de arranque de la aplicacin. Por ejemplo, si un acceso directo de
Windows 95/98 tiene sus propiedades asignadas para que la aplicacin se ejecute
minimizada, la opcin SW_SHOWDEFAULT mostrar la ventana minimizada. Sin esta
opcin, las propiedades del acceso directo sern ignoradas.
Parmetros
hWnd: Manejador de la ventana que ser mostrada.
nCmdShow: Especifica cmo ser mostrada la ventana. Puede ser un valor de la Tabla
10-8.
Vase adems
CreateProcess, CreateWindow, SetWindowPlacement, SetWindowPos,
ShowOwnedPopups, ShowWindowAsync, WM_SHOWWINDOW
635
Ejemplo
Listado 10-12: Mostrando una ventana basndose en la propiedades de un acceso directo
procedure TForm1.FormCreate(Sender: TObject);
begin
{Este ejemplo se ejecuta desde un acceso directo y esta lnea mostrar la
ventana en base a las propiedades del acceso directo}
ShowWindow(Form1.Handle, SW_SHOWDEFAULT);
end;
Figura 10-9:
Los atributos
del acceso
directo hacen
que esta
aplicacin se
inicie
maximizada
Captulo
10
Tabla 10-8: Valores del parmetro nCmdShow de ShowWindow
Valor
SW_HIDE
SW_MINIMIZE
SW_RESTORE
SW_SHOW
Descripcin
La ventana es ocultada y otra ventana es activada.
La ventana es minimizada y la siguiente ventana de
nivel superior en la lista de ventanas del sistema es
activada.
La ventana es activada y mostrada en su tamao y
posicin original.
La ventana es activada y mostrada en su tamao y
posicin actual.
636
Captulo 10
Valor
SW_SHOWDEFAULT
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED
SW_SHOWMINNOACTIVE
SW_SHOWNA
SW_SHOWNOACTIVE
SW_SHOWNORMAL
ShowWindowAsync
Descripcin
La ventana es mostrada segn indique el campo
wShowWindow del registro TStartupInfo pasado a la
funcin CreateProcess que lanz la aplicacin. Esto es
usado para asignar el estado de presentacin inicial de
una ventana principal de una aplicacin. Esta opcin
debe ser usada cuando se muestra la ventana por
primera vez, si la aplicacin puede ser ejecutada
desde un acceso directo. Esta opcin hace que la
ventana sea mostrada usando los atributos
especificados en las propiedades del acceso directo.
La ventana es activada y mostrada en estado
maximizado.
La ventana es activada y mostrada como un icono.
La ventana es mostrada como un icono. La ventana
activa permanece activa.
La ventana es mostrada en su estado actual. La
ventana activa permanece activa.
La ventana es mostrada en su estado ms reciente. La
ventana activa permanece activa.
Equivalente a SW_RESTORE.
Windows.Pas
Sintaxis
ShowWindowAsync(
hWnd: HWND;
nCmdShow: Integer
): BOOL;
{manejador de ventana}
{estado de presentacin de la ventana}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin es similar a ShowWindow. Su propsito es establecer el estado de
presentacin de una ventana creada por un hilo de ejecucin diferente. Esta funcin
enva directamente un mensaje WM_SHOWWINDOW a la cola de mensajes de la
ventana especificada. Esto permite a la aplicacin que hace la llamada continuar la
ejecucin si la aplicacin asociada con la ventana especificada se cuelga.
Parmetros
hWnd: Manejador de la ventana a mostrar.
nCmdShow: Especifica cmo se mostrar la ventana. Puede ser un valor de la Tabla
10-9.
637
Vase adems
CreateProcess, CreateWindow, SetWindowPlacement, SetWindowPos,
ShowOwnedPopups, ShowWindow, WM_SHOWWINDOW
Ejemplo
Listado 10-13: Mostrando una ventana asncronamente
procedure TForm1.Button1Click(Sender: TObject);
var
TheWindow: HWND;
begin
{Encuentra un manejador de ventana del Explorador de Windows. El Explorador
debe estar ejecutndose}
TheWindow := FindWindow('ExploreWClass', nil);
{Lo muestra}
ShowWindowAsync(TheWindow, SW_MAXIMIZE);
end;
Valor
SW_HIDE
SW_MINIMIZE
SW_RESTORE
SW_SHOW
SW_SHOWDEFAULT
SW_SHOWMAXIMIZED
Descripcin
La ventana es ocultada y otra ventana es activada.
La ventana es minimizada y la siguiente ventana de
nivel superior en la lista de ventanas del sistema es
activada.
La ventana es activada y mostrada en su tamao y
posicin original.
La ventana es activada y mostrada en su tamao y
posicin actual.
La ventana es mostrada segn indique el campo
wShowWindow del registro TStartupInfo pasado a la
funcin CreateProcess que lanz la aplicacin. Esto es
usado para asignar el estado de presentacin inicial de
una ventana principal de una aplicacin. Esta opcin
debe ser usada cuando se muestra la ventana por
primera vez, si la aplicacin puede ser ejecutada
desde un acceso directo. Esta opcin hace que la
ventana sea mostrada usando los atributos
especificados en las propiedades del acceso directo.
La ventana es activada y mostrada en estado
maximizado.
10
Captulo
638
Captulo 10
Valor
SW_SHOWMINIMIZED
SW_SHOWMINNOACTIVE
SW_SHOWNA
SW_SHOWNOACTIVE
SW_SHOWNORMAL
TileWindows
Descripcin
La ventana es activada y mostrada como un icono.
La ventana es mostrada como un icono. La ventana
activa permanece activa.
La ventana es mostrada en su estado actual. La
ventana activa permanece activa.
La ventana es mostrada en su estado ms reciente. La
ventana activa permanece activa.
Equivalente a SW_RESTORE.
Windows.Pas
Sintaxis
TileWindows(
hwndParent: HWND;
wHow: UINT;
lpRect: PRect;
cKids: UINT;
lpKids: Pointer
): WORD;
Descripcin
Esta funcin ordena en mosaico las ventanas asociadas con los manejadores colocados
en el array lpKids o las ventanas hijas de la ventana especificada. Las ventanas pueden
ser puestas en mosaico horizontal o vertical y pueden ser restringidas a un rea
rectangular dentro de la ventana madre especificada.
Parmetros
hwndParent: Manejador de la ventana madre. Si este parmetro es cero, el escritorio es
usado como ventana madre. Si la funcin va a ser utilizada para ordenar en cascada
ventanas hijas MDI, a este parmetro se le debe asignar la propiedad ClientHandle del
formulario particular.
wHow: MDITILE_HORIZONTAL dispone las ventanas en mosaico horizontal y
MDITILE_VERTICAL en mosaico vertical. Estas opciones pueden combinarse con
MDITILE_SKIPDISABLED para no colocar en mosaico las ventanas hijas
desactivadas. Consulte la Tabla 10-10.
lpRect: Puntero a un registro TRect que describe un rea rectangular en coordenadas de
pantalla, dentro del cual las ventanas sern ordenadas. Si este parmetro es nil, se
utilizar el rea cliente de la ventana madre.
cKids: Indica la cantidad de elementos en el array lpKids. Si lpKids es nil, este
parmetro es ignorado.
639
lpKids: Puntero a un array de manejadores de ventanas que identifican las ventanas que
sern ordenadas. Si a este parmetro se le asigna nil, se ordenarn todas las ventanas
hijas de la ventana madre.
Vase adems
BeginDeferWindowPos, CascadeWindows, DeferWindowPos, EndDeferWindowPos,
MoveWindow, SetWindowPlacement, WM_MDICASCADE, WM_MDITILE
Ejemplo
Listado 10-14: Poniendo en mosaico vertical las ventanas hijas MDI
procedure TForm1.TileWindows1Click(Sender: TObject);
begin
{Coloca en mosaico vertical todas las ventanas hijas MDI}
TileWindows(Form1.ClientHandle, MDITILE_VERTICAL, nil, 0, nil);
end;
Captulo
10
Figura 10-10:
Ventanas en
mosaico
Descripcin
Las ventanas son colocadas en mosaico horizontal.
Las ventanas deshabilitadas no son colocadas en
mosaico.
Las ventanas son colocadas en mosaico vertical.
641
Captulo 11
11
Captulo
Las funciones de arrastrar y soltar del shell y las de manipulacin de ficheros pueden
mejorar enormemente la funcionalidad de aplicaciones basadas en ficheros. La
posibilidad de arrastrar un fichero sobre una aplicacin para abrirlo es esencial para
cualquier aplicacin actual basada en ficheros. Las funciones DragAcceptFiles,
DragQueryFile y DragFinish son imprescindibles para implementar mtodos
amigables e intuitivos para que el usuario abra los ficheros.
642
Captulo 11
643
DeleteObject(SmallIcon);
end;
end;
{Libera el buffer de texto para el nombre de fichero}
StrDispose(TextBuffer);
end;
{Libera la memoria reservada para el registro}
DragFinish(Msg.Drop);
end;
11
Captulo
644
Captulo 11
Figura 11-1:
Ficheros
soltados sobre
la barra de
lanzamiento
645
11
Captulo
Figura 11-2:
Confirmacion
del borrado
del fichero
646
Captulo 11
conocidos slo por el creador del mismo. Los identificadores de elementos son
devueltos por varias funciones de organizacin de ficheros.
La organizacin del espacio de nombres del shell es anloga a la organizacin de
ficheros en una estructura de directorios. La raz del espacio de nombres del shell es el
escritorio, y todos los objetos por debajo de l pueden contener otros objetos. El
identificador de elemento de cada objeto es nico y tiene sentido solamente dentro del
contexto de su padre. Dado que los objetos contenedores tienen un identificador de
elemento que los identifica de modo nico dentro del contenedor padre, cualquier
objeto puede ser identificado de forma nica mediante una lista de identificadores de
elementos. Por lo tanto, una lista de identificadores de elementos identifica de forma
nica un objeto dentro del espacio de nombres del shell trazando una ruta que parte
desde l y llega hasta el escritorio. Muchas de las funciones de organizacin y
manipulacin de ficheros utilizan listas de identificadores de elementos para especificar
ficheros o carpetas.
Las listas de identificadores de elementos son comnmente utilizadas con los objetos
del Modelo de Objetos Componentes (Component Object Model - COM) del shell.
Estos objetos ofrecen una interfaz ms avanzada y compleja para el shell de Windows
que las funciones tratadas en este captulo. Se han escrito libros enteros acerca del
modelo COM y de cmo trabajar con tales objetos (vea el libro Programacin COM
con Delphi editado por Danysoft). Por esa razn, una explicacin del modelo COM
est ms all del alcance de este captulo.
647
var
Form1: TForm1;
{El registro TAppBarData debe ser global a la unit}
AppBarInfo: TAppBarData;
implementation
{$R *.DFM}
{Sobreescribimos CreateParams para asegurarnos que se usen los estilos apropiados}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
{La appbar tiene que ser una ventana de herramientas emergente para funcionar
adecuadamente}
11
Captulo
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormActivate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{Declaraciones privadas}
procedure CreateParams(var Params: TCreateParams); override;
public
{Declaraciones pblicas}
{El manejador de mensajes de la barra}
procedure WMDelAppBar(var Msg: TMessage); message WM_DELAPPBAR;
end;
648
Captulo 11
Params.ExStyle := WS_EX_TOOLWINDOW;
Params.Style := WS_POPUP or WS_CLIPCHILDREN;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{Provee el registro TAppBarData con el manejador de la ventana de la barra}
AppBarInfo.hWnd := Form1.Handle;
{Registra la nueva barra}
SHAppBarMessage(ABM_NEW, AppBarInfo);
{Le pide al sistema una posicin aprobada}
SHAppBarMessage(ABM_QUERYPOS, AppBarInfo);
{Ajusta la nueva posicin a la altura de la ventana de la barra}
AppBarInfo.rc.Bottom := AppBarInfo.rc.Top + 50;
{Informa al sistema de la nueva posicin de la barra}
SHAppBarMessage(ABM_SETPOS, AppBarInfo);
{Mueve fsicamente la ventana de la barra a su posicin}
MoveWindow(AppBarInfo.hWnd, AppBarInfo.rc.Left, AppBarInfo.rc.Top,
AppBarInfo.rc.Right - AppBarInfo.rc.Left,
AppBarInfo.rc.Bottom - AppBarInfo.rc.Top, TRUE);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Rellena el registro TAppBarData con la informacin necesaria}
AppBarInfo.cbSize := SizeOf(TAppBarData);
AppBarInfo.hWnd := Form1.Handle;
AppBarInfo.lParam := 0;
{Desregistra la barra}
SHAppBarMessage(ABM_REMOVE, AppBarInfo);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
{Activa la barra}
SHAppBarMessage(ABM_ACTIVATE, AppBarInfo);
end;
procedure TForm1.FormPaint(Sender: TObject);
var
Loop: Integer;
begin
{Rellena la barra con un gradiente de amarillo a rojo}
for Loop := 0 to (Width div 20) do
begin
Canvas.Brush.Color := RGB(255, 255 - ((255 div 20)*Loop), 0);
Canvas.Brush.Style := bsSolid;
Canvas.FillRect(Rect((Width div 20)*Loop, 0, ((Width div 20)*Loop) +
(Width div 20), Height));
649
end;
11
Captulo
Figura 11-3:
La barra de
aplicacin de
Delphi en
accin
650
Captulo 11
DragAcceptFiles
Descripcin
Registra una ventana como destino de ficheros arrastrados.
Completa el proceso de arrastrar y soltar.
Recupera informacin sobre un fichero soltado.
Recupera las coordenadas del ratn en el momento en que
un fichero es soltado.
Recupera el nombre del fichero ejecutable asociado con un
fichero especificado.
Aade o elimina un tipo de documento registrado en el
elemento de men Documentos bajo el botn de Inicio.
Registra y controla una barra de aplicaciones.
Crea un cuadro de dilogo que permite al usuario
seleccionar una carpeta del shell.
Muestra el cuadro de dilogo Acerca de.... del shell.
Lanza un fichero ejecutable.
Lanza un fichero ejecutable. Esta funcin ofrece ms
opciones que ShellExecute.
Registra un icono de notificacin en la bandeja de iconos.
Copia, mueve, renombra o borra un fichero.
Libera un objeto de mapa de nombres.
Recupera informacin sobre el fichero especificado.
Recupera un nombre de ruta a partir de una lista de
identificadores de elementos.
Recupera la ubicacin de carpetas nicas.
ShellAPI.Pas
Sintaxis
DragAcceptFiles(
Wnd: HWND;
Accept: BOOL
);
{manejador de ventana}
{indicador de aceptacin}
{esta funcin no devuelve nada}
Descripcin
Este procedimiento registra una ventana para aceptar o rechazar ficheros soltados sobre
ella. Si una aplicacin registra una ventana para aceptar ficheros soltados, recibir un
mensaje WM_DROPFILES cuando uno o ms ficheros sean arrastrados y dejados caer
sobre la ventana.
Parmetros
Wnd: Manejador de la ventana que aceptar o rechazar los ficheros soltados sobre ella.
651
Vase adems
DragFinish, DragQueryFile, DragQueryPoint, WM_DROPFILES
Ejemplo
Listado 11-5: Recuperando informacin sobre ficheros soltados
Observe que este ejemplo requiere que esta lnea sea aadida a la seccin pblica de la
definicin de la clase del formulario:
procedure WMDropFiles(var DropFileMsg: TWMDropFiles); message WM_DROPFILES;
11
Captulo
652
Captulo 11
Figura 11-4:
Informacin
sobre el
fichero dejado
caer
DragFinish
ShellAPI.Pas
Sintaxis
DragFinish(
Drop: HDROP
);
Descripcin
Este procedimiento libera memoria que Windows reserv para el registro de
informacin sobre ficheros soltados.
Parmetros
Drop: Manejador del registro de datos sobre ficheros soltados. Este manejador es
pasado en el campo wParam del mensaje WM_DROPFILES. Este parmetro es
653
tambin accesible desde Delphi, a travs del campo Drop del registro de mensajes
TWMDropFiles pasado a la rutina que maneja el mensaje WM_DROPFILES.
Vase adems
DragAcceptFiles, WM_DROPFILES
Ejemplo
Vea el Listado 11-5 bajo DragAcceptFiles.
DragQueryFile
ShellAPI.Pas
Sintaxis
DragQueryFile(
Drop: HDROP
FileIndex: UINT;
FileName: PChar;
cb: UINT
): UINT;
Descripcin
Esta funcin recupera el nombre de un fichero soltado. El parmetro FileIndex indica la
posicin del fichero deseado en la lista de ficheros soltados que est almacenada en el
registro indicado por el parmetro Drop. La ruta completa y el nombre del fichero
soltado son copiados en el buffer al que apunta el parmetro FileName.
Parmetros
Drop: Manejador del registro de datos sobre ficheros soltados. Este manejador es
pasado en el campo wParam del mensaje WM_DROPFILES. Este parmetro es
tambin accesible desde Delphi, a travs del campo Drop del registro de mensajes
TWMDropFiles pasado a la rutina que maneja el mensaje WM_DROPFILES.
11
Captulo
654
Captulo 11
nmero total de ficheros soltados. Si el parmetro FileIndex est entre cero y el nmero
total de ficheros dejados caer menos uno y el valor del parmetro FileName es nil, la
funcin devuelve el tamao del buffer necesario para almacenar la ruta y el nombre del
fichero correspondiente, en caracteres (sin incluir el terminador nulo). Si la funcin
copia un nombre de fichero al buffer al que apunta el parmetro FileName, devuelve la
cantidad de caracteres copiados, excluyendo el terminador nulo. Si la funcin falla,
devuelve cero.
Vase adems
DragAcceptFiles, DragQueryPoint, WM_DROPFILES
Ejemplo
Vea el Listado 11-5 bajo DragAcceptFiles.
DragQueryPoint
ShellAPI.Pas
Sintaxis
DragQueryPoint(
Drop: HDROP
var Point: TPoint
): BOOL;
Descripcin
Esta funcin rellena un registro de tipo TPoint con las coordenadas del cursor del ratn
en el momento en que los ficheros fueron soltados sobre la ventana.
Parmetros
Drop: Manejador del registro de datos sobre ficheros soltados. Este manejador es
pasado en el campo wParam del mensaje WM_DROPFILES. Este parmetro es
tambin accesible desde Delphi, a travs del campo Drop del registro de mensajes
TWMDropFiles pasado a la rutina que maneja el mensaje WM_DROPFILES.
Point: Puntero a un registro TPoint que ser rellenado con las coordenadas X e Y del
cursor del ratn cuando los ficheros fueron soltados. Estas coordenadas son relativas a
la ventana sobre la que se han soltado ficheros.
Vase adems
DragAcceptFiles, DragQueryFile, WM_DROPFILES
655
Ejemplo
Vea el Listado 11-5 bajo DragAcceptFiles.
FindExecutable
ShellAPI.Pas
Sintaxis
FindExecutable(
FileName: PChar;
Directory: PChar;
Result: PChar
): HINST;
Descripcin
Esta funcin recupera la ruta y el nombre del fichero ejecutable asociados con el
nombre de fichero pasado en el parmetro FileName.
Parmetros
FileName: Puntero a una cadena de caracteres terminada en nulo que contiene un
nombre de fichero. Este parmetro puede especificar un documento o un fichero
ejecutable. Si este parmetro contiene un nombre de fichero ejecutable, el parmetro
Result contendr una copia exacta de este parmetro cuando la funcin retorne.
Directory: Puntero a una cadena de caracteres terminada en nulo que especifica una
ruta a usar como directorio por defecto.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\<tipo de fichero>.
Bajo esa clave se almacena el nombre de otra clave. FindExecutable toma este valor y
busca en la clave
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\<clave>\Shell\Open\Command.
El valor situado en este lugar contiene la ruta y nombre de fichero completos del
ejecutable asociado al tipo de documento. Por ejemplo, si el parmetro FileName
especifica un fichero con la extensin .PAS, FindExecutable busca primero en
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.pas.
Bajo esta clave se almacena el valor DelphiUnit. FindExecutable toma este valor y
busca en la entrada:
11
Captulo
Result: Puntero a un buffer que recibe una cadena de caracteres terminada en nulo que
identifica al fichero ejecutable asociado con el fichero o documento indicado por el
parmetro FileName. Este fichero ejecutable es lanzado cada vez que una accin
abrir es ejecutada sobre el fichero especificado por el parmetro FileName, ya sea
haciendo clic con el botn derecho sobre el fichero y seleccionando Abrir en el
Explorador de Windows o usando la funcin ShellExecute. El Registro de Windows
almacena qu fichero ejecutable est asociado con tipos especficos de ficheros. La
funcin FindExecutable busca inicialmente en el Registro bajo la clave
656
Captulo 11
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\DelphiUnit\Shell\Open\Command.
Si Delphi ha sido instalado en el directorio por defecto, el valor hallado en este lugar
ser C:\Archivos de programa\Borland\Delphi5\Bin\Delphi32.EXE /np. Observe
que si la ruta y el nombre del ejecutable almacenados en la entrada del registro
contienen espacios, como en este ejemplo, y el valor no est encerrado entre comillas,
la funcin FindExecutable reemplazar cualquier espacio con un carcter nulo.
Vase adems
ShellExecute, ShellExecuteEx
Ejemplo
Listado 11-6: Encontrando un fichero ejecutable y abriendo documentos
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
{Selecciona una nueva mscara de edicin basada en el contenido de Edit1}
if ((Key = Chr(13)) AND (Edit1.Text <> '')) then
begin
FileListBox1.Mask := '*.' + Edit1.Text;
{Evita el beep del altavoz interno}
Key := #0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{Lanza el fichero ejecutable hallado por FindExecutable}
if Label1.Caption <> '' then
ShellExecute(Form1.Handle, 'open', PChar(Label1.Caption),
nil, nil, SW_SHOWNORMAL);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
{Abre el fichero seleccionado, ejecutando su aplicacin asociada}
ShellExecute(Form1.Handle, 'open', PChar(FileListBox1.Filename),
nil, nil, SW_SHOWNORMAL);
end;
procedure TForm1.FileListBox1Click(Sender: TObject);
var
Buffer: array[0..500] of Char;
// un buffer para ruta y nombre de fichero
begin
{Encuentra el ejecutable asociado con el fichero seleccionado}
FindExecutable(PChar(FileListBox1.FileName), nil, @Buffer);
657
Figura 11-5:
Se encontr
un fichero
ejecutable
Valor
0
ERROR_GEN_FAILURE
ERROR_FILE_NOT_FOUND
ERROR_PATH_NOT_FOUND
ERROR_BAD_FORMAT
Descripcin
No hay suficiente memoria o recursos.
El fichero especificado no tiene un fichero
ejecutable asociado.
El fichero especificado por el parmetro FileName
no pudo ser hallado.
La ruta del directorio por defecto especificada por
el parmetro Directory no pudo ser hallada.
El fichero ejecutable asociado no es vlido o est
corrupto.
11
Captulo
658
Captulo 11
SHAddToRecentDocs
ShlObj.Pas
Sintaxis
SHAddToRecentDocs(
uFlags: UINT;
pv: Pointer
);
Descripcin
Esta funcin aade o quita ficheros de la lista de documentos recientes. A esta lista se
accede a travs del elemento de men Documentos que aparece al pulsar el botn de
Inicio. A esta lista slo se pueden aadir documentos registrados (aquellos que tienen
un fichero ejecutable asociado).
Parmetros
uFlags: Un valor que indica qu contiene el parmetro pv. Este parmetro puede
contener un valor de la Tabla 11-3.
pv: Puede ser un puntero a una cadena de caracteres terminada en nulo que contiene la
ruta y nombre de fichero de un documento, o un puntero a una lista de identificadores
de elementos, que identifica el documento de forma nica. Si este parmetro es nil, la
lista de documentos recientes es vaciada.
Vase adems
SHGetFileInfo
Ejemplo
Listado 11-7: Aadiendo un documento a la lista de documentos recientes
procedure TForm1.Button1Click(Sender: TObject);
begin
{Borra todos los documentos de la lista de documentos recientes}
SHAddToRecentDocs(SHARD_PATH, nil);
end;
procedure TForm1.FileListBox1DblClick(Sender: TObject);
var
TheFileName: string;
begin
{Recupera el nombre de fichero del documento seleccionado}
TheFileName := FileListBox1.FileName;
{Lo aade a la lista de documentos recientes. Observe que el fichero tiene que
ser de un tipo registrado (debe tener asociado un ejecutable), para aadirlo
a la lista}
SHAddToRecentDocs(SHARD_PATH, PChar(TheFileName));
end;
659
Figura 11-6:
Un
documento fue
aadido a la
lista
SHARD_PIDL
Descripcin
El parmetro pv contiene la direccin de una cadena de
caracteres terminada en nulo con la ruta y el nombre de fichero
de un documento.
El parmetro pv contiene la direccin de una lista de
identificadores de elementos que identifica de manera nica el
documento.
SHAppBarMessage
ShellAPI.Pas
Sintaxis
SHAppBarMessage(
dwMessage: DWORD;
var pData: TAppBarData
): UINT;
11
Captulo
Valor
SHARD_PATH
660
Captulo 11
Descripcin
Esta funcin crea una barra de aplicacin. Una barra de aplicacin es una ventana que
est asociada a un borde particular de la pantalla y reserva ese espacio para su propio
uso. Windows evita que otras ventanas utilicen este espacio, movindolas si es
necesario. Observe que la ventana de una barra de aplicacin tiene que usar los estilos
WS_EX_TOOLWINDOW y WS_POPUP para funcionar correctamente.
Parmetros
dwMessage: El identificador del mensaje de la barra de aplicacin. Este parmetro
puede tomar un valor de la Tabla 11-4.
pData: Puntero a un registro TAppBarData. Este registro ofrece informacin a la
funcin SHAppBarMessage y recibe informacin como resultado de esa llamada. El
registro TAppBarData se define de la siguiente manera:
TAppBarData = record
cbSize: DWORD;
hWnd: HWND;
uCallbackMessage: UINT;
uEdge: UINT;
rc: TRect;
lParam: LPARAM;
end;
Vase adems
CreateWindow, CreateWindowEx, MoveWindow
661
Ejemplo
Listado 11-8: Recuperando las coordenadas de la barra de tareas de Windows
procedure TForm1.Button1Click(Sender: TObject);
var
AppBarInfo: TAppBarData;
// almacena la informacin de la barra
begin
{Inicializa el registro de la barra con la informacin necesaria}
AppBarInfo.cbSize := SizeOf(TAppBarData);
AppBarInfo.hWnd
:= Form1.Handle;
{Recupera las coordenadas de la barra de tareas de Windows...}
SHAppBarMessage(ABM_GETTASKBARPOS, AppBarInfo);
{...y las muestra}
Button1.Caption := 'Left: ' + IntToStr(AppBarInfo.rc.Left) +
' Top: ' + IntToStr(AppBarInfo.rc.Top) +
' Right: ' + IntToStr(AppBarInfo.rc.Right) +
' Bottom: ' + IntToStr(AppBarInfo.rc.Bottom);
end;
Figura 11-7:
Las
coordenadas
de la barra de
tareas
11
Captulo
Valor
ABM_ACTIVATE
662
Captulo 11
Valor
ABM_GETAUTOHIDEBAR
ABM_GETSTATE
ABM_GETTASKBARPOS
ABM_NEW
Descripcin
Recupera el manejador de ventana de la barra de
aplicacin que se oculta automticamente asociada con
el borde especificado de la pantalla. Los campos cbSize,
hWnd, y uEdge del registro TAppBarData tienen que
ser inicializados. Todos los dems campos son
ignorados. Si la funcin tiene xito, devuelve un
manejador de la ventana de la barra de aplicacin
asociada con el borde especificado de la pantalla. Si la
funcin falla o no hay una barra de aplicacin asociada
con el borde especificado de la pantalla, la funcin
devuelve cero.
Recupera los estados de ocultamiento automtico y
siempre-visible de la barra de tareas de Windows. Los
campos cbSize y hWnd del registro TAppBarData tienen
que ser inicializados. Todos los dems campos son
ignorados. Si la funcin tiene xito, devuelve
ABS_ALWAYSONTOP, una constante que indica que la
barra de tareas est en el estado siempre-visible o
ABS_AUTOHIDE, una constante que indica que la barra
de tareas est en estado de ocultamiento automtico.
La funcin puede devolver ambos valores si es
necesario. Si la funcin falla o la barra de tareas de
Windows no est en ninguno de los dos estados,
devuelve cero.
Recupera las coordenadas del rectngulo lmite de la
barra de tareas de Windows. Los campos cbSize y
hWnd del registro TAppBarData tienen que ser
inicializados. Todos los dems campos son ignorados. Si
la funcin tiene xito, devuelve un valor mayor que
cero y el campo rc contendr el rectngulo lmite de la
barra de tareas de Windows, en coordenadas de la
pantalla. Si la funcin falla, devuelve cero.
Registra una nueva barra de aplicacin en el sistema. La
funcin especifica el identificador de mensaje definido
por la aplicacin que ser utilizado para enviar los
mensajes de notificacin de la barra de aplicacin. Este
mensaje debe ser llamado antes que cualquier otro
mensaje de la barra de aplicacin. Para registrar una
barra de aplicacin que se oculte automticamente,
utilice el mensaje ABM_SETAUTOHIDEBAR. Los
campos cbSize, hWnd y uCallbackMessage del registro
TAppBarData tienen que ser inicializados. Todos los
dems campos son ignorados. Si la funcin tiene xito,
devuelve un valor distinto de cero. Si la funcin falla o la
barra de aplicacin especificada ya est registrada,
devuelve cero.
Valor
ABM_QUERYPOS
ABM_REMOVE
ABM_SETAUTOHIDEBAR
663
Descripcin
Solicita un rectngulo lmite y un borde de pantalla para
la barra de aplicacin. El sistema ajusta el rectngulo
especificado de manera que la barra de aplicacin no
interfiera con la barra de tareas de Windows u otra
barra de aplicacin. La barra de aplicacin debe enviar
este mensaje antes del mensaje ABM_SETPOS. Los
campos cbSize, hWnd, uEdge y rc del registro
TAppBarData tienen que ser inicializados. Todos los
dems campos son ignorados. Cuando la funcin
retorna, el campo rc contiene las coordenadas ajustadas
para la nueva posicin de la barra de aplicacin. Este
mensaje hace que la funcin siempre devuelva un valor
distinto de cero.
Desregistra una barra de aplicacin del sistema. Los
campos cbSize y hWnd del registro TAppBarData tienen
que ser inicializados. Todos los dems campos son
ignorados. La funcin siempre devolver un valor
distinto de cero cuando utilice este mansaje. El mensaje
de notificacin ABN_POSCHANGED es enviado a
todas las dems barras de aplicacin una vez que este
mensaje es procesado.
Registra o desregistra una barra de aplicacin con
ocultamiento automtico. El sistema slo permite una
barra de aplicacin con ocultamiento automtico por
borde de la pantalla. Al campo lParam del registro
TAppBarData se le asigna un valor distinto de cero para
registrar una barra de aplicacin con ocultamiento
automtico, o cero para desregistrarla. Los campos
cbSize, hWnd, uEdge y lParam del registro
TAppBarData tienen que ser inicializados. Todos los
dems campos son ignorados. Si la funcin tiene xito,
devuelve un valor distinto de cero. Si la funcin falla o
ya est registrada una barra de aplicacin con
ocultamiento automtico para el borde especificado, la
funcin devuelve cero.
11
Captulo
664
Captulo 11
Valor
ABM_SETPOS
Descripcin
Asigna un rectngulo lmite y un borde de pantalla para
la barra de aplicacin. El sistema ajusta el rectngulo
especificado de manera que la barra de aplicacin no
interfiera con la barra de tareas de Windows u otra
barra de aplicacin. Los campos cbSize, hWnd, uEdge y
rc del registro TAppBarData tienen que ser
inicializados. Todos los dems campos son ignorados.
Cuando la funcin retorna, el campo rc contiene las
coordenadas ajustadas para la nueva posicin de la barra
de aplicacin. Este mensaje hace que la funcin siempre
retorne un valor distinto de cero. El sistema enva un
mensaje de notificacin ABN_POSCHANGED a todas
las dems barras de aplicacin una vez que este mensaje
es procesado.
ABM_WINDOWPOSCHANGED Notifica al sistema que la posicin de la barra de
aplicacin ha cambiado. La barra de aplicacin debe
enviar este mensaje cuando responda al mensaje
WM_WINDOWPOSCHANGED. Los campos cbSize y
hWnd del registro TAppBarData tienen que ser
inicializados. Todos los dems campos son ignorados.
Este mensaje hace que la funcin siempre devuelva un
valor distinto de cero. Este mensaje es ignorado si el
campo hWnd identifica una barra de aplicacin con
ocultamiento automtico.
ABN_POSCHANGED
Descripcin
Notifica a una barra de aplicacin cuando una aplicacin a
pantalla completa se est abriendo o cerrando. Cuando se
inicia la ejecucin de una aplicacin a pantalla completa, la
barra de aplicacin tiene que pasar al final del orden Z.
Cuando una aplicacin a pantalla completa se cierra, la
barra de aplicacin puede restaurar su posicin original en
el orden Z. Si el parmetro lParam es distinto de cero, ello
indica que la aplicacin a pantalla completa est arrancando;
si es cero, indica que se est cerrando.
Notifica a la barra de aplicacin de un evento que puede
afectar su tamao y posicin, como puede ser la adicin,
eliminacin o cambio de tamao de otra barra de
aplicacin, o el cambio de posicin o estado de la barra de
tareas de Windows. Al recibir este mensaje, la barra de
aplicacin debe enviar el mensaje ABM_QUERYPOS
seguido del mensaje ABM_SETPOS para determinar si su
posicin ha cambiado. La funcin MoveWindow es entonces
llamada para mover fsicamente la ventana de la barra de
aplicacin a su nueva posicin.
Valor
ABN_STATECHANGE
ABN_WINDOWARRANGE
665
Descripcin
Notifica a la barra de aplicacin que el estado de
ocultamiento automtico o de siempre visible de la barra de
tareas ha cambiado.
Notifica a la barra de aplicacin que el usuario ha
seleccionado el comando Cascada, Mosaico Horizontal, o
Mosaico Vertical desde el men de contexto de la barra de
tareas de Windows. Si el parmetro lParam es un valor
distinto de cero, entonces la ejecucin del comando de
organizacin de ventanas ha comenzado y ninguna ventana
ha sido an movida. Un valor cero indica que el comando
de organizacin ha finalizado y que todas las ventanas estn
en sus posiciones finales. La barra de aplicacin recibe este
mensaje dos veces, una antes de que la operacin comience
y otra cuando sta ya ha terminado.
SHBrowseForFolder
Descripcin
El borde inferior de la pantalla.
El borde izquierdo de la pantalla.
El borde derecho de la pantalla.
El borde superior de la pantalla.
ShlObj.Pas
Sintaxis
{puntero a registro TBrowseInfo}
{devuelve un puntero a una lista de identificadores
de elementos}
Descripcin
Esta funcin muestra una caja de dilogo que permite al usuario seleccionar una
carpeta del shell.
Parmetros
lpbi: Puntero a un registro TBrowseInfo. Este registro almacena informacin que es
usada para mostrar el cuadro de dilogo de seleccin de carpeta, y recibe informacin
del cuadro de dilogo que indica la seleccin del usuario. Este registro se define como:
TBrowseInfo = packed record
hwndOwner: HWND;
pidlRoot: PItemIDList;
{manejador de ventana}
{puntero a lista de id. de elementos}
11
Captulo
SHBrowseForFolder(
var lpbi: TBrowseInfo
): PItemIDList;
666
Captulo 11
pszDisplayName: PAnsiChar;
lpszTitle: PAnsiChar;
ulFlags: UINT;
lpfn: TFNBFFCallBack;
lParam: LPARAM;
iImage: Integer;
end;
hwndOwner: Manejador de la ventana propietaria del cuadro de dilogo.
pidlRoot: Puntero a una lista de identificadores de elementos que especifica la
carpeta raz a partir de la que el usuario comienza la exploracin. Si este campo
es nil, la raz del espacio de nombres es usada como punto de partida.
pszDisplayName: Puntero a un buffer que recibe una cadena de caracteres
terminada en nulo que contiene el nombre de la carpeta seleccionada. El tamao
de este buffer se asume que es MAX_PATH bytes.
lpszTitle: Puntero a una cadena de caracteres terminada en nulo que contiene el
texto a mostrar en la barra de ttulo del cuadro de dilogo.
ulFlags: Combinacin de valores que especifica los tipos de carpetas a mostrar y
otras opciones. Este campo puede tomar uno o ms valores de la Tabla 11-7.
lpfn: Puntero a una funcin de respuesta. Esta funcin es llamada siempre que
una accin del usuario genere un evento en el cuadro de dilogo, tal como
seleccionar una carpeta. A este campo se le puede asignar nil. La sintaxis de la
funcin de respuesta se describe ms adelante.
lParam: Un valor definido por la aplicacin que es pasado a la funcin de
respuesta, si hay una definida.
iImage: Recibe el ndice en la lista de imgenes del sistema de la imagen que
representa la carpeta seleccionada.
667
Descripcin
La funcin de respuesta se ejecuta cada vez que el usuario provoca que un evento tenga
lugar en el cuadro de dilogo de exploracin de carpetas. Esta funcin de respuesta
puede ejecutar cualquier tarea que se estime necesaria.
Parmetros
hWnd: Manejador de la ventana del cuadro de dilogo. La funcin de respuesta puede
usar este parmetro para enviar un mensaje especial a la ventana del cuadro de dilogo.
Los mensajes disponibles se listan en la Tabla 11-8.
uMsg: Un valor que indica el tipo de evento que ha ocurrido. Este parmetro puede
tomar cualquier valor de la Tabla 11-9.
lParam: Un valor especfico del mensaje, dependiente del parmetro uMsg.
lpData: El valor definido por la aplicacin que fue pasado en el campo lParam del
registro TBrowseInfo.
Vase adems
FindExecutable, ShellExecute, ShellExecuteEx, SHFileOperation
Ejemplo
Listado 11-9: Seleccionando una carpeta
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
IDList: PItemIDList;
// lista de ids. de elementos
BrowseInfo: TBrowseInfo;
// registro de informacin
PathName: array[0..MAX_PATH] of Char;
// ruta
DisplayName: array[0..MAX_PATH] of Char; // nombre del fichero a mostrar
begin
{Inicializa el registro de exploracin}
BrowseInfo.hwndOwner
:= Form1.Handle;
BrowseInfo.pidlRoot
:= nil;
BrowseInfo.pszDisplayName := DisplayName;
BrowseInfo.lpszTitle
:= 'Choose a file or folder';
11
Captulo
668
Captulo 11
BrowseInfo.ulFlags
BrowseInfo.lpfn
BrowseInfo.lParam
:= BIF_STATUSTEXT;
:= @BrowseCallback;
:= 0;
Figura 11-8:
El cuadro de
dilogo de
explorar
carpetas
669
Descripcin
Permite al usuario seleccionar slo ordenadores.
Permite al usuario seleccionar slo impresoras.
El cuadro de dilogo no contendr carpetas de red
bajo el nivel de dominio.
Permite al usuario seleccionar slo los ancestros del
sistema de ficheros.
Permite al usuario seleccionar slo los directorios del
sistema de ficheros.
Incluye una lnea de estado en el cuadro de dilogo.
La funcin de respuesta puede enviar un mensaje al
cuadro de dilogo especificando qu mostrar en esa
lnea.
BFFM_SETSELECTION
BFFM_SETSTATUSTEXT
Descripcin
Habilita el botn Aceptar si el parmetro wParam del
mensaje contiene un valor distinto de cero. Si el parmetro
wParam contiene cero, el botn Aceptar es deshabilitado.
Selecciona una carpeta especfica. Si el parmetro wParam del
mensaje contiene TRUE, el parmetro lParam tiene que
contener un puntero a una cadena que describe la ruta de la
carpeta. Si el parmetro wParam es FALSE, el parmetro
lParam tiene que contener un puntero a una lista de
identificadores de elementos que especifica la carpeta
seleccionada.
Asigna el texto de la lnea de estado del cuadro de dilogo. El
parmetro lParam del mensaje tiene que contener un puntero
a una cadena de caracteres terminada en nulo para la lnea de
estado. Este mensaje es vlido slo si la opcin
BIF_STATUSTEXT fue especificada en el campo ulFlags del
registro TBrowseInfo.
BFFM_SELCHANGED
Descripcin
El cuadro de dilogo de exploracin de carpetas ha
terminado su inicializacin. El parmetro lParam contiene
cero.
El usuario ha seleccionado una carpeta. El parmetro lParam
contiene un puntero a una lista de identificadores de
elementos que especifica la carpeta elegida.
11
Captulo
Valor
BFFM_ENABLEOK
670
Captulo 11
ShellAbout
ShellAPI.Pas
Sintaxis
ShellAbout(
Wnd: HWND;
szApp: PChar;
szOtherStuff: PChar;
Icon: HICON
): Integer;
Descripcin
Esta funcin muestra el cuadro de dilogo de Acerca de... del shell. Este es el cuadro
de dilogo de identificacin que es mostrado cuando se selecciona Acerca de
Windows en el Explorador de Windows. Este cuadro de dilogo muestra un icono y un
texto que son especficos para Windows 95/98 o Windows NT.
Parmetros
Wnd: Manejador de la ventana madre. Si este parmetro es cero, el cuadro Acerca de...
se comporta como un cuadro de dilogo no modal. Si se especifica un manejador, el
cuadro de dilogo ser modal.
szApp: Puntero al texto que se va a mostrar en la barra de ttulo y a la primera lnea del
dilogo.
szOtherStuff: Puntero al texto que se va a mostrar despus de la informacin de
copyright.
Icon: Manejador del icono a mostrar en el cuadro de dilogo. Si este parmetro es cero,
el dilogo mostrar el icono de Windows 95/98 Windows NT.
Vase adems
GetSystemInfo
Ejemplo
Listado 11-10: Mostrando el cuadro de dilogo de ShellAbout
procedure TForm1.Button1Click(Sender: TObject);
begin
{Lanza el dilogo Acerca de... del shell de Microsoft}
ShellAbout(Form1.Handle, 'ShellAbout Example',
'This is a simple example of how to use the ShellAbout API function.', 0);
end;
671
Figura 11-9:
La caja de
dilogo del
shell
ShellExecute
ShellAPI.Pas
Sintaxis
ShellExecute(
hWnd: HWND;
Operation: PChar;
FileName: PChar;
Parameters: PChar;
Directory: PChar;
ShowCmd: Integer
): HINST;
Descripcin
Parmetros
hWnd: Manejador de la ventana madre sobre la que se mostrarn los cuadros de
mensajes en caso de error.
Operation: Puntero a una cadena de caracteres terminada en nulo que especifica la
accin a ejecutar sobre el fichero o carpeta indicado por el parmetro FileName. La
Tabla 11-10 lista las acciones estndar que pueden ser ejecutadas sobre un fichero o
carpeta. Sin embargo, estas acciones no estn limitadas a aquellas que se listan en la
tabla. Este parmetro depende de las acciones registradas para el documento o la
aplicacin en el registro de Windows, y es posible crear nuevas acciones a travs del
men Opciones de carpeta del Explorador de Windows. Si este parmetro es nil, la
operacin open (abrir) es utilizada por defecto.
11
Captulo
Esta funcin ejecuta la accin especificada sobre el fichero especificado y puede ser
usada para imprimir un documento, lanzar un fichero ejecutable o abrir un carpeta de
directorio.
672
Captulo 11
Vase adems
FindExecutable, ShellExecuteEx
Ejemplo
Listado 11-11: Visualizando ficheros de texto
procedure TForm1.FileListBox1DblClick(Sender: TObject);
begin
{Abre el fichero sobre el que se hizo doble clic en el cuadro de lista de
ficheros. Si el fichero es demasiado grande para el Bloc de Notas, Windows
preguntar si se desea lanzar Wordpad}
ShellExecute(Form1.Handle, 'open', PChar(FileListBox1.FileName), nil, nil,
SW_SHOWNORMAL);
end;
explore
Descripcin
Abre el fichero o carpeta, o lanza el fichero ejecutable
identificado por el parmetro FileName.
Imprime el documento identificado por el parmetro FileName.
Si este parmetro identifica un fichero ejecutable, este es
lanzado como si open hubiera sido especificado.
Abren una ventana del Explorador de Windows sobre la carpeta
identificada por el parmetro FileName.
673
Figura 11-10:
Visualizando
un fichero de
texto en el
Bloc de Notas
SW_RESTORE
SW_SHOW
SW_SHOWDEFAULT
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED
Descripcin
La ventana es ocultada y otra ventana es activada.
La ventana es minimizada y la prxima ventana de nivel
superior en el orden Z relativo es activada.
La ventana es activada y mostrada en su tamao y posicin
originales.
La ventana es activada y mostrada en su tamao y posicin
actuales.
La ventana es mostrada segn se indica en el campo
wShowWindow del registro TStartupInfo pasado a la
funcin CreateProcess cuando arranc la aplicacin. Esto es
usado para seleccionar el estado de presentacin inicial de
la ventana principal de la aplicacin. Esta opcin debe ser
usada cuando se muestra la ventana por primera vez, si la
aplicacin puede ser lanzada desde un acceso directo. Esta
opcin provocar que la ventana sea mostrada usando los
atributos de ejecucin indicados en las propiedades del
acceso directo.
La ventana es activada y mostrada en estado maximizado.
La ventana es activada y mostrada como un icono.
11
Captulo
Valor
SW_HIDE
SW_MINIMIZE
674
Captulo 11
Valor
SW_SHOWMINNOACTIVE
SW_SHOWNA
SW_SHOWNOACTIVE
SW_SHOWNORMAL
Descripcin
La ventana es mostrada como un icono. La ventana que
estaba activa permanecer activa.
La ventana es mostrada en su estado actual. La ventana
que estaba activa permanecer activa.
La ventana es mostrada en su estado ms reciente. La
ventana que estaba activa permanecer activa.
Equivalente a SW_RESTORE.
Descripcin
No hay suficiente memoria o recursos.
El fichero especificado por el parmetro FileName no
pudo ser encontrado.
El directorio especificado por el parmetro Directory
no pudo ser encontrado.
El fichero ejecutable no es vlido o est corrupto.
El acceso al fichero especificado fue denegado.
Hay una asociacion incompleta o no vlida entre el
fichero especificado y el fichero ejecutable.
La transaccin DDE solicitada no pudo ser completada
debido a que otra transaccin DDE se est realizando.
La transaccin DDE solicitada fall.
La transaccin DDE solicitada fall debido a que su
tiempo de espera mximo ha finalizado.
Una biblioteca de enlace dinmico requerida no fue
encontrada.
El fichero especificado por el parmetro FileName no
fue encontrado.
No hay fichero ejecutable asociado con la extensin
del nombre de fichero especificado.
La operacin no pudo ser completada debido a
insuficiente memoria.
El directorio especificado por el parmetro Directory
no fue encontrado.
Ha ocurrido una violacin de comparticin de
recursos.
ShellExecuteEx
675
ShellAPI.Pas
Sintaxis
ShellExecuteEx(
lpExecInfo: PShellExecuteInfo
):BOOL;
Descripcin
Similar a ShellExecute, esta funcin ejecuta una accin sobre un fichero y puede ser
utilizada para imprimir un documento, lanzar un fichero ejecutable o abrir una carpeta
de directorio.
Parmetros
lpExecInfo: Puntero a un registro TShellExecuteInfo. Este registro contiene informacin
sobre la accin a ejecutar sobre un fichero particular y recibir a su vez informacin
una vez que la accin sea completada. El registro TShellExecuteInfo se define como:
11
Captulo
TShellExecuteInfo = record
cbSize: DWORD;
{el tamao del registro, en bytes}
fMask: ULONG;
{valor que indica cmo usar los otros campos}
Wnd: HWND;
{manejador de la ventana madre}
lpVerb: PAnsiChar;
{puntero a una cadena que describe la accin}
lpFile: PAnsiChar;
{puntero a nombre de fichero o de carpeta}
lpParameters: PAnsiChar; {puntero a parmetros de un fichero ejecutable}
lpDirectory: PAnsiChar;
{puntero al nombre del directorio por defecto}
nShow: Integer;
{modo de presentacin}
hInstApp: HINST;
{manejador de instancia de aplicacin}
{*** los siguientes campos son opcionales ***}
lpIDList: Pointer;
{puntero a lista de identificadores de elementos}
lpClass: PAnsiChar;
{puntero al nombre de clase de fichero o GUID}
hkeyClass: HKEY;
{manejador de la entrada en el registro de la clase
del fichero}
dwHotKey: DWORD;
{tecla caliente asociada con la aplicacin}
hIcon: THandle;
{manejador de icono para la clase del fichero}
hProcess: THandle;
{manejador de proceso de la aplicacion lanzada}
end;
676
Captulo 11
677
Vase adems
ShellExecute
Ejemplo
Listado 11-12: Otro modo de visualizar ficheros de texto
procedure TForm1.FileListBox1DblClick(Sender: TObject);
var
ExecInfo: TShellExecuteInfo;
begin
{Esto abrir el fichero sobre el que se hizo doble clic en el cuadro de lista.
Si este fichero es demasiado grande para el Bloc de Notas, Windows preguntar
si se desea lanzar Wordpad}
Descripcin
Utiliza la clave de clase especificada en el campo
hkeyClass.
SEE_MASK_CLASSNAME
Utiliza el nombre de clase especificado en el campo
lpClass.
SEE_MASK_CONNECTNETDRV El campo lpFile especifica una ruta UNC.
SEE_MASK_DOENVSUBST
Expande las variables de entorno incluidas en los
campos lpFile o lpDirectory.
11
Captulo
678
Captulo 11
SEE_MASK_FLAG_DDEWAIT
explore
Descripcin
Abre el fichero o carpeta, o lanza el fichero ejecutable
identificado por el parmetro FileName.
Imprime el documento identificado por el parmetro FileName.
Si este parmetro identifica un fichero ejecutable, este es
lanzado como si open hubiera sido especificado.
Abren una ventana del Explorador de Windows sobre la carpeta
identificada por el parmetro FileName.
Descripcin
La ventana es ocultada y otra ventana es activada.
La ventana es minimizada y la prxima ventana de nivel
superior en el orden Z relativo es activada.
La ventana es activada y mostrada en su tamao y posicin
originales.
La ventana es activada y mostrada en su tamao y posicin
actuales.
Valor
SW_SHOWDEFAULT
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED
SW_SHOWMINNOACTIVE
SW_SHOWNA
SW_SHOWNOACTIVE
SW_SHOWNORMAL
679
Descripcin
La ventana es mostrada segn se indica en el campo
wShowWindow del registro TStartupInfo pasado a la
funcin CreateProcess cuando arranc la aplicacin. Esto es
usado para seleccionar el estado de presentacin inicial de
la ventana principal de la aplicacin. Esta opcin debe ser
usada cuando se muestra la ventana por primera vez, si la
aplicacin puede ser lanzada desde un acceso directo. Esta
opcin provocar que la ventana sea mostrada usando los
atributos de ejecucin indicados en las propiedades del
acceso directo.
La ventana es activada y mostrada en estado maximizado.
La ventana es activada y mostrada como un icono.
La ventana es mostrada como un icono. La ventana que
estaba activa permanecer activa.
La ventana es mostrada en su estado actual. La ventana
que estaba activa permanecer activa.
La ventana es mostrada en su estado ms reciente. La
ventana que estaba activa permanecer activa.
Equivalente a SW_RESTORE.
SE_ERR_DDEBUSY
SE_ERR_DDEFAIL
SE_ERR_DDETIMEOUT
SE_ERR_DLLNOTFOUND
SE_ERR_FNF
SE_ERR_NOASSOC
SE_ERR_OOM
SE_ERR_PNF
SE_ERR_SHARE
Descripcin
El acceso al fichero especificado fue denegado.
Hay una asociacion incompleta o no vlida entre el
fichero especificado y el fichero ejecutable.
La transaccin DDE solicitada no pudo ser completada
debido a que otra transaccin DDE se est realizando.
La transaccin DDE solicitada fall.
La transaccin DDE solicitada fall debido a que su
tiempo de espera mximo ha finalizado.
Una biblioteca de enlace dinmico requerida no fue
encontrada.
El fichero especificado por el parmetro FileName no
fue encontrado.
No hay ningn fichero ejecutable asociado con la
extensin del nombre de fichero especificado.
La operacin no pudo ser completada debido a
memoria insuficiente.
El directorio especificado por el parmetro Directory
no fue encontrado.
Ha ocurrido una violacin de comparticin de
recursos.
11
Captulo
Valor
SE_ERR_ACCESSDENIED
SE_ERR_ASSOCINCOMPLETE
680
Captulo 11
Shell_NotifyIcon
Descripcin
La tecla Alt debe ser pulsada.
La tecla Ctrl debe ser pulsada.
La tecla Shift debe ser pulsada.
ShellAPI.Pas
Sintaxis
Shell_NotifyIcon(
dwMessage: DWORD;
lpData: PNotifyIconData
): BOOL;
Descripcin
Esta funcin aade, modifica o quita un icono de notificacin de la bandeja de iconos
de la barra de tareas del sistema.
Parmetros
dwMessage: Identificador del mensaje de icono de notificacin. Puede ser cualquier
valor de la Tabla 11-18.
lpData: Puntero a un registro TNotifyIconData. Este registro se define como:
TNotifyIconData = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
end;
681
Vase adems
SHAppBarMessage
Ejemplo
Listado 11-13: Aadiendo un icono a la bandeja del sistema
const
{El mensaje de notificacin definido por la aplicacin}
WM_TRAYICONCLICKED = WM_USER + 1;
DELTRAYICON
= 1;
// el id del icono de la bandeja
var
Form1: TForm1;
IconData: TNotifyIconData;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Inicializa el registro del icono de notificacin de la bandeja}
with IconData do begin
cbSize
:= SizeOf(TNotifyIconData);
Wnd
:= Form1.Handle;
11
Captulo
type
TForm1 = class(TForm)
ListBox1: TListBox;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{Declaraciones privadas}
{El manejador del mensaje para la notificacin del icono de la bandeja}
procedure WMTrayIconClicked(var Msg: TMessage); message WM_TRAYICONCLICKED;
public
{Declaraciones pblicas}
end;
682
Captulo 11
uID
uFlags
uCallbackMessage
hIcon
szTip
end;
:=
:=
:=
:=
:=
DELTRAYICON;
NIF_ICON or NIF_MESSAGE or NIF_TIP;
WM_TRAYICONCLICKED;
Application.Icon.Handle;
'Delphi Tray Icon';
Figura 11-11:
El nuevo icono
de notificacin
Descripcin
Aade un icono de notificacin a la bandeja de iconos en la barra
de tareas del sistema.
Borra un icono de notificacin de la bandeja de iconos en la barra
de tareas del sistema.
Modifica un icono de notificacin de la bandeja de iconos en la
barra de tareas del sistema.
683
SHFileOperation
Descripcin
El manejador de icono en el campo hIcon es vlido.
El identificador de mensaje en el campo uCallbackMessage es
vlido.
La cadena de indicaciones a la que apunta el campo szTip es
vlida.
ShellAPI.Pas
Sintaxis
SHFileOperation(
const lpFileOp: TSHFileOpStruct
): Integer;
Descripcin
Esta funcin permite copiar, eliminar, mover, o renombrar ficheros o carpetas.
Parmetros
lpFileOp: Un registro de tipo TSHFileOpStruct que contiene informacin sobre los
ficheros implicados y las acciones a ejecutar. Este registro se define como:
lpszProgressTitle: PAnsiChar;
{manejador de ventana}
{indica el tipo de operacin}
{puntero a nombres de ficheros de origen}
{puntero a nombres de ficheros de destino}
{opciones de control de operaciones}
{indicador de operacin abortada}
{manejador de objeto de mapeado de
nombre de fichero}
{el ttulo del cuadro de dilogo de progreso}
end;
Wnd: Manejador de la ventana que ser usada como madre del cuadro de dilogo
que muestra el progreso de la operacin sobre ficheros.
wFunc: Valor que indica la operacin a ejecutar. Este campo puede tomar un
valor de la Tabla 11-20.
pFrom: Puntero a un buffer que contiene los nombres de los ficheros sobre los
cuales se realizar la operacin indicada. Si se especifican varios nombres de
fichero, cada uno tiene que ser separado por un terminador nulo, y el buffer debe
terminar con dos terminadores nulos. Si los nombres de fichero no contienen una
11
Captulo
TSHFileOpStruct = record
Wnd: HWND;
wFunc: UINT;
pFrom: PAnsiChar;
pTo: PAnsiChar;
fFlags: FILEOP_FLAGS;
fAnyOperationsAborted: BOOL;
hNameMappings: Pointer;
684
Captulo 11
{puntero a cadena}
{puntero a cadena}
{longitud de cadena}
{longitud de cadena}
685
Vase adems
GetCurrentDirectory, SetCurrentDirectory, ShellExecute, SHFreeNameMappings
Ejemplo
Figura 11-12:
Copiando un
fichero de
mapa de bits
Descripcin
Copia los ficheros especificados en el campo pFrom a la
ubicacin especificada por el campo pTo.
Elimina (borra) los ficheros especificados en el campo
pFrom. El campo pTo es ignorado.
11
Captulo
686
Captulo 11
Valor
FO_MOVE
FO_RENAME
Descripcin
Mueve los ficheros especificados en el campo pFrom a la
ubicacin especificada por el campo pTo.
Renombra los ficheros especificados en el campo pFrom. El
campo pTo es ignorado.
FOF_MULTIDESTFILES
FOF_NOCONFIRMATION
FOF_NOCONFIRMMKDIR
FOF_NOERRORUI
FOF_RENAMEONCOLLISION
FOF_SILENT
FOF_SIMPLEPROGRESS
FOF_WANTMAPPINGHANDLE
SHFreeNameMappings
Descripcin
El fichero especificado es borrado (enviado a la
papelera de reciclaje).
La operacin es ejecutada solamente sobre ficheros
solo si se ha especificado un nombre de fichero con
comodines (por ejemplo, *.pas).
El campo pTo contiene un fichero de destino para cada
fichero de origen, en lugar de un directorio en el cual
todos los ficheros sern depositados.
No se pide la confirmacin del usuario, y la operacin
se realiza como si se hubiera respondido S a Todo.
Crea automticamente un nuevo directorio si es
necesario.
No hay indicacin visual si ocurre un error.
Al fichero de origen se le asigna automticamente un
nuevo nombre, tal como Copia #1 de..., en una
operacin de mover, copiar o renombrar, si en el
directorio de destino ya existe un fichero con ese
nombre.
No muestra un cuadro de dilogo de progreso.
Muestra un cuadro de dilogo de progreso, pero no
muestra los nombres de ficheros.
El campo hNameMappings recibe un manejador de un
objeto de mapeado de nombres de ficheros.
ShellAPI.Pas
Sintaxis
SHFreeNameMappings(
hNameMappings: THandle
);
Descripcin
Esta funcin libera un objeto de mapeado de nombres de ficheros devuelto por la
funcin SHFileOperation.
687
Parmetros
hNameMappings: Manejador del objeto de mapeado de nombres de ficheros a liberar.
Vase adems
SHFileOperation
Ejemplo
Vea el Listado 11-14 bajo SHFileOperation.
SHGetFileInfo
ShellAPI.Pas
Sintaxis
SHGetFileInfo(
pszPath: PAnsiChar;
dwFileAttributes: DWORD;
var psfi: TSHFileInfo;
cbFileInfo: UINT;
uFlags: UINT
): DWORD;
Descripcin
Esta funcin recupera informacin sobre un fichero, carpeta, directorio, o unidad de
disco.
Parmetros
dwFileAttributes: Combinacin de valores que indican los atributos del fichero. Este
parmetro puede contener uno o ms valores de la Tabla 11-22. Si el parmetro uFlags
no contiene la opcin SHGFI_USEFILEATTRIBUTES, este parmetro es ignorado.
psfi: Puntero a un registro de tipo TSHFileInfo. Este registro contiene la informacin
requerida sobre el fichero especificado. El registro TSHFileInfo se define como:
TSHFileInfo = record
hIcon: HICON;
{manejador de icono}
iIcon: Integer;
{ndice de icono}
dwAttributes: DWORD;
{atributos}
szDisplayName: array [0..MAX_PATH-1] of AnsiChar;
{cadena de nombre a mostrar}
11
Captulo
pszPath: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta y
nombre del fichero cuya informacin ser recuperada. Puede ser un nombre de fichero
largo o un nombre de fichero en el formato de nombres de DOS (8.3). Si el parmetro
uFlags contiene la opcin SHGFI_PIDL, este parmetro puede apuntar a una lista de
identificadores de elementos que identifica al fichero.
688
Captulo 11
end;
hIcon: Manejador del icono que representa al fichero especificado.
iIcon: El ndice del icono del fichero dentro de la lista de imgenes del sistema.
dwAttributes: Combinacin de valores que indican los atributos del fichero. Este
campo puede tomar uno o ms valores de la tabla dwFileAttributes (Tabla 11-22).
szDisplayName: Cadena de caracteres terminada en nulo que indica el nombre a
mostrar del fichero especificado, tal como aparece en el shell.
szTypeName: Cadena de caracteres terminada en nulo que describe el tipo del
fichero especificado.
cbFileInfo: El tamao, en bytes, del registro TSHFileInfo al que apunta el parmetro
psfi. A este parmetro se le debe asignar SizeOf(TSHFileInfo).
uFlags: Combinacin de opciones que indican el tipo de informacin a recuperar. Este
parmetro puede tomar uno o ms valores de la Tabla 11-23.
Vase adems
ExtractAssociatedIcon, ExtractIcon, FindExecutable
Ejemplo
Listado 11-15: Recuperando informacin sobre el fichero
procedure TForm1.FileListBox1DblClick(Sender: TObject);
var
FileInfo: TSHFileInfo;
// almacena informacin sobre un fichero
TempIcon: TIcon;
// un objeto de icono temporal
begin
{Recupera informacin sobre el fichero seleccionado}
SHGetFileInfo(PChar(FileListBox1.Filename), 0, FileInfo, SizeOf(TSHFileInfo),
SHGFI_DISPLAYNAME or SHGFI_ICON or SHGFI_TYPENAME);
{Muestra informacin sobre el fichero seleccionado}
with ListBox1.Items do begin
Clear;
Add('Display Name: ' + FileInfo.szDisplayName);
Add('Type Name: ' + FileInfo.szTypeName);
Add('Icon index: ' + IntToStr(FileInfo.iIcon));
end;
{Crea un objeto de icono temporal, para que podemos mostrar el icono del fichero
sobre el objeto imagen}
TempIcon := TIcon.Create;
689
TempIcon.Handle := FileInfo.hIcon;
Image1.Picture.Assign(TempIcon);
TempIcon.Free;
end;
Figura 11-13:
La informacin
del fichero
SHGFI_DISPLAYNAME
Descripcin
Recupera los atributos del fichero especificado. Estos
atributos son copiados en el campo dwAttributes del
registro TSHFileInfo al que apunta el parmetro psfi.
Recupera el nombre a mostrar del fichero especificado.
Esta cadena es copiada al campo szDisplayName del
registro TSHFileInfo al que apunta el parmetro psfi.
11
Captulo
Valor
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_TEMPORARY
FILE_ATTRIBUTE_COMPRESSED
690
Captulo 11
Valor
SHGFI_ICON
SHGFI_ICONLOCATION
SHGFI_LARGEICON
SHGFI_LINKOVERLAY
SHGFI_OPENICON
SHGFI_PIDL
SHGFI_SELECTED
SHGFI_SHELLICONSIZE
SHGFI_SMALLICON
SHGFI_SYSICONINDEX
SHGFI_TYPENAME
SHGFI_USEFILEATTRIBUTES
Descripcin
Recupera un manejador del icono que representa al
fichero especificado. El manejador del icono es copiado
en el campo hIcon de registro TSHFileInfo al que apunta
el parmetro psfi. El ndice del icono en la lista de
imgenes del sistema es copiado al campo iIcon del
registro TSHFileInfo al que apunta el parmetro psfi. La
funcin devuelve el manejador de la lista de imgenes del
sistema.
Recupera el nombre del fichero que contiene el icono
que representa al fichero especificado. Este nombre de
fichero es copiado en el campo szDisplayName del
registro TSHFileInfo al que apunta el parmetro psfi.
Recupera el icono grande del fichero especificado. Esta
opcin debe utilizarse junto con la opcin SHGFI_ICON.
Combina el grfico de enlace con el icono del fichero
especificado. Esta opcin debe utilizarse junto con la
opcin SHGFI_ICON.
Recupera el icono de abrir del fichero especificado. Esta
opcin debe utilizarse junto con la opcin SHGFI_ICON.
Indica que el parmetro pszPath apunta a una lista de
identificadores de elementos y no a una ruta.
El icono del fichero es combinado con el color resaltado
del sistema. Esta opcin debe utilizarse junto con la
opcin SHGFI_ICON.
Recupera el icono del fichero especificado, escalado al
tamao utilizado por el shell. Esta opcin debe utilizarse
junto con la opcin SHGFI_ICON.
Recupera el icono pequeo del fichero especificado. Esta
opcin debe utilizarse junto con la opcin SHGFI_ICON.
Recupera el ndice del icono del fichero especificado en la
lista de imgenes del sistema. El ndice del icono es
copiado al campo iIcon del registro TSHFileInfo al que
apunta el parmetro psfi. La funcin devuelve el
manejador de la lista de imgenes del sistema.
Recupera una cadena que describe el tipo de fichero
especificado. Esta cadena es copiada al campo
szTypeName del registro TSHFileInfo al que apunta el
parmetro psfi.
Indica que la funcin debe recuperar informacin slo
sobre aquellos ficheros que tienen los atributos
especificados por el parmetro dwFileAttributes.
SHGetPathFromIDList
691
ShlObj.Pas
Sintaxis
SHGetPathFromIDList(
pidl: PItemIDList;
pszPath: PChar
): BOOL;
Descripcin
Esta funcin recupera una cadena que contiene el nombre de ruta del fichero o carpeta
identificado por la lista de identificadores de elementos.
Parmetros
pidl: Puntero a una lista de identificadores de elementos que identifica un fichero o
directorio en el sistema de ficheros. Esta funcin fallar si la lista de identificadores de
elementos especifica una carpeta que no pertenece al sistema de ficheros, como por
ejemplo las carpetas de Impresoras o del Panel de Control.
pszPath: Puntero a un buffer que recibe la ruta asociada. Se asume que el tamao de
este buffer es de MAX_PATH bytes.
Vase adems
SHBrowseForFolder, SHGetFileInfo
Ejemplo
Vea el Listado 11-9 bajo SHBrowseForFolder.
ShlObj.Pas
Sintaxis
SHGetSpecialFolderLocation(
hwndOwner: HWND;
nFolder: Integer;
var ppidl: PItemIDList
): HResult;
{manejador de ventana}
{indicador de carpeta}
{puntero a lista de identificadores de elementos}
{devuelve un resultado OLE}
Descripcin
Esta funcin recupera una lista de identificadores de elementos que especifica la
ubicacin de la carpeta especial. Observe que slo aquellas carpetas que estn
registradas bajo la clave:
11
Captulo
SHGetSpecialFolderLocation
692
Captulo 11
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\
Explorer\Shell Folders
devolvern una lista de identificadores de elementos que identifica a una carpeta del
sistema de ficheros que SHGetPathFromIDList puede usar para recuperar una ruta
fsica.
Parmetros
hwndOwner: Manejador de la ventana propietaria de posibles cuadros de dilogo o
mensajes.
nFolder: Valor que indica la carpeta cuya ubicacin se desea recuperar. Este parmetro
puede tomar un valor de la Tabla 11-24.
ppidl: Puntero a una lista de identificadores de elementos que determina la ubicacin
de la carpeta indicada, relativa a la raz del espacio de nombres.
Vase adems
SHBrowseForFolder, SHGetFileInfo, SHGetPathFromIDList
Ejemplo
Listado 11-16: Recuperando la ubicacin del directorio del escritorio de Windows
procedure TForm1.Button1Click(Sender: TObject);
var
IDList: PItemIDList;
// lista de identificadores de elementos
PathName: array[0..MAX_PATH] of Char; // la ruta de la carpeta especificada
begin
{Recupera la lista de identificadores asociada a la ubicacin del escritorio}
SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DESKTOPDIRECTORY, IDList);
{Recupera la ruta a partir de la lista de identificadores}
SHGetPathFromIDList(IDList, @PathName);
{Muestra la ruta}
Label1.Caption := PathName;
end;
Figura 11-14:
Recuperando
la ubicacin
del escritorio
de Windows
693
CSIDL_CONTROLS
CSIDL_DESKTOP
CSIDL_DESKTOPDIRECTORY
CSIDL_DRIVES
CSIDL_FONTS
CSIDL_NETHOOD
CSIDL_NETWORK
CSIDL_PERSONAL
CSIDL_PRINTERS
CSIDL_PROGRAMS
CSIDL_RECENT
CSIDL_SENDTO
CSIDL_STARTMENU
CSIDL_STARTUP
CSIDL_TEMPLATES
Descripcin
Recupera la ubicacin de la papelera de reciclaje. Este
directorio no est en el registro y tiene los atributos
oculto y de sistema para evitar que los usuarios lo
muevan o eliminen.
Recupera la carpeta virtual que contiene los iconos
para las aplicaciones (applets) del Panel de Control.
Recupera la carpeta virtual para la raz del espacio de
nombres, el escritorio de Windows.
Recupera el directorio del sistema de ficheros donde se
almacenan fsicamente los elementos del escritorio.
Recupera la carpeta virtual Mi PC, que contiene
dispositivos de almacenamiento, impresoras y el Panel
de Control, y puede adems contener unidades de red
mapeadas.
Recupera la carpeta virtual que contiene las fuentes.
Recupera el directorio del sistema de ficheros que
contiene objetos del Entorno de Red.
Recupera la carpeta virtual del Entorno de Red que
representa el nivel ms alto de la jerarqua de red.
Recupera el directorio del sistema de ficheros que sirve
como depsito comn para documentos, que es
generalmente el directorio C:\Mis Documentos.
Recupera la carpeta virtual que contiene las impresoras
instaladas.
Recupera el directorio del sistema de ficheros que
contiene los grupos de programas.
Recupera el directorio del sistema de ficheros donde se
almacenan los enlaces a los documentos ms recientes.
Recupera el directorio del sistema de ficheros que
contiene las opciones del men de contexto Enviar a.
Recupera el directorio del sistema de ficheros que
contiene los accesos directos y ficheros ejecutables que
aparecen en el men Inicio.
Recupera el directorio del sistema de ficheros que
contiene los accesos directos y ficheros ejecutables que
son lanzados durante el arranque de Windows.
Recupera el directorio del sistema de ficheros que sirve
como depsito comn para las plantillas de
documentos.
11
Captulo
Valor
CSIDL_BITBUCKET
Funciones de men
695
Captulo 12
Funciones de men
Todas las aplicaciones Windows complejas utilizan un men como parte de las
herramientas de navegacin de la interfaz de usuario. Delphi ha hecho un excelente
trabajo encapsulando la arquitectura de mens de Windows, eliminando as la
necesidad por parte del desarrollador de definir una estructura de men en un fichero
de recursos e importarlo mediante cdigo a la aplicacin. Sin embargo, las funciones de
bajo nivel del API de Windows para manipular mens ofrecen al desarrollador alguna
funcionalidad adicional que no est incluida de modo nativo en Delphi.
12
Captulo
Cada vez que un usuario selecciona un elemento de men, ste enva un mensaje
WM_COMMAND a su ventana propietaria. El parmetro wID de este mensaje contiene
el identificador del elemento de men seleccionado. Cuando un elemento de men es
aadido usando el API de Windows, la aplicacin debe ofrecer una funcin de
redefinicin de mensaje para el mensaje WM_COMMAND. Esto permitir a la
aplicacin responder tanto a los mensajes enviados por los elementos de men
aadidos mediante el API de Windows, como a los enviados por los objetos TMenuItem
de Delphi.
696
Captulo 12
El men de sistema
El uso ms comn de las funciones de men del API de Windows en Delphi es aadir
elementos a un men de sistema de una ventana. El men de sistema es un men
desplegable que se muestra cuando se hace clic sobre el icono situado en la esquina
superior izquierda de una ventana.
Para aadir un elemento de men al men de sistema, una aplicacin tiene primero que
usar la funcin GetSystemMenu para recuperar un manejador del men de sistema. Una
vez que se ha hecho sto, las dems funciones de men pueden ser llamadas utilizando
este manejador, como si de un men normal se tratara. Los elementos de men
aadidos al men de sistema enviarn un mensaje WM_SYSCOMMAND a la ventana,
en lugar del mensaje WM_COMMAND. Adicionalmente, Windows asigna
identificadores de elementos de men superiores a $F000 a los elementos de men por
defecto del sistema. Por eso, cualquier elemento de men que la aplicacin aada al
men de sistema, tiene que tener un identificador de elemento de men menor que
$F000. Cuando el manejador del mensaje WM_SYSCOMMAND determina si el
mensaje fue enviado por un elemento de men aadido por la aplicacin, tiene que
combinar el valor del parmetro de mensaje wParam con el valor $FFF0 usando el
operador booleano and. Esto es necesario porque Windows utiliza los ltimos cuatro
bits del parmetro wParam internamente, y stos deben ser eliminados de la mscara
para comprobar su igualdad con un identificador de elemento de men definido por la
aplicacin.
Observe que si la aplicacin aade elementos al men de sistema y cambia alguna
propiedad de la ventana, como por ejemplo el estilo del borde, de manera que la
ventana tenga que ser creada nuevamente, el men del sistema regresa a su
configuracin por defecto y todos los cambios se pierden. Consulte la funcin
CreatePopupMenu para ver un ejemplo de cmo aadir elementos al men de sistema.
Mens emergentes
Un men puede tomar dos formas: la forma de una barra de men y la forma de un
men emergente. Un barra de men es un men que ha sido asignado a una ventana, y
sus elementos de men son mostrados en una fila horizontal bajo la barra de ttulo de la
ventana. Un men emergente es un men que es mostrado dinmicamente, como es el
caso cuando un elemento de men en la barra de men es seleccionado o cuando el
usuario hace clic con el botn derecho sobre una ventana para mostrar su men
contextual. Todos los mens desplegables, los mens emergentes o los submens caen
en esta categora. Cualquier men desplegable o submen puede ser mostrado como un
men emergente, recuperando su manejador por medio de la funcin GetSubMenu y
mostrndolo mediante la funcin TrackPopupMenu. Consulte la funcin
CreatePopupMenu para ver un ejemplo de esta tcnica.
Los elementos de men en un men emergente envan un mensaje WM_COMMAND
cuando son seleccionados. Sin embargo, Delphi define un objeto privado conocido
Funciones de men
697
como PopupList (lista emergente) cuando se utiliza la clase TPopupMenu. Todos los
mensajes WM_COMMAND enviados por TPopupMenu son manejados por este objeto
PopupList. Por eso, el formulario nunca recibe estos mensajes. Cuando se usan las
funciones TrackPopupMenu o TrackPopupMenuEx con un objeto TPopupMenu de
Delphi, estos mensajes son enviados directamente a la ventana indicada, sobrepasando
la funcionalidad nativa de Delphi. Esto requiere que el desarrollador gestione la
seleccin de los elementos de men como si stos hubieran sido aadidos por programa
usando las funciones del API de Windows. Si el programador enva estos mensajes de
vuelta al men emergente, utilizando el mtodo DispatchCommand de la clase
TPopupMenu, entonces podr asignar de la manera habitual eventos OnClick a los
elementos de men situados en un TPopupMenu.
{Asigna las dimensiones del mapa de bits (18 pxeles de altura y el ancho de
la imagen original)}
ABitmap.Width := Image1.Width;
ABitmap.Height := 18;
12
Captulo
698
Captulo 12
Funciones de men
699
Canvas.CopyMode := cmNotSrcCopy
else
{...o normalmente}
Canvas.CopyMode := cmSrcCopy;
{Dibuja el mapa de bits (obtenido del campo ItemData del mensaje)}
Canvas.Draw(Msg.DrawItemStruct^.rcItem.Left, Msg.DrawItemStruct^.rcItem.Top,
TBitmap(Pointer(Msg.DrawItemStruct^.ItemData)));
{Reinicia el manejador del rea de dibujo. Un nuevo manejador del rea de dibujo
ser automticamente creado cuando sea necesario}
Canvas.Handle := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
iCount: Integer;
// variable de control de bucle
MenuInfo: TMenuItemInfo; // almacena informacin sobre el elemento de men
begin
{Inicializa el registro del elemento de men, que indica que slo deseamos
recuperar un puntero al mapa de bits asociado al elemento de men}
MenuInfo.cbSize := SizeOf(TMenuItemInfo);
MenuInfo.fMask := MIIM_DATA;
{Para cada elemento en el men...}
for iCount := 0 to 6 do
begin
{...recupera informacin sobre el elemento de men, especficamente el puntero
asociado al mapa de bits}
GetMenuItemInfo(MainMenu2.Handle, iCount, TRUE, MenuInfo);
{Libera el mapa de bits}
TBitmap(MenuInfo.dwItemData).Free;
end;
end;
procedure TForm1.Item11Click(Sender: TObject);
begin
{Indica qu elemento de men fue seleccionado}
Label2.Caption := TMenuItem(Sender).Caption;
end;
12
Captulo
Figura 12-1:
El elemento
de men
dibujado por el
propietario
700
Captulo 12
Funciones de men
Las siguientes funciones son descritas en este captulo:
Tabla 12-1: Funciones de men
Valor
AppendMenu
CheckMenuItem
CheckMenuRadioItem
CreateMenu
CreatePopupMenu
DeleteMenu
DestroyMenu
EnableMenuItem
GetMenu
GetMenuDefaultItem
GetMenuItemCount
GetMenuItemID
GetMenuItemInfo
GetMenuItemRect
GetMenuState
GetMenuString
GetSubMenu
GetSystemMenu
HiliteMenuItem
InsertMenu
InsertMenuItem
IsMenu
ModifyMenu
RemoveMenu
SetMenu
SetMenuDefaultItem
SetMenuItemBitmaps
SetMenuItemInfo
TrackPopupMenu
Descripcin
Aade un elemento de men a un men.
Marca o desmarca un elemento de men.
Marca un elemento de men en un grupo de elementos de men,
y desmarca todos los dems. La marca de verificacin es
mostrada como una vieta.
Crea un men nuevo y vaco.
Crea un men emergente nuevo y vaco.
Elimina un elemento de men y su submen asociado.
Destruye un men.
Habilita o deshabilita un elemento de men.
Recupera un manejador de un men asignado a una ventana.
Recupera un elemento por defecto de un men.
Recupera el nmero de elementos de men en un men.
Recupera un identificador de un elemento de men.
Recupera informacin sobre un elemento de men.
Recupera las coordenadas de pantalla de un elemento de men.
Recupera el estado de un elemento de men.
Recupera el texto de un elemento de men.
Recupera un manejador del submen activado por un elemento
de men.
Recupera un manejador del men de sistema.
Resalta u opaca un elemento de men en una barra de men.
Inserta un elemento de men.
Inserta un elemento de men. Ofrece ms opciones que
InsertMenu.
Indica si un manejador especificado es un manejador de un men.
Modifica un elemento de men existente.
Borra un elemento de men de un men.
Asigna un men a una ventana.
Asigna el elemento por defecto del men.
Asigna el mapa de bits que indica que un elemento de men est
marcado o no marcado.
Selecciona informacin de un elemento de men.
Muestra un men emergente.
Funciones de men
Valor
TrackPopupMenuEx
AppendMenu
701
Descripcin
Muestra un men emergente sin ocultar un rea rectangular
especfica.
Windows.Pas
Sintaxis
AppendMenu(
hMenu: HMenu;
uFlags: Integer;
uIDNewItem: Integer;
lpNewItem: PChar
): BOOL;
Descripcin
Esta funcin aade un nuevo elemento de men al final de un men, men
descendente, men emergente, o submen, asignando los atributos especficos del
elemento de men que se deseen.
Parmetros
hMenu: Manejador del men al cual ser aadido el elemento de men.
uFlags: Una combinacin de opciones que indican ciertos atributos del nuevo elemento
de men. A este parmetro se le puede asignar uno o ms valores de la Tabla 12-2.
uIDNewItem: Especifica el identificador del nuevo elemento de men. Si el parmetro
uFlags contiene la opcin MF_POPUP, a este parmetro se le asigna el manejador del
men desplegable o submen.
12
Captulo
702
Captulo 12
Vase adems
CreateMenu, CreatePopupMenu, DeleteMenu, DestroyMenu, InsertMenu,
InsertMenuItem, ModifyMenu, RemoveMenu
Ejemplo
Listado 12-2: Aadiendo un elemento de men al men del sistema
const
MNUID_ABOUT = $1000;
var
Form1: TForm1;
implementation
uses AboutBoxU;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Aade un men Acerca de... al final del men del sistema}
AppendMenu(GetSystemMenu(Form1.Handle, FALSE), MF_STRING, MNUID_ABOUT,
'About...');
{Hace lo mismo para la aplicacin, de manera que el elemento aparecer cuando
se haga clic con el botn derecho en el icono de la barra de tareas}
AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_STRING, MNUID_ABOUT,
'About...');
{Debido a que estos elementos de men son aadidos desde las funciones del API,
debemos interceptar manualmente sus mensajes y procesarlos apropiadamente}
Application.OnMessage := ApplicationMessage;
end;
procedure TForm1.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
{Si el mensaje proviene de un elemento de men del sistema y especficamente
de nuestro nuevo elemento de men, muestra el Acerca de...}
if (Msg.Message = WM_SYSCOMMAND) and (Msg.wParam and $FFF0 = MNUID_ABOUT) then
AboutBox.ShowModal;
end;
Figura 12-2:
El elemento
de men
aadido
Funciones de men
703
MF_CHECKED
MF_DISABLED
MF_ENABLED
MF_GRAYED
MF_MENUBARBREAK
MF_MENUBREAK
MF_OWNERDRAW
MF_POPUP
Descripcin
Indica que se utiliza un mapa de bits para representar el
elemento de men. El manejador del mapa de bits es
especificado en el parmetro lpNewItem. Esta opcin no puede
ser combinada con las opciones MF_STRING o
MF_OWNERDRAW.
Coloca el mapa de bits de la marca de verificacin del men
junto al elemento de men. Esta opcin no puede ser
combinada con la opcin MF_UNCHECKED.
Deshabilita el elemento de men de manera que no pueda ser
seleccionado. Esta opcin no puede ser combinada con las
opciones MF_ENABLED o MF_GRAYED.
Habilita el elemento de men de manera que pueda ser
seleccionado, y lo restaura si estaba sombreado. Esta opcin no
puede ser combinada con las opciones MF_DISABLED o
MF_GRAYED.
Deshabilita el elemento de men de manera que no pueda ser
seleccionado y lo dibuja sombreado (en gris). Esta opcin no
puede ser combinada con las opciones MF_ENABLED o
MF_DISABLED.
Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna y las
columnas son separadas mediante una lnea vertical. Esta opcin
no puede ser combinada con la opcin MF_MENUBREAK.
Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna. No hay
indicacin visual de separacin de columnas. Esta opcin no
puede ser combinada con la opcin MF_MENUBARBREAK.
Indica un elemento de men dibujado por el propietario.
Cuando el elemento de men es mostrado por primera vez, la
ventana propietaria recibe un mensaje WM_MEASUREITEM,
permitiendo a la aplicacin especificar el ancho y altura del
elemento de men. La ventana propietaria recibe un mensaje
WM_DRAWITEM cuando el elemento de men va a ser
dibujado, permitiendo a la aplicacin dibujar el elemento de
men con la apariencia deseada. Esta opcin no puede ser
combinada con las opciones MF_BITMAP o MF_STRING.
Indica que el elemento de men abre un men desplegable o
submen. El manejador del men desplegable o submen es
especificado en el parmetro uIDNewItem.
12
Captulo
Valor
MF_BITMAP
704
Captulo 12
Valor
MF_SEPARATOR
MF_STRING
MF_UNCHECKED
CheckMenuItem
Descripcin
Indica un separador de men. Este elemento de men es
dibujado como una lnea horizontal y es vlido solo cuando es
usado con mens desplegables, mens emergentes o submens.
Este elemento de men no puede ser resaltado, sombreado, o
deshabilitado y los parmetros uIDNewItem y lpNewItem son
ignorados.
Indica que se utiliza una cadena de caracteres para representar
el elemento de men. El parmetro lpNewItem contiene un
puntero a la cadena terminada en nulo mostrada en el elemento
de men. Esta opcin no puede ser combinada con las opciones
MF_BITMAP o MF_OWNERDRAW.
Coloca el mapa de bits que indica que el elemento de men
est desmarcado junto al elemento de men. Por defecto, sta
imagen es una imagen en blanco. Esta opcin no puede ser
combinada con la opcin MF_CHECKED.
Windows.Pas
Sintaxis
CheckMenuItem(
hMenu: HMENU;
uIDCheckItem: UINT;
uCheck: UINT
): DWORD;
{manejador de men}
{identificador o posicin del elemento de men a marcar}
{opciones de elemento de men}
{devuelve el estado anterior de la marca}
Descripcin
Esta funcin asigna el estado de la marca al elemento de men especificado. El
elemento de men no puede estar situado en una barra de men; tiene que estar en un
submen, men desplegable, o men emergente. Si el elemento de men especificado
abre un submen, el parmetro uIDCheckItem debe contener el identificador de
elemento de men.
Parmetros
hMenu: Manejador del men que contiene el elemento que ser marcado o desmarcado.
uIDCheckItem: Especifica el elemento de men cuyo atributo ser cambiado. Este
parmetro contiene un identificador de elemento de men o una posicin (de base
cero), segn determina el parmetro uCheck.
uCheck: Una combinacin de opciones que determinan cmo es interpretado el
parmetro uIDCheckItem y si el elemento de men es marcado o desmarcado. Este
parmetro puede contener las opciones MF_BYCOMMAND o MF_BYPOSITION
combinadas con MF_CHECKED o MF_UNCHECKED, segn se describe en la Tabla
12-3.
Funciones de men
705
Vase adems
CheckMenuRadioItem, GetMenuItemID, GetMenuItemInfo, GetMenuState,
GetSystemMetrics, SetMenuItemBitmaps, SetMenuItemInfo
Ejemplo
Vea el Listado 12-3 bajo CreateMenu.
Tabla 12-3: Valores del parmetro uCheck de CheckMenuItem
Valor
MF_BYCOMMAND
MF_BYPOSITION
MF_CHECKED
MF_UNCHECKED
CheckMenuRadioItem
Descripcin
Indica que el parmetro uIDCheckItem contiene el identificador
del elemento de men. Esta opcin es utilizada por defecto si no
hay ninguna especificada, y no puede ser combinada con
MF_BYPOSITION.
Indica que el parmetro uIDCheckItem contiene la posicin del
elemento de men en el men, contando a partir de cero. Esta
opcin no puede ser combinada con MF_BYCOMMAND.
Coloca el mapa de bits de marca de verificacin de elementos
de men junto al elemento de men. Por defecto, sta imagen
tiene la forma de una marca de verificacin. Esta opcin no
puede ser combinada con MF_UNCHECKED.
Coloca el mapa de bits que indica que el elemento de men est
desmarcado junto al elemento de men. Por defecto, sta
imagen es una imagen en blanco. Esta opcin no puede ser
combinada con la opcin MF_CHECKED.
Windows.Pas
Sintaxis
Last: UINT;
Check: UINT;
Flags: UINT
): BOOL;
{manejador de men}
{primer identificador de elemento de men o posicin
en el grupo}
{ltimo identificador de elemento de men o posicin
en el grupo}
{identificador o posicin del elemento de men a marcar}
{opciones del elemento de men}
{devuelve TRUE o FALSE}
12
Captulo
CheckMenuRadioItem(
hMenu: HMENU;
First: UINT;
706
Captulo 12
Descripcin
Esta funcin asigna la marca al elemento de men identificado por el parmetro
Check, mientras limpia las marcas de todos los dems elementos de men en el grupo
de elementos identificado por los parmetros First y Last. Especficamente, se asignan
los atributos MFT_RADIOCHECK y MFS_CHECKED al elemento de men
identificado por el parmetro Check y se limpian los atributos de todos los dems.
Consulte la funcin GetMenuItemInfo para ver una explicacin ms detallada de estas
opciones. Por defecto, el elemento de men marcado mostrar un pequeo crculo (una
vieta) en lugar de una marca de verificacin.
Parmetros
hMenu: Manejador del men que contiene el grupo de elementos de men que ser
modificado.
First: Especifica el primer elemento de men en el grupo. Este parmetro contiene un
identificador de elemento de men o una posicin de base cero, segn determina el
valor del parmetro Flags.
Last: Especifica el ltimo elemento de men en el grupo. Este parmetro contiene un
identificador de elemento de men o una posicin de base cero, segn determina el
valor del parmetro Flags.
Check: Especifica el elemento de men que ser marcado. Este parmetro contiene un
identificador de elemento de men o una posicin de base cero, segn determina el
valor del parmetro Flags.
Flags: Valor que indica cmo deben ser interpretados los parmetros First, Last y
Check. Si este parmetro contiene el valor MF_BYCOMMAND, los parmetros First,
Last y Check contienen identificadores de elementos de men. Si este parmetro
contiene el valor MF_BYPOSITION, los dems parmetros contienen las posiciones de
los elementos dentro del men (contando a partir de cero).
Vase adems
CheckMenuItem, GetMenuItemInfo, GetMenuState, SetMenuItemBitmaps,
SetMenuItemInfo
Ejemplo
Vea el Listado 12-4 bajo CreatePopupMenu.
Funciones de men
CreateMenu
707
Windows.Pas
Sintaxis
CreateMenu: HMENU;
Descripcin
Esta funcin crea un men vaco y devuelve su manejador. A este nuevo men podrn
aadirse luego elementos de men y submens mediante las funciones AppendMenu,
InsertMenu e InsertMenuItem. Cuando la aplicacin termina de utilizar el men, debe
eliminarlo usando la funcin DestroyMenu. Sin embargo, si el men es asignado a una
ventana mediante la funcin SetMenu, Windows liberar automticamente los recursos
de men cuando la aplicacin termine.
Vase adems
AppendMenu, CreatePopupMenu, DestroyMenu, InsertMenu, InsertMenuItem, IsMenu,
SetMenu
Ejemplo
Listado 12-3: Creando un men a la vieja usanza
const
MNUID_MAINMENU
MNUID_ITEM1
MNUID_ITEM2
MNUID_ITEM3
MNUID_ITEM4
=
=
=
=
=
1;
2;
3;
4;
5;
var
Form1: TForm1;
MainMenu, SubMenu1: HMENU;
implementation
12
Captulo
{$R *.DFM}
708
Captulo 12
begin
{Comienza por crear el men principal y el desplegable}
MainMenu := CreateMenu;
SubMenu1 := CreatePopupMenu;
{Inicializa el registro del elemento de men para indicar que el identificador
de elemento de men es vlido y que el men contendr una cadena}
MenuInfo.cbSize := SizeOf(TMenuItemInfo);
MenuInfo.fMask := MIIM_TYPE or MIIM_ID;
MenuInfo.fType := MFT_STRING;
{Inserta el primer elemento de men en el men desplegable}
MenuInfo.wID := MNUID_ITEM1;
MenuInfo.dwTypeData := 'Item 1';
InsertMenuItem(SubMenu1, 0, TRUE, MenuInfo);
{Inserta el segundo elemento de men al final del men desplegable}
MenuInfo.wID := MNUID_ITEM2;
MenuInfo.dwTypeData := 'Item 2';
InsertMenuItem(SubMenu1, $FFFF, TRUE, MenuInfo);
{Inserta el tercer elemento de men al final del men desplegable}
MenuInfo.wID := MNUID_ITEM3;
MenuInfo.dwTypeData := 'Item 3';
InsertMenuItem(SubMenu1, $FFFF, TRUE, MenuInfo);
{Inserta el cuarto elemento de men al final del men desplegable}
MenuInfo.wID := MNUID_ITEM4;
MenuInfo.dwTypeData := 'Item 4';
InsertMenuItem(SubMenu1, $FFFF, TRUE, MenuInfo);
{Reinicializa el registro de elemento de men para indicar que estamos
insertando un elemento de men que activar un men desplegable}
MenuInfo.wID := MNUID_MAINMENU;
MenuInfo.fMask := MIIM_TYPE or MIIM_ID or MIIM_SUBMENU;
MenuInfo.dwTypeData := 'Main Menu';
MenuInfo.hSubMenu := SubMenu1;
{Inserta el elemento de men en el men principal}
InsertMenuItem(MainMenu, 0, TRUE, MenuInfo);
{Asigna el men principal que fue creado como men de la ventana. Esto hace que
la aplicacin dibuje la barra de men que contiene el men principal}
SetMenu(Form1.Handle, MainMenu);
end;
{El manejador redefinido del mensaje WM_COMMAND}
procedure TForm1.WMCommand(var Msg: TWMCommand);
begin
{Si este mensaje fue enviado desde un elemento de men (cero indica un men)...}
if Msg.NotifyCode = 0 then
begin
{...recupera el estado del men y lo marca}
if (GetMenuState(MainMenu, Msg.ItemID, MF_BYCOMMAND) and MF_CHECKED) =
Funciones de men
709
MF_CHECKED then
CheckMenuItem(MainMenu, Msg.ItemID, MF_BYCOMMAND or MF_UNCHECKED)
else
CheckMenuItem(MainMenu, Msg.ItemID, MF_BYCOMMAND or MF_CHECKED);
{Indica que el mensaje fue manejado}
Msg.Result := 0;
end
else
{En caso contrario, no fue ninguno de nuestros nuevos cuatro elementos de men
quien gener el mensaje, dejemos que Windows lo maneje}
inherited;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Para llamar la atencin sobre el men, podemos asignar su estado resaltado.}
if (GetMenuState(MainMenu, 0, MF_BYPOSITION) and MF_HILITE) = MF_HILITE then
HiliteMenuItem(Form1.Handle, MainMenu, 0, MF_BYPOSITION or MF_UNHILITE)
else
HiliteMenuItem(Form1.Handle, MainMenu, 0, MF_BYPOSITION or MF_HILITE);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{Hemos terminado con los mens y los eliminamos a ambos: tanto al men
desplegable, como al principal}
DeleteMenu(MainMenu, 0, MF_BYPOSITION);
{Observe que debido a que el men fue asignado a una ventana usando la funcin
SetMenu, este men ser liberado automticamente y la siguiente lnea de cdigo
es innecesaria}
DestroyMenu(MainMenu);
end;
Figura 12-3:
La estructura
del men
Windows.Pas
Sintaxis
CreatePopupMenu: HMENU;
Descripcin
Esta funcin crea un men emergente vaco y devuelve su manejador. El men
resultante puede ser utilizado como men emergente, submen o men desplegable. A
12
Captulo
CreatePopupMenu
710
Captulo 12
este nuevo men podrn aadirse luego elementos de men y submens mediante las
funciones AppendMenu, InsertMenu e InsertMenuItem. Si el men va a ser usado como
men emergente, puede ser mostrado mediante las funciones TrackPopupMenu o
TrackPopupMenuEx. Cuando la aplicacin termina de utilizar el men, debe eliminarlo
usando la funcin DestroyMenu.
Vase adems
AppendMenu, CreateMenu, DestroyMenu, InsertMenu, InsertMenuItem, IsMenu,
TrackPopupMenu, TrackPopupMenuEx
Ejemplo
Listado 12-4: Creando un men emergente y utilizndolo en el men de sistema
const
{Identificadores de elementos de men. Debido a que estos elementos de men
sern situados en el men de sistema, y el mensaje WM_SYSCOMMAND utiliza
internamente los ltimos 4 bits del parmetro wParam, los identificadores de
elementos de men deben ser mayores que 15}
MNUID_BLACK = $1000;
MNUID_NORMAL = $2000;
var
Form1: TForm1;
SysPopup: HMENU;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{Crea el men emergente, que ser usado como un men desplegable en el men
de sistema}
SysPopup := CreatePopupMenu;
{Le aade los dos elementos de men}
AppendMenu(SysPopup, MF_STRING, MNUID_BLACK, 'Black');
AppendMenu(SysPopup, MF_STRING, MNUID_NORMAL, 'Normal');
Funciones de men
711
12
Captulo
712
Captulo 12
Figura 12-4:
El submen en
el men de
sistema
DeleteMenu
Windows.Pas
Sintaxis
DeleteMenu(
hMenu: HMENU;
uPosition: UINT;
uFlags: UINT
): BOOL;
{manejador de men}
{identificador o posicin del elemento a eliminar}
{opciones de elemento de men}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin elimina un elemento de men del men especificado. Si el elemento de
men abre un men desplegable o submen, esta funcin elimina el manejador del
men desplegable o submen, liberando sus recursos asociados.
Parmetros
hMenu: Manejador del men que contiene el elemento de men que ser eliminado.
uPosition: Especifica el elemento de men que ser eliminado. Este parmetro contiene
un identificador de elemento de men o una posicin de base cero, segn determina el
valor del parmetro uFlags.
uFlags: Valor que indica cmo debe ser interpretado el parmetro uPosition. Si este
parmetro contiene el valor MF_BYCOMMAND, el parmetro uPosition contiene un
identificador de elemento de men. Si este parmetro contiene la opcin
MF_BYPOSITION, el parmetro uFlags contiene una posicin de base cero.
Funciones de men
713
Vase adems
AppendMenu, CreatePopupMenu, DestroyMenu, InsertMenu, InsertMenuItem,
RemoveMenu
Ejemplo
Vea el Listado 12-4 bajo CreatePopupMenu.
DestroyMenu
Windows.Pas
Sintaxis
DestroyMenu(
hMenu: HMENU
): BOOL;
Descripcin
Esta funcin destruye el men especificado y libera todos sus recursos asociados.
Cualquier men que no haya sido asignado a una ventana mediante la funcin SetMenu
debe ser destruido utilizando la funcin DestroyMenu. Los mens asignados a una
ventana son automticamente destruidos cuando la funcin termina y no necesitan ser
destruidos explcitamente.
Parmetros
hMenu: Manejador del men que ser destruido.
Vase adems
CreateMenu, CreatePopupMenu, DeleteMenu, RemoveMenu
Ejemplo
12
Captulo
714
Captulo 12
EnableMenuItem
Windows.Pas
Sintaxis
EnableMenuItem(
hMenu: HMENU;
uIDEnableItem: UINT;
uEnable: UINT
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opciones de elemento de men}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin habilita, deshabilita, o sombrea (muestra en gris) un elemento de men del
men especificado.
Parmetros
hMenu: Manejador del men que contiene el elemento de men cuyo estado ser
modificado.
uIDEnableItem: Especifica el elemento de men que ser habilitado, deshabilitado, o
sombreado. Este parmetro contiene un identificador de elemento de men o una
posicin de base cero, segn determina el valor del parmetro uEnable.
uEnable: Combinacin de opciones que determina cmo el parmetro uIDEnableItem
debe ser interpretado y si el elemento de men ser habilitado, deshabilitado, o
sombreado. Este parmetro puede contener los valores MF_BYCOMMAND o
MF_BYPOSITION combinados con una de las siguientes opciones: MF_DISABLED,
MF_ENABLED, o MF_GRAYED. Estas opciones se describen en la Tabla 12-4.
Observe que si este parmetro incluye la opcin MF_BYCOMMAND, todos los
submens alcanzables desde los elementos del men identificado por el parmetro
hMenu sern recorridos en busca del identificador de elemento de men especificado.
De esta manera, utilizando la opcin MF_BYCOMMAND (y asumiendo que no hay
identificadores de mens duplicados), slo es necesario especificar el manejador del
men principal.
Vase adems
AppendMenu, CreateMenu, CreatePopupMenu, GetMenuItemID, GetMenuItemInfo,
InsertMenu, InsertMenuItem, ModifyMenu, SetMenuItemInfo
Ejemplo
Listado 12-5: Habilitando y deshabilitando el elemento Cerrar del men de sistema
procedure TForm1.Button1Click(Sender: TObject);
var
SysMenu: HMENU;
// almacena un manejador del men de sistema
Funciones de men
715
begin
{Recupera un manejador del men de sistema}
SysMenu := GetSystemMenu(Form1.Handle, FALSE);
{Si el elemento de men Cerrar est deshabilitado...}
if (GetMenuState(SysMenu, 6, MF_BYPOSITION) and MF_GRAYED) = MF_GRAYED then
begin
{...habilitarlo...}
EnableMenuItem(SysMenu, 6, MF_BYPOSITION or MF_ENABLED);
Button1.Caption := 'Disable Close menu item'
end
else
begin
{...en caso contrario, deshabilitarlo y sombrearlo}
EnableMenuItem(SysMenu, 6, MF_BYPOSITION or MF_GRAYED);
Button1.Caption := 'Enable Close menu item';
end;
end;
Figura 12-5:
El elemento
Cerrar del
men de
sistema
deshabilitado
MF_BYPOSITION
MF_DISABLED
MF_ENABLED
MF_GRAYED
Descripcin
Indica que el parmetro uIDEnableItem contiene el
identificador de un elemento de men. Esta opcin es
utilizada por defecto si no se especifica ninguna, y no puede
ser combinada con la opcin MF_BYPOSITION.
Indica que el parmetro uIDEnableItem contiene la posicin
de base cero del elemento de men. Esta opcin no puede
ser combinada con MF_BYCOMMAND.
Deshabilita el elemento de men de manera que no pueda
ser seleccionado, sin sombrearlo. Esta opcin no puede ser
combinada con MF_ENABLED o MF_GRAYED.
Habilita el elemento de men de manera que pueda ser
seleccionado, restaurndolo si estaba sombreado. Esta
opcin no puede ser combinada con MF_DISABLED o
MF_GRAYED.
Deshabilita el elemento de men de manera que no pueda
ser seleccionado y lo sombrea. Esta opcin no puede ser
combinada con MF_ENABLED o MF_DISABLED.
12
Captulo
Valor
MF_BYCOMMAND
716
Captulo 12
GetMenu
Windows.Pas
Sintaxis
GetMenu(
hWnd: HWND
): HMENU;
Descripcin
Esta funcin devuelve un manejador del men asignado a la ventana especificada.
Parmetros
hWnd: Manejador de la ventana cuyo manejador de men es recuperado.
Vase adems
CreateMenu, GetSubMenu, GetSystemMenu, SetMenu
Ejemplo
Listado 12-6: Controlando a Delphi a travs de sus mens
var
Form1: TForm1;
DelphiWindow: HWND;
ReopenMenu: HMENU;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
DelphiMainMenu,
// manejador del men principal de Delphi
DelphiFileMenu: HMENU; // manejador del men desplegable File de Delphi
begin
{Recupera un manejador de la ventana principal de Delphi}
DelphiWindow := FindWindow('TAppBuilder', NIL);
{Recupera un manejador del men principal de Delphi}
DelphiMainMenu := GetMenu(DelphiWindow);
{Recupera un manejador del men desplegable File de Delphi}
DelphiFileMenu := GetSubMenu(DelphiMainMenu, 0);
{Recupera un manejador submen Reopen de Delphi}
ReopenMenu := GetSubMenu(DelphiFileMenu, 5);
Funciones de men
717
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
MenuPos: TPoint; // las coordenadas de pantalla del ratn
begin
{Si el botn derecho del ratn fue pulsado...}
if Button = mbRight then
begin
{...convierte las coordenadas del ratn a coordenadas de la pantalla}
MenuPos.X := X;
MenuPos.Y := Y;
MenuPos := ClientToScreen(MenuPos);
{Muestra el men Reopen de Delphi como un men emergente}
TrackPopupMenu(ReopenMenu, TPM_RIGHTALIGN, MenuPos.X, MenuPos.Y, 0,
Form1.Handle, nil);
end;
end;
{El manejador redefinido del mensaje WM_COMMAND}
procedure TForm1.WMCommand(var Msg: TMessage);
begin
{Redireccionando el mensaje desde el men emergente hacia Delphi, podemos
controlar a Delphi desde nuestra copia del men de la misma manera que si
se hiciera clic en la opcin de men del IDE de Delphi}
PostMessage(DelphiWindow, Msg.Msg, Msg.WParam, Msg.LParam);
inherited;
end;
12
Captulo
Figura 12-6:
El men
Reopen de
Delphi
718
Captulo 12
GetMenuDefaultItem
Windows.Pas
Sintaxis
GetMenuDefaultItem(
hMenu: HMENU;
fByPos: UINT;
gmdiFlags: UINT
): UINT;
{manejador de men}
{opcin de identificador o posicin}
{opciones de bsqueda}
{devuelve un identificador de elemento o posicin}
Descripcin
Esta funcin recupera la posicin o identificador del elemento de men predeterminado
(por defecto) del men especificado. A menos que se indique lo contrario, la funcin no
devolver el elemento de men predeterminado si ste est deshabilitado.
Parmetros
hMenu: Manejador del men cuyo elemento de men predeterminado ser recuperado.
fByPos: Valor que indica si se desea obtener el identificador de elemento de men o su
posicin con base cero. Si este parmetro es cero, la funcin devuelve el identificador
del elemento de men predeterminado. Si es 1, la funcin devuelve la posicin de base
cero del elemento de men predeterminado.
gmdiFlags: Combinacin de valores que determinan cmo la funcin busca en el men
especificado para encontrar su elemento de men predeterminado. Este parmetro
puede ser cero o una combinacin de uno o ms valores de la Tabla 12-5.
Vase adems
GetMenuItemInfo, SetMenuDefaultItem, SetMenuItemInfo
Ejemplo
Vea el Listado 12-10 bajo SetMenuDefaultItem.
Funciones de men
719
GMDI_USEDISABLED
GetMenuItemCount
Descripcin
Indica que si el elemento predeterminado del men despliega
un submen, la funcin debe buscar en el submen un
elemento predeterminado. Si el submen no contiene un
elemento predeterminado, ser devuelto el elemento que
despliega el submen. Si el elemento predeterminado de un
submen abre a su vez otro submen, la bsqueda contina
recursivamente hasta encontrar un elemento por defecto.
Indica que la funcin devolver el elemento de men
predeterminado incluso aunque estuviese deshabilitado.
Windows.Pas
Sintaxis
GetMenuItemCount(
hMenu: HMENU
): Integer;
{manejador de men}
{devuelve la cantidad de elementos de men en el men}
Descripcin
Esta funcin devuelve la cantidad de elementos de men del men especificado.
Parmetros
hMenu: Manejador del men cuya cantidad de elementos de men se desea obtener.
Vase adems
GetMenu, GetMenuItemID, GetSubMenu, GetMenuItemInfo, GetMenuString
Ejemplo
Vea el Listado 12-10 bajo SetMenuDefaultItem.
Sintaxis
GetMenuItemID(
hMenu: HMENU;
nPos: Integer
{manejador de men}
{posicin del elemento de men}
12
Captulo
GetMenuItemID Windows.Pas
720
Captulo 12
): UINT;
Descripcin
Esta funcin devuelve el identificador del elemento de men situado en la posicin
nPos del men especificado.
Parmetros
hMenu: Manejador del men que contiene el elemento de men cuyo identificador va a
ser recuperado.
nPos: Especifica la posicin (con base cero) del elemento de men cuyo identificador
va a ser recuperado.
Vase adems
GetMenuItemCount, GetMenuItemID, GetMenuItemInfo, GetMenuString
Ejemplo
Vea el Listado 12-10 bajo SetMenuDefaultItem.
GetMenuItemInfo
Windows.Pas
Sintaxis
GetMenuItemInfo(
p1: HMENU;
p2: UINT;
p3: BOOL;
var p4: TMenuItemInfo
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opcin de identificador o posicin}
{puntero a registro TMenuItemInfo}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin recupera informacin especfica sobre el elemento de men especificado
por el parmetro p2, perteneciente al men identificado por su manejador p1.
Parmetros
p1: Manejador del men que contiene el elemento de men cuya informacin va a ser
recuperada.
Funciones de men
721
p2: Especifica el identificador de elemento de men o la posicin (de base cero) del
elemento de men cuya informacin va a ser recuperada. El valor del parmetro p3
indica cmo la funcin debe interpretar el valor de este parmetro.
p3: Indica cmo la funcin debe interpretar el valor del parmetro p2. Si a este
parmetro se le asigna TRUE, el valor del parmetro p2 indica la posicin del elemento
de men, contando a partir de cero. Si a este parmetro se le asigna FALSE, p2
contiene un identificador de elemento de men.
p4: Puntero a un registro TMenuItemInfo que contiene valores que especifican la
informacin a recuperar. Este registro recibe la informacin solicitada cuando la
funcin retorna. El registro TMenuItemInfo se define como:
TMenuItemInfo = packed record
cbSize: UINT;
fMask: UINT;
fType: UINT;
fState: UINT;
wID: UINT;
hSubMenu: HMENU;
hbmpChecked: HBITMAP;
hbmpUnchecked: HBITMAP;
dwItemData: DWORD;
dwTypeData: PAnsiChar;
cch: UINT;
end;
cbSize: Especifica el tamao del registro, en bytes. A este campo debe asignrsele
SizeOf(TMenuItemInfo).
fMask: Valor que determina qu campos de la estructura se desea asignar o
recuperar. Este campo puede contener una combinacin de uno o ms valores de
la Tabla 12-6.
fType: Valor que indica el tipo del elemento de men. Este campo puede contener
una combinacin de uno o ms valores de la Tabla 12-7.
fState: Valor que indica el estado del elemento de men. Este campo puede
contener una combinacin de uno o ms valores de la Tabla 12-8.
hSubMenu: Manejador del men desplegable o submen que es activado cuando
el elemento de men es seleccionado. Si el elemento de men no activa un
submen o men desplegable, este campo tendr valor cero.
12
Captulo
722
Captulo 12
Vase adems
EnableMenuItem, GetMenuItemCount, GetMenuItemID, GetMenuItemRect,
GetMenuState, GetMenuString, HiliteMenuItem, InsertMenuItem, ModifyMenu,
SetMenuItemBitmaps, SetMenuItemInfo
Ejemplo
Vea el Listado 12-1 bajo el ejemplo de men dibujado por el propietario, en la
introduccin del captulo.
Tabla 12-6: Valores del campo p4.fMask de GetMenuItemInfo
Valor
MIIM_CHECK MARKS
MIIM_DATA
MIIM_ID
MIIM_STATE
Descripcin
Recupera o asigna el valor de los campos hbmpChecked y
hbmpUnchecked.
Recupera o asigna el valor del campo dwItemData.
Recupera o asigna el valor del campo wID.
Recupera o asigna el valor del campo fState.
Funciones de men
Valor
MIIM_SUBMENU
MIIM_TYPE
723
Descripcin
Recupera o asigna el valor del campo hSubMenu.
Recupera o asigna el valor de los campos fType y
dwTypeData.
12
Captulo
Descripcin
Indica que se utiliza un mapa de bits para representar el
elemento de men. El manejador del mapa de bits es
especificado en el parmetro dwTypeData. Esta opcin no
puede ser combinada con las opciones MFT_STRING o
MFT_OWNERDRAW.
MFT_MENUBARBREAK Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna y las
columnas son separadas mediante una lnea vertical. Esta opcin
no puede ser combinada con la opcin MFT_MENUBREAK.
MFT_MENUBREAK
Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna. No hay
indicacin visual de separacin de columnas. Esta opcin no
puede ser combinada con la opcin MFT_MENUBARBREAK.
MFT_OWNERDRAW
Indica un elemento de men dibujado por el propietario.
Cuando el elemento de men es mostrado por primera vez, la
ventana propietaria recibe un mensaje WM_MEASUREITEM,
permitiendo a la aplicacin especificar el ancho y altura del
elemento de men. La ventana propietaria recibe un mensaje
WM_DRAWITEM cuando el elemento de men va a ser
dibujado, permitiendo a la aplicacin dibujar el elemento de
men con la apariencia deseada. Esta opcin no puede ser
combinada con las opciones MFT_BITMAP o MFT_STRING.
MFT_RADIOCHECK
Indica que la imagen de la marca de verificacin usada para
elementos de men es una vieta, si el campo hbmpChecked
contiene cero.
MFT_RIGHTJUSTIFY
Justifica a la derecha el elemento de men y los elementos de
men subsiguientes. Esta opcin es vlida slo para elementos
de men situados en una barra de men.
MFT_SEPARATOR
Indica un separador de men. Este elemento de men es
dibujado como una lnea horizontal y es vlido solo cuando es
usado con mens desplegables, mens emergentes, o
submens. Este elemento de men no puede ser resaltado,
sombreado, o deshabilitado y los parmetros dwTypeData y cch
son ignorados
724
Captulo 12
Valor
MFT_STRING
Descripcin
Indica que se utiliza una cadena de caracteres para representar
el elemento de men. El parmetro dwTypeData contiene un
puntero a la cadena terminada en nulo mostrada en el elemento
de men. Esta opcin no puede ser combinada con las opciones
MFT_BITMAP o MFT_OWNERDRAW.
MFS_DEFAULT
MFS_DISABLED
MFS_ENABLED
MFS_GRAYED
MFS_HILITE
MFS_UNCHECKED
MFS_UNHILITE
GetMenuItemRect
Descripcin
Coloca el mapa de bits de la marca de verificacin del men
junto al elemento de men. Por defecto, es la imagen de una
marca de verificacin. Esta opcin no puede ser combinada con
la opcin MFS_UNCHECKED.
Indica que el elemento de men es el elemento predeterminado
del men. Slo puede haber un elemento predeterminado por
men.
Deshabilita el elemento de men de manera que no pueda ser
seleccionado, pero no lo sombrea. Esta opcin no puede ser
combinada con las opciones MFS_ENABLED o MFS_GRAYED.
Habilita el elemento de men de manera que pueda ser
seleccionado, y lo restaura si estaba sombreado. Esta opcin no
puede ser combinada con las opciones MFS_DISABLED o
MFS_GRAYED. Este es el estado por defecto de un nuevo
elemento de men.
Deshabilita el elemento de men de manera que no pueda ser
seleccionado y lo dibuja sombreado (en gris). Esta opcin no
puede ser combinada con las opciones MFS_ENABLED o
MFS_DISABLED.
Resalta el elemento de men.
Coloca el mapa de bits que indica que el elemento de men
est desmarcado junto al elemento de men. Por defecto, esta
imagen es una imagen en blanco. Esta opcin no puede ser
combinada con la opcin MFS_CHECKED.
Elimina el resaltado del elemento de men. Los nuevos
elementos de men contienen este atributo de manera
predeterminada.
Windows.Pas
Sintaxis
GetMenuItemRect(
hWnd: HWND;
Funciones de men
hMenu: HMENU;
uItem: UINT;
var lprcItem: TRect
): BOOL;
725
{manejador de men}
{posicin de un elemento de men}
{puntero a un registro TRect}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin recupera el rectngulo lmite, en coordenadas de la pantalla, del elemento
de men especificado.
Parmetros
hWnd: Manejador de la ventana propietaria del men para uno de cuyos elementos se
determina el rectngulo lmite.
hMenu: Manejador del men que contiene el elemento de men cuyo rectngulo lmite
ser recuperado.
uItem: La posicin (contando a partir de cero) del elemento de men.
lprcItem: Puntero al registro TRect que recibe las coordenadas del rectngulo lmite del
elemento de men, en coordenadas de pantalla.
Vase adems
GetMenu, GetMenuItemCount, GetMenuItemID, GetMenuItemInfo, GetMenuState,
GetMenuString, GetSubMenu, GetSystemMenu
Ejemplo
Vea el Listado 12-10 bajo SetMenuDefaultItem.
GetMenuState
Windows.Pas
Sintaxis
{manejador de men}
{identificador de un elemento de men o posicin}
{opcin de identificador o posicin}
{devuelve las opciones de estado del elemento de men}
12
Captulo
GetMenuState(
hMenu: HMENU;
uId: UINT;
uFlags: UINT
): UINT;
726
Captulo 12
Descripcin
Esta funcin recupera un valor que indica el estado del elemento de men especificado.
Si el elemento de men abre un submen, la funcin tambin devuelve el nmero de
elementos de men en el submen abierto.
Parmetros
hMenu: Manejador del men que contiene el elemento de men cuyo estado ser
recuperado.
uId: Especifica el identificador de elemento de men o la posicin de base cero del
elemento de men cuyo estado ser recuperado. El valor del parmetro uFlags indica
cmo la funcin debe interpretar el valor de este parmetro.
uFlags: Indica cmo la funcin debe interpretar el valor del parmetro uId. Si a este
parmetro se le asigna MF_BYPOSITION, el valor del parmetro uId indica la posicin
de base cero del elemento de men. Si a este parmetro se le asigna
MF_BYCOMMAND, uId contiene el identificador del elemento de men.
Vase adems
GetMenu, GetMenuDefaultItem, GetMenuItemCount, GetMenuItemID,
GetMenuItemInfo, GetMenuItemRect, GetMenuString, GetSubMenu
Ejemplo
Vea el Listado 12-3 bajo CreateMenu y el Listado 12-5 bajo EnableMenuItem.
Tabla 12-9: Valores que devuelve GetMenuState
Valor
MF_CHECKED
MF_DISABLED
MF_GRAYED
MF_HILITE
Descripcin
Indica que el elemento de men est marcado.
Indica que el elemento de men est deshabilitado.
Indica que el elemento de men est deshabilitado y
sombreado.
Indica que el elemento de men est resaltado.
Funciones de men
Valor
MF_MENUBARBREAK
MF_MENUBREAK
MF_SEPARATOR
GetMenuString
727
Descripcin
Indica que el elemento de men identifica un separador de
men. Para submens o mens desplegables, las columnas
estarn separadas por una barra vertical.
Indica que el elemento de men identifica un separador de
men. No habr indicaciones visuales de separacin de
columna para mens desplegables o submens.
Indica que el elemento de men es un separador de men.
Este elemento de men es dibujado como una lnea horizontal
y es vlido solo para mens desplegables, mens emergentes,
o submens.
Windows.Pas
Sintaxis
GetMenuString(
hMenu: HMENU;
{manejador de men}
uIDItem: UINT;
{identificador de elemento de men o posicin}
lpString: PChar;
{puntero a un buffer de cadena terminada en nulo}
nMaxCount: Integer;
{longitud de la cadena que ser recuperada}
uFlag: UINT
{opcin de identificador o posicin}
): Integer;
{devuelve la cantidad de caracteres copiados en el buffer}
Descripcin
Esta funcin recupera el texto asociado con el elemento de men especificado, y lo
almacena en una cadena terminada en nulo a la que apunta el parmetro lpString.
Parmetros
hMenu: Manejador del men que contiene el elemento de men cuyo texto ser
recuperado.
uIDItem: Especifica el identificador de elemento de men o la posicin de base cero
del elemento de men cuyo texto ser recuperado. El valor del parmetro uFlag indica
cmo la funcin debe interpretar el valor de este parmetro.
12
Captulo
728
Captulo 12
Vase adems
GetMenuItemID, GetMenuItemInfo, GetMenuState, SetMenuItemInfo
Ejemplo
Vea el Listado 12-10 bajo SetMenuDefaultItem.
GetSubMenu
Windows.Pas
Sintaxis
GetSubMenu(
hMenu: HMENU;
nPos: Integer
): HMENU;
{manejador de men}
{posicin de base cero del elemento de men}
{devuelve un manejador de men}
Descripcin
Esta funcin recupera un manejador del men desplegable o un submen activado por
el elemento de men especificado.
Parmetros
hMenu: Manejador del men que contiene el elemento de men para el que se
recuperar un manejador del men desplegable o submen.
nPos: Especifica la posicin (contando a partir de cero) del elemento de men que
activa un men desplegable o submen.
Funciones de men
729
Vase adems
CreatePopupMenu, GetMenu, GetMenuItemInfo, SetMenuItemInfo
Ejemplo
Vea el Listado 12-6 bajo GetMenu.
GetSystemMenu
Windows.Pas
Sintaxis
GetSystemMenu(
hWnd: HWND;
bRevert: BOOL
): HMENU;
{manejador de ventana}
{opcin de reinicializacin del men de la ventana}
{devuelve un manejador del men de sistema}
Descripcin
Esta funcin recupera un manejador del men de sistema de la ventana especificada (el
men mostrado cuando se hace clic en el icono situado en la esquina superior izquierda
de la ventana). Una aplicacin puede modificar este men utilizando varias de las
funciones que se describen en este captulo. El elemento de men aadido a este men
enviar a la ventana propietaria un mensaje WM_SYSCOMMAND cuando se haga clic
sobre l. Observe que todos los elementos de men predefinidos en el men de sistema
tienen identificadores mayores que $F000. Los elementos de men que se aadan al
men de sistema deben tener identificadores menores que $F000.
Parmetros
hWnd: Manejador de la ventana cuyo manejador del men de sistema ser recuperado.
bRevert: Indica si el men de sistema debe ser restaurado a su estado predeterminado.
Si a este parmetro se le asigna FALSE, la funcin devuelve un manejador del men de
sistema actual. Si a este parmetro se le asigna TRUE, el men del sistema es
reinicializado a su estado por defecto y el men de sistema anterior es destruido.
Ejemplo
Vea el Listado 12-4 bajo CreatePopupMenu.
12
Captulo
Vase adems
730
Captulo 12
HiliteMenuItem
Windows.Pas
Sintaxis
HiliteMenuItem(
hWnd: HWND;
hMenu: HMENU;
uIDHiliteItem: UINT;
uHilite: UINT
): BOOL;
{manejador de ventana}
{manejador de men}
{identificador de elemento de men o posicin}
{opciones de elemento de men}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin resalta o quita el resaltado a un elemento de men en una barra de men.
Parmetros
hWnd: Manejador de la ventana propietaria del men cuyo elemento de men ser
resaltado.
hMenu: Manejador del men que contiene el elemento de men a resaltar. Observe que
ste debe ser un manejador de una barra de men, y no de un men emergente, men
desplegable, o submen.
uIDHiliteItem: Especifica el elemento de men que ser resaltado. Este parmetro
contiene un identificador de elemento de men o una posicin de base cero, segn
determina el parmetro uHilite.
uHilite: Una combinacin de valores que determina cmo el parmetro uIDHiliteItem
es interpretado y si el elemento de men debe ganar o perder el resaltado. Este
parmetro puede contener una de las opciones MF_BYCOMMAND o
MF_BYPOSITION combinada con MF_HILITE o MF_UNHILITE. El significado de
estas opciones se describe en la Tabla 12-10.
Vase adems
GetMenuItemInfo, GetMenuState, SetMenuItemInfo
Ejemplo
Vea el Listado 12-3 bajo CreateMenu.
Tabla 12-10: Valores del parmetro uHilite de HiliteMenuItem
Valor
MF_BYCOMMAND
Descripcin
Indica que el parmetro uIDHiliteItem contiene un
identificador de elemento de men. Esta opcin se asume
por defecto si ninguna es especificada, y no puede ser
combinada con MF_BYPOSITION.
Funciones de men
Valor
MF_BYPOSITION
731
Descripcin
Indica que el parmetro uIDHiliteItem contiene una posicin
de elemento de men (de base cero). Esta opcin no puede
ser combinada con MF_BYCOMMAND.
Resalta el elemento de men.
Quita el resaltado al elemento de men.
MF_HILITE
MF_UNHILITE
InsertMenu
Windows.Pas
Sintaxis
InsertMenu(
hMenu: HMENU;
uPosition: UINT;
uFlags: UINT;
uIDNewItem: UINT;
lpNewItem: PChar
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opciones de elemento de men}
{identificador de elemento de men o manejador de
submen}
{datos del elemento de men}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin inserta un nuevo elemento de men antes del elemento de men indicado,
en el men especificado. Todos los elementos de men subsiguientes son desplazados
hacia abajo.
Parmetros
hMenu: Manejador del men en el cual el nuevo elemento de men ser insertado.
uPosition: Especifica el elemento de men antes del cual el nuevo elemento de men
ser insertado. Este parmetro puede contener un identificador de elemento de men o
una posicin de base cero, segn determine el parmetro uFlags.
uFlags: Una combinacin de opciones que determina cmo el parmetro uPosition es
interpretado y cmo el nuevo elemento de men aparecer y se comportar. Este
parmetro puede contener una de las opciones MF_BYCOMMAND o
MF_BYPOSITION, combinada con una o ms opciones de la Tabla 12-11.
12
Captulo
732
Captulo 12
valor de 32 bits definido por la aplicacin. Este valor estar contenido en el campo
itemData del registro al que apuntan los mensajes WM_MEASUREITEM y
WM_DRAWITEM, que la ventana recibe cuando el men es creado o dibujado.
Vase adems
AppendMenu, CreateMenu, CreatePopupMenu, DeleteMenu, DestroyMenu,
InsertMenuItem, ModifyMenu, RemoveMenu
Ejemplo
Vea el Listado 12-4 bajo CreatePopupMenu.
Tabla 12-11: Valores del parmetro uFlags de InsertMenu
Valor
MF_BITMAP
MF_BYCOMMAND
MF_BYPOSITION
MF_CHECKED
MF_DISABLED
MF_ENABLED
Descripcin
Indica que se utiliza un mapa de bits para representar el
elemento de men. El manejador del mapa de bits es
especificado en el parmetro lpNewItem. Esta opcin no puede
ser combinada con las opciones MF_STRING o
MF_OWNERDRAW.
Indica que el parmetro uPosition contiene un identificador de
elemento de men. Esta opcin se asume por defecto si ninguna
es especificada, y no puede ser combinada con
MF_BYPOSITION.
Indica que el parmetro uPosition contiene una posicin de
elemento de men (de base cero). Esta opcin no puede ser
combinada con MF_BYCOMMAND. Observe que si el
parmetro uPosition es $FFFFFFFF; el elemento del men se
aade al final del men.
Coloca el mapa de bits de la marca de verificacin del men
junto al elemento de men. Por defecto, es la imagen de una
marca de verificacin. Esta opcin no puede ser combinada con
la opcin MF_UNCHECKED.
Deshabilita el elemento de men de manera que no pueda ser
seleccionado, pero no lo sombrea. Esta opcin no puede ser
combinada con las opciones MF_ENABLED o MF_GRAYED.
Habilita el elemento de men de manera que pueda ser
seleccionado, y lo restaura si estaba sombreado. Esta opcin no
puede ser combinada con las opciones MF_DISABLED o
MF_GRAYED.
Valor
MF_GRAYED
MF_MENUBARBREAK
MF_MENUBREAK
MF_OWNERDRAW
MF_POPUP
MF_SEPARATOR
MF_STRING
MF_UNCHECKED
733
Descripcin
Deshabilita el elemento de men de manera que no pueda ser
seleccionado y lo dibuja sombreado (en gris). Esta opcin no
puede ser combinada con las opciones MF_ENABLED o
MF_DISABLED.
Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna y las
columnas son separadas mediante una lnea vertical. Esta opcin
no puede ser combinada con la opcin MF_MENUBREAK.
Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna. No hay
indicacin visual de separacin de columnas. Esta opcin no
puede ser combinada con la opcin MF_MENUBARBREAK.
Indica un elemento de men dibujado por el propietario.
Cuando el elemento de men es mostrado por primera vez, la
ventana propietaria recibe un mensaje WM_MEASUREITEM,
permitiendo a la aplicacin especificar el ancho y altura del
elemento de men. La ventana propietaria recibe un mensaje
WM_DRAWITEM cuando el elemento de men va a ser
dibujado, permitiendo a la aplicacin dibujar el elemento de
men con la apariencia deseada. Esta opcin no puede ser
combinada con las opciones MF_BITMAP o MF_STRING.
Indica que el elemento de men abre un men desplegable o
submen. El manejador del men desplegable o submen es
especificado en el parmetro uIDNewItem.
Indica un separador de men. Este elemento de men es
dibujado como una lnea horizontal y es vlido solo cuando es
usado con mens desplegables, mens emergentes, o
submens. Este elemento de men no puede ser resaltado,
sombreado, o deshabilitado y los parmetros uIDNewItem y
lpNewItem son ignorados.
Indica que se utiliza una cadena de caracteres para representar
el elemento de men. El parmetro lpNewItem contiene un
puntero a la cadena terminada en nulo mostrada en el elemento
de men. Esta opcin no puede ser combinada con las opciones
MF_BITMAP o MF_OWNERDRAW.
Coloca el mapa de bits que indica que el elemento de men
est desmarcado junto al elemento de men. Por defecto, esta
imagen es una imagen en blanco. Esta opcin no puede ser
combinada con la opcin MF_CHECKED.
12
Captulo
Funciones de men
734
Captulo 12
InsertMenuItem
Windows.Pas
Sintaxis
InsertMenuItem(
p1: HMENU;
p2: UINT;
p3: BOOL;
const p4: TMenuItemInfo
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opcin de identificador o posicin}
{puntero a registro TMenuItemInfo}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin inserta un nuevo elemento de men antes del elemento de men
especificado en el men indicado. Todos lo elementos de men subsiguientes son
desplazados hacia abajo.
Parmetros
p1: Manejador del men en el cual el nuevo elemento de men ser insertado.
p2: Especifica el identificador de elemento de men o la posicin de base cero del
elemento de men, delante del cual el nuevo elemento de men ser insertado. El valor
del parmetro p3 indica cmo la funcin debe interpretar el valor de este parmetro.
p3: Indica cmo la funcin debe interpretar el valor del parmetro p2. Si a este
parmetro se le asigna TRUE, el valor del parmetro p2 indica la posicin de base cero
del elemento de men. Si a este parmetro se le asigna FALSE, p2 contiene el
identificador del elemento de men.
p4: Puntero a un registro de tipo TMenuItemInfo que contiene informacin sobre el
nuevo elemento de men. El registro TMenuItemInfo se define como:
TMenuItemInfo = packed record
cbSize: UINT;
fMask: UINT;
fType: UINT;
fState: UINT;
wID: UINT;
hSubMenu: HMENU;
hbmpChecked: HBITMAP;
hbmpUnchecked: HBITMAP;
dwItemData: DWORD;
dwTypeData: PAnsiChar;
cch: UINT;
end;
Funciones de men
735
Vase adems
AppendMenu, CreateMenu, CreatePopupMenu, DeleteMenu, DestroyMenu,
InsertMenu, ModifyMenu, RemoveMenu
Ejemplo
Vea el Listado 12-3 bajo CreateMenu.
IsMenu
Windows.Pas
Sintaxis
IsMenu(
hMenu: HMENU
): BOOL;
{manejador de men}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin indica si el manejador especificado es un manejador de men.
Parmetros
hMenu: Especifica el manejador a comprobar.
Vase adems
GetMenu, GetSubMenu, IsWindow
Ejemplo
12
Captulo
736
Captulo 12
ModifyMenu
Windows.Pas
Sintaxis
ModifyMenu(
hMnu: HMENU;
uPosition: UINT;
uFlags: UINT;
uIDNewItem: UINT;
lpNewItem: PChar
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opciones de elemento de men}
{identificador de elemento de men o manejador de
submen}
{datos del elemento de men}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin modifica la apariencia y comportamiento del elemento de men indicado
en el men especificado.
Parmetros
hMnu: Manejador del men que contiene el elemento de men que ser modificado.
uPosition: Especifica el elemento de men a modificar. Este parmetro contiene un
identificador de elemento de men o a una posicin de base cero, segn determine el
parmetro uFlags.
uFlags: Una combinacin de opciones que determinan cmo el parmetro uPosition
debe ser interpretado y cmo el elemento de men especificado ser modificado. Este
parmetro puede contener una de las opciones MF_BYCOMMAND o
MF_BYPOSITION, combinadas con una o ms opciones de la Tabla 12-12.
uIDNewItem: Especifica el identificador del nuevo elemento de men. Si el parmetro
uFlags contiene la opcin MF_POPUP, este parmetro contiene el manejador del men
desplegable o submen.
lpNewItem: Puntero a datos adicionales asociados con el nuevo elemento de men. El
contenido de este parmetro depende de las opciones especificadas en el parmetro
uFlags. Si el parmetro uFlags incluye la opcin MF_BITMAP, este parmetro contiene
un manejador de un mapa de bits. Si el parmetro uFlags incluye la opcin
MF_STRING, este parmetro apunta a una cadena de caracteres terminada en nulo. Si el
parmetro uFlags incluye la opcin MF_OWNERDRAW, este parmetro contiene un
valor de 32 bits definido por la aplicacin. Este valor estar contenido en el campo
itemData del registro al que apuntan los mensajes WM_MEASUREITEM y
WM_DRAWITEM, que la ventana recibe cuando el men es creado o dibujado.
Funciones de men
737
Vase adems
AppendMenu, CreateMenu, CreatePopupMenu, DeleteMenu, DestroyMenu,
InsertMenu, InsertMenuItem, RemoveMenu
Ejemplo
Listado 12-8: Creando una herramienta de paleta en un men
procedure TForm1.FormCreate(Sender: TObject);
begin
{Cambia los elementos de men existentes en el men desplegable. Esto dar al
men la apariencia de una barra de herramientas o un herramienta de paleta}
ModifyMenu(Palette1.Handle, 0, MF_BYPOSITION or MF_BITMAP,
GetMenuItemID(Palette1.Handle, 0),
Pointer(Image1.Picture.Bitmap.Handle));
ModifyMenu(Palette1.Handle, 1, MF_BYPOSITION or MF_BITMAP,
GetMenuItemID(Palette1.Handle, 1),
Pointer(Image2.Picture.Bitmap.Handle));
ModifyMenu(Palette1.Handle, 2, MF_BYPOSITION or MF_BITMAP,
GetMenuItemID(Palette1.Handle, 2),
Pointer(Image3.Picture.Bitmap.Handle));
{Queremos comenzar una nueva columna aqu}
ModifyMenu(Palette1.Handle, 3, MF_BYPOSITION or MF_BITMAP or MF_MENUBREAK,
GetMenuItemID(Palette1.Handle, 3),
Pointer(Image4.Picture.Bitmap.Handle));
ModifyMenu(Palette1.Handle, 4, MF_BYPOSITION or MF_BITMAP,
GetMenuItemID(Palette1.Handle, 4),
Pointer(Image5.Picture.Bitmap.Handle));
ModifyMenu(Palette1.Handle, 5, MF_BYPOSITION or MF_BITMAP,
GetMenuItemID(Palette1.Handle, 5),
Pointer(Image6.Picture.Bitmap.Handle));
end;
procedure TForm1.Item11Click(Sender: TObject);
begin
{Muestra en qu elemento se hizo clic}
Label2.Caption := TMenuItem(Sender).Caption;
end;
12
Captulo
Figura 12-7:
El men de
paleta de
herramientas
738
Captulo 12
MF_BYCOMMAND
MF_BYPOSITION
MF_CHECKED
MF_DISABLED
MF_ENABLED
MF_GRAYED
MF_MENUBARBREAK
MF_MENUBREAK
Descripcin
Indica que se utiliza un mapa de bits para representar el
elemento de men. El manejador del mapa de bits es
especificado en el parmetro lpNewItem. Esta opcin no puede
ser combinada con las opciones MF_STRING o
MF_OWNERDRAW.
Indica que el parmetro uPosition contiene un identificador de
elemento de men. Esta opcin se asume por defecto si ninguna
es especificada, y no puede ser combinada con
MF_BYPOSITION.
Indica que el parmetro uPosition contiene una posicin de
elemento de men (de base cero). Esta opcin no puede ser
combinada con MF_BYCOMMAND. Observe que si el
parmetro uPosition es $FFFFFFFF, el elemento del men se
aade al final del men.
Coloca el mapa de bits de la marca de verificacin del men
junto al elemento de men. Por defecto, sta es una imagen de
marca de verificacin. Esta opcin no puede ser combinada con
la opcin MF_UNCHECKED.
Deshabilita el elemento de men de manera que no pueda ser
seleccionado, pero no lo muestra en gris. Esta opcin no puede
ser combinada con las opciones MF_ENABLED o MF_GRAYED.
Habilita el elemento de men de manera que pueda ser
seleccionado, y lo restaura si estaba sombreado. Esta opcin no
puede ser combinada con las opciones MF_DISABLED o
MF_GRAYED.
Deshabilita el elemento de men de manera que no pueda ser
seleccionado y lo dibuja sombreado (en gris). Esta opcin no
puede ser combinada con las opciones MF_ENABLED o
MF_DISABLED.
Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna y las
columnas son separadas mediante una lnea vertical. Esta opcin
no puede ser combinada con la opcin MF_MENUBREAK.
Coloca el elemento de men en una nueva lnea de la barra de
men. En el caso de submens y mens desplegables, el
elemento de men es situado en una nueva columna. No hay
indicacin visual de separacin de columnas. Esta opcin no
puede ser combinada con la opcin MF_MENUBARBREAK.
Funciones de men
Valor
MF_OWNERDRAW
MF_POPUP
MF_SEPARATOR
MF_STRING
MF_UNCHECKED
RemoveMenu
739
Descripcin
Indica un elemento de men dibujado por el propietario.
Cuando el elemento de men es mostrado por primera vez, la
ventana propietaria recibe un mensaje WM_MEASUREITEM,
permitiendo a la aplicacin especificar el ancho y altura del
elemento de men. La ventana propietaria recibe un mensaje
WM_DRAWITEM cuando el elemento de men va a ser
dibujado, permitiendo a la aplicacin dibujar el elemento de
men con la apariencia deseada. Esta opcin no puede ser
combinada con las opciones MF_BITMAP o MF_STRING.
Indica que el elemento de men abre un men desplegable o
submen. El manejador del men desplegable o submen es
especificado en el parmetro uIDNewItem.
Indica un separador de men. Este elemento de men es
dibujado como una lnea horizontal y es vlido solo cuando es
usado con mens desplegables, mens emergentes o submens.
Este elemento de men no puede ser resaltado, sombreado o
deshabilitado y los parmetros uIDNewItem y lpNewItem son
ignorados.
Indica que se utiliza una cadena de caracteres para representar
el elemento de men. El parmetro lpNewItem contiene un
puntero a la cadena terminada en nulo mostrada en el elemento
de men. Esta opcin no puede ser combinada con las opciones
MF_BITMAP o MF_OWNERDRAW.
Coloca el mapa de bits que indica que el elemento de men
est desmarcado junto al elemento de men. Por defecto, sta
imagen es una imagen en blanco. Esta opcin no puede ser
combinada con la opcin MF_CHECKED.
Windows.Pas
Sintaxis
{manejador de men}
{identificador de elemento de men o posicin}
{opcin de identificador o posicin}
{devuelve TRUE o FALSE}
Descripcin
Esta funcin elimina el elemento de men indicado del men especificado, desplazando
todos los elementos subsiguientes hacia arriba. Si el elemento de men abre un
submen o men desplegable, el submen o men desplegable NO es destruido. Una
aplicacin debe llamar la funcin GetSubMenu para recuperar un manejador del
submen antes de eliminar el elemento de men. Se puede utilizar la funcin
12
Captulo
RemoveMenu(
hMenu: HMENU;
uPosition: UINT;
uFlags: UINT
): BOOL;
740
Captulo 12
Parmetros
hMenu: Manejador del men del cual ser eliminado el elemento de men especificado.
uPosition: Especifica el identificador de elemento de men o la posicin de base cero
del elemento de men a eliminar. El valor del parmetro uFlags indica cmo la funcin
debe interpretar el valor de este parmetro.
uFlags: Indica cmo la funcin debe interpretar el valor del parmetro uPosition. Si a
este parmetro se le asigna MF_BYPOSITION, el valor de uPosition indica la posicin
de base cero del elemento de men. Si a este parmetro se le asigna
MF_BYCOMMAND, uPosition tendr el identificador del elemento de men.
Vase adems
CreatePopupMenu, DeleteMenu, DestroyMenu, GetMenu, GetSubMenu
Ejemplo
Listado 12-9: Quitando elementos del men de sistema
procedure TForm1.FormCreate(Sender: TObject);
begin
{Quita los comandos Maximizar, Minimizar y Restaurar del men de sistema}
RemoveMenu(GetSystemMenu(Form1.Handle, FALSE), 4, MF_BYPOSITION);
RemoveMenu(GetSystemMenu(Form1.Handle, FALSE), 3, MF_BYPOSITION);
RemoveMenu(GetSystemMenu(Form1.Handle, FALSE), 0, MF_BYPOSITION);
end;
Figura 12-8:
El men de
sistema
modificado
SetMenu
Windows.Pas
Sintaxis
SetMenu(
hWnd: HWND;
hMenu: HMENU
{manejador de ventana}
{manejador de men}
Funciones de men
): BOOL;
741
Descripcin
Esta funcin asigna el men especificado a la ventana especificada. El men anterior, si
exista, es reemplazado pero no destruido. Una aplicacin debe llamar a alguna funcin
de destruccin de men para eliminar el men anterior y sus recursos asociados.
Parmetros
hWnd: Manejador de la ventana a la que se asigna el nuevo men.
hMenu: Manejador del men que ser asignado a la ventana especificada. Este men
crea una barra de men en la ventana. Si a este parmetro se le asigna cero, la funcin
simplemente quita el men actual.
Vase adems
CreateMenu, DeleteMenu, DestroyMenu, GetMenu
Ejemplo
Vea el Listado 12-3 bajo CreateMenu.
SetMenuDefaultItem
Windows.Pas
Sintaxis
SetMenuDefaultItem(
hMenu: HMENU;
uItem: UINT;
fByPos: UINT
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opcin de identificador o posicin}
{devuelve TRUE o FALSE}
Descripcin
Parmetros
hMenu: Manejador del men cuyo elemento por defecto va a ser asignado.
uItem: Especifica el identificador de elemento de men o la posicin de base cero del
elemento de men que ser asignado como elemento por defecto del men. El valor del
12
Captulo
Esta funcin asigna el elemento de men indicado como elemento predeterminado (por
defecto) para el men especificado. Un men puede tener slo un elemento por defecto
y ste debe formar parte de un men desplegable, submen, o men emergente.
742
Captulo 12
parmetro fByPos indica cmo la funcin debe interpretar el valor de este parmetro. Si
a este parmetro se le asigna -1, la funcin quita el atributo de predeterminado al
elemento por defecto actual, dejando al men sin elemento por defecto.
fByPos: Indica cmo la funcin debe interpretar el valor del parmetro uItem. Si a este
parmetro se le asigna MF_BYPOSITION, el valor del parmetro uItem indica la
posicin de base cero del elemento de men. Si a este parmetro se le asigna
MF_BYCOMMAND, uItem contiene el identificador del elemento de men.
Vase adems
GetMenuDefaultItem, GetMenuItemID, GetMenuItemInfo, HiliteMenuItem
Ejemplo
Listado 12-10: Recuperando informacin sobre el elemento por defecto de un men
procedure TForm1.FormCreate(Sender: TObject);
begin
{Asigna al mximo valor del editor la cantidad de elementos del men}
SpinEdit1.MaxValue := GetMenuItemCount(MainMenu2.Handle) - 1;
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
var
DefaultItem: Integer;
// posicin del elemento por defecto
DefaultItemRect: TRect;
// coordenadas del elemento por defecto
DefaultMenuString: array[0..255] of Char; // cadena del elemento por defecto
begin
{Asigna como elemento por defecto el especificado por editor}
SetMenuDefaultItem(MainMenu2.Handle, SpinEdit1.Value, 1);
{Recupera el elemento por defecto recin asignado}
DefaultItem := GetMenuDefaultItem(MainMenu2.Handle, 1, 0);
{Recupera las coordenadas del elemento por defecto}
GetMenuItemRect(Form1.Handle, MainMenu2.Handle, DefaultItem, DefaultItemRect);
{Recupera el texto del elemento por defecto}
GetMenuString(MainMenu2.Handle, DefaultItem, @DefaultMenuString, 255,
MF_BYPOSITION);
{Muestra la posicin e identificador del elemento por defecto}
Label2.Caption := 'Default Item Position: ' + IntToStr(DefaultItem);
Label3.Caption := 'Default Item ID: ' + IntToStr(GetMenuItemID(MainMenu2.Handle,
DefaultItem));
{Muestra las coordenadas del elemento de men por defecto}
Funciones de men
Label4.Caption := 'Default
' T: ' +
' R: ' +
' B: ' +
743
Figura 12-9:
Los atributos
del elemento
por defecto
del men
SetMenuItemBitmaps
Windows.Pas
Sintaxis
SetMenuItemBitmaps(
hMenu: HMENU;
uPosition: UINT;
uFlags: UINT;
hBitmapUnchecked: HBITMAP;
hBitmapChecked: HBITMAP
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opcin de identificador o posicin}
{manejador del mapa de bits del estado
desmarcado}
{manejador del mapa de bits del estado marcado}
{devuelve TRUE o FALSE}
Descripcin
12
Captulo
Esta funcin permite asignar el mapa de bits que ser mostrado cuando el elemento de
men indicado, contenido en el men especificado, est marcado o desmarcado. La
aplicacin debe gestionar estos mapas de bits, ya que stos no son destruidos cuando el
men o elemento de men es eliminado o destruido. Observe que si a ambos
parmetros, hBitmapUnchecked y hBitmapChecked, se les asigna cero (0), a partir de
ese momento Windows mostrar una imagen de marca de verificacin cuando el
elemento de men est marcado y ninguna imagen cuando no est marcado. La
aplicacin debe utilizar la funcin GetSystemMetrics con las opciones
744
Captulo 12
Parmetros
hMenu: Manejador del men que contiene el elemento de men cuyos mapas de bits de
marcado y desmarcado sern asignados.
uPosition: Especifica el identificador de elemento de men o la posicin de base cero
del elemento de men cuyos mapas de bits de marcado y desmarcado sern asignados.
El valor del parmetro uFlags indica cmo la funcin debe interpretar el valor de este
parmetro.
uFlags: Indica cmo la funcin debe interpretar el valor del parmetro uPosition. Si a
este parmetro se le asigna MF_BYPOSITION, el valor de uPosition indica la posicin
(contando a partir de cero) del elemento de men. Si a este parmetro se le asigna
MF_BYCOMMAND, uPosition contiene un identificador de elemento de men.
hBitmapUnchecked: Manejador del mapa de bits que ser mostrado cuando el elemento
de men no est marcado. Si a este parmetro se le asigna cero, ninguna imagen ser
mostrada cuando el elemento de men no est marcado.
hBitmapChecked: Manejador del mapa de bits que ser mostrado cuando el elemento
de men est marcado. Si a este parmetro se le asigna cero, ninguna imagen ser
mostrada cuando el elemento de men est marcado.
Vase adems
GetMenu, GetMenuItemInfo, GetSubMenu, GetSystemMetrics, SetMenuItemInfo
Ejemplo
Listado 12-11: Especificando mapas de bits personalizados para marcas de verificacin
procedure TForm1.FormCreate(Sender: TObject);
begin
{Especifica el nuevo mapa de bits de marca de verificacin para todos los
elementos de men}
SetMenuItemBitmaps(TheMainMenu1.Handle, 0, MF_BYPOSITION,
Image2.Picture.Bitmap.Handle,
Image1.Picture.Bitmap.Handle);
SetMenuItemBitmaps(TheMainMenu1.Handle, 1, MF_BYPOSITION,
Image2.Picture.Bitmap.Handle,
Image1.Picture.Bitmap.Handle);
SetMenuItemBitmaps(TheMainMenu1.Handle, 2, MF_BYPOSITION,
Image2.Picture.Bitmap.Handle,
Image1.Picture.Bitmap.Handle);
Funciones de men
745
end;
procedure TForm1.ItemOne1Click(Sender: TObject);
procedure DisplayChecked(Item: TMenuItem; TheLabel: TLabel);
begin
{Indica si el elemento est marcado o no}
if Item.Checked then
TheLabel.Caption := Item.Caption + ' checked'
else
TheLabel.Caption := Item.Caption + ' not checked'
end;
begin
{Marca el elemento de men seleccionado}
TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked;
{Muestra qu elementos de men estn marcados}
DisplayChecked(TheMainMenu1.Items[0], Label1);
DisplayChecked(TheMainMenu1.Items[1], Label2);
DisplayChecked(TheMainMenu1.Items[2], Label3);
end;
Figura 12-10:
La nueva
marca de
verificacin del
elemento de
menu
SetMenuItemInfo
Windows.Pas
Sintaxis
SetMenuItemInfo(
p1: HMENU;
p2: UINT;
p3: BOOL;
const p4: TMenuItemInfo
): BOOL;
{manejador de men}
{identificador de elemento de men o posicin}
{opcin de identificador o posicin}
{puntero a registro TMenuItemInfo}
{devuelve TRUE o FALSE}
Descripcin
Parmetros
p1: Manejador del men que contiene el elemento de men cuya informacin es
asignada.
12
Captulo
Esta funcin asigna informacin especfica sobre el elemento de men del men
especificado.
746
Captulo 12
p2: Especifica el identificador del elemento de men o la posicin de base cero del
elemento de men cuya informacin ser asignada. El valor del parmetro p3
determina cmo la funcin debe interpretar el valor de este parmetro.
p3: Indica cmo la funcin debe interpretar el valor del parmetro p2. Si a este
parmetro se le asigna TRUE, el valor de p2 indica la posicin de base cero del
elemento de men. Si a este parmetro se le asigna FALSE, p2 contiene el
identificador del elemento de men.
p4: Puntero a un registro de tipo TMenuItemInfo que contiene valores que especifican
la informacin a asignar. El registro TMenuItemInfo se define como:
TMenuItemInfo = packed record
cbSize: UINT;
fMask: UINT;
fType: UINT;
fState: UINT;
wID: UINT;
hSubMenu: HMENU;
hbmpChecked: HBITMAP;
hbmpUnchecked: HBITMAP;
dwItemData: DWORD;
dwTypeData: PAnsiChar;
cch: UINT;
end;
Consulte la funcin GetMenuItemInfo para ver una descripcin detallada de este
registro.
Vase adems
EnableMenuItem, GetMenuItemCount, GetMenuItemID, GetMenuItemInfo,
GetMenuItemRect, GetMenuState, GetMenuString, HiliteMenuItem, InsertMenuItem,
ModifyMenu, SetMenuItemBitmaps
Ejemplo
Vea el Listado 12-1 bajo el ejemplo de men dibujado por el propietario, en la
introduccin del captulo.
Funciones de men
TrackPopupMenu
747
Windows.Pas
Sintaxis
TrackPopupMenu(
hMenu: HMENU;
uFlags: UINT;
x: Integer;
y: Integer;
nReserved: Integer;
hWnd: HWND;
prcRect: PRect
): BOOL;
Descripcin
Esta funcin muestra un men emergente en las coordenadas especificadas de la
pantalla, enviando un mensaje WM_COMMAND a la ventana hWnd cuando el usuario
selecciona un elemento de men.
Parmetros
hMenu: Manejador del men emergente que ser mostrado. Este manejador es devuelto
por la funcin CreatePopupMenu cuando se crea un nuevo men emergente, o por la
funcin GetSubMenu cuando se recupera un submen o un men desplegable.
uFlags: Una combinacin de opciones que indican la alineacin del men emergente en
relacin a sus coordenadas y qu botn del ratn indica una seleccin. Este parmetro
puede ser cero o una combinacin de un elemento de la Tabla 12-13 y un elemento de
la Tabla 12-14.
x: La coordenada horizontal en la cual se mostrar el men emergente, relativa a la
pantalla.
y: La coordenada vertical en la cual se mostrar el men emergente, relativa a la
pantalla.
nReserved: Este parmetro es reservado y se le debe asignar cero.
hWnd: Manejador de la ventana propietaria del men emergente que ser mostrado.
Esta ventana recibir un mensaje WM_COMMAND cuando el usuario seleccione un
elemento del men. La ventana no recibir el mensaje hasta que la funcin
TrackPopupMenu retorne.
12
Captulo
prcRect: Puntero al registro TRect que contiene las coordenadas, relativas a la pantalla,
del rectngulo dentro del cual el usuario puede hacer clic sin que el men emergente
desaparezca. Si a este parametro se le asigna nil, el men emergente desaparece cuando
el usuario hace clic fuera de las fronteras del men emergente.
748
Captulo 12
Vase adems
CreatePopupMenu, GetSubMenu, TrackPopupMenuEx
Ejemplo
Vea el Listado 12-4 bajo CreatePopupMenu.
Tabla 12-13: Valores de alineacin para el parmetro uFlags de TrackPopupMenu
Valor
TPM_CENTERALIGN
TPM_LEFTALIGN
TPM_RIGHTALIGN
Descripcin
Centra el men emergente con respecto a la coordenada
horizontal.
Ajusta el lado izquierdo del men emergente con respecto a
la coordenada horizontal.
Ajusta el lado derecho del men emergente con respecto a
la coordenada horizontal.
Tabla 12-14: Valores de botn del ratn para el parmetro uFlags de TrackPopupMenu
Valor
TPM_LEFTBUTTON
TPM_RIGHTBUTTON
TrackPopupMenuEx
Descripcin
Un elemento de men ser seleccionado cuando se haga
clic sobre l con el botn izquierdo del ratn.
Un elemento de men ser seleccionado cuando se haga
clic sobre l con el botn derecho del ratn.
Windows.Pas
Sintaxis
TrackPopupMenuEx(
hMenu: HMENU;
{manejador de un men emergente}
Flags: UINT;
{opciones de posicin y seguimiento}
x: Integer;
{coordenadas horizontales de pantalla}
y: Integer;
{coordenadas verticales de pantalla}
Wnd: HWND;
{manejador de la ventana propietaria}
TPMParams: PTPMParams {puntero a registro TPMParams}
): BOOL;
{devuelve TRUE o FALSE}
Descripcin
Esta funcin es similar a la funcin TrackPopupMenu, ya que muestra un men
emergente en las coordenadas especificadas de la pantalla y enva un mensaje
Funciones de men
749
Parmetros
hMenu: Manejador del men emergente que ser mostrado. Este manejador es devuelto
por la funcin CreatePopupMenu cuando se crea un nuevo men emergente, o por la
funcin GetSubMenu cuando se recupera un submen o men desplegable.
Flags: Una combinacin de opciones que indican la alineacin del men emergente
respecto a sus coordenadas y qu botn del ratn indica una seleccin. Este parmetro
puede ser cero o una combinacin de un elemento de la Tabla 12-15, un elemento de la
Tabla 12-16 y un elemento de la Tabla 12-17 (opcionalmente).
x: La coordenada horizontal en la cual se mostrar el men emergente, relativa a la
pantalla.
y: La coordenada vertical en la cual se mostrar el men emergente, relativa a la
pantalla.
Wnd: Manejador de la ventana propietaria del men emergente que ser mostrado. Esta
ventana recibir un mensaje WM_COMMAND cuando el usuario seleccione un
elemento del men. La ventana no recibir el mensaje hasta que la funcin
TrackPopupMenuEx retorne.
TPMParams: Puntero a un registro de tipo TTPMParams que contiene las coordenadas
de un rea rectangular, en coordenadas de pantalla, en la que el men emergente no
aparecer. Si este rea rectangular no es necesaria, a este parmetro se le puede asignar
nil. El registro TTPMParams se define como:
TTPMParams = packed record
cbSize: UINT;
{el tamao del registro}
rcExclude: TRect;
{las coordenadas del rectngulo}
end;
cbSize: Especifica el tamao del registro, en bytes. A este campo se le debe
asignar SizeOf(TPMParams).
12
Captulo
750
Captulo 12
Vase adems
CreatePopupMenu, GetSubMenu, TrackPopupMenu
Ejemplo
Listado 12-12: Mostrando un men emergente sin oscurecer un control
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
MenuPos: TPoint;
// la posicin del men en coordenadas de pantalla
ExtraInfo: TTPMParams; // el rea rectangular excluida
begin
{Si el botn derecho fue pulsado, muestra el men emergente}
if Button = mbRight then
begin
{Convierte las coordenadas cliente en coordenadas de pantalla}
MenuPos.X := X; MenuPos.Y := Y;
MenuPos := ClientToScreen(MenuPos);
{Inicializa el registro TTPMParams, haciendo que el rea rectangular excluida
sea la ocupada por el cuadro de lista ListBox1}
ExtraInfo.cbSize := SizeOf(TTPMParams);
ExtraInfo.rcExclude.TopLeft := ClientToScreen(ListBox1.BoundsRect.TopLeft);
ExtraInfo.rcExclude.BottomRight := ClientToScreen(ListBox1.BoundsRect.
BottomRight);
{Muestra el men emergente}
TrackPopupMenuEx(PopupMenu1.Handle, 0, MenuPos.X, MenuPos.Y, Form1.Handle,
@ExtraInfo);
end;
end;
{El mensaje WM_COMMAND redefinido}
procedure TForm1.WMCommand(var Msg: TMessage);
begin
{Esto es necesario para que el control de men emergente de Delphi reciba
los mensajes adecuados y la funcionalidad no se altere}
PopupMenu1.DispatchCommand(Msg.wParam);
inherited;
end;
procedure TForm1.Item11Click(Sender: TObject);
begin
{Muestra qu elemento men fue seleccionado}
Label2.Caption := TMenuItem(Sender).Caption;
end;
Funciones de men
751
Figura 12-11:
El men
emergente
mostrado
Descripcin
Centra el men emergente con respecto a la coordenada
horizontal.
Ajusta el lado izquierdo del men emergente con respecto a
la coordenada horizontal.
Ajusta el lado derecho del men emergente con respecto a
la coordenada horizontal.
Tabla 12-16: Valores de botn del ratn para el parmetro uFlags de TrackPopupMenuEx
Valor
TPM_LEFTBUTTON
TPM_RIGHTBUTTON
Descripcin
Un elemento de men ser seleccionado cuando se haga clic
sobre l con el botn izquierdo del ratn.
Un elemento de men ser seleccionado cuando se haga clic
sobre l con el botn derecho del ratn.
TPM_VERTICAL
Descripcin
Si el men va a solapar el rea rectangular excluida y tiene
que ser desplazado, la alineacin horizontal debe tener
prioridad sobre la vertical.
Si el men va a solapar el rea rectangular excluida y tiene
que ser desplazado, la alineacin vertical debe tener
prioridad sobre la horizontal.
12
Captulo
Valor
TPM_HORIZONTAL
Mensajes
753
Apndice
A
Apndice A
Mensajes
Si las funciones de mensajes como GetMessage, TranslateMessage y DispatchMessage
son los capilares y las arterias de Windows, los mensajes son las clulas sanguneas.
Hasta la ms simple accin del usuario produce una docena o ms de mensajes que son
intercambiados entre la aplicacin y el sistema. Aunque es posible desarrollar
aplicaciones Delphi muy complejas que no tengan nada que ver con los mensajes, en
ocasiones manipular o enviar un mensaje permite obtener una solucin ms elegante y
simple de un problema.
Este apndice no describe todos los mensajes disponibles en Windows. De una
descripcin completa resultara un manual del tamao de este libro. Este captulo
describe las estructuras de datos sobre los cuales Delphi ha definido un gran nmero de
mensajes. Estos registros ayudan al desarrollador a tratar los mensajes de una manera
eficiente, ya que son ms intuitivos e informativos que los campos wParam y lParam
de un mensaje tradicional de Windows.
WM_ACTIVATE
Sintaxis
TWMActivate = record
Msg: Cardinal;
Active: Word;
Minimized: WordBool;
ActiveWindow: HWND;
Result: Longint;
end;
Descripcin
Una ventana recibe este mensaje cuando va a ser activada o desactivada. Este mensaje
es enviado primero a la ventana que es desactivada y luego a la ventana que es
activada. Si la ventana que va a ser activada no est minimizada, sta recibe el foco del
teclado. Si la ventana fue activada por un clic del ratn, tambin recibir el mensaje
WM_MOUSEACTIVATE.
754
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ACTIVATE.
Active: Indica si la ventana va a ser activada o desactivada y puede tomar un valor de la
Tabla A-1.
Minimized: Indica el estado minimizado de la ventana que va a ser activada o
desactivada. Si la ventana no est minimizada, este campo valdr FALSE.
ActiveWindow: Contiene un manejador de la ventana que va a ser activada o
desactivada. Este valor depende del valor del campo Active. Si el campo Active
contiene WA_INACTIVE, este campo contiene un manejador de la ventana que va a ser
activada. Si el campo Active contiene WA_ACTIVE o WA_CLICKACTIVE, este campo
contiene un manejador de la ventana que va a ser desactivada. Este campo puede
contener cero.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
SetActiveWindow, WM_MOUSEACTIVATE, WM_NCACTIVATE
Tabla A-1: Valores de TWMActivate.Active
Valor
WA_ACTIVE
WA_CLICKACTIVE
WA_INACTIVE
Descripcin
La ventana fue activada por un mecanismo diferente al clic
del ratn, ya sea mediante cdigo o mediante rdenes de
teclado.
La ventana fue activada por un clic del ratn.
La ventana va a ser desactivada.
WM_ACTIVATEAPP
Sintaxis
TWMActivateApp = record
Msg: Cardinal;
Active: BOOL;
ThreadId: Longint;
Result: Longint;
end;
Descripcin
Este mensaje es enviado cuando una ventana que no pertenece a la aplicacin actual va
a ser activada. Es enviado tanto a la aplicacin propietaria de la ventana que va a ser
activada, como a la aplicacin propietaria de la ventana que va a ser desactivada.
755
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ACTIVATEAPP.
Active: Indica si la ventana va a ser activada o desactivada. Si la ventana va a ser
activada, a este campo se le asigna TRUE; en caso contrario, se le asigna FALSE.
ThreadId: Un identificador de hilo de ejecucin para la ventana que va a ser activada o
desactivada. Si al campo Active se le asigna TRUE, este campo contiene el
identificador del hilo que posee la ventana que va a ser desactivada. Si Active es
FALSE, este campo contiene el identificador del hilo que posee la ventana que va a ser
activada.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_ACTIVATE
WM_ASKCBFORMATNAME
Sintaxis
TWMAskCBFormatName = record
Msg: Cardinal;
{identificador del mensaje}
NameLen: Word;
{tamao del buffer en bytes}
Unused: Word;
{no se utiliza}
FormatName: PChar;
{buffer de salida}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Un visualizador del portapapeles enva el mensaje WM_ASKCBFORMATNAME a un
propietario del portapapeles para obtener el nombre de un formato de portapapeles
CF_OWNERDISPLAY. Como respuesta, el propietario del portapapeles coloca el
nombre del formato en el buffer de salida suministrado por el visualizador.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ASKCBFORMATNAME.
NameLen: Especifica el tamao del buffer de salida al que apunta el campo
FormatName, en bytes.
Unused: Este campo no es utilizado por este mensaje.
FormatName: Puntero a un buffer de cadena de caracteres terminada en nulo que
almacenar el nombre del formato del portapapeles.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
A
Apndice
Mensajes
756
Apndice A
Vase adems
WM_DRAWCLIPBOARD
WM_CANCELMODE
Sintaxis
TWMCancelMode = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Una ventana con el foco de entrada recibe un mensaje WM_CANCELMODE cuando un
cuadro de dilogo o de mensaje es mostrado. La ventana que tena el foco puede
cancelar modos de operacin tales como el modo de captura del ratn. Al recibir el
mensaje, la funcin DefWindowProc cancelar el procesamiento interno, el
procesamiento de mens y la captura del ratn.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CANCELMODE.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, ReleaseCapture
WM_CHANGECBCHAIN
Sintaxis
TWMChangeCBChain = record
Msg: Cardinal;
Remove: HWND;
Next: HWND;
Result: Longint;
end;
Descripcin
Cuando una ventana va a ser eliminada de la cadena de ventanas visualizadoras del
portapapeles, un mensaje WM_CHANGECBCHAIN es enviado a la primera ventana en
la cadena. Cada ventana almacena un manejador de la prxima ventana en la cadena de
757
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CHANGECBCHAIN.
Remove: El manejador de la ventana que ser eliminada de la cadena de ventanas
visualizadoras del portapapeles.
Next: El manejador de la prxima ventana en la cadena de ventanas visualizadoras del
portapapeles. Este campo contendr cero si no hay ms ventanas en la cadena de
visualizadores del portapapeles.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
SendMessage, SetClipboardViewer
WM_CHAR
Sintaxis
TWMChar = record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
Descripcin
Cuando se pulsa una tecla, un mensaje WM_CHAR es enviado a la ventana que tiene el
foco del teclado. Este mensaje WM_CHAR es el resultado de un mensaje
WM_KEYDOWN que es convertido por la funcin TranslateMessage.
Las teclas extendidas en los teclados de 101 102 teclas son:
- En la seccin principal del teclado, las teclas Alt y Ctrl de la derecha.
- A la izquierda del teclado numrico, las teclas Ins, Supr, Inicio, Fin, Av.Pg.,
Re.Pg., y las cuatro teclas de flechas.
- En el teclado numrico, las teclas Bloq.Nm., dividir (/) y la tecla Intro.
A
Apndice
Mensajes
758
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante del identificador
de mensaje WM_CHAR.
CharCode: El cdigo de carcter de la tecla que fue pulsada.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones , cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado previo de la tecla e indicador de
estado de transicin. La Tabla A-2 muestra qu informacin se almacena en cada
posicin de bit, dentro de los 32 bits del campo KeyData. La palabra ms significativa
(bits del 16 al 31), pertenece al mensaje anterior WM_KEYDOWN, que provoc el
mensaje WM_CHAR mediante la funcin TranslateMessage.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
TranslateMessage, WM_KEYDOWN
Tabla A-2: Valores de TWMChar.KeyData
Valor
0-15
16-23
24
25-28
29
30
31
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
El cdigo de contexto. Si la tecla Alt estaba presionada mientras otra tecla
fue pulsada, este bit contiene 1; en caso contrario, contiene 0.
El estado previo de la tecla. Si la tecla estaba presionada antes de que se
enviara el mensaje, este bit contiene 1; en caso contario contiene 0.
El estado de transicin. Si la tecla est siendo liberada, este bit contiene 1;
en caso contrario, contiene 0.
WM_CHARTOITEM
Sintaxis
TWMCharToItem = record
Msg: Cardinal;
Key: Word;
CaretPos: Word;
ListBox: HWND;
Result: Longint;
759
end;
Descripcin
Cuando un cuadro de lista con estilo LBS_WANTKEYBOARDINPUT recibe un mensaje
WM_CHAR, enva un mensaje WM_CHARTOITEM a su propietaria.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CHARTOITEM.
Key: El valor de la tecla, enviado por el mensaje WM_CHAR.
CaretPos: La posicin del cursor de edicin en el cuadro de lista.
ListBox: El manejador del cuadro de lista.
Result: Si la aplicacin maneja este mensaje, deber asignar a este campo -1 -2. Si el
cuadro de lista debe ejecutar su accin por defecto en adicin a cualquier tratamiento
del mensaje especfico de la aplicacin, se deber asignar a este campo el ndice de
base cero del elemento del cuadro de lista.
Vase adems
DefWindowProc, WM_CHAR
WM_CHILDACTIVATE
Sintaxis
TWMChildActivate = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_CHILDACTIVATE es enviado a una ventana hija MDI cuando es
activada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CHILDACTIVATE.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
A
Apndice
Mensajes
760
Apndice A
Vase adems
MoveWindow, SetWindowPos
WM_CLEAR
Sintaxis
TWMClear = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_CLEAR es enviado a un cuadro de combinacin o a un control de
edicin cuando la seleccin actual va a ser eliminada o vaciada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CLEAR.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
WM_COPY, WM_CUT, WM_PASTE
WM_CLOSE
Sintaxis
TWMClose = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Cuando una ventana o una aplicacin va a ser cerrada o finalizada, recibe un mensaje
WM_CLOSE.
761
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CLOSE.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, DestroyWindow
WM_COMMAND
Sintaxis
TWMCommand = record
Msg: Cardinal;
ItemID: Word;
NotifyCode: Word;
Ctl: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_COMMAND es enviado cuando el usuario pulsa una tecla aceleradora,
entonces un control enva un mensaje de notificacin a una ventana madre o el usuario
hace una seleccin de men. Este mensaje no es enviado cuando el usuario hace una
seleccin de un men de sistema. Al hacer una seleccin de un men de sistema se
enva un mensaje WM_SYSCOMMAND. El men de sistema es el men que se presenta
cuando se hace clic en el icono de la esquina superior izquierda de la ventana. Si la
ventana es minimizada y se pulsa una tecla aceleradora, el mensaje WM_COMMAND
ser enviado slo si la tecla no se corresponde con ningn elemento de men en el
men de la ventana o en el men de sistema.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante del identificador
de mensaje WM_COMMAND.
ItemID: El identificador del elemento de men, control o acelerador. Este campo tendr
valor cero si el usuario selecciona un separador de un men.
NotifyCode: Indica si el mensaje se origin en un control, elemento de men, o
acelerador. Este campo tendr valor cero si el mensaje proviene de un elemento de
men o uno si proviene de un acelerador. Cualquier otro valor indica un cdigo de
notificacin especfico proveniente de un control.
A
Apndice
Mensajes
762
Apndice A
Ctl: El manejador del control que enva el mensaje. Este campo tendr valor cero si el
mensaje ha sido enviado como resultado de un acelerador o de una seleccin de men.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_SYSCOMMAND
WM_COMPACTING
Sintaxis
TWMCompacting = record
Msg: Cardinal;
CompactRatio: Longint;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_COMPACTING indica que hay poca memoria. Es enviado a todas las
ventanas de nivel superior cuando ms de un octavo del tiempo del sistema, en un
intervalo de 30 a 60 segundos va a ser utilizado para compactar la memoria. La
aplicacin debe responder liberando la memoria que no utilice o no le sea necesaria.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_COMPACTING.
CompactRatio: La relacin entre el tiempo de la CPU dedicado a compactar memoria y
el tiempo de la CPU dedicado a las dems operaciones.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_CLOSE, WM_DESTROY, WM_QUIT
WM_COMPAREITEM
Sintaxis
TWMCompareItem = record
Msg: Cardinal;
Ctl: Hwnd;
CompareItemStruct: PCompareItemStruct;
Result: Longint;
763
comparacin}
end;
Descripcin
El mensaje WM_COMPAREITEM es enviado a la ventana propietaria de un cuadro de
lista o de combinacin cuando una aplicacin aade un elemento al objeto, si ste fue
creado con un estilo LBS_SORT o CBS_SORT, respectivamente. El mensaje identifica
dos elementos cuyas posiciones relativas en la lista de elementos ser determinada. El
valor devuelto indica el resultado de esta comparacin. Para una lista que ya tenga
varios elementos, Windows enva tantos mensajes WM_COMPAREITEM como sea
necesario para determinar la posicin exacta del nuevo elemento.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_COMPAREITEM.
Ctl: El manejador del control que enva el mensaje.
CompareItemStruct: Un puntero al registro TCompareItemStruct que contiene
informacin sobre los dos elementos cuya posicin en la lista va a ser determinada. El
registro TCompareItemStruct se define como:
TCompareItemStruct = packed record
CtlType: UINT;
{tipo de control}
CtlID: UINT;
{identificador del control}
hwndItem: HWND;
{manejador del control}
itemID1: UINT;
{ndice del primer elemento}
itemData1: DWORD;
{los datos que estn siendo comparados}
itemID2: UINT;
{ndice del segundo elemento}
itemData2: DWORD;
{los datos que estn siendo comparados}
dwLocaleId: DWORD;
{identificador de lenguaje local}
end;
CtlType: Identifica el tipo de control que genera el mensaje, y puede contener
ODT_LISTBOX si los elementos a comparar pertenecen a un cuadro de lista
dibujado por el propietario, u ODT_COMBOBOX si los elementos a comparar
pertenecen a un cuadro de combinacin dibujado por el propietario.
CtlID: El identificador del cuadro de lista o de combinacin.
hwndItem: El manejador del control que enva el mensaje.
itemID1: El ndice del primer elemento a comparar.
itemData1: Los datos que sern comparados. Este es el parmetro lParam del
mensaje enviado por la aplicacin que aadi el primer elemento que va a ser
comparado.
itemID2: El ndice del segundo elemento a comparar.
A
Apndice
Mensajes
764
Apndice A
itemData2: Los datos que sern comparados. Este es el parmetro lParam del
mensaje enviado por la aplicacin que aadi el segundo elemento que va a ser
comparado.
dwLocaleId: El identificador de localidad que puede ser usado como base de la
comparacin.
Result: El mensaje devuelve un valor que indica el orden relativo de los dos elementos
comparados. El mensaje debe devolver -1 si el elemento identificado por el campo
itemData1 debe preceder al elemento identificado por el campo itemData2 en la lista,
debe devolver 0 si los dos elementos son considerados iguales y debe devolver 1 si
itemData2 debe preceder a itemData1 en la lista.
Vase adems
WM_DELETEITEM
WM_COPY
Sintaxis
TWMCopy = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_COPY es enviado a un control de edicin o cuadro de combinacin
cuando la aplicacin o el usuario invocan un mtodo de copiar (como Ctrl+C) que
colocar el texto seleccionado en el portapapeles. El control que recibe el mensaje
deber colocar su texto seleccionado en el portapapeles en el formato CF_TEXT.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_COPY.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
WM_CLEAR, WM_CUT, WM_PASTE
Mensajes
765
Sintaxis
TWMCopyData = record
Msg: Cardinal;
From: HWND;
CopyDataStruct: PCopyDataStruct;
Result: Longint;
end;
Descripcin
El mensaje WM_COPYDATA permite a una aplicacin enviar datos a otra aplicacin.
Este mensaje puede ser enviado slo mediante la funcin SendMessage, y los datos
identificados por el campo CopyDataStruct no pueden contener ningn puntero ni otra
referencia a objetos o a memoria que no sean accesibles al proceso que los recibe.
Durante el procesamiento, la aplicacin que recibe los datos debe considerarlos como
de slo lectura. Si tiene que modificarlos, deber copiarlos a un buffer local.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_COPYDATA.
From: El manejador de la ventana que enva el mensaje.
CopyDataStruct: Un puntero a un registro TCopyDataStruct que contiene los datos que
sern enviados a la otra aplicacin. El registro TCopyDataStruct se define como:
TCopyDataStruct = packed record
dwData: DWORD;
{valor de datos de 32 bits}
cbData: DWORD;
{tamao del buffer lpData}
lpData: Pointer;
{puntero a datos adicionales}
end;
dwData: Un valor de datos de 32 bits que ser pasado a la otra aplicacin.
cbData: Especifica el tamao del buffer de datos al que apunta el campo lpData.
lpData: Un puntero a datos adicionales.
Result: Si la aplicacin maneja este mensaje, deber asignar uno (1) a este campo.
Vase adems
PostMessage, SendMessage
Apndice
WM_COPYDATA
766
Apndice A
WM_CREATE
Sintaxis
TWMCreate = record
Msg: Cardinal;
Unused: Integer;
CreateStruct: PCreateStruct;
Result: Longint;
end;
Descripcin
Cuando una aplicacin crea una nueva ventana llamando a las funciones
CreateWindow o CreateWindowEx, Windows enva un mensaje WM_CREATE al
procedimiento de ventana de la nueva ventana despus de que sta es creada, pero antes
de que se haga visible y antes de que las funciones CreateWindow o CreateWindowEx
retornen. El registro de datos enviado con el mensaje contiene especificaciones para la
nueva ventana, y es en esencia la misma informacin pasada a la funcin
CreateWindowEx.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CREATE.
Unused: Este campo no es utilizado por este mensaje.
CreateStruct: Un puntero al registro TCreateStruct que contiene informacin sobre la
nueva ventana. El registro TCreateStruct se define como:
TCreateStruct = packed record
lpCreateParams: Pointer;
hInstance: HINST;
hMenu: HMENU;
hwndParent: HWND;
cy: Integer;
cx: Integer;
y: Integer;
x: Integer;
style: Longint;
lpszName: PAnsiChar;
lpszClass: PAnsiChar;
dwExStyle: DWORD;
end;
767
Result: Si la aplicacin maneja este mensaje, deber devolver cero para indicar que la
ventana puede ser creada. Si la aplicacin devuelve -1, la nueva ventana ser destruida
y las funciones CreateWindow o CreateWindowEx que generaron el mensaje
devolvern el valor cero para el manejador de la ventana.
Vase adems
CreateWindow, CreateWindowEx, WM_NCCREATE
WM_CTLCOLORBTN
Sintaxis
TWMCtlColorBtn = record
Msg: Cardinal;
ChildDC: HDC;
ChildWnd: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_CTLCOLORBTN es enviado a la ventana madre de un botn cuando el
botn va a ser dibujado. La ventana madre puede responder asignando el color del texto
y del fondo del botn. Este mensaje es enviado nicamente dentro de un hilo de
ejecucin, y no puede ser enviado entre hilos.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CTLCOLORBTN.
ChildDC: Manejador del contexto de dispositivo del botn que ser dibujado.
ChildWnd: Manejador de ventana del botn que ser dibujado.
Result: Si la aplicacin maneja este mensaje, deber devolver un manejador de brocha
que Windows usar para dibujar el fondo del botn.
Vase adems
DefWindowProc, RealizePalette, SelectPalette, WM_CTLCOLOREDIT,
WM_CTLCOLORLISTBOX, WM_CTLCOLORMSGBOX,
WM_CTLCOLORSCROLLBAR, WM_CTLCOLORSTATIC
WM_CTLCOLOREDIT
Sintaxis
TWMCtlColorEdit = record
A
Apndice
Mensajes
768
Apndice A
Msg: Cardinal;
ChildDC: HDC;
ChildWnd: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_CTLCOLOREDIT es enviado a la ventana madre de un control de
edicin cuando ste va a ser dibujado. La ventana madre puede responder asignando el
color del texto y del fondo. Este mensaje es enviado nicamente dentro de un hilo de
ejecucin, y no puede ser enviado entre hilos.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CTLCOLOREDIT.
ChildDC: Manejador del contexto de dispositivo del control de edicin que va a ser
dibujado.
ChildWnd: Manejador de ventana del control de edicin que ser dibujado.
Result: Si la aplicacin maneja este mensaje, deber devolver un manejador de brocha
que Windows usar para dibujar el fondo del control de edicin.
Vase adems
DefWindowProc, RealizePalette, SelectPalette, WM_CTLCOLORBTN,
WM_CTLCOLORLISTBOX, WM_CTLCOLORMSGBOX,
WM_CTLCOLORSCROLLBAR, WM_CTLCOLORSTATIC
WM_CTLCOLORLISTBOX
Sintaxis
TWMCtlColorListbox = record
Msg: Cardinal;
ChildDC: HDC;
ChildWnd: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_CTLCOLORLISTBOX es enviado a la ventana madre de un cuadro de
lista cuando ste va a ser dibujado. La ventana madre puede responder asignando los
colores del texto y del fondo del cuadro de lista. Este mensaje es enviado nicamente
dentro de un hilo de ejecucin, y no puede ser enviado entre hilos.
769
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CTLCOLORLISTBOX.
ChildDC: Manejador del contexto de dispositivo del cuadro de lista que ser dibujado.
ChildWnd: Manejador de ventana del cuadro de lista que ser dibujado.
Result: Si la aplicacin maneja este mensaje, deber devolver un manejador de brocha
que Windows usar para dibujar el fondo del cuadro de lista.
Vase adems
DefWindowProc, RealizePalette, SelectPalette, WM_CTLCOLORBTN,
WM_CTLCOLOREDIT, WM_CTLCOLORMSGBOX, WM_CTLCOLORSCROLLBAR,
WM_CTLCOLORSTATIC
WM_CTLCOLORMSGBOX
Sintaxis
TWMCtlColorMsgbox = record
Msg: Cardinal;
ChildDC: HDC;
ChildWnd: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_CTLCOLORMSGBOX es enviado a la ventana madre de un cuadro de
mensaje cuando ste va a ser dibujado. La ventana madre puede responder asignando
los colores del texto y de fondo del cuadro de mensaje. Este mensaje es enviado
nicamente dentro de un hilo de ejecucin, y no puede ser enviado entre hilos.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CTLCOLORMSGBOX.
ChildDC: Manejador del contexto de dispositivo del cuadro de mensaje que ser
dibujado.
ChildWnd: Manejador de la ventana que ser dibujada.
Result: Si la aplicacin maneja este mensaje, deber devolver un manejador de brocha
que Windows usar para dibujar el fondo del cuadro de mensaje.
A
Apndice
Mensajes
770
Apndice A
Vase adems
DefWindowProc, RealizePalette, SelectPalette, WM_CTLCOLORBTN,
WM_CTLCOLOREDIT, WM_CTLCOLORLISTBOX, WM_CTLCOLORSCROLLBAR,
WM_CTLCOLORSTATIC
WM_CTLCOLORSCROLLBAR
Sintaxis
TWMCtlColorScrollbar = record
Msg: Cardinal;
ChildDC: HDC;
ChildWnd: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_CTLCOLORSCROLLBAR es enviado a la ventana madre de una barra
de desplazamiento cuando sta va a ser dibujada. La ventana madre puede responder
asignando los colores del texto y del fondo de la barra de desplazamiento. Este mensaje
es enviado nicamente dentro de un hilo de ejecucin, y no puede ser enviado entre
hilos.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CTLCOLORSCROLLBAR.
ChildDC: Manejador del contexto de dispositivo de la barra de desplazamiento que
ser dibujada.
ChildWnd: Manejador de ventana de la barra de desplazamiento que ser dibujada.
Result: Si la aplicacin maneja este mensaje, deber devolver un manejador de brocha
que Windows usar para dibujar el fondo de la barra de desplazamiento.
Vase adems
DefWindowProc, RealizePalette, SelectPalette, WM_CTLCOLORBTN,
WM_CTLCOLOREDIT, WM_CTLCOLORLISTBOX, WM_CTLCOLORMSGBOX,
WM_CTLCOLORSTATIC
WM_CTLCOLORSTATIC
Sintaxis
TWMCtlColorStatic = record
Msg: Cardinal;
ChildDC: HDC;
ChildWnd: HWND;
Result: Longint;
771
end;
Descripcin
El mensaje WM_CTLCOLORSTATIC es enviado a la ventana madre de un control
esttico cuando ste va a ser dibujado. La ventana madre puede responder asignando
los colores del texto y del fondo del control esttico. Este mensaje es enviado
nicamente dentro de un hilo de ejecucin, y no puede ser enviado entre hilos.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CTLCOLORSTATIC.
ChildDC: Manejador del contexto de dispositivo del control esttico que ser dibujado.
ChildWnd: Manejador de ventana del control esttico que ser dibujado.
Result: Si la aplicacin maneja este mensaje, deber devolver un manejador de brocha
que Windows usar para dibujar el fondo del control esttico.
Vase adems
DefWindowProc, RealizePalette, SelectPalette, WM_CTLCOLORBTN,
WM_CTLCOLOREDIT, WM_CTLCOLORLISTBOX, WM_CTLCOLORMSGBOX,
WM_CTLCOLORSCROLLBAR
WM_CUT
Sintaxis
TWMCut = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_CUT es enviado a un control de edicin o cuadro de combinacin
cuando la aplicacin o el usuario invocan a un mtodo de corte (como Ctrl+X) que
coloca el texto seleccionado en el portapapeles. El control que recibe el mensaje debe
borrar su texto seleccionado y colocarlo en el portapapeles en el formato CF_TEXT.
A
Apndice
Mensajes
772
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_CUT.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
WM_CLEAR, WM_COPY, WM_PASTE
WM_DEADCHAR
Sintaxis
TWMDeadChar = record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
Descripcin
Cuando un mensaje WM_KEYDOWN es traducido por una llamada a la funcin
TranslateMessage, un mensaje WM_DEADCHAR es enviado a la ventana que tiene el
foco del teclado. Este mensaje es generado como resultado de pulsar una tecla
muerta. Una tecla muerta es aquella que genera un carcter adicional que es usado en
combinacin con otra tecla, creando as un carcter combinado o compuesto. El
ejemplo tpico es el de un carcter con un acento o marca diacrtica. La tecla muerta
que identifica el acento o marca diacrtica es introducida primero, seguida por la tecla
que identifica el carcter que tendr aplicada la marca.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DEADCHAR.
CharCode: El cdigo del carcter de la tecla que fue presionada.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones , cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado previo de la tecla e indicador de
estado de transicin. La Tabla A-3 muestra qu informacin se almacena en cada
posicin de bit, dentro de los 32 bits del campo KeyData. La palabra ms significativa
(bits del 16 al 31), pertenece al mensaje anterior WM_KEYDOWN, que provoc el
mensaje WM_DEADCHAR mediante la funcin TranslateMessage.
773
Vase adems
TranslateMessage, WM_KEYDOWN, WM_KEYUP, WM_SYSDEADCHAR,
WM_SYSKEYDOWN
Tabla A-3: Valores de TWMDeadChar.KeyData
Valor
0-15
16-23
24
25-28
29
30
31
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
El cdigo de contexto. Si la tecla Alt estaba presionada mientras la tecla
fue pulsada, este bit contiene 1; en caso contrario, contiene 0.
El estado previo de la tecla. Si la tecla estaba presionada antes de que se
enviara el mensaje, este bit contiene 1; en caso contario, contiene 0.
El estado de transicin. Si la tecla est siendo liberada, este bit contiene 1;
en caso contrario, contiene 0.
WM_DELETEITEM
Sintaxis
TWMDeleteItem = record
Msg: Cardinal;
Ctl: HWND;
DeleteItemStruct: PDeleteItemStruct;
Result: Longint;
end;
Descripcin
La ventana propietaria de un cuadro de lista o de combinacin recibe un mensaje
WM_DELETEITEM cuando el control es destruido o cuando un elemento va a ser
eliminado del control como resultado de un mensaje LB_DELETESTRING,
LB_RESETCONTENT, CB_DELETESTRING, o CB_RESETCONTENT. Cuando se
eliminan varios elementos, un mensaje WM_DELETEITEM es enviado por cada
elemento a eliminar. Bajo Windows NT, este mensaje es enviado slo cuando se
eliminan elementos de un cuadro de lista o de combinacin dibujado por el propietario.
A
Apndice
Mensajes
774
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DELETEITEM.
Ctl: Manejador del cuadro de lista o de combinacin que enva el mensaje.
DeleteItemStruct: Puntero a un registro TDeleteItemStruct que contiene informacin
sobre el elemento a ser eliminado. El registro TDeleteItemStruct se define como:
TDeleteItemStruct = packed record
CtlType: UINT;
{tipo de control}
CtlID: UINT;
{identificador del control}
itemID: UINT;
{ndice del elemento dentro del control}
hwndItem: HWND;
{manejador del control}
itemData: UINT;
{elemento de datos}
end;
CtlType: Contiene un valor que especifica el tipo de control en el que el elemento
ha sido eliminado. Este campo contendr ODT_LISTBOX, que indica un cuadro
de lista, o ODT_COMBOBOX, que indica un cuadro de combinacin.
CtlID: El identificador del cuadro de lista o de combinacin.
itemID: El ndice del elemento a ser eliminado del control.
hwndItem: Manejador del control del que se elimina el elemento.
itemData: Los datos definidos por la aplicacin para el elemento especificado.
Result: Si la aplicacin maneja este mensaje, deber asignar uno (1) a este campo.
Vase adems
WM_COMPAREITEM
WM_DESTROY
Sintaxis
TWMDestroy = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_DESTROY es enviado a una ventana que va a ser destruida, despus
que es borrada de la pantalla, pero antes de que el manejador de la ventana sea
invalidado. Durante el proceso de destruccin, el mensaje WM_DESTROY es pasado a
todas las ventanas hijas. Si la ventana es parte de la cadena de visualizadores del
775
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DESTROY.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
ChangeClipboardChain, DestroyWindow, PostQuitMessage, SetClipboardViewer,
WM_CLOSE
WM_DESTROYCLIPBOARD
Sintaxis
TWMDestroyClipboard = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Cuando la funcin EmptyClipboard es llamada para vaciar el portapapeles, el mensaje
WM_DESTROYCLIPBOARD es enviado a la ventana propietaria del portapapeles.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DESTROYCLIPBOARD.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
EmptyClipboard
WM_DEVMODECHANGE
Sintaxis
TWMDevModeChange = record
Msg: Cardinal;
{identificador del mensaje}
A
Apndice
Mensajes
776
Apndice A
Unused: Integer;
Device: PChar;
Result: Longint;
{no se utiliza}
{nombre del dispositivo}
{devuelve cero (0) si fue manejado}
end;
Descripcin
Todas las ventanas de nivel superior reciben un mensaje WM_DEVMODECHANGE
cuando los atributos del modo de dispositivo son cambiados por el usuario.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DEVMODECHANGE.
Unused: Este campo no es utilizado por este mensaje.
Device: Un puntero a una cadena de caracteres terminada en nulo que contiene el
nombre del dispositivo que va a ser cambiado, tal como est almacenado en el fichero
Win.ini o en el registro de Windows.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
RegSetValue, RegSetValueEx
WM_DISPLAYCHANGE
Sintaxis
TWMDisplayChange = record
Msg: Cardinal;
BitsPerPixel: Integer;
Width: Word;
Height: Word;
end;
Descripcin
El mensaje WM_DISPLAYCHANGE es enviado a todas las ventanas de nivel superior
cuando cambia la resolucin de la pantalla.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DISPLAYCHANGE.
BitsPerPixel: La profundidad de color de la pantalla, en bits por pxel.
Width: El tamao horizontal de la pantalla, en pxeles.
Height: El tamao vertical de la pantalla, en pxeles.
Mensajes
777
Vase adems
Apndice
ChangeDisplaySettings
WM_DRAWCLIPBOARD
Sintaxis
TWMDrawClipboard = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_DRAWCLIPBOARD es enviado a la primera ventana en la cadena de
visualizadores del portapapeles cuando el contenido del portapapeles cambia,
indicando que la ventana del visualizador debe refrescar su contenido para reflejar el
nuevo contenido del portapapeles. Slo las ventanas aadidas a la cadena de
visualizadores del portapapeles mediante una llamada a la funcin SetClipboardViewer
recibirn este mensaje. Cada ventana en la cadena de visualizadores del portapapeles
debe pasar este mensaje a la prxima ventana en la cadena, mediante la funcin
SendMessage, de manera que todas las ventanas visualizadoras sean notificadas.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DRAWCLIPBOARD.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
SendMessage, SetClipboardViewer, WM_CHANGECBCHAIN
WM_DRAWITEM
Sintaxis
TWMDrawItem = record
Msg: Cardinal;
{identificador del mensaje}
Ctl: HWND;
{manejador del control que enva el mensaje}
DrawItemStruct: PDrawItemStruct;{puntero al registro DrawItemStruct}
Result: Longint;
{devuelve uno (1) si fue manejado}
end;
778
Apndice A
Descripcin
La ventana propietaria de un cuadro de lista, de combinacin, un elemento de men o
botn dibujado por el propietario recibe un mensaje WM_DRAWITEM cuando algn
aspecto visual del control cambia, como por ejemplo el foco, estado de habilitacin,
etc. Para crear elementos de men dibujados por el propietario, utilice las funciones
InsertMenuItem o SetMenuItemInfo.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DRAWITEM.
Ctl: Manejador de la ventana que enva el mensaje WM_DRAWITEM.
DrawItemStruct: Puntero a un registro TDrawItemStruct que contiene la informacin
sobre el control que necesita la ventana propietaria para dibujar. El registro
TDrawItemStruct se define como:
TDrawItemStruct = packed record
CtlType: UINT;
{indicador de tipo de control}
CtlID: UINT;
{identificador del control}
itemID: UINT;
{identificador de elemento de men o ndice}
itemAction: UINT;
{opcin de dibujo}
itemState: UINT;
{estado visual del elemento}
hwndItem: HWND;
{manejador del control}
hDC: HDC;
{contexto de dispositivo}
rcItem: TRect;
{rectngulo del elemento}
itemData: DWORD;
{los datos de 32 bits del elemento}
end;
CtlType: Un valor que especifica el tipo de control. Este campo puede contener
un valor de la Tabla A-4.
CtlID: Especifica el identificador del control. Este campo es ignorado si el
control es un elemento de men.
itemID: Este campo contiene el identificador del elemento de men o el ndice
del elemento seleccionado en el cuadro de lista o de combinacin. Un valor -1
indica un cuadro de lista o de combinacin vaco. Esto permite a la ventana
propietaria del control redibujar slo la porcin del control especificada en el
campo rcItem y es til para dibujar el rectngulo de foco.
itemAction: Valor que indica qu acciones deben tomarse cuando se dibuja el
elemento. Este campo puede ser un valor de la Tabla A-5.
itemState: Indica el nuevo estado visual del control. Este campo puede contener
uno o ms valores de la Tabla A-6.
hwndItem: El manejador de ventana del control, para cuadros de combinacin,
cuadros de lista, botones y controles estticos. Para elementos de men, este
campo contiene el manejador de ventana del men que contiene el elemento.
779
Vase adems
WM_MEASUREITEM
Tabla A-4: Valores de TWMDrawItem.TDrawItemStruct.CtlType
Valor
ODT_BUTTON
ODT_COMBOBOX
ODT_LISTBOX
ODT_LISTVIEW
ODT_MENU
ODT_STATIC
ODT_TAB
Descripcin
Indica un botn dibujado por el propietario.
Indica un cuadro de combinacin dibujado por el propietario.
Indica un cuadro de lista dibujado por el propietario.
Indica una vista de lista dibujada por el propietario.
Indica un elemento de men dibujado por el propietario.
Indica un control esttico dibujado por el propietario.
Indica un control de tabulacin dibujado por el propietario.
Descripcin
El control completo debe ser dibujado.
El foco del teclado ha cambiado. Verifique el valor del
campo itemState para conocer el estado del foco.
El estado de la seleccin ha cambiado. Verifique el valor del
campo itemState para conocer el estado de seleccin.
Descripcin
El elemento de men est marcado.
La accin de dibujo se efectuar en el cuadro de edicin de
un cuadro de combinacin.
Indica el elemento por defecto.
El elemento debe ser dibujado en estado deshabilitado.
A
Apndice
Mensajes
780
Apndice A
ODS_FOCUS
ODS_GRAYED
ODS_SELECTED
WM_DROPFILES
Sintaxis
TWMDropFiles = record
Msg: Cardinal;
Drop: THANDLE;
Unused: Longint;
Result: Longint;
end;
Descripcin
Si una ventana est registrada para recibir archivos arrastrados y soltados desde el
Explorador o el Administrador de Ficheros, recibir el mensaje WM_DROPFILES
cuando el usuario suelte el botn del ratn sobre la ventana para completar una
operacin de arrastrar y soltar. Utilice la funcin DragAcceptFiles para registrar una
ventana como receptora de ficheros mediante arrastrar y soltar.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_DROPFILES.
Drop: El manejador del registro interno que contiene los ficheros que han sido
arrastrados y soltados.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DragAcceptFiles, DragFinish, DragQueryFile, DragQueryPoint
WM_ENABLE
Sintaxis
TWMEnable = record
Msg: Cardinal;
Enabled: LongBool;
Unused: Longint;
Result: Longint;
Mensajes
781
Descripcin
Cuando una aplicacin cambia el estado de habilitacin de una ventana, un mensaje
WM_ENABLE es enviado a la ventana cuyo estado est cambiando. El mensaje es
enviado despus que el estado haya cambiado, pero antes que la funcin
EnableWindow retorne.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ENABLE.
Enabled: Este campo contiene TRUE si la ventana pasa a estar habilitada, o FALSE si
la ventana pasa a estar deshabilitada.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
EnableWindow
WM_ENDSESSION
Sintaxis
TWMEndSession = record
Msg: Cardinal;
EndSession: LongBool;
Unused: Longint;
Result: Longint;
end;
Descripcin
Despus que el mensaje WM_QUERYENDSESSION es enviado a todas las ventanas y
los resultados son procesados, Windows enva un mensaje WM_ENDSESSION a todas
las aplicaciones indicando si la sesin Windows est finalizando.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ENDSESSION.
EndSession: Indica si la sesin Windows est terminando. Si este campo contiene
TRUE, la sesin est terminando; en caso contrario, contiene FALSE.
Apndice
end;
782
Apndice A
Unused: Indica si el usuario est simplemente cerrando la sesin actual o est apagando
el sistema. Si est cerrando la sesin, este campo contiene ENDSESSION_LOGOFF. Si
est apagando el sistema, este campo contiene cero.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DestroyWindow, PostQuitMessage, WM_QUERYENDSESSION
WM_ENTERIDLE
Sintaxis
TWMEnterIdle = record
Msg: Cardinal;
Source: Longint;
IdleWnd: HWND;
Result: Longint;
end;
Descripcin
Si un cuadro de dilogo modal o un men estn siendo mostrados y todos los mensajes
en la cola han sido procesados, el men o cuadro de dilogo modal entran en estado
ocioso y el mensaje WM_ENTERIDLE es enviado a la ventana propietaria del men o
al cuadro de dilogo.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ENTERIDLE.
Source: Indica si un cuadro de dilogo o un men estn siendo mostrados. Este campo
puede ser un valor de la Tabla A-7.
IdleWnd: El manejador del cuadro de dilogo o el manejador de la ventana que
contiene el men.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_ACTIVATE, WM_MOUSEACTIVATE
Tabla A-7: Valores de TWMEnterIdle.Source
Valor
MSGF_DIALOGBOX
MSGF_MENU
Descripcin
Indica que un cuadro de dilogo es mostrado.
Indica que un men es mostrado.
Mensajes
783
Sintaxis
TWMEnterMenuLoop = record
Msg: Cardinal;
IsTrackPopupMenu: LongBool;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_ENTERMENULOOP es enviado a la ventana principal de una
aplicacin cuando un men va a ser mostrado y se ha entrado en el bucle modal del
men.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ENTERMENULOOP.
IsTrackPopupMenu: Indica si el men es un men emergente o normal. Si a este campo
se le asigna TRUE, el men es emergente; en caso contrario, es un men corriente.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_EXITMENULOOP
WM_ERASEBKGND
Sintaxis
TWMEraseBkgnd = record
Msg: Cardinal;
DC: HDC;
Unused: Longint;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a una ventana cuyo fondo ha sido invalidado a causa de
acciones tales como el redimensionamiento, y que necesita ser borrada. Tpicamente el
fondo de la ventana es borrado cuando se redibuja la regin no vlida usando la brocha
de fondo de la clase de la ventana.
Apndice
WM_ENTERMENULOOP
784
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ERASEBKGND.
DC: El contexto de dispositivo de la ventana cuyo fondo ser borrado.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja este mensaje, deber asignar uno (1) a este campo.
Vase adems
BeginPaint, DefWindowProc, WM_ICONERASEBKGND
WM_EXITMENULOOP
Sintaxis
TWMExitMenuLoop = record
Msg: Cardinal;
IsTrackPopupMenu: LongBool;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_EXITMENULOOP es enviado a la ventana principal de una aplicacin
cuando un men es cerrado y se ha salido de su bucle modal de men.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_EXITMENULOOP.
IsTrackPopupMenu: Indica si el men es un men emergente o normal. Si a este campo
se le asigna TRUE, el men es emergente; en caso contrario, es un men corriente.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_ENTERMENULOOP
WM_FONTCHANGE
Sintaxis
TWMFontChange = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
785
end;
Descripcin
Si una aplicacin cambia los recursos de fuente globales al sistema mediante las
funciones AddFontResource o RemoveFontResource, deber enviar un mensaje
WM_FONTCHANGE a todas las ventanas de nivel superior. Este mensaje puede ser
enviado a esas ventanas usando la funcin SendMessage con el parmetro hWnd puesto
a HWND_BROADCAST.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_FONTCHANGE.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
AddFontResource, RemoveFontResource, SendMessage
WM_GETFONT
Sintaxis
TWMGetFont = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Una aplicacin puede recuperar la fuente que un control est usando para dibujar texto,
envindole un mensaje WM_GETFONT a ese control.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_GETFONT.
Unused: Este campo no es utilizado por este mensaje.
Result: Este mensaje devuelve cero si el control utiliza la fuente de sistema. En caso
contrario, el mensaje devuelve el manejador de la fuente actualmente seleccionada.
A
Apndice
Mensajes
786
Apndice A
Vase adems
WM_SETFONT
WM_GETHOTKEY
Sintaxis
TWMGetHotKey = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_GETHOTKEY es enviado a una ventana para recuperar su tecla
caliente asociada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_GETHOTKEY.
Unused: Este campo no es utilizado por este mensaje.
Result: Este mensaje devuelve cero si no hay ninguna tecla caliente asociada a la
ventana. Si la ventana tiene una tecla caliente asociada, el cdigo virtual de la misma
estar en el byte menos significativo del valor resultante y el modificador estar en el
byte ms significativo. El modificador de la tecla caliente puede ser una combinacin
de valores de la Tabla A-8.
Vase adems
WM_SETHOTKEY, WM_SYSCOMMAND
Tabla A-8: Valores del modificador de la tecla caliente TWMGetHotKey.Result
Valor
HOTKEYF_ALT
HOTKEYF_CONTROL
HOTKEYF_EXT
HOTKEYF_SHIFT
WM_GETICON
Sintaxis
TWMGetIcon = record
Descripcin
La tecla Alt.
La tecla Ctrl.
Una tecla extendida.
La tecla May.
Msg: Cardinal;
BigIcon: Longbool;
Unused: Longint;
Result: Longint;
787
end;
Descripcin
El mensaje WM_GETICON es enviado a una ventana para recuperar su icono asociado,
grande o pequeo.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_GETICON.
BigIcon: Valor que indica el tipo de icono a recuperar. Este campo puede contener
ICON_BIG para recuperar el icono grande o ICON_SMALL para recuperar el pequeo.
Unused: Este campo no es utilizado por este mensaje.
Result: Si el mensaje tiene xito, devuelve un manejador del icono grande o pequeo.
Vase adems
DefWindowProc, WM_SETICON
WM_GETMINMAXINFO
Sintaxis
TWMGetMinMaxInfo = record
Msg: Cardinal;
Unused: Integer;
MinMaxInfo: PMinMaxInfo;
Result: Longint;
end;
Descripcin
Cuando el tamao o la posicin de una ventana va a cambiar, el mensaje
WM_GETMINMAXINFO es enviado a la ventana. Esto puede ser usado para redefinir
los valores predeterminados para el tamao maximizado, la posicin maximizada, el
tamao mnimo de seguimiento o el tamao mximo de seguimiento de la ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_GETMINMAXINFO.
Unused: Este campo no es utilizado por este mensaje.
A
Apndice
Mensajes
788
Apndice A
{reservado}
{tamao mximo de la ventana}
{ubicacin de la ventana maximizada}
{tamao mnimo de seguimiento}
{tamao mximo de seguimiento}
ptReserved: Este campo est reservado para uso futuro y hay que asignarle cero.
ptMaxSize: El nuevo ancho y altura de la ventana maximizada, en pxeles.
ptMaxPosition: La nueva posicin de la ventana maximizada, en pxeles, relativa
a la esquina superior izquierda de la pantalla.
ptMinTrackSize: El nuevo tamao mnimo de seguimiento de la ventana, en
pxeles.
ptMaxTrackSize: El nuevo tamao mximo de seguimiento de la ventana, en
pxeles.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
MoveWindow, SetWindowPos
WM_GETTEXT
Sintaxis
TWMGetText = record
Msg: Cardinal;
TextMax: Integer;
Text: PChar;
Result: Longint;
end;
Descripcin
El mensaje WM_GETTEXT es enviado para recuperar el texto o el ttulo de una
ventana. El texto o ttulo es copiado en un buffer reservado por el usuario al que apunta
el campo Text. Para un control de edicin, el texto recuperado es el contenido completo
del control de edicin. Para un cuadro de combinacin, es el contenido de su control de
edicin. Para un botn, es el ttulo mostrado por el botn. Para las dems ventanas, es
el ttulo de la ventana. Para recuperar el texto de un elemento de un cuadro de lista, se
debe usar el mensaje LB_GETTEXT. Para un control de edicin con ms de 64K de
texto, se deben usar los mensajes EM_STREAMOUT o EM_GETSELTEXT. Cuando un
789
control esttico tiene el estilo SS_ICON y el icono fue asignado por un mensaje
WM_SETTEXT, el mensaje WM_GETTEXT devolver el manejador del icono en los
primeros cuatro bytes del buffer de salida.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_GETTEXT.
TextMax: Especifica la cantidad mxima de caracteres a copiar, incluyendo el
terminador nulo.
Text: Un puntero al buffer de salida que recibe el texto.
Result: Si el mensaje tiene xito, devuelve el nmero de caracteres copiados en el
buffer de salida.
Vase adems
DefWindowProc, GetWindowText, GetWindowTextLength, WM_GETTEXTLENGTH,
WM_SETTEXT
WM_GETTEXTLENGTH
Sintaxis
TWMGetTextLength = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_GETTEXTLENGTH es enviado a una ventana para determinar la
longitud del texto asociado con esa ventana, excluyendo el terminador nulo. Este
mensaje puede ser usado para determinar el tamao del buffer de salida requerido por
el mensaje WM_GETTEXT. Cuando el sistema contiene una mezcla de cadenas ANSI y
Unicode, el resultado puede ser mayor que el nmero de bytes requerido, pero nunca
ser menor que el nmero de bytes requerido por el buffer de salida usado por el
mensaje WM_GETTEXT. Vea el mensaje WM_GETTEXT para ver una descripcin del
texto asociado con los diferentes tipos de controles.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_GETTEXTLENGTH.
Unused: Este campo no es utilizado por este mensaje.
A
Apndice
Mensajes
790
Apndice A
Result: Si el mensaje tiene xito, devuelve la longitud del texto asociado con la ventana
a la cual el mensaje fue enviado, en caracteres.
Vase adems
DefWindowProc, GetWindowText, GetWindowTextLength, WM_GETTEXT
WM_HELP
Sintaxis
TWMHelp = record
Msg: Cardinal;
Unused: Integer;
HelpInfo: PHelpInfo;
Result: Longint;
end;
Descripcin
El mensaje WM_HELP es enviado cuando el usuario presiona la tecla F1 en busca de
ayuda. Si un elemento de men est abierto, el mensaje es enviado a la ventana
asociada con el men; en caso contrario, el mensaje es enviado a la ventana que tiene el
foco del teclado o a la ventana actualmente activa, si ninguna tiene el foco del teclado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_HELP.
Unused: Este campo no es utilizado por este mensaje.
HelpInfo: Un puntero al registro THelpInfo que contiene informacin sobre la ventana
o el control para el cual la ayuda fue solicitada. El registro THelpInfo se define como:
THelpInfo = packed record
cbSize: UINT;
iContextType: Integer;
iCtrlId: Integer;
hItemHandle: THandle;
dwContextId: DWORD;
MousePos: TPoint;
end;
791
Vase adems
DefWindowProc, WM_SYSCOMMAND
Tabla A-9: Valores de TWMHelp.THelpInfo.iContextType
Valor
HELPINFO_MENUITEM
HELPINFO_WINDOW
Descripcin
Indica una solicitud de ayuda para un elemento de men.
Indica una solicitud de ayuda para una ventana o control.
WM_HSCROLL
Sintaxis
TWMHScroll = record
Msg: Cardinal;
ScrollCode: Smallint;
Pos: Smallint;
Scroll bar: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_HSCROLL es enviado a una ventana cuando un evento de
desplazamiento horizontal ocurre, si la ventana tiene una barra de desplazamiento
horizontal estndar. Tambin es enviado cuando un evento de desplazamiento ocurre en
un control de barra de desplazamiento horizontal. Si la aplicacin cambia la posicin
de los datos en una ventana como resultado de un evento de desplazamiento horizontal,
debe reinicializar la posicin del botn de la barra de desplazamiento, llamando a la
funcin SetScrollPos. Los mensajes WM_VSCROLL y WM_HSCROLL tienen un valor
de 16 bits para la posicin de los desplazamientos, restringiendo as la posicin
mxima a 65.535.
A
Apndice
Mensajes
792
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_HSCROLL.
ScrollCode: Especifica el tipo de desplazamiento solicitado como resultado de un
evento de desplazamiento. Este campo puede contener un valor de la Tabla A-10.
Pos: Si el campo ScrollCode contiene SB_THUMBPOSITION o SB_THUMBTRACK,
este campo especifica la posicin actual del botn de la barra de desplazamiento. En
caso contrario, este campo no es usado.
Scroll bar: Especifica el manejador de la barra de desplazamiento, si es un control de
barra de desplazamiento el que est enviando el mensaje WM_HSCROLL. En caso
contrario, este campo no es usado.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_VSCROLL
Tabla A-10: Valores de TWMHScroll.ScrollCode
Valor
SB_BOTTOM
SB_ENDSCROLL
SB_LINELEFT
SB_LINERIGHT
SB_PAGELEFT
SB_PAGERIGHT
SB_THUMBPOSITION
SB_THUMBTRACK
SB_TOP
Descripcin
Indica un desplazamiento al extremo derecho.
Indica el fin de la operacin de desplazamiento.
Indica un desplazamiento a la izquierda de una unidad.
Indica un desplazamiento a la derecha de una unidad.
Indica un desplazamiento a la izquierda del ancho de la
ventana.
Indica un desplazamiento a la derecha del ancho de la
ventana.
Indica un desplazamiento a la posicin absoluta que
especifica el campo Pos.
Arrastra el botn de la barra de desplazamiento a la
posicin que indica el campo Pos. Esto se usa para obtener
retroalimentacin del control.
Indica un desplazamiento al extremo izquierda.
WM_HSCROLLCLIPBOARD
Sintaxis
TWMHScrollClipboard = record
Msg: Cardinal;
{identificador del mensaje}
Viewer: HWND;
{manejador del visualizador del portapapeles}
ScrollCode: Word;
{cdigo del desplazamiento solicitado}
Mensajes
ThumbPos: Word;
Result: Longint;
793
Descripcin
El mensaje WM_HSCROLLCLIPBOARD es enviado por una ventana visualizadora del
portapapeles a la propietaria del portapapeles cuando se produce un evento en la barra
de desplazamiento horizontal del visor del portapapeles y el portapapeles contiene
datos en el formato CF_OWNERDISPLAY. La propietaria del portapapeles deber
desplazar la imagen y reinicializar el valor de la barra de desplazamiento horizontal.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_HSCROLLCLIPBOARD.
Viewer: Especifica el manejador de la ventana visualizadora del portapapeles.
ScrollCode: Especifica el tipo de peticin de desplazamiento como resultado de un
evento de desplazamiento. Este campo puede contener un valor de la Tabla A-11.
ThumbPos: Si el campo ScrollCode contiene SB_THUMBPOSITION, este campo
especifica la posicin actual del botn de la barra de desplazamiento. En caso
contrario, este campo no es usado.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_VSCROLLCLIPBOARD
Tabla A-11: Valores de TWMHScrollClipboard.ScrollCode
Valor
SB_BOTTOM
SB_ENDSCROLL
SB_LINELEFT
SB_LINERIGHT
SB_PAGELEFT
SB_PAGERIGHT
SB_THUMBPOSITION
SB_TOP
Descripcin
Indica un desplazamiento al extremo derecho.
Indica el final de la operacin de desplazamiento.
Indica un desplazamiento a la izquierda de una unidad.
Indica un desplazamiento a la derecha de una unidad.
Indica un desplazamiento a la izquierda del ancho de la
ventana.
Indica un desplazamiento a la derecha del ancho de la
ventana.
Indica un desplazamiento a la posicin absoluta que
especifica el campo Pos.
Indica un desplazamiento al extremo izquierdo.
Apndice
end;
794
Apndice A
WM_ICONERASEBKGND
Sintaxis
TWMIconEraseBkgnd = record
Msg: Cardinal;
DC: HDC;
Unused: Longint;
Result: Longint;
end;
Descripcin
Una ventana que ha sido minimizada recibe un mensaje WM_ICONERASEBKGND
cuando el fondo del icono tiene que ser rellenado antes de que sea dibujado. Este
mensaje es enviado slo si un icono de clase ha sido definido para la ventana; en caso
contrario, es enviado el mensaje WM_ERASEBKGND.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_ICONERASEBKGND.
DC: El contexto de dispositivo sobre el cual el icono ser dibujado.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja este mensaje, deber asignar uno (1) a este campo.
Vase adems
DefWindowProc, WM_ERASEBKGND
WM_INITMENU
Sintaxis
TWMInitMenu = record
Msg: Cardinal;
Menu: HMENU;
Unused: Longint;
Result: Longint;
end;
Descripcin
Cuando un men va a activarse, por ejemplo cuando el usuario hace clic sobre un
elemento del men o pulsa una tecla de atajo al men, un mensaje WM_INITMENU es
enviado a la ventana propietaria del men. Esto permite que la aplicacin modifique el
men antes de mostrarlo. Este mensaje es enviado slo cuando un men es accedido
por primera vez, y solamente un mensaje es enviado por cada acceso. Mover el ratn
795
por los elementos del men mientras se mantiene pulsado el botn no generar nuevos
mensajes.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_INITMENU.
Menu: Identifica el manejador del men.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_ENTERMENULOOP, WM_EXITMENULOOP, WM_INITMENUPOPUP
WM_INITMENUPOPUP
Sintaxis
TWMInitMenuPopup = record
Msg: Cardinal;
MenuPopup: HMENU;
Pos: Smallint;
SystemMenu: WordBool;
Result: Longint;
end;
Descripcin
Cuando un men desplegable o submen se va a activar, por ejemplo cuando el usuario
hace clic sobre un elemento de men que contiene un submen, un mensaje
WM_INITMENUPOPUP es enviado a la ventana propietaria del men. Esto permite a
la aplicacin modificar el men antes de mostrarlo.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_INITMENUPOPUP.
MenuPopup: Identifica el manejador del men desplegable o submen.
Pos: Especifica el ndice de base cero del elemento de men que abri el men
desplegable o submen.
SystemMenu: Indica si el men desplegable activado es el men de sistema o de
ventana. Si a este campo se le asigna TRUE, el men desplegable activado es el de
sistema; en caso contrario, es un men desplegable o submen.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
A
Apndice
Mensajes
796
Apndice A
Vase adems
WM_ENTERMENULOOP, WM_EXITMENULOOP, WM_INITMENU
WM_KEYDOWN
Sintaxis
TWMKeyDown = record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
Descripcin
Cuando el usuario pulsa una tecla que no es de sistema, un mensaje WM_KEYDOWN
es enviado a la ventana que tiene el foco del teclado. Una tecla no de sistema es una
combinacin de teclas que no incluye la tecla Alt. Si la tecla pulsada es F10,
DefWindowProc asigna 1 a una opcin interna. Cuando el mensaje WM_KEYUP es
recibido, DefWindowProc verifica el valor de esa opcin interna y si sta tiene valor 1,
enva un mensaje WM_SYSCOMMAND a la ventana de nivel superior con el campo
CmdType del mensaje puesto a SC_KEYMENU.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_KEYDOWN.
CharCode: Especifica el cdigo de tecla virtual de la tecla presionada.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones, cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado anterior de la tecla e indicador del
estado de transicin. La Tabla A-12 muestra qu informacin se almacena en cada bit
del valor de 32 bits del campo KeyData.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_CHAR, WM_KEYUP, WM_SYSCOMMAND
797
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
El cdigo de contexto. Este bit siempre es 0.
El estado previo de la tecla. Si la tecla estaba presionada antes de que se
enviara el mensaje, este bit contiene 1; en caso contario contiene 0.
El estado de transicin. Este bit siempre contiene 0.
WM_KEYUP
Sintaxis
TWMKeyUp = record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
Descripcin
Cuando el usuario libera una tecla que no es de sistema, un mensaje WM_KEYUP es
enviado a la ventana que posee el foco del teclado. Una tecla no de sistema es una
combinacin de teclas que no incluye la tecla Alt. Si la tecla liberada es F10,
DefWindowProc enva un mensaje WM_SYSCOMMAND a la ventana de nivel superior
con el campo CmdType del mensaje puesto a SC_KEYMENU.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_KEYUP.
CharCode: Especifica el cdigo virtual de la tecla para la tecla que fue liberada.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones, cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado anterior de la tecla e indicador de
estado de transicin. La Tabla A-13 muestra qu informacin se almacena en cada bit
del valor de 32 bits del campo KeyData.
A
Apndice
Mensajes
798
Apndice A
Vase adems
DefWindowProc, WM_CHAR, WM_KEYDOWN, WM_SYSCOMMAND
Tabla A-13: Valores de TWMKeyUp.KeyData
Valor
0-15
16-23
24
25-28
29
30
31
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
El cdigo de contexto. Este bit siempre es 0.
El estado previo de la tecla. Este bit siempre es 1.
El estado de transicin. Este bit siempre es 1.
WM_KILLFOCUS
Sintaxis
TWMKillFocus = record
Msg: Cardinal;
FocusedWnd: HWND;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_KILLFOCUS es enviado a una ventana cuando va a perder el foco del
teclado. La ventana recibir el mensaje antes de que el foco del teclado cambie.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_KILLFOCUS.
FocusedWnd: Especifica el manejador de la ventana que recibe el foco del teclado.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
SetFocus, WM_SETFOCUS
799
WM_LBUTTONDBLCLK
Sintaxis
TWMLButtonDblClk = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
{coordenada horizontal del cursor}
YPos: Smallint);
{coordenada vertical del cursor}
1: (
Pos: TSmallPoint;
{registro que contiene las coordenadas del cursor}
Result: Longint);
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y se hace doble
clic con el botn izquierdo, un mensaje WM_LBUTTONDBLCLK es enviado a la
ventana que est bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada
del ratn, mediante una llamada a la funcin SetCapture, el mensaje es enviado a esa
ventana. Un doble clic se genera cuando el usuario pulsa y libera el botn del ratn y lo
pulsa y libera de nuevo, en las mismas coordenadas y dentro del intervalo de doble clic
del sistema. Este proceso genera una serie de cuatro mensajes, en el orden siguiente:
WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK y
WM_LBUTTONUP. Slo las ventanas cuyo estilo de clase incluye el atributo
CS_DBLCLKS recibirn el mensaje WM_LBUTTONDBLCLK.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_LBUTTONDBLCLK.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento del doble
clic. Este campo puede contener uno o ms valores de la Tabla A-14.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn, relativas
al rea cliente.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, GetDoubleClickTime, SetCapture, SetDoubleClickTime,
WM_LBUTTONDOWN, WM_LBUTTONUP
A
Apndice
Mensajes
800
Apndice A
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_LBUTTONDOWN
Sintaxis
TWMLButtonDown = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
{coordenada horizontal del cursor}
YPos: Smallint);
{coordenada vertical del cursor}
1: (
Pos: TSmallPoint;
{registro que contiene las coordenadas del cursor}
Result: Longint);
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y se pulsa el
botn izquierdo, se enva un mensaje WM_LBUTTONDOWN a la ventana situada bajo
el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn mediante una
llamada a la funcin SetCapture, el mensaje es enviado a esa ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_LBUTTONDOWN.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento del clic. Este
campo puede contener uno o ms valores de la Tabla A-15.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn, relativas
al rea cliente.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
801
Vase adems
GetCapture, SetCapture, WM_LBUTTONDBLCLK, WM_LBUTTONUP
Tabla A-15: Valores de TWMLButtonDown.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada .
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_LBUTTONUP
Sintaxis
TWMLButtonUp = record
Msg: Cardinal;
Keys: Longint;
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
1: (
Pos: TSmallPoint;
Result: Longint);
end;
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de la ventana y el botn
izquierdo es liberado, un mensaje WM_LBUTTONUP es enviado a la ventana situada
bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn mediante
una llamada a la funcin SetCapture, el mensaje es enviado a esa ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_LBUTTONUP.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento que el botn
fue liberado. Este campo puede contener uno o ms valores de la Tabla A-16.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
A
Apndice
Mensajes
802
Apndice A
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn relativas
al rea cliente.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, SetCapture, WM_LBUTTONDBLCLK, WM_LBUTTONDOWN
Tabla A-16: Valores de TWMLButtonUp.Keys
Valor
MK_CONTROL
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_MBUTTONDBLCLK
Sintaxis
TWMMButtonDblClk = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
{coordenada horizontal del cursor}
YPos: Smallint);
{coordenada vertical del cursor}
1: (
Pos: TSmallPoint;
{registro que contiene las coordenadas del cursor}
Result: Longint);
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y se hace doble
clic con el botn central, un mensaje WM_MBUTTONDBLCLK es enviado a la ventana
situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn,
mediante una llamada a la funcin SetCapture, el mensaje es enviado a esa ventana. Un
doble clic se genera cuando el usuario pulsa y libera el botn del ratn y lo pulsa y
libera de nuevo, en las mismas coordenadas y dentro del intervalo de doble clic del
sistema. Este proceso genera una serie de cuatro mensajes en el orden siguiente:
WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK y
WM_MBUTTONUP. Slo aquellas ventanas cuyo estilo de clase incluye el atributo
CS_DBLCLKS recibirn el mensaje WM_MBUTTONDBLCLK.
803
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MBUTTONDBLCLK.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento del doble
clic. Este campo puede contener uno o ms valores de la Tabla A-17.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas del ratn, relativas al rea
cliente.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, GetDoubleClickTime, SetCapture, SetDoubleClickTime,
WM_MBUTTONDOWN, WM_MBUTTONUP
Tabla A-17: Valores de TWMMButtonDblClk.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_MBUTTONDOWN
Sintaxis
TWMMButtonDown = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
{coordenada horizontal del cursor}
YPos: Smallint);
{coordenada vertical del cursor}
1: (
Pos: TSmallPoint;
{registro que contiene las coordenadas del cursor}
Result: Longint);
{devuelve cero (0) si fue manejado}
end;
A
Apndice
Mensajes
804
Apndice A
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y se hace clic
con el botn central, un mensaje WM_MBUTTONDOWN es enviado a la ventana
situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn
mediante una llamada a la funcin SetCapture, el mensaje es enviado a esa ventana.
Campos
Msg: El identificador del mensaje. Contiene la constante WM_MBUTTONDOWN.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento del clic. Este
campo puede contener uno o ms valores de la Tabla A-18.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, SetCapture, WM_MBUTTONDBLCLK, WM_MBUTTONUP
Tabla A-18: Valores de TWMMButtonDown.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_MBUTTONUP
Sintaxis
TWMMButtonUp = record
Msg: Cardinal;
Keys: Longint;
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
1: (
Pos: TSmallPoint;
Result: Longint);
end;
805
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y el botn
central es liberado, un mensaje WM_MBUTTONUP es enviado a la ventana situada
bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn mediante
una llamada a la funcin SetCapture, el mensaje es enviado a esa ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MBUTTONUP.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento en que el
botn fue liberado. Este campo puede contener uno o ms valores de la Tabla A-19.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, SetCapture, WM_MBUTTONDBLCLK, WM_MBUTTONDOWN
Tabla A-19: Valores de TWMMButtonUp.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_MDIACTIVATE
Sintaxis
TWMMDIActivate = record
Msg: Cardinal;
case Integer of
0: (
ChildWnd: HWND);
1: (
DeactiveWnd: HWND;
ActiveWnd: HWND;
Result: Longint);
end;
A
Apndice
Mensajes
806
Apndice A
Descripcin
Una ventana cliente de una aplicacin MDI recibe el mensaje WM_MDIACTIVATE
cuando debe activar una nueva ventana hija. La ventana cliente MDI pasar el mensaje
tanto a la ventana que va a ser desactivada como a la ventana que va a ser activada. Las
ventanas hijas MDI son activadas independientemente de la ventana marco MDI.
Cuando la ventana marco es activada, la ltima ventana hija MDI que fue activada
mediante el mensaje WM_MDIACTIVATE recibir el mensaje WM_NCACTIVATE, pero
no recibir otro mensaje WM_MDIACTIVATE.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDIACTIVATE.
ChildWnd: El manejador de la ventana hija que va a ser activada. Este campo es vlido
solamente cuando el mensaje es recibido por una ventana cliente MDI.
DeactiveWnd: El manejador de la ventana hija que va a ser desactivada. Este campo es
vlido solamente cuando el mensaje es recibido por una ventana hija MDI.
ActiveWnd: El manejador de la ventana hija que va a ser activada. Este campo es vlido
solamente cuando el mensaje es recibido por una ventana hija MDI.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_MDIGETACTIVE, WM_MDINEXT, WM_NCACTIVATE
WM_MDICASCADE
Sintaxis
TWMMDICascade = record
Msg: Cardinal;
Cascade: Longint;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_MDICASCADE es enviado a la ventana cliente de una aplicacin MDI
para indicarle que disponga en cascada a todas las ventanas hijas abiertas.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDICASCADE.
807
Vase adems
WM_MDIICONARRANGE, WM_MDITILE
WM_MDICREATE
Sintaxis
TWMMDICreate = record
Msg: Cardinal;
Unused: Integer;
MDICreateStruct: PMDICreateStruct;
Result: Longint;
end;
Descripcin
El mensaje WM_MDICREATE es enviado a una ventana cliente MDI cuando una
aplicacin quiere crear una ventana hija. La informacin para la nueva ventana es
especificada por el registro al que apunta el campo MDICreateStruct. La ventana hija
es creada con los estilos WS_CHILD, WS_CLIPSIBLINGS, WS_CLIPCHILDREN,
WS_SYSMENU, WS_CAPTION, WS_THICKFRAME, WS_MINIMIZEBOX,
WS_MAXIMIZEBOX, adems de cualquier otro que sea especificado en el registro
TMDICreateStruct. Una aplicacin debe terminar el procesamiento del mensaje actual
WM_MDICREATE antes de que otro mensaje WM_MDICREATE sea enviado. Cuando
la ventana cliente MDI recibe el mensaje, enva un mensaje WM_CREATE a la ventana
hija. El campo lpCreateParams del registro TCreateStruct utilizado en el mensaje
WM_CREATE contendr un puntero al registro TMDICreateStruct.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDICREATE.
Unused: Este campo no es utilizado por este mensaje.
MDICreateStruct: Un puntero al registro TMDICreateStruct que define los atributos de
la nueva ventana hija. El registro TMDICreateStruct se define como:
A
Apndice
Mensajes
808
Apndice A
Vase adems
CreateMDIWindow, WM_CREATE, WM_MDIDESTROY
Tabla A-20: Valores de TWMMDICreate.TMDICreateStruct.style
Valor
WS_MINIMIZE
WS_MAXIMIZE
Descripcin
La ventana hija MDI est inicialmente minimizada.
La ventana hija MDI est inicialmente maximizada.
Mensajes
809
WM_MDIDESTROY
Sintaxis
TWMMDIDestroy = record
Msg: Cardinal;
{identificador del mensaje}
Child: HWND;
{manejador de ventana hija}
Unused: Longint;
{no se utiliza}
Result: Longint;
{devuelve cero}
end;
Descripcin
Este mensaje es enviado a una ventana cliente MDI para cerrar una ventana hija. El
ttulo de la ventana hija es eliminado de la ventana marco MDI y la ventana hija es
desactivada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDIDESTROY.
Child: Especifica el manejador de la ventana hija MDI que ser cerrada.
Unused: Este campo no es utilizado por este mensaje.
Result: Este mensaje siempre devuelve cero.
Vase adems
WM_MDICREATE
WM_MDIGETACTIVE
Sintaxis
TWMMDIGetActive = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
A
Apndice
WS_HSCROLL
WS_VSCROLL
Descripcin
Este mensaje recupera el manejador de la ventana hija MDI activa.
810
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDIGETACTIVE.
Unused: Este campo no es utilizado por este mensaje.
Result: Si el mensaje tiene xito, devuelve un manejador de la ventana hija MDI activa;
en caso contrario, devuelve cero.
Vase adems
WM_MDIACTIVATE, WM_MDICREATE, WM_MDIDESTROY
WM_MDIICONARRANGE
Sintaxis
TWMMDIIconArrange = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a una ventana cliente MDI para alinear todos los iconos de las
ventanas hijas. No tiene efecto sobre ventanas hijas que no estn minimizadas.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDIICONARRANGE.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
WM_MDICASCADE, WM_MDITILE
WM_MDIMAXIMIZE
Sintaxis
TWMMDIMaximize = record
Msg: Cardinal;
Maximize: HWND;
Unused: Longint;
Result: Longint;
Mensajes
811
Descripcin
El mensaje WM_MDIMAXIMIZE es enviado a una ventana cliente MDI para
maximizar una ventana hija. Windows redimensiona la ventana hija para hacer que su
rea cliente llene la ventana cliente MDI. La barra de ttulo de la ventana hija es
aadida a la barra de ttulo de la ventana marco y el icono del men de sistema de la
ventana hija y sus botones de ventana son situados en la barra de men de la ventana
marco. Si la ventana hija actualmente activa est maximizada y otra ventana hija MDI
es activada, Windows restaura la ventana hija que estaba activa y maximiza la ventana
hija recin activada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDIMAXIMIZE.
Maximize: Especifica el manejador de la ventana hija MDI que ser maximizada.
Unused: Este campo no es utilizado por este mensaje.
Result: Este mensaje siempre devuelve cero.
Vase adems
SM_MDIICONARRANGE, WM_MDIRESTORE
WM_MDINEXT
Sintaxis
TWMMDINext = record
Msg: Cardinal;
Child: HWND;
Next: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_MDINEXT activa la ventana hija anterior o siguiente en una ventana
cliente MDI. Si la ventana hija actualmente activa est maximizada y otra ventana hija
MDI es activada, Windows restaura la ventana hija que estaba activa y maximiza la
ventana hija recin activada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDINEXT.
Apndice
end;
812
Apndice A
Vase adems
WM_MDIACTIVATE, WM_MDIGETACTIVE
WM_MDIREFRESHMENU
Sintaxis
TWMMDIRefreshMenu = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a la ventana marco MDI para actualizar el men de la ventana
marco.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDIREFRESHMENU.
Unused: Este campo no es utilizado por este mensaje.
Result: Si este mensaje tiene xito, devuelve un manejador del men de la ventana
marco; en caso contrario, devuelve cero.
Vase adems
WM_MDISETMENU
WM_MDIRESTORE
Sintaxis
TWMMDIRestore = record
Msg: Cardinal;
IDChild: HWND;
Unused: Longint;
Result: Longint;
813
end;
Descripcin
Este mensaje restaura una ventana hija MDI desde un estado maximizado o
minimizado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDIRESTORE.
IDChild: Especifica el manejador de la ventana hija MDI que ser restaurada.
Unused: Este campo no es utilizado por este mensaje.
Result: Este mensaje siempre devuelve cero.
Vase adems
WM_MDIMAXIMIZE
WM_MDISETMENU
Sintaxis
TWMMDISetMenu = record
Msg: Cardinal;
MenuFrame: HMENU;
MenuWindow: HMENU;
Result: Longint;
end;
Descripcin
Este mensaje es usado para reemplazar el men completo o solamente la ventana de
men de una ventana marco MDI. Los elementos de men de la ventana hija MDI son
eliminados del men de ventana anterior y aadidos al nuevo men de ventana si este
mensaje reemplaza el men de la ventana. El icono del men de sistema y los botones
de la ventana son quitados del men anterior de la ventana marco y aadidos al nuevo
men de la ventana marco, si una ventana hija MDI es maximizada y este mensaje
reemplaza el men de la ventana marco MDI.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDISETMENU.
A
Apndice
Mensajes
814
Apndice A
Vase adems
WM_MDIREFRESHMENU
WM_MDITILE
Sintaxis
TWMMDITile = record
Msg: Cardinal;
Tile: Longint;
Unused: Longint;
Result: Longint;
end;
Descripcin
Este mensaje hace que una ventana cliente MDI disponga sus ventanas hijas en forma
de mosaico.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MDITILE.
Tile: Valor que especifica cmo las ventanas hijas sern dispuestas en el mosaico. A
este campo se le puede asignar un valor de la Tabla A-21.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la funcin tiene xito, devuelve uno; en caso contrario, devuelve cero.
Vase adems
WM_MDICASCADE, WM_MDIICONARRANGE
Tabla A-21: Valores de TWMDITile.Tile
Valor
MDITILE_HORIZONTAL
MDITILE_SKIPDISABLED
MDITILE_VERTICAL
Descripcin
Las ventanas son dispuestas en mosaico horizontal.
Las ventanas deshabilitadas no son dispuestas en mosaico.
Las ventanas son dispuestas en mosaico vertical.
Mensajes
815
Sintaxis
TWMMeasureItem = record
Msg: Cardinal;
IDCtl: HWnd;
MeasureItemStruct: PMeasureItemStruct;
Result: Longint;
end;
Descripcin
El mensaje WM_MEASUREITEM es enviado a la ventana propietaria de un botn
dibujado por el propietario, un cuadro de combinacin, un cuadro de lista, una vista de
lista o un elemento de men, cuando ese control o elemento de men es creado. Esto
permite a la aplicacin especificar el tamao del control. El registro TWMMeasureItem
al que apunta el campo MeasureItemStruct contiene informacin que identifica al control que enva el mensaje. La aplicacin deber rellenar los campos itemWidth e
itemHeight de este registro antes de retornar. Si un cuadro de lista o de combinacin es
creado con los estilos LBS_OWNERDRAWVARIABLE o
CBS_OWNERDRAWVARIABLE, el mensaje es enviado a cada elemento de ese control.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MEASUREITEM.
IDCtl: Especifica el identificador del control cuyas medidas sern determinadas, que se
corresponde con el campo CtlID del registro al que apunta el campo
MeasureItemStruct. Si este campo tiene valor cero, el mensaje fue enviado por un
men; en caso contrario, fue enviado por un botn, cuadro de combinacin, vista de
lista o cuadro de lista. Si este campo es distinto de cero y al campo itemID de la
estructura a la que apunta el campo MeasureItemStruct se le asigna -1, el mensaje fue
enviado por el control de edicin de un cuadro de combinacin desplegable.
MeasureItemStruct: Puntero a un registro TMeasureItemStruct que contiene
informacin sobre el control que enva el mensaje. La aplicacin debe rellenar los
campos itemWidth e itemHeight de esta estructura antes de retornar. El registro
TMeasureItemStruct se define como:
TMeasureItemStruct = packed record
CtlType: UINT;
CtlID: UINT;
itemID: UINT;
itemWidth: UINT;
itemHeight: UINT;
itemData: DWORD;
end;
Apndice
WM_MEASUREITEM
816
Apndice A
Vase adems
WM_DRAWITEM
Tabla A-22: Valores de TWMMeasureItem.TMeasureItemStruct.CtlType
Valor
ODT_BUTTON
ODT_COMBOBOX
ODT_LISTBOX
ODT_LISTVIEW
ODT_MENU
ODT_STATIC
ODT_TAB
Descripcin
Indica un botn dibujado por el propietario.
Indica un cuadro de combinacin dibujado por el propietario.
Indica un cuadro de lista dibujado por el propietario.
Indica una vista de lista dibujada por el propietario.
Indica un elemento de men dibujado por el propietario.
Indica un control esttico dibujado por el propietario.
Indica un control de tabulacin dibujado por el propietario.
WM_MENUCHAR
Sintaxis
TWMMenuChar = record
Msg: Cardinal;
User: Char;
Unused: Byte;
MenuFlag: Word;
Menu: HMENU;
Result: Longint;
817
end;
Descripcin
Este mensaje es enviado cuando un men est activo y el usuario pulsa una tecla que
no es un acelerador o un atajo de teclado de alguno de los elementos del men.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MENUCHAR.
User: Especifica el valor ASCII del carcter que fue presionado.
Unused: Este campo no es usado por este mensaje.
MenuFlag: Valor que indica el tipo de men activo. Este campo tiene el valor
MF_POPUP si un men desplegable, submen, o men emergente est actualmente
activo. Si este campo tiene el valor MF_SYSMENU, el men de sistema est
actualmente activo.
Menu: Manejador del men activo.
Result: Si la aplicacin maneja este mensaje, deber devolver un valor de la Tabla A-23
en la palabra ms significativa de este campo.
Vase adems
WM_CHAR, WM_MENUSELECT
Tabla A-23: Valores de TWMMenuChar.Result
Valor
0
1
2
Descripcin
Descarta el carcter y emite un pitido por el altavoz.
Cierra el men activo.
Especifica que la palabra menos significativa del valor devuelto contiene el
ndice de base cero del elemento de men a seleccionar.
WM_MENUSELECT
Sintaxis
TWMMenuSelect = record
Msg: Cardinal;
IDItem: Word;
MenuFlag: Word;
Menu: HMENU;
Result: Longint;
end;
A
Apndice
Mensajes
818
Apndice A
Descripcin
Cuando el usuario hace una seleccin en un men, un mensaje WM_MENUSELECT es
enviado a la ventana propietaria del men.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MENUSELECT.
IDItem: El identificador del elemento de men seleccionado. Si el elemento de men
seleccionado abre un submen, este campo contendr el ndice de base cero de ese
elemento de men.
MenuFlag: Combinacin de valores que contienen informacin sobre el elemento de
men seleccionado. Este campo puede contener uno o ms valores de la Tabla A-24.
Menu: Manejador del men en el que se hizo clic.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetSubMenu, WM_ENTERMENULOOP, WM_EXITMENULOOP
Tabla A-24: Valores de TWMMenuSelect.MenuFlag
Valor
MF_BITMAP
MF_CHECKED
MF_DISABLED
MF_GRAYED
MF_HILITE
MF_MOUSESELECT
MF_OWNERDRAW
MF_POPUP
MF_SYSMENU
Descripcin
El elemento de men muestra un mapa de bits.
El elemento de men est marcado.
El elemento de men est deshabilitado.
Elemento de men est sombreado.
El elemento de men est resaltado.
El elemento de men est seleccionado con el ratn.
El elemento de men es dibujado por el propietario.
El elemento de men abre un men desplegable o un submen.
El elemento de men est contenido en el men de sistema.
WM_MOUSEACTIVATE
Sintaxis
TWMMouseActivate = record
Msg: Cardinal;
TopLevel: HWND;
HitTestCode: Word;
MouseMsg: Word;
Result: Longint;
end;
819
Descripcin
El mensaje WM_MOUSEACTIVATE es enviado cuando el usuario hace clic sobre una
ventana inactiva. Si la ventana en la que se hizo clic es una ventana hija, su ventana
madre recibir el mensaje slo si la ventana hija lo pasa a la funcin DefWindowProc.
La funcin DefWindowProc pasar el mensaje a la ventana madre antes de procesarlo,
permitiendo a la ventana madre determinar si la ventana hija debe ser activada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MOUSEACTIVATE.
TopLevel: Manejador de la ventana madre de nivel superior de la ventana que ser
activada.
HitTestCode: Valor que indica el rea de la ventana en la que se hizo clic. Este campo
puede contener un valor de la Tabla A-30. Consulte el mensaje WM_NCHITTEST para
ver una lista de las opciones disponibles.
MouseMsg: El mensaje del ratn que fue generado como resultado del clic. Este
mensaje ser procesado o descartado en dependencia del valor devuelto.
Result: Este mensaje devuelve un resultado que indica si la ventana debe ser activada y
si el mensaje del ratn debe ser procesado. Ser un valor de la Tabla A-25.
Vase adems
DefWindowProc, WM_ACTIVATE, WM_NCHITTEST
Tabla A-25: Valores de TWMMouseActivate.Result
Valor
MA_ACTIVATE
MA_ACTIVATEANDEAT
MA_NOACTIVATE
MA_NOACTIVATEANDEAT
Descripcin
Activar la ventana y procesar el mensaje.
Activar la ventana y descartar el mensaje.
No activar la ventana y procesar el mensaje.
No activar la ventana y descartar el mensaje.
WM_MOUSEMOVE
Sintaxis
TWMMouseMove = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
{coordenada horizontal del cursor}
YPos: Smallint);
{coordenada vertical del cursor}
A
Apndice
Mensajes
820
Apndice A
1: (
Pos: TSmallPoint;
Result: Longint);
end;
Descripcin
Este mensaje es enviado a una ventana cuando el usuario mueve el cursor del ratn
dentro del rea cliente de la ventana. Sin embargo, si otra ventana ha capturado el
ratn, entonces el mensaje es enviado a esa ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MOUSEMOVE.
Keys: Indica si teclas virtuales especficas estaban presionadas en el momento en que el
ratn se mueve. Este campo puede contener uno o ms valores de la Tabla A-26.
XPos: La coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: La coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, SetCapture, WM_NCMOUSEMOVE
Tabla A-26: Valores de TWMMouseMove.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_MOVE
Sintaxis
TWMMove = record
Msg: Cardinal;
Unused: Longint;
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
1: (
Pos: TSmallPoint;
Result: Longint);
821
end;
Descripcin
Este mensaje es enviado cuando una ventana es movida. Las coordenadas son relativas
a la pantalla si la ventana es una ventana de nivel superior, o relativas al rea cliente de
la ventana madre si es una ventana hija.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_MOVE.
Unused: Este campo no es utilizado por este mensaje.
XPos: La coordenada horizontal de la esquina superior izquierda del rea cliente de la
ventana movida.
YPos: La coordenada vertical de la esquina superior izquierda del rea cliente de la
ventana movida.
Pos: Un registro TSmallPoint que contiene las coordenadas de la esquina superior
izquierda del rea cliente de la ventana movida.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_GETMINMAXINFO
WM_NCACTIVATE
TWMNCActivate = record
Msg: Cardinal;
Active: BOOL;
Unused: Longint;
Result: Longint;
end;
Descripcin
Cuando el rea no-cliente de una ventana necesita ser cambiada para indicar un estado
activo o inactivo, el mensaje WM_NCACTIVATE es enviado.
A
Apndice
Mensajes
822
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCACTIVATE.
Active: Indica cuando una barra de ttulo o icono necesita ser cambiado para indicar un
estado activo o inactivo. Este campo vale TRUE cuando la barra de ttulo y el icono
van a ser dibujados como activos; o FALSE en caso contrario.
Unused: Este campo no es utilizado por este mensaje.
Result: Si al campo Active se le asigna TRUE, el valor devuelto es ignorado. Cuando al
campo Active se le asigna FALSE, la aplicacin debe devolver uno (1) si el mensaje es
procesado normalmente; o cero (0) para evitar que la barra de ttulo y el icono sean
desactivados.
Vase adems
WM_ACTIVATE
WM_NCCALCSIZE
Sintaxis
TWMNCCalcSize = record
Msg: Cardinal;
{identificador del mensaje}
CalcValidRects: BOOL;
{opcin de informacin vlida}
CalcSize_Params: PNCCalcSizeParams; {puntero a la informacin de tamao}
Result: Longint;
{devuelve un cdigo de accin}
end;
Descripcin
Este mensaje es enviado cuando el tamao y la posicin del rea cliente de una ventana
son calculadas.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCCALCSIZE.
CalcValidRects: Indica si la aplicacin debe especificar dnde existe informacin
vlida en el rea cliente de la ventana. Si este campo contiene TRUE, el campo
CalcSize_Params contendr un puntero al registro TNCCalcSizeParams que contiene
datos sobre el tamao, posicin y partes vlidas del rea cliente. Si a este campo se le
asigna FALSE, la aplicacin no necesita especificar las partes vlidas del rea cliente y
el campo CalcSize_Params apuntar a un registro TRect.
CalcSize_Params: Si al campo CalcValidRects se le asigna FALSE, este campo
apuntar a un registro TRect que contiene las nuevas coordenadas de la ventana. En
caso contrario, este campo apunta a un registro TNCCalcSizeParams que contiene
823
Apndice
Mensajes
824
Apndice A
Vase adems
DefWindowProc, MoveWindow, SetWindowPos
Tabla A-27: Valores de TWMNCCalcSize.CalcSize_Params.lppos.hwndInsertAfter
Valor
HWND_BOTTOM
HWND_NOTOPMOST
HWND_TOP
HWND_TOPMOST
Descripcin
Coloca la ventana al final del orden Z. Si esta ventana era una
ventana siempre visible, pierde su condicin de siempre
visible y es colocada debajo de todas las dems.
Coloca la ventana encima de todas la ventanas que no son
siempre visibles, pero detrs de las siempre visibles. Si la
ventana ya no era siempre visible, esta opcin no tiene
efecto.
Coloca la ventana en la cima del orden Z.
Coloca la ventana encima de todas las no siempre visibles;
esta ventana retendr su posicin siempre visible incluso si es
desactivada.
Descripcin
Dibuja el marco definido en la descripcin de la clase de
la ventana alrededor de la ventana.
Hace que un mensaje WM_NCCALCSIZE sea enviado a
la ventana, incluso si su tamao no est cambiando.
Oculta la ventana.
No activa la ventana. Si esta opcin no se especifica, la
ventana es activada y movida a la cima del grupo de
ventanas siempre visibles o no siempre visibles, en
dependencia del valor del campo hwndInsertAfter.
Valor
SWP_NOCOPYBITS
SWP_NOMOVE
SWP_NOOWNERZORDER
SWP_NOREDRAW
SWP_NOREPOSITION
SWP_NOSENDCHANGING
SWP_NOSIZE
SWP_NOZORDER
SWP_SHOWWINDOW
825
Descripcin
Descarta el rea cliente completa. Si esta opcin no se
especifica, el rea vlida del rea cliente es guardada y
copiada de nuevo en el rea cliente despus que todos
los movimientos y posicionamientos se completen.
Mantiene la posicin actual, ignorando los campos X e Y.
No cambia la posicin de la ventana propietaria en el
orden Z.
Cuando se especifica esta opcin, no se redibuja la
ventana y la aplicacin deber invalidar explcitamente o
redibujar cualquier parte de la ventana que necesite ser
redibujada, incluyendo el rea no-cliente y las barras de
desplazamiento.
Equivalente a SWP_NOOWNERZORDER.
La ventana no recibir mensajes
WM_WINDOWPOSCHANGING.
Mantiene el tamao actual, ignorando los campos CX y
CY.
Mantiene el orden Z actual, ignorando el campo
hwndInsertAfter.
Muestra la ventana.
Descripcin
Ajusta el rea cliente a la parte inferior de la ventana.
Ajusta el rea cliente al borde izquierdo de la ventana.
Ajusta el rea cliente al borde derecho de la ventana.
Ajusta el rea cliente a la parte superior de la ventana.
Redibuja la ventana completa si el rea cliente es
redimensionada horizontalmente.
Redibuja la ventana completa si el rea cliente es
redimensionada verticalmente.
Redibuja la ventana completa si el rea cliente es
redimensionada horizontal o verticalmente.
Indica que los rectngulos especificados en rgrc[1] y
rgrc[2] son rectngulos de origen y destino vlidos. Estos
determinan qu parte del rea cliente va a ser
conservada. El rectngulo de origen es copiado, y
cualquier parte que pertenezca al rectngulo destino
ser recortada.
A
Apndice
Mensajes
826
Apndice A
WM_NCCREATE
Sintaxis
TWMNCCreate = record
Msg: Cardinal;
Unused: Integer;
CreateStruct: PCreateStruct;
Result: Longint;
end;
Descripcin
El mensaje WM_NCCREATE es enviado a una ventana justo antes de que el mensaje
WM_CREATE sea enviado cuando se crea una ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCCREATE.
Unused: Este campo no es utilizado por este mensaje.
CreateStruct: Puntero a un registro TCreateStruct que contiene datos para inicializar la
ventana. El registro TCreateStruct se define como:
TCreateStruct = packed record
lpCreateParams: Pointer;
{puntero a datos definidos por la aplicacin}
hInstance: HINST;
{manejador de instancia del mdulo}
hMenu: HMENU;
{manejador del men o identificador de una
ventana hija}
hwndParent: HWND;
{manejador de la ventana madre}
cy: Integer;
{altura inicial de la ventana}
cx: Integer;
{ancho inicial de la ventana}
y: Integer;
{posicin vertical inicial}
x: Integer;
{posicin horizontal inicial}
style: Longint;
{opciones de estilo de ventana}
lpszName: PAnsiChar;
{puntero a cadena del nombre de la ventana}
lpszClass: PAnsiChar;
{puntero a cadena del nombre de la clase}
dwExStyle: DWORD;
{opciones de estilo extendido de ventanas}
end;
Consulte el mensaje WM_CREATE para ver una descripcin de este registro.
Result: Si la aplicacin procesa este mensaje, deber devolver uno (1) para indicar que
la ventana puede ser creada. En caso contrario, puede devolver cero (0), bloqueando la
creacin de la ventana y causando que las funciones CreateWindow o
CreateWindowEx, que fueron llamadas para crear la ventana devuelvan cero.
Mensajes
827
Vase adems
WM_NCDESTROY
Sintaxis
TWMNCDestroy = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
El mensaje WM_NCDESTROY es enviado a una ventana por la funcin
DestroyWindow. Es recibido a continuacin del mensaje WM_DESTROY e informa a la
ventana que su rea no-cliente va a ser destruida. Este mensaje hace que se libere
cualquier memoria reservada para la ventana.
Campos
Msg: El identificador del mensaje. A este campo se le asigna la constante
WM_NCDESTROY.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DestroyWindow, WM_CREATE, WM_DESTROY, WM_NCCREATE
WM_NCHITTEST
Sintaxis
TWMNCHitTest = record
Msg: Cardinal;
Unused: Longint;
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
1: (
Pos: TSmallPoint;
Result: Longint);
A
Apndice
828
Apndice A
end;
Descripcin
El mensaje WM_NCHITTEST es enviado a una ventana cuando el cursor se mueve
sobre la ventana o un botn del ratn es pulsado. Si el ratn ha sido capturado, el
mensaje es enviado a la ventana que hace la captura.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCHITTEST.
Unused: Este campo no es utilizado por este mensaje.
XPos: La coordenada x del cursor del ratn, relativa a la pantalla.
YPos: La coordenada y del cursor del ratn, relativa a la pantalla.
Pos: Un registro TSmallPoint que contiene las coordenadas del cursor del ratn,
relativas a la pantalla.
Result: Este mensaje devuelve un valor que indica la posicin del cursor del ratn
dentro de la ventana y puede ser un valor de la Tabla A-30.
Vase adems
DefWindowProc, WM_MOUSEACTIVATE, WM_MOUSEMOVE,
WM_NCMOUSEMOVE
Tabla A-30: Valores de TWMNCHitTest.Result
Valor
HTBORDER
HTBOTTOM
HTBOTTOMLEFT
HTBOTTOMRIGHT
HTCAPTION
HTCLIENT
HTERROR
HTGROWBOX
HTHSCROLL
HTLEFT
HTMENU
HTNOWHERE
HTREDUCE
HTRIGHT
Descripcin
El borde de una ventana sin un borde de redimensionamiento.
El borde horizontal inferior.
La esquina inferior izquierda del borde de la ventana.
La esquina inferior derecha del borde de la ventana.
La barra de ttulo.
El rea cliente.
El fondo de la pantalla o una lnea divisoria entre ventanas. Esta
opcin es equivalente a HTNOWHERE, con la diferencia de
que es tratada como un error y la funcin DefWindowProc
produce un pitido por el altavoz del sistema.
El cuadro de redimensionamiento. Equivalente a HTSIZE.
La barra de desplazamiento horizontal.
El borde izquierdo.
El men.
El fondo de pantalla o una lnea divisoria entre ventanas.
El botn de Minimizar.
El borde derecho.
HTSIZE
HTSYSMENU
HTTOP
HTTOPLEFT
HTTOPRIGHT
HTTRANSPARENT
HTVSCROLL
HTZOOM
829
El cuadro de redimensionamiento.
El men de sistema o el botn de Cerrar en una ventana hija.
El borde superior horizontal.
La esquina superior izquierda del borde de la ventana.
La esquina superior derecha del borde de la ventana.
En una ventana actualmente cubierta por otra.
La barra de desplazamiento vertical.
El botn de Maximizar.
WM_NCLBUTTONDBLCLK
Sintaxis
TWMNCLButtonDblClk = record
Msg: Cardinal;
{identificador del mensaje}
HitTest: Longint;
{indicador de posicin del clic}
XCursor: Smallint;
{coordenada horizontal del cursor}
YCursor: Smallint;
{coordenada vertical del cursor}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado en el rea no cliente de una ventana y se hace doble
clic con el botn izquierdo del ratn, un mensaje WM_NCLBUTTONDBLCLK es
enviado a la ventana situada bajo el cursor. Sin embargo, si otra ventana ha capturado
la entrada del ratn mediante una llamada a la funcin SetCapture, el mensaje no es
enviado. Un doble clic se genera cuando el usuario pulsa y libera el botn del ratn y lo
pulsa y libera de nuevo, en las mismas coordenadas y dentro del intervalo de doble clic
del sistema. Este proceso genera una serie de cuatro mensajes, en el orden siguiente:
WM_NCLBUTTONDOWN, WM_NCLBUTTONUP, WM_NCLBUTTONDBLCLK y
WM_NCLBUTTONUP. Una ventana no tiene que tener el estilo de clase CS_DBLCLKS
para recibir el mensaje WM_NCLBUTTONDBLCLK.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCLBUTTONDBLCLK.
HitTest: Valor que indica el rea de la ventana en la que el doble clic ocurri. Consulte
los posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
A
Apndice
Mensajes
830
Apndice A
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCLBUTTONDOWN,
WM_NCLBUTTONUP, WM_SYSCOMMAND
WM_NCLBUTTONDOWN
Sintaxis
TWMNCLButtonDown = record
Msg: Cardinal;
HitTest: Longint;
XCursor: Smallint;
YCursor: Smallint;
Result: Longint;
end;
Descripcin
Si el cursor del ratn est situado en el rea no cliente de una ventana y el botn
izquierdo del ratn es pulsado, un mensaje WM_NCLBUTTONDOWN es enviado a la
ventana situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del
ratn mediante una llamada a la funcin SetCapture, el mensaje no es enviado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCLBUTTONDOWN.
HitTest: Valor que indica el rea de la ventana en la que el clic ocurri. Consulte los
posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCLBUTTONDBLCLK,
WM_NCLBUTTONUP, WM_SYSCOMMAND
WM_NCLBUTTONUP
Sintaxis
TWMNCLButtonUp = record
Msg: Cardinal;
HitTest: Longint;
XCursor: Smallint;
YCursor: Smallint;
Result: Longint;
831
end;
Descripcin
Si el cursor del ratn est situado en el rea no cliente de una ventana y el botn
izquierdo del ratn es liberado, un mensaje WM_NCLBUTTONUP es enviado a la
ventana situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del
ratn mediante una llamada a la funcin SetCapture, el mensaje no es enviado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCLBUTTONUP.
HitTest: Valor que indica el rea de la ventana en la que el clic ocurri. Consulte los
posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCLBUTTONDBLCLK,
WM_NCLBUTTONDOWN, WM_SYSCOMMAND
WM_NCMBUTTONDBLCLK
Sintaxis
TWMNCMButtonDblClk = record
Msg: Cardinal;
{identificador del mensaje}
HitTest: Longint;
{indicador de posicin del clic}
XCursor: Smallint;
{coordenada horizontal del cursor}
YCursor: Smallint;
{coordenada vertical del cursor}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado en el rea no cliente de una ventana y se hace doble
clic con el botn central del ratn, un mensaje WM_NCMBUTTONDBLCLK es enviado
a la ventana situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada
A
Apndice
Mensajes
832
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCMBUTTONDBLCLK.
HitTest: Valor que indica el rea de la ventana en la que el doble clic ocurri. Consulte
los posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCMBUTTONDOWN,
WM_NCMBUTTONUP, WM_SYSCOMMAND
WM_NCMBUTTONDOWN
Sintaxis
TWMNCMButtonDown = record
Msg: Cardinal;
{identificador del mensaje}
HitTest: Longint;
{indicador de posicin del clic}
XCursor: Smallint;
{coordenada horizontal del cursor}
YCursor: Smallint;
{coordenada vertical del cursor}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado en el rea no cliente de una ventana y el botn central
del ratn es pulsado, un mensaje WM_NCMBUTTONDOWN es enviado a la ventana
situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn
mediante una llamada a la funcin SetCapture, el mensaje no es enviado.
833
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCMBUTTONDOWN.
HitTest: Valor que indica el rea de la ventana en la que el clic ocurri. Consulte los
posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCMBUTTONDBLCLK,
WM_NCMBUTTONUP, WM_SYSCOMMAND
WM_NCMBUTTONUP
Sintaxis
TWMNCMButtonUp = record
Msg: Cardinal;
HitTest: Longint;
XCursor: Smallint;
YCursor: Smallint;
Result: Longint;
end;
Descripcin
Si el cursor del ratn est situado en el rea no cliente de una ventana y el botn central
del ratn es liberado, un mensaje WM_NCMBUTTONUP es enviado a la ventana
situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn
mediante una llamada a la funcin SetCapture, el mensaje no es enviado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCMBUTTONUP.
HitTest: Valor que indica el rea de la ventana en la que el clic ocurri. Consulte los
posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
A
Apndice
Mensajes
834
Apndice A
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCMBUTTONDBLCLK,
WM_NCMBUTTONDOWN, WM_SYSCOMMAND
WM_NCMOUSEMOVE
Sintaxis
TWMNCMouseMove = record
Msg: Cardinal;
HitTest: Longint;
XCursor: Smallint;
YCursor: Smallint;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a una ventana cuando el usuario mueve el cursor del ratn
dentro del rea no cliente de la ventana. Sin embargo, si otra ventana ha capturado la
entrada del ratn, el mensaje no es enviado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCMOUSEMOVE.
HitTest: Valor que indica el rea de la ventana en la que se produjo el movimiento.
Consulte los posibles valores de este campo en la Tabla A-30 bajo el mensaje
WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor, relativa a la pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_NCHITTEST, WM_SYSCOMMAND
WM_NCPAINT
Sintaxis
TWMNCPaint = record
Msg: Cardinal;
Mensajes
835
{no se utiliza}
{devuelve cero (0) si fue manejado}
Descripcin
Este mensaje es enviado a una ventana cuando las reas no clientes, tales como la barra
de ttulo y el marco, necesitan ser dibujadas.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCPAINT.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, GetWindowDC, WM_PAINT
WM_NCRBUTTONDBLCLK
Sintaxis
TWMNCRButtonDblClk = record
Msg: Cardinal;
{identificador del mensaje}
HitTest: Longint;
{indicador de posicin del clic}
XCursor: Smallint;
{coordenada horizontal del cursor}
YCursor: Smallint;
{coordenada vertical del cursor}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado en el rea no cliente de una ventana y se hace doble
clic con el botn derecho del ratn, un mensaje WM_NCRBUTTONDBLCLK es
enviado a la ventana situada bajo el cursor. Sin embargo, si otra ventana ha capturado
la entrada del ratn mediante una llamada a la funcin SetCapture, el mensaje no es
enviado. Un doble clic se genera cuando el usuario pulsa y libera el botn del ratn y lo
pulsa y libera de nuevo, en las mismas coordenadas y dentro del intervalo de doble clic
del sistema. Este proceso genera una serie de cuatro mensajes, en el orden siguiente:
WM_NCRBUTTONDOWN, WM_NCRBUTTONUP, WM_NCRBUTTONDBLCLK y
WM_NCRBUTTONUP. Una ventana no tiene que tener el estilo de clase CS_DBLCLKS
para recibir el mensaje WM_NCRBUTTONDBLCLK.
Apndice
end;
836
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCRBUTTONDBLCLK.
HitTest: Valor que indica el rea de la ventana en la que el doble clic ocurri. Consulte
los posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCRBUTTONDOWN,
WM_NCRBUTTONUP, WM_SYSCOMMAND
WM_NCRBUTTONDOWN
Sintaxis
TWMNCRButtonDown = record
Msg: Cardinal;
HitTest: Longint;
XCursor: Smallint;
YCursor: Smallint;
Result: Longint;
end;
Descripcin
Si el cursor del ratn est situado dentro del rea no cliente de una ventana y se hace
clic con el botn derecho del ratn, un mensaje WM_NCRBUTTONDOWN es enviado a
la ventana situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada
del ratn mediante una llamada a la funcin SetCapture, el mensaje no es enviado
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCRBUTTONDOWN.
HitTest: Valor que indica el rea de la ventana en la que el clic ocurri. Consulte los
posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
837
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCRBUTTONDBLCLK,
WM_NCRBUTTONUP, WM_SYSCOMMAND
WM_NCRBUTTONUP
Sintaxis
TWMNCRButtonUp = record
Msg: Cardinal;
HitTest: Longint;
XCursor: Smallint;
YCursor: Smallint;
Result: Longint;
end;
Descripcin
Si el cursor del ratn est situado dentro del rea no cliente de una ventana y se libera
el botn derecho del ratn, un mensaje WM_NCRBUTTONUP es enviado a la ventana
situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn,
mediante una llamada a la funcin SetCapture, el mensaje no es enviado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NCRBUTTONUP.
HitTest: Valor que indica el rea de la ventana en la que el clic ocurri. Consulte los
posibles valores de este campo en la Tabla A-30 bajo el mensaje WM_NCHITTEST.
XCursor: Especifica la coordenada horizontal del cursor del ratn, relativa a la
pantalla.
YCursor: Especifica la coordenada vertical del cursor del ratn, relativa a la pantalla.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_NCHITTEST, WM_NCRBUTTONDBLCLK,
WM_NCRBUTTONDOWN, WM_SYSCOMMAND
A
Apndice
Mensajes
838
Apndice A
WM_NEXTDLGCTRL
Sintaxis
TWMNextDlgCtrl = record
Msg: Cardinal;
CtlFocus: Longint;
Handle: WordBool;
Unused: Word;
Result: Longint;
end;
Descripcin
Este mensaje indica a una ventana desplazar el foco del teclado al control anterior o
siguiente.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NEXTDLGCTRL.
CtlFocus: El manejador del control que recibir el foco del teclado, o un indicador de
la direccin en que el foco del teclado debe moverse, dependiendo del valor del campo
Handle. Si al campo Handle se le asigna TRUE, este campo contiene el manejador de
la ventana que debe recibir el foco del teclado. Si al campo Handle se le asigna
FALSE, este campo contiene un valor que indica si el control anterior o el siguiente en
la secuencia de tabulacin debe recibir el foco. En ese caso, si a este campo se le asigna
cero, el control siguiente recibir el foco; de lo contrario, lo recibir el control anterior.
Handle: Indica si el campo CtlFocus contiene un manejador de una ventana que va a
recibir el foco o un indicador de la direccin de movimiento del foco. Si a este campo
se le asigna TRUE, el campo CtlFocus contiene un manejador del control que recibir
el foco. Si a este campo se le asigna FALSE, el campo CtlFocus contiene un valor que
indica la direccin de movimiento del foco del teclado.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
PostMessage, SendMessage, SetFocus
WM_NOTIFY
Sintaxis
TWMNotify = record
Msg: Cardinal;
IDCtrl: Longint;
NMHdr: PNMHdr;
Result: Longint;
839
end;
Descripcin
El mensaje WM_NOTIFY alerta a una ventana madre de que un evento ha ocurrido en
el control que enva el mensaje.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NOTIFY.
IDCtrl: El identificador del control que enva el mensaje.
NMHdr: Puntero a un registro TNMHdr que contiene informacin sobre el control que
enva el mensaje y el evento que ocurri dentro de ese control. El registro TNMHdr se
define como:
TNMHdr = packed record
hwndFrom: HWND;
idFrom: UINT;
code: Integer;
end;
Vase adems
WM_KILLFOCUS, WM_LBUTTONDOWN, WM_LBUTTONDBLCLK,
WM_SETFOCUS, WM_RBUTTONDOWN, WM_RBUTTONDBLCLK
Tabla A-31: Valores de TWMNotify.NMHdr.code
Valor
NM_CLICK
NM_DBLCLK
NM_KILLFOCUS
NM_OUTOFMEMORY
NM_RCLICK
NM_RDBLCLK
Descripcin
Indica un clic del botn izquierdo del ratn.
Indica un doble clic del botn izquierdo del ratn.
Indica que el control ha perdido el foco de entrada.
Indica un error de falta de memoria.
Indica un clic del botn derecho del ratn.
Indica un doble clic del botn derecho del ratn.
A
Apndice
Mensajes
840
Apndice A
Valor
NM_RETURN
NM_SETFOCUS
Descripcin
Indica que el control tiene el foco y que la tecla Intro fue
presionada.
Indica que el control ha recibido el foco de entrada
WM_NOTIFYFORMAT
Sintaxis
TWMNotifyFormat = record
Msg: Cardinal;
From: HWND;
Command: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_NOTIFYFORMAT es enviado entre ventanas madre e hija para
determinar si se debe utilizar una estructura ANSI o Unicode en el mensaje
WM_NOTIFY.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_NOTIFYFORMAT.
From: Especifica el manejador del control que enva el mensaje.
Command: Valor que especifica una consulta de estado. Este campo puede contener un
valor de la Tabla A-32.
Result: Este mensaje devuelve un valor que indica el formato de la estructura de datos
usada en el mensaje WM_NOTIFY y puede ser un valor de la Tabla A-33.
Vase adems
DefWindowProc, WM_NOTIFY
Tabla A-32: Valores de TWMNotifyFormat.Command
Valor
NF_QUERY
NF_REQUERY
Descripcin
Usado por un control cuando enva este mensaje a su ventana
madre para determinar si usar un formato de estructura ANSI o
Unicode. Se utiliza durante la creacin de un control como
respuesta al mensaje NF_REQUERY.
Usado para solicitar un mensaje NF_QUERY. En este caso el
mensaje es enviado desde una ventana a un control del cual es
propietaria.
841
Descripcin
WM_NOTIFY debe usar estructuras de datos ANSI.
WM_NOTIFY debe usar estructuras de datos Unicode.
Se ha producido un error.
WM_PAINT
Sintaxis
TWMPaint = record
Msg: Cardinal;
DC: HDC;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_PAINT es enviado para solicitar que una aplicacin redibuje su
ventana. La solicitud puede ser hecha por el sistema o por otra aplicacin. Puede
tambin ser generada cuando se hace una llamada a las funciones UpdateWindow o
RedrawWindow. El mensaje WM_PAINT es enviado cuando una ventana tiene una
regin invalidada y no hay otros mensajes en la cola de mensajes de la aplicacin. La
funcin DefWindowProc validar las regiones no vlidas despus de que se efecte el
dibujo. La funcin DefWindowProc puede tambin enviar un mensaje WM_NCPAINT si
el marco de la ventana necesita ser redibujado, o un mensaje WM_ERASEBKGND si el
fondo necesita ser redibujado. Observe que el mensaje WM_PAINT es enviado slo una
vez para cada evento del sistema que requiera el redibujo.
Si la aplicacin llama a la funcin RedrawWindow usando la opcin
RDW_INTERNALPAINT, la aplicacin recibir un mensaje de dibujo interno. En este
caso, la funcin GetUpdateRect debe ser llamada para determinar si hay una regin no
vlida que deba ser actualizada. Si no hay regin no vlida, la aplicacin no debe
llamar a las funciones BeginPaint o EndPaint.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_PAINT.
DC: Especifica el contexto de dispositivo sobre el cual se debe dibujar. A este campo se
le puede asignar cero si el dibujo va a ser realizado sobre el contexto de dispositivo por
defecto de la ventana.
Unused: Este campo no es utilizado por este mensaje.
A
Apndice
Mensajes
842
Apndice A
Vase adems
BeginPaint, DefWindowProc, DispatchMessage, EndPaint, GetMessage,
GetUpdateRect, PeekMessage, RedrawWindow, UpdateWindow, WM_ERASEBKGND,
WM_NCPAINT
WM_PAINTCLIPBOARD
Sintaxis
TWMPaintClipboard = record
Msg: Cardinal;
Viewer: HWND;
PaintStruct: THandle
Result: Longint;
end;
Descripcin
Un visualizador del portapapeles enva el mensaje WM_PAINTCLIPBOARD a un
propietario del portapapeles cuando el portapapeles contiene datos del tipo
CF_OWNERDISPLAY y el rea cliente del visualizador necesita ser redibujada. El
propietario debe comparar el campo rcPaint del objeto PaintStruct con las dimensiones
especificadas en el ltimo mensaje WM_SIZECLIPBOARD recibido, para determinar
qu parte del rea cliente necesita ser redibujada. El propietario del portapapeles debe
llamar a la funcin GlobalLock para acceder al registro PaintStruct y desbloquearlo
mediante una llamada a la funcin GlobalUnlock antes de retornar.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_PAINTCLIPBOARD.
Viewer: Especifica el manejador de la ventana del visualizador del portapapeles.
PaintStruct: Manejador de un objeto DDESHARE que contiene un registro
TPaintStruct. Este registro define qu parte del rea cliente necesita ser redibujada. El
registro TPaintStruct se define como:
TPaintStruct = packed record
hdc: HDC;
{manejador de contexto de dispositivo}
fErase: BOOL;
{opcin de borrado de fondo}
rcPaint: Trect;
{rea que ser dibujada}
fRestore: BOOL;
{reservado}
fIncUpdate: BOOL;
{reservado}
rgbReserved: array[0..31] of Byte;{reservado}
end;
843
Vase adems
GlobalLock, GlobalUnlock, WM_SIZECLIPBOARD
WM_PALETTECHANGED
Sintaxis
TWMPaletteChanged = record
Msg: Cardinal;
PalChg: HWND;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_PALETTECHANGED es enviado a todas las ventanas de nivel superior
y solapadas cuando la ventana enfocada cambie la paleta del sistema realizando una
paleta lgica. Esto permite a las otras ventanas realizar una paleta lgica como paleta
de fondo. Este mensaje tiene que ser enviado a todas las ventanas de nivel superior y a
lass ventanas solapadas, incluyendo a aquella que cambi la paleta del sistema, y a
todas las ventanas hijas que usan una paleta. Para evitar caer en un bucle infinito, una
ventana que reciba este mensaje no debe activar su paleta si el manejador identificado
por el campo PalChg se corresponde con su propio manejador de ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_PALETTECHANGED.
PalChg: Especifica el manejador de la ventana que cambi la paleta del sistema.
A
Apndice
Mensajes
844
Apndice A
Vase adems
WM_PALETTEISCHANGING, WM_QUERYNEWPALETTE
WM_PALETTEISCHANGING
Sintaxis
TWMPaletteIsChanging = record
Msg: Cardinal;
{identificador del mensaje}
Realize: HWND;
{manejador de ventana}
Unused: Longint;
{no se utiliza}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
El mensaje WM_PALETTEISCHANGING es enviado cuando una aplicacin va a
realizar una paleta lgica. Cuando el mensaje WM_PALETTECHANGED es enviado, la
aplicacin que realiza la paleta lgica no espera a que otras aplicaciones procesen este
mensaje. Por lo tanto, la paleta del sistema puede ya contener nuevos colores en el
momento en que una aplicacin recibe este mensaje.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_PALETTEISCHANGING.
Realize: Especifica el manejador de la ventana que va a realizar su paleta lgica.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_PALETTECHANGED, WM_QUERYNEWPALETTE
WM_PARENTNOTIFY
Sintaxis
TWMParentNotify = record
Msg: Cardinal;
{identificador del mensaje}
case Event: Word of
{indicador de tipo de evento}
WM_CREATE, WM_DESTROY: (
845
ChildID: Word;
{identificador de la ventana hija}
ChildWnd: Hwnd);
{manejador de la ventana hija}
WM_LBUTTONDOWN,
WM_MBUTTONDOWN,
WM_RBUTTONDOWN: (
Value: Word;
{indicador de tipo de evento}
XPos: Smallint;
{posicin horizontal del cursor del ratn}
YPos: Smallint);
{posicin vertical del cursor del ratn}
0: (
Value1: Word;
{indicador de tipo de evento}
Value2: Longint;
{identificador de la ventana hija o posicin del cursor}
Result: Longint);
{devuelve cero (0) si fue manejado}
end;
Descripcin
Cuando una ventana hija es creada o destruida, o cuando se hace clic con un botn del
ratn dentro de una ventana hija, un mensaje WM_PARENTNOTIFY es enviado a la
madre de la ventana hija y a todas las ventanas anteriores. Si una ventana hija va a ser
creada, el mensaje WM_PARENTNOTIFY es enviado antes que las funciones
CreateWindow o CreateWindowEx retornen. Si una ventana hija va a ser destruida, el
mensaje es enviado antes de que cualquier accin para destruir la ventana haya tenido
lugar. Sin embargo, las ventanas hijas que tienen el estilo extendido
WS_EX_NOPARENTNOTIFY no enviarn este mensaje a sus ventanas madres.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_PARENTNOTIFY.
Event: Valor que indica el tipo de evento que ha ocurrido. Este campo puede contener
un valor de la Tabla A-34.
ChildID: Identificador de la ventana hija.
ChildWnd: Manejador de la ventana hija.
Valor: Valor que indica el tipo de evento que ha ocurrido. Este campo puede contener
un valor de la Tabla A-34.
XPos: Especifica la posicin horizontal del cursor del ratn. Este campo es vlido slo
cuando el campo Value identifica eventos WM_LBUTTONDOWN,
WM_MBUTTONDOWN o WM_RBUTTONDOWN.
YPos: Especifica la posicin vertical del cursor del ratn. Este campo es vlido slo
cuando el campo Value identifica eventos WM_LBUTTONDOWN,
WM_MBUTTONDOWN o WM_RBUTTONDOWN.
Value1: Valor que indica el tipo de evento que ha ocurrido. Este campo puede contener
un valor de la Tabla A-34.
A
Apndice
Mensajes
846
Apndice A
Vase adems
CreateWindow, CreateWindowEx, WM_CREATE, WM_DESTROY,
WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN
Tabla A-34: Valores de TWMParentNotify.Event
Valor
WM_CREATE
WM_DESTROY
WM_LBUTTONDOWN
WM_MBUTTONDOWN
WM_RBUTTONDOWN
Descripcin
Indica que una ventana hija va a ser creada.
Indica que una ventana hija va a ser destruida.
Indica que el cursor del ratn est sobre la ventana hija y
se ha pulsado el botn izquierdo.
Indica que el cursor del ratn est sobre la ventana hija y
se ha pulsado el botn central.
Indica que el cursor del ratn est sobre la ventana hija y
se ha pulsado el botn derecho.
WM_PASTE
Sintaxis
TWMPaste = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a un control de edicin o cuadro de combinacin para copiar
el texto ubicado en el portapapeles a dicho control, en la posicin actual del cursor de
edicin. El texto ser copiado dentro del control slo si el portapapeles contiene datos
en formato CF_TEXT. Este mensaje fallar si se enva a un cuadro de combinacin con
el estilo CBS_DROPDOWNLIST.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_PASTE.
Mensajes
847
Vase adems
WM_CLEAR, WM_COPY, WM_CUT
WM_QUERYDRAGICON
Sintaxis
TWMQueryDragIcon = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
A
Apndice
Descripcin
Cuando una ventana minimizada va a ser arrastrada y no hay icono definido para su
clase de ventana, el mensaje WM_QUERYDRAGICON es enviado a la ventana para
determinar qu imagen mostrar durante el arrastre. La aplicacin debe devolver el
manejador de un icono o cursor que sea compatible con el controlador de vdeo actual
del sistema. Si la aplicacin no devuelve un manejador de un icono o cursor
compatible, el sistema utilizar el cursor por defecto. Si el icono devuelto por la
aplicacin utiliza colores, ser convertido a blanco y negro.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_QUERYDRAGICON.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja este mensaje deber devolver el manejador del cursor o
icono que ser mostrado cuando se arrastre la ventana.
Vase adems
DefWindowProc, LoadCursor, LoadIcon
WM_QUERYENDSESSION
Sintaxis
TWMQueryEndSession = record
Msg: Cardinal;
{identificador del mensaje}
Source: Longint;
{manejador de la ventana que est finalizando}
848
Apndice A
Unused: Longint;
Result: Longint;
{no se utiliza}
{devuelve un cdigo de finalizacin}
end;
Descripcin
Este mensaje es enviado a todos los procesos activos cuando Windows se est cerrando
o una aplicacin ha llamado a la funcin ExitWindows. Esto permite a una aplicacin
cancelar una solicitud de terminacin de sesin. Si alguna aplicacin devuelve cero,
Windows no finalizar y dejar de enviar mensajes WM_QUERYENDSESSION.
Despus de procesar este mensaje, el sistema enviar el mensaje WM_ENDSESSION a
todos los procesos activos, con el resultado del mensaje WM_QUERYENDSESSION en
el campo EndSession. Por defecto, la funcin DefWindowProc devuelve uno (1) para
este mensaje. Bajo Windows NT, cuando una aplicacin devuelve 1 para este mensaje
recibe el mensaje WM_ENDSESSION y es finalizada, independientemente de cmo las
otras aplicaciones respondan al mensaje WM_QUERYENDSESSION. Bajo Windows
95/98, las aplicaciones recibirn el mensaje WM_ENDSESSION slo despus de que
todas las aplicaciones hayan devuelto 1 en el mensaje WM_QUERYENDSESSION.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_QUERYENDSESSION.
Source: Especifica el manejador de la ventana que solicita la finalizacin.
Unused: Este campo no es utilizado por este mensaje.
Result: Una aplicacin debe devolver uno (1) si quiere terminar; en caso contrario,
debe devolver cero (0).
Vase adems
DefWindowProc, ExitWindows, WM_ENDSESSION
WM_QUERYNEWPALETTE
Sintaxis
TWMQueryNewPalette = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Una ventana recibe el mensaje WM_QUERYNEWPALETTE cuando est recibiendo el
foco del teclado, lo que indica que debe realizar su paleta lgica.
849
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_QUERYNEWPALETTE.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la ventana realiza su paleta lgica debe devolver uno; en caso contrario, debe
devolver cero.
Vase adems
WM_PALETTECHANGED, WM_PALETTEISCHANGING
WM_QUERYOPEN
Sintaxis
TWMQueryOpen = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a una ventana iconizada cuando va a ser restaurada. La
aplicacin no debe ejecutar ninguna accin que produzca un cambio de foco mientras
se procesa este mensaje.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_QUERYOPEN.
Unused: Este campo no es utilizado por este mensaje.
Result: La aplicacin debe devolver uno (1) para permitir a la ventana que sea
restaurada, o cero (0) para evitar que la ventana sea restaurada.
Vase adems
DefWindowProc, WM_SHOWWINDOW, WM_SIZE
WM_QUIT
Sintaxis
TWMQuit = record
Msg: Cardinal;
ExitCode: Longint;
A
Apndice
Mensajes
850
Apndice A
Unused: Longint;
Result: Longint;
{no se utiliza}
{no se utiliza}
end;
Descripcin
Este mensaje es enviado como resultado de una llamada a la funcin
PostQuitMessage. Hace que la funcin GetMessage devuelva cero, saliendo as del
bucle de mensajes y terminando la aplicacin.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_QUIT.
ExitCode: Especifica el cdigo de finalizacin. Consulte la funcin PostQuitMessage
para ver una descripcin de este campo. (Esta funcin est descrita en Los Tomos de
Delphi: Ncleo del API Win32, editado en castellano tambin por Danysoft).
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
GetMessage, PostQuitMessage
WM_RBUTTONDBLCLK
Sintaxis
TWMRButtonDblClk = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
{coordenada horizontal del cursor}
YPos: Smallint);
{coordenada vertical del cursor}
1: (
Pos: TSmallPoint;
{registro que contiene las coordenadas del cursor}
Result: Longint);
{devuelve cero (0) si fue manejado}
end;
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y se hace doble
clic con el botn derecho, un mensaje WM_RBUTTONDBLCLK es enviado a la
ventana situada bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del
ratn mediante una llamada a la funcin SetCapture, el mensaje es enviado a esa
ventana. Un doble clic se genera cuando el usuario pulsa y libera el botn del ratn y lo
851
pulsa y libera de nuevo, en las mismas coordenadas y dentro del intervalo de doble clic
del sistema. Este proceso genera una serie de cuatro mensajes, en el orden siguiente:
WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK y
WM_RBUTTONUP. Slo una ventana con el estilo de clase CS_DBLCLKS recibir el
mensaje WM_RBUTTONDBLCLK.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_RBUTTONDBLCLK.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento del doble
clic. Este campo puede contener uno o ms valores de la Tabla A-35.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn, relativas
al rea cliente.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, GetDoubleClickTime, SetCapture, SetDoubleClickTime,
WM_RBUTTONDOWN, WM_RBUTTONUP
Tabla A-35: Valores de TWRButtonDblClk.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_RBUTTONDOWN
Sintaxis
TWMRButtonDown = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
{coordenada horizontal del cursor}
YPos: Smallint);
{coordenada vertical del cursor}
1: (
A
Apndice
Mensajes
852
Apndice A
Pos: TSmallPoint;
Result: Longint);
end;
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y el botn
derecho es pulsado, un mensaje WM_RBUTTONDOWN es enviado a la ventana situada
bajo el cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn mediante
una llamada a la funcin SetCapture, el mensaje es enviado a esa ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_RBUTTONDOWN.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento del clic. Este
campo puede contener uno o ms valores de la Tabla A-36.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn, relativas
al rea cliente.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, SetCapture, WM_RBUTTONDBLCLK, WM_RBUTTONUP
Tabla A-36: Valores de TWMRButtonDown.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que el botn derecho del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_RBUTTONUP
Sintaxis
TWMRButtonUp = record
Msg: Cardinal;
{identificador del mensaje}
Keys: Longint;
{opciones de teclas virtuales}
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
1: (
Pos: TSmallPoint;
Result: Longint);
853
end;
Descripcin
Si el cursor del ratn est situado dentro del rea cliente de una ventana y se libera el
botn derecho, un mensaje WM_RBUTTONUP es enviado a la ventana situada bajo el
cursor. Sin embargo, si otra ventana ha capturado la entrada del ratn mediante una
llamada a la funcin SetCapture, el mensaje es enviado a esa ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_RBUTTONUP.
Keys: Indica si ciertas teclas virtuales estaban presionadas en el momento en que el
botn es liberado. Este campo puede contener uno o ms valores de la Tabla A-37.
XPos: Especifica la coordenada horizontal del cursor del ratn, relativa al rea cliente.
YPos: Especifica la coordenada vertical del cursor del ratn, relativa al rea cliente.
Pos: Un registro TSmallPoint que contiene las coordenadas actuales del ratn, relativas
al rea cliente.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
GetCapture, SetCapture, WM_RBUTTONDBLCLK, WM_RBUTTONDOWN
Tabla A-37: Valores de TWMRButtonUp.Keys
Valor
MK_CONTROL
MK_LBUTTON
MK_MBUTTON
MK_SHIFT
Descripcin
Indica que la tecla Ctrl est presionada.
Indica que el botn izquierdo del ratn est pulsado.
Indica que el botn central del ratn est pulsado.
Indica que la tecla May. est presionada.
WM_RENDERALLFORMATS
Sintaxis
TWMRenderAllFormats = record
Msg: Cardinal;
Unused: array[0..3] of Word;
A
Apndice
Mensajes
854
Apndice A
Result: Longint;
end;
Descripcin
Este mensaje es enviado a la ventana propietaria del portapapeles si va a ser destruida y
ha demorado la entrega de uno o ms de los formatos del portapapeles. Con vistas a
que los datos permanezcan accesibles para otras aplicaciones, la propietaria del
portapapeles debe colocar sus datos en el portapapeles en todos los formatos en que sea
capaz. Cualquier formato del portapapeles no entregado es eliminado de la lista de
formatos disponibles en el portapapeles antes que el mensaje retorne.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_RENDERALLFORMATS.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
EmptyClipboard, OpenClipboard, SetClipboardData, WM_RENDERFORMAT
WM_RENDERFORMAT
Sintaxis
TWMRenderFormat = record
Msg: Cardinal;
{identificador del mensaje}
Format: Longint;
{formato de portapapeles}
Unused: Longint;
{no se utiliza}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Este mensaje es enviado a la ventana propietaria del portapapeles si est usando
entrega demorada para un formato especfico y una aplicacin ha solicitado datos del
portapapeles en este formato. La ventana propietaria del portapapeles no debe abrir el
portapapeles antes de llamar a la funcin SetClipboardData para colocar los datos
solicitados en el portapapeles.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_RENDERFORMAT.
Format: Indica qu formato del portapapeles va a ser entregado.
855
Vase adems
SetClipboardData, WM_RENDERALLFORMATS
WM_SETCURSOR
Sintaxis
TWMSetCursor = record
Msg: Cardinal;
CursorWnd: HWND;
HitTest: Word;
MouseMsg: Word;
Result: Longint;
end;
Descripcin
Si el cursor del ratn se mueve dentro de una ventana y el ratn no est capturado, el
mensaje WM_SETCURSOR es enviado a esa ventana. Antes de que este mensaje sea
enviado a una ventana, la funcin DefWindowProc lo enva a la ventana madre. Si la
ventana madre devuelve uno (1), este mensaje no es enviado a la ventana de destino. La
funcin DefWindowProc procesa este mensaje cambiando el cursor a una flecha, si el
cursor no est situado dentro del rea cliente, o al cursor registrado, si el cursor est
situado dentro del rea cliente. Si el campo HitTest incluye el atributo HTERROR y el
campo MouseMsg contiene un identificador de un mensaje de clic de botn, la funcin
MessageBeep es llamada. Si un men ha sido activado, el campo MouseMsg ser cero.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SETCURSOR.
CursorWnd: Manejador de la ventana que contiene el cursor del ratn.
HitTest: Valor que indica el rea de la ventana en la que el cursor del ratn est situado.
Consulte los posibles valores para este campo en la Tabla A-30 bajo el mensaje
WM_NCHITTEST.
MouseMsg: El identificador del mensaje del ratn que gener el mensaje
WM_SETCURSOR.
Result: Este mensaje devuelve el resultado del tratamiento del mensaje en la ventana
madre.
A
Apndice
Mensajes
856
Apndice A
Vase adems
DefWindowProc, MessageBeep, WM_MOUSEMOVE, WM_NCHITTEST
WM_SETFOCUS
Sintaxis
TWMSetFocus = record
Msg: Cardinal;
FocusedWnd: HWND;
Unused: Longint;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a una ventana despus de que sta recibe el foco del teclado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SETFOCUS.
FocusedWnd: Especifica el manejador de la ventana que perdi el foco del teclado.
Este campo puede valer cero si ninguna ventana tena el foco del teclado.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
SetFocus, WM_KILLFOCUS
WM_SETFONT
Sintaxis
TWMSetFont = record
Msg: Cardinal;
Font: HFONT;
Redraw: WordBool;
Unused: Word;
Result: Longint;
end;
857
Descripcin
El mensaje WM_SETFONT es enviado a un control para especificar qu fuente utilizar
cuando se dibuja texto. Este mensaje no alterar el tamao del control. Un control debe
hacer cualquier cambio que sea necesario en su tamao antes de cambiar la fuente.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SETFONT.
Font: Manejador de la fuente que ser usada en el control. Si a este campo se le asigna
cero, el control utilizar la fuente por defecto del sistema.
Redraw: Valor que indica si el control debe ser redibujado despus de seleccionar la
fuente. Si a este campo se le asigna TRUE, el control ser redibujado.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
CreateFont, CreateFontIndirect, WM_GETFONT
WM_SETHOTKEY
Sintaxis
TWMSetHotKey = record
Msg: Cardinal;
Key: Longint;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_SETHOTKEY es enviado a una ventana para asociar la ventana con
una tecla caliente. Cuando esta combinacin sea pulsada, el sistema activar la
ventana y le enviar un mensaje WM_SYSCOMMAND con el valor SC_HOTKEY
asignado al campo CmdType. Una ventana puede tener solamente una tecla caliente
asociada en cada momento. Si este mensaje es enviado a una ventana que ya tiene una
tecla caliente asociada, la nueva tecla caliente reemplaza a la anterior. Sin embargo,
la misma combinacin de tecla caliente puede ser asociada con ms de una ventana.
En ese caso, cualquiera de las ventanas podr ser activada cuando la tecla caliente sea
pulsada.
El mensaje WM_SETHOTKEY no tiene relacin alguna con la funcin RegisterHotKey.
A
Apndice
Mensajes
858
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SETHOTKEY.
Key: Especifica el cdigo virtual de la tecla y las opciones de modificacin de la tecla
caliente que ser asociada con la ventana a la que se le envi el mensaje. Asignando
cero a este campo la ventana dejar de tener una tecla caliente asociada. Al byte
menos significativo de este campo se le debe asignar el cdigo virtual de la tecla, y al
ms significativo las opciones de modificacin, que se listan en la Tabla A-38. Observe
que los cdigos virtuales de teclas VK_ESCAPE, VK_SPACE y VK_TAB no pueden ser
utilizados como tecla caliente.
Unused: Este campo no es utilizado por este mensaje.
Result: Este mensaje devuelve un cdigo de xito de la Tabla A-39.
Vase adems
WM_GETHOTKEY, WM_SYSCOMMAND
Tabla A-38: Valores de TWMSetHotKey.Key
Valor
HOTKEYF_ALT
HOTKEYF_CONTROL
HOTKEYF_EXT
HOTKEYF_SHIFT
Descripcin
La tecla Alt.
La tecla Ctrl.
Una tecla extendida.
La tecla May.
Descripcin
Error debido a una tecla caliente no vlida.
Error debido a una ventana no vlida.
La tecla caliente ha sido asignada.
La tecla caliente ha sido asignada, pero ms de una ventana tiene
asignada esa misma combinacin.
WM_SETICON
Sintaxis
TWMSetIcon = record
Msg: Cardinal;
BigIcon: Longbool;
Icon: HICON;
Result: Longint;
end;
859
Descripcin
El mensaje WM_SETICON asocia un nuevo icono grande o pequeo con la ventana de
destino.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SETICON.
BigIcon: Valor que indica si el icono es grande o pequeo. Este campo contiene TRUE
si el icono a ser asociado con la ventana es un icono grande; FALSE si es un icono
pequeo.
Icon: Manejador del icono que ser asociado con la ventana.
Result: Este mensaje devuelve el manejador del icono que estaba anteriormente
asociado con la ventana, dependiendo del valor del campo BigIcon. Devuelve cero si la
ventana no tena asociado un icono del tamao indicado.
Vase adems
DefWindowProc, WM_GETICON
WM_SETREDRAW
Sintaxis
TWMSetRedraw = record
Msg: Cardinal;
Redraw: Longint;
Unused: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_SETREDRAW es enviado a una ventana para asignar el estado de su
opcin de redibujado. Si el valor de esta opcin es cero, la ventana no ser redibujada
despus de cualquier funcin de dibujo, comportndose igual que la funcin
LockWindowUpdate. La opcin de redibujado debe ser asignada antes de que se
produzca cualquier dibujo sobre la ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SETREDRAW.
Redraw: Especifica el valor a asignar a la opcin de redibujado. Si a este campo se le
asigna uno (1), la opcin de redibujado ser asignada y se podr comenzar a dibujar. Si
A
Apndice
Mensajes
860
Apndice A
a este campo se le asigna cero (0), la ventana no se actualizar hasta que a la opcin de
redibujado se le asigne 1.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
InvalidateRect, LockWindowUpdate
WM_SETTEXT
Sintaxis
TWMSetText = record
Msg: Cardinal;
Unused: Longint;
Text: PChar;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a una ventana para cambiar su texto.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SETTEXT.
Unused: Este campo no es utilizado por este mensaje.
Text: Puntero a una cadena de caracteres terminada en nulo que contiene el texto que
ser asociado a la ventana.
Result: Este mensaje devuelve un valor de la Tabla A-40.
Vase adems
DefWindowProc, WM_GETTEXT
Tabla A-40: Valores de TWMSetText.Result
Valor
1
0 (slo controles de edicin)
LB_ERRSPACE (slo cuadros
de lista)
CB_ERRSPACE (slo cuadros
de combinacin)
Descripcin
El texto fue asignado con xito.
El texto no fue asignado debido a espacio insuficiente.
El texto no fue asignado debido a espacio insuficiente.
El texto no fue asignado debido a espacio insuficiente.
Mensajes
861
Descripcin
El texto no fue asignado porque el cuadro de combinacin
no tiene un control de edicin.
WM_SHOWWINDOW
Sintaxis
TWMShowWindow = record
Msg: Cardinal;
{identificador del mensaje}
Show: BOOL;
{opcin de mostrar/ocultar}
Status: Longint;
{cdigo de estado}
Result: Longint;
{devuelve cero (0) si es manejado}
end;
Descripcin
Una ventana recibir un mensaje WM_SHOWWINDOW cuando va a ser mostrada u
ocultada. Si a la ventana se le asign el estilo WS_VISIBLE cuando fue creada, el
mensaje WM_SHOWWINDOW es enviado despus que la ventana es creada, pero antes
de que sea mostrada. Las funciones ShowWindow y ShowOwnedPopups tambin
generarn este mensaje. Este mensaje no es enviado cuando una ventana solapada de
nivel superior es creada con los estilos WS_MAXIMIZE o WS_MINIMIZE, o si la
opcin SW_SHOWNORMAL es especificada en una llamada a la funcin ShowWindow.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SHOWWINDOW.
Show: Valor que indica si la ventana va a ser mostrada u ocultada. A este campo se le
asigna FALSE si la ventana va a ser ocultada o TRUE si va a ser mostrada.
Status: Valor que indica el estado de la ventana que va a ser mostrada. A este campo se
le asigna cero si el mensaje fue enviado como resultado de una llamada a la funcin
ShowWindow. En caso contrario, a este campo se le asigna un valor de la Tabla A-41.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, ShowOwnedPopups, ShowWindow
Tabla A-41: Valores de TWMShowWindow.Status
Valor
SW_OTHERUNZOOM
A
Apndice
Valor
CB_ERR (slo cuadros de
combinacin)
Descripcin
La ventana va a ser descubierta porque una ventana
previamente maximizada va a ser restaurada o minimizada.
862
Apndice A
Valor
SW_OTHERZOOM
SW_PARENTCLOSING
SW_PARENTOPENING
Descripcin
La ventana va a ser cubierta porque otra ventana va a ser
maximizada.
La propietaria de la ventana ha sido minimizada.
La propietaria de la ventana ha sido restaurada.
WM_SIZE
Sintaxis
TWMSize = record
Msg: Cardinal;
SizeType: Longint;
Width: Word;
Height: Word;
Result: Longint;
end;
Descripcin
El mensaje WM_SIZE es enviado a una ventana despus de que su tamao ha
cambiado. Si el mensaje WM_SIZE hace que se llame a las funciones SetScrollPos o
MoveWindow, al parmetro redraw de estas funciones se le debe asignar TRUE para
forzar que la ventana sea redibujada.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SIZE.
SizeType: Valor que indica el tipo de operacin de redimensionamiento que ha ocurrido.
Este campo puede contener un valor de la Tabla A-42.
Width: Especifica el nuevo ancho del rea cliente, en pxeles.
Height: Especifica la nueva altura del rea cliente, en pxeles.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
MoveWindow
Tabla A-42: Valores de TWMSize.SizeType
Valor
SIZE_MAXHIDE
SIZE_MAXIMIZED
SIZE_MAXSHOW
Descripcin
Indica que otra ventana ha sido maximizada.
Indica que la ventana ha sido maximizada.
Indica que otra ventana ha sido restaurada.
SIZE_MINIMIZED
SIZE_RESTORED
863
WM_SIZECLIPBOARD
Sintaxis
TWMSizeClipboard = record
Msg: Cardinal;
{identificador del mensaje}
Viewer: HWND;
{manejador de visualizador del portapapeles}
RC: THandle;
{manejador de un objeto rectngular}
Result: Longint;
{no se utiliza}
end;
Descripcin
El mensaje WM_SIZECLIPBOARD es enviado por una ventana visualizadora del
portapapeles a la propietaria del portapapeles cuando el tamao de su rea cliente ha
cambiado. Este mensaje slo ser enviado si el portapapeles contiene datos en el
formato CF_OWNERDISPLAY. Cuando la ventana visualizadora del portapapeles va a
ser destruida o redimensionada, enviar este mensaje a la propietaria del portapapeles,
especificando un rectngulo vaco. La propietaria del portapapeles debe usar las
funciones GlobalLock y GlobalUnlock para recuperar el rectngulo identificado por el
manejador DDESHARE situado en el campo RC.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SIZECLIPBOARD.
Viewer: Manejador de la ventana visualizadora del portapapeles.
RC: Manejador de un objeto DDESHARE que contiene un registro TRect. Este registro
TRect contiene las nuevas coordenadas del rea cliente de la ventana visualizadora del
portapapeles.
Result: Este campo no es utilizado por este mensaje.
Vase adems
GlobalLock, GlobalUnlock, WM_RENDERALLFORMATS, WM_RENDERFORMAT
WM_SPOOLERSTATUS
Sintaxis
TWMSpoolerStatus = record
A
Apndice
Mensajes
864
Apndice A
Msg: Cardinal;
JobStatus: Longint;
JobsLeft: Word;
Unused: Word;
Result: Longint;
end;
Descripcin
El mensaje WM_SPOOLERSTATUS es enviado por el Administrador de Impresin
cuando un trabajo de impresin es aadido o quitado de la cola de impresin.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SPOOLERSTATUS.
JobStatus: Este campo contiene la constante PR_JOBSTATUS.
JobsLeft: Especifica la cantidad de trabajos de impresin que quedan en el spooler de
la impresora, gestionado por el Administrador de Impresin.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
WM_NOTIFY, WM_NOTIFYFORMAT
WM_STYLECHANGED
Sintaxis
TWMStyleChanged = record
Msg: Cardinal;
StyleType: Longint;
StyleStruct: PStyleStruct;
Result: Longint;
end;
Descripcin
El mensaje WM_STYLECHANGED es enviado a una ventana cuando sus estilos han
cambiado como resultado de una llamada a la funcin SetWindowLong.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_STYLECHANGED.
865
StyleType: Combinacin de valores que especifica si han cambiado los estilos comunes
o extendidos de la ventana. Este campo puede contener uno o ms valores de la Tabla
A-43.
StyleStruct: Puntero a un registro TStyleStruct. Este registro contiene los atributos de
estilo de la ventana antes y despus de la llamada a la funcin SetWindowLong. El
registro TStyleStruct se define como:
TStyleStruct = packed record
styleOld: DWORD;
styleNew: DWORD;
end;
Vase adems
CreateWindow, CreateWindowEx, SetWindowLong, WM_STYLECHANGING
Tabla A-43: Valores de TWMStyleChanged.StyleType
Valor
GWL_EXSTYLE
GWL_STYLE
Descripcin
Indica que los atributos de estilo extendidos de la ventana han
cambiado.
Indica que los atributos de estilo comunes de la ventana han
cambiado.
WM_STYLECHANGING
Sintaxis
TWMStyleChanging = record
Msg: Cardinal;
StyleType: Longint;
StyleStruct: PStyleStruct;
Result: Longint;
end;
A
Apndice
Mensajes
866
Apndice A
Descripcin
El mensaje WM_STYLECHANGING es enviado a una ventana cuando sus estilos van a
cambiar como resultado de una llamada a la funcin SetWindowLong.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_STYLECHANGING.
StyleType: Combinacin de valores que especifica si han cambiado los estilos comunes
o extendidos de la ventana. Este campo puede contener uno o ms valores de la Tabla
A-44.
StyleStruct: Puntero a un registro TStyleStruct. Este registro contiene los atributos de
estilo de la ventana antes y despus de la llamada a la funcin SetWindowLong. El
registro TStyleStruct se define como:
TStyleStruct = packed record
styleOld: DWORD;
styleNew: DWORD;
end;
Vase adems
CreateWindow, CreateWindowEx, SetWindowLong, WM_STYLECHANGED
Tabla A-44: Valores de TWMStyleChanging.StyleType
Valor
GWL_EXSTYLE
GWL_STYLE
Descripcin
Indica que los atributos de estilo extendidos de la ventana han
cambiado.
Indica los los atributos de estilo comunes de la ventana han
cambiado.
WM_SYSCHAR
Sintaxis
TWMSysChar = record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
867
Descripcin
Cuando una tecla es pulsada mientras se mantiene presionada la tecla Alt (indicando
una tecla de sistema), un mensaje WM_SYSCHAR es enviado a la ventana que tiene el
foco del teclado. Este mensaje WM_SYSCHAR es el resultado de un mensaje
WM_SYSKEYDOWN traducido por la funcin TranslateMessage.
Las teclas extendidas en un teclado de 101 102 teclas son:
- En la seccin principal del teclado, las teclas Alt y Ctrl de la derecha.
- A la izquierda del teclado numrico, las teclas Ins, Supr, Inicio, Fin, Av.Pg.,
Re.Pg., y las cuatro teclas de flechas.
- En el teclado numrico, las teclas Bloq.Nm., dividir (/) y la tecla Intro.
- Las teclas PrintScrn y Break.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SYSCHAR.
CharCode: El cdigo del carcter de la tecla de men de la ventana.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones , cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado anterior de la tecla e indicador de
estado de transicin. La Tabla A-45 muestra qu informacin se almacena en cada
posicin de bit, dentro de los 32 bits del campo KeyData. La palabra ms significativa
(bits del 16 al 31), pertenece al mensaje inmediatamente precedente
WM_SYSKEYDOWN, que provoc el mensaje WM_SYSCHAR mediante la funcin
TranslateMessage.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
TranslateMessage, WM_SYSKEYDOWN
Tabla A-45: Valores de TWMSysChar.KeyData
Valor
0-15
16-23
24
25-28
29
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
El cdigo de contexto. Si la tecla Alt estaba presionada mientras la tecla
fue pulsada, este bit contiene 1; en caso contrario, contiene 0.
A
Apndice
Mensajes
868
Apndice A
30
31
WM_SYSCOLORCHANGE
Sintaxis
TWMSysColorChange = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Cuando los atributos de un color del sistema son cambiados, el mensaje
WM_SYSCOLORCHANGE es enviado a todas las ventanas de nivel superior. Un
mensaje WM_PAINT ser enviado a cualquier ventana afectada por el cambio de color.
Este mensaje tiene que ser reenviado a cualquier control comn usado por la ventana.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SYSCOLORCHANGE.
Unused: Este campo no es utilizado por este mensaje.
Result: Este campo no es utilizado por este mensaje.
Vase adems
SetSysColors, WM_PAINT
WM_SYSCOMMAND
Sintaxis
TWMSysCommand = record
Msg: Cardinal;
{identificador del mensaje}
case CmdType: Longint of {indicador de tipo de comando}
SC_HOTKEY: (
ActivateWnd: HWND);
{manejador de ventana}
SC_KEYMENU: (
Key: Word);
{cdigo de carcter}
SC_CLOSE, SC_HSCROLL, SC_MAXIMIZE, SC_MINIMIZE,
SC_MOUSEMENU,
869
Descripcin
Este mensaje es enviado a una ventana cuando un elemento del men de sistema es
seleccionado o se hace clic en el botn de minimizar o maximizar. Este mensaje puede
ser tambin enviado a la funcin DefWindowProc para ejecutar cualquier accin
identificada por los valores en la Tabla A-46. Observe que si el men del sistema es
modificado mediante las funciones AppendMenu, InsertMenu, ModifyMenu,
InsertMenuItem, o SetMenuItemInfo, un valor de comando de sistema definido por el
usuario tiene que ser especificado para el nuevo elemento. En este caso, la aplicacin
debe manejar el mensaje WM_SYSCOMMAND para procesar los comandos procedentes
de los nuevos elementos de men.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SYSCOMMAND.
CmdType: Valor que indica el tipo de comando de sistema. Este campo puede contener
un valor de comando de sistema definido por el usuario (usado cuando se aaden
elementos de men al men de sistema de la ventana) o puede contener un valor de la
Tabla A-46. Observe que los cuatro bits menos significativos de este valor son usados
internamente. Si una aplicacin est comprobando un valor de comando de sistema
definido por el usuario, debe combinar el valor de este campo con $FFF0 mediante el
operador booleano and.
ActivateWnd: Si una tecla caliente asociada con una ventana fue pulsada, este campo
contendr el manejador de la ventana que ser activada por esa tecla caliente.
Key: Contiene el cdigo del carcter de la tecla de sistema que fue pulsada. Este no es
otro que el valor ASCII de cualquier tecla pulsada mientras la tecla Alt estaba
presionada. Por defecto, la combinacin Alt + espacio activar el men de sistema.
XPos: Especifica la posicin horizontal del cursor del ratn, en coordenadas de
pantalla, cuando un elemento del men de sistema es seleccionado con el ratn.
YPos: Especifica la posicin vertical del cursor del ratn, en coordenadas de pantalla,
cuando un elemento del men de sistema es seleccionado con el ratn.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
AppendMenu, DefWindowProc, GetSystemMenu, InsertMenu, ModifyMenu,
WM_COMMAND, WM_SETHOTKEY
A
Apndice
Mensajes
870
Apndice A
SC_DEFAULT
SC_HOTKEY
SC_HSCROLL
SC_KEYMENU
SC_MAXIMIZE
SC_MINIMIZE
SC_MONITORPOWER
SC_MOUSEMENU
SC_MOVE
SC_NEXTWINDOW
SC_PREVWINDOW
SC_RESTORE
SC_SCREENSAVE
SC_SIZE
SC_TASKLIST
SC_VSCROLL
Descripcin
Cierra la ventana.
El cursor del ratn es cambiado a un puntero con forma de
signo de interrogacin. Cualquier control sobre el que se
haga clic con este cursor del ratn recibir el mensaje
WM_HELP.
El elemento por defecto del men es seleccionado.
Indica que la tecla caliente de una ventana fue pulsada.
Desplaza la ventana horizontalmente.
Indica que el men de sistema fue activado por teclado.
Maximiza la ventana.
Minimiza la ventana.
Slo Windows 95/98: Asigna el estado del dispositivo de
video para aquellos que soporten ahorro de energa.
Indica que el men de sistema fue activado por un clic del
ratn.
Mueve la ventana.
Activa la ventana siguiente.
Activa la ventana anterior.
Restaura la ventana.
Ejecuta el protector de pantalla.
Redimensiona la ventana.
Activa y muestra la lista de tareas del sistema.
Desplaza la ventana verticalmente.
WM_SYSDEADCHAR
Sintaxis
TWMSysDeadChar = record
Msg: Cardinal;
{identificador del mensaje}
CharCode: Word;
{cdigo de carcter}
Unused: Word;
{no se utiliza}
KeyData: Longint;
{contiene informacin diversa}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Cuando un mensaje WM_SYSKEYDOWN es traducido por una llamada a la funcin
TranslateMessage, un mensaje WM_SYSDEADCHAR es enviado a la ventana con el
foco del teclado. Este mensaje es generado como resultado de pulsar una tecla muerta
871
mientras se mantiene presionada la tecla Alt. Una tecla muerta es aquella que genera
un carcter adicional que es usado en combinacin con otra tecla, creando as un
carcter combinado o compuesto. El ejemplo tpico es el de un carcter con un acento o
marca diacrtica. La tecla muerta que identifica el acento o marca diacrtica es
introducida primero, seguida por la tecla que identifica el carcter que tendr aplicada
la marca.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SYSDEADCHAR.
CharCode: El cdigo del carcter de la tecla que fue presionada.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones , cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado previo de la tecla e indicador de
estado de transicin. La Tabla A-47 muestra qu informacin se almacena en cada
posicin de bit, dentro de los 32 bits del campo KeyData. La palabra ms significativa
(bits del 16 al 31), pertenece al mensaje inmediatamente precedente
WM_SYSKEYDOWN, que provoc el mensaje WM_SYSDEADCHAR mediante la
funcin TranslateMessage.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
TranslateMessage, WM_DEADCHAR, WM_KEYDOWN, WM_SYSKEYDOWN,
WM_SYSKEYUP
Tabla A-47: Valores de TWMSysDeadChar.KeyData
Valor
0-15
16-23
24
25-28
29
30
31
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
El cdigo de contexto. Si la tecla Alt estaba presionada mientras la tecla
fue pulsada, este bit contiene 1; en caso contrario, contiene 0.
El estado previo de la tecla. Si la tecla estaba presionada antes de que se
enviara el mensaje, este bit contiene 1; en caso contario, contiene 0.
El estado de transicin. Si la tecla est siendo liberada, este bit contiene 1;
en caso contrario, contiene 0.
A
Apndice
Mensajes
872
Apndice A
WM_SYSKEYDOWN
Sintaxis
TWMSysKeyDown = record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_SYSKEYDOWN es enviado cuando el usuario pulsa una tecla con la
tecla Alt presionada. El mensaje ser enviado a la ventana que tiene el foco del teclado
o a la ventana actualmente activa, si ninguna ventana tiene el foco del teclado. El
indicador de contexto en el campo KeyData diferencia entre estos dos eventos.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SYSKEYDOWN.
CharCode: Especifica el cdigo virtual de la tecla que fue pulsada.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones , cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado previo de la tecla e indicador de
estado de transicin. La Tabla A-48 muestra qu informacin se almacena en cada
posicin de bit, dentro de los 32 bits del campo KeyData.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DefWindowProc, WM_SYSCHAR, WM_SYSCOMMAND, WM_SYSKEYUP
Tabla A-48: Valores de TWMSysKeyDown.KeyData
Valor
0-15
16-23
24
25-28
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
29
30
31
873
WM_SYSKEYUP
Sintaxis
TWMSysKeyUp = record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
Descripcin
El mensaje WM_SYSKEYUP es enviado cuando el usuario libera una tecla que fue
pulsada mientras la tecla Alt estaba presionada. El mensaje ser enviado a la ventana
que tenga el foco del teclado o a la ventana activa, si ninguna ventana tiene el foco del
teclado. El cdigo de contexto en el campo KeyData distingue entre estos dos eventos.
En teclados ampliados de 102 teclas no-U.S., la tecla Alt de la derecha se interpreta
como una combinacin Ctrl+Alt. Cuando esta tecla es pulsada, produce los siguientes
mensajes, en orden: WM_KEYDOWN (con el cdigo de tecla virtual VK_CONTROL),
WM_KEYDOWN (con el cdigo de tecla virtual VK_MENU), WM_KEYUP (con el
cdigo de tecla virtual VK_CONTROL) y WM_SYSKEYUP (con el cdigo de tecla
virtual VK_MENU).
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_SYSKEYUP.
CharCode: Especifica el cdigo de la tecla virtual de la tecla que fue liberada.
Unused: Este campo no es utilizado por este mensaje.
KeyData: Especifica la cantidad de repeticiones , cdigo de barrido, indicador de tecla
extendida, cdigo de contexto, indicador de estado previo de la tecla e indicador de
estado de transicin. La Tabla A-49 muestra qu informacin se almacena en cada
posicin de bit, dentro de los 32 bits del campo KeyData.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
A
Apndice
Mensajes
874
Apndice A
Vase adems
DefWindowProc, WM_SYSCHAR, WM_SYSCOMMAND, WM_SYSKEYDOWN
Tabla A-49: Valores de TWMSysKeyUP.KeyData
Valor
0-15
16-23
24
25-28
29
30
31
Descripcin
La cantidad de repeticiones resultante de que el usuario haya mantenido
presionada la tecla.
El cdigo de barrido, cuyo valor depende del fabricante OEM del teclado.
El indicador de tecla extendida. Si la tecla es extendida (Alt y Ctrl
derechos), este bit contiene 1; en caso contrario, contiene 0.
No usados.
El cdigo de contexto. Si la tecla Alt estaba presionada mientras la tecla
fue pulsada, este bit contiene 1. Este bit no se asignar si el mensaje
WM_SYSKEYDOWN fue enviado a la ventana activa porque ninguna
ventana tena el foco del teclado.
El estado previo de la tecla. Este bit siempre contendr 1.
El estado de transicin. Este bit siempre contendr 0.
WM_TIMECHANGE
Sintaxis
TWMTimeChange = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Descripcin
Cualquier aplicacin que modifica la hora del sistema debe enviar este mensaje a todas
las ventanas de nivel superior, usando la funcin SendMessage y asignando
HWND_TOPMOST al parmetro hWnd.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_TIMECHANGE.
Unused: Este campo no es utilizado por este mensaje.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
SendMessage
Mensajes
875
Sintaxis
TWMTimer = record
Msg: Cardinal;
TimerID: Longint;
TimerProc: TFarProc;
Result: Longint;
end;
Descripcin
Este mensaje es enviado a la cola de mensajes del hilo de ejecucin que instal un
temporizador cada vez que expire el intervalo de tiempo establecido para el
temporizador. Si una funcin de respuesta fue especificada en la llamada a la funcin
SetTimer, este mensaje ser pasado a la funcin de respuesta y no a la cola de mensajes
del hilo de ejecucin.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_TIMER.
TimerID: El identificador del temporizador creado cuando la funcin SetTimer fue
llamada.
TimerProc: Especifica la direccin de la funcin de respuesta opcional. Cuando este
campo no es nil, el mensaje WM_TIMER es enviado a la funcin de respuesta; en caso
contrario, es enviado a la cola de mensajes del hilo de ejecucin que instal el
temporizador.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
Vase adems
DispatchMessage, SetTimer
WM_UNDO
Sintaxis
TWMUndo = record
Msg: Cardinal;
Unused: array[0..3] of Word;
Result: Longint;
end;
Apndice
WM_TIMER
876
Apndice A
Descripcin
El mensaje WM_UNDO es enviado a un control de edicin como un comando para
deshacer la ultima operacin. El nuevo texto es borrado y el texto anteriormente
borrado es restaurado.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_UNDO.
Unused: Este campo no es utilizado por este mensaje.
Result: Este mensaje devolver uno, si tiene xito; en caso contrario, devolver cero.
Vase adems
WM_CLEAR, WM_COPY, WM_CUT, WM_PASTE
WM_VKEYTOITEM
Sintaxis
TWMVKeyToItem = record
Msg: Cardinal;
Key: Word;
CaretPos: Word;
ListBox: HWND;
Result: Longint;
end;
Descripcin
Un cuadro de lista con el estilo LBS_WANTKEYBOARDINPUT enva un mensaje
WM_VKEYTOITEM a su propietaria en respuesta a un mensaje WM_KEYDOWN.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_VKEYTOITEM.
Key: El cdigo de la tecla virtual de la tecla que gener el mensaje WM_KEYDOWN.
CaretPos: La posicin del cursor de edicin en el cuadro de lista.
ListBox: Manejador del cuadro de lista.
Result: Este mensaje debe devolver -2 para indicar que el mensaje fue manejado y que
ningn procesamiento posterior por parte del cuadro de lista es necesario. Un valor de
retorno de -1 indica que el cuadro de lista debe ejecutar su accin por defecto para la
tecla indicada. Un valor cero o mayor especifica el ndice de base cero de un elemento
877
en el cuadro de lista e indica al cuadro de lista que debe ejecutar su accin por defecto
para la tecla indicada sobre el elemento especificado.
Vase adems
DefWindowProc, WM_CHARTOITEM, WM_KEYDOWN
WM_VSCROLL
Sintaxis
TWMVScroll = record
Msg: Cardinal;
ScrollCode: Smallint;
Pos: Smallint;
Scroll bar: HWND;
Result: Longint;
end;
Descripcin
El mensaje WM_VSCROLL es enviado a una ventana cuando se produce un evento de
desplazamiento vertical, si la ventana tiene una barra de desplazamiento vertical
estndar. Tambin es enviado cuando un desplazamiento ocurre en un control de la
barra de desplazamiento. Si la aplicacin cambia la posicin de los datos en una
ventana como resultado de un desplazamiento vertical, debe reinicializar la posicin
del botn de la barra de desplazamiento llamando a la funcin SetScrollPos. Los
mensajes WM_VSCROLL y WM_HSCROLL tienen valores de 16 bits para posiciones
de desplazamiento, restringiendo la posicin mxima a 65.535.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_VSCROLL.
ScrollCode: Especifica el tipo de desplazamiento solicitado como resultado del evento
de desplazamiento. Este campo puede contener un valor de la Tabla A-50.
Pos: Si el campo ScrollCode contiene SB_THUMBPOSITION o SB_THUMBTRACK,
este campo especifica la posicin actual del botn de la barra de desplazamiento. En
caso contrario, este campo no es usado.
Scroll bar: Manejador de un control de barra de desplazamiento, si es un control de
barra de desplazamiento el que que est enviando el mensaje WM_VSCROLL. En caso
contrario, este campo no es usado.
Result: Si la aplicacin maneja el mensaje, deber asignar cero a este campo.
A
2
Apndice
Captulo
Mensajes
878
Apndice A
Vase adems
WM_HSCROLL
Tabla A-50: Valores de TWMVScroll.ScrollCode
Valor
SB_BOTTOM
SB_ENDSCROLL
SB_LINEDOWN
SB_LINEUP
SB_PAGEDOWN
SB_PAGEUP
SB_THUMBPOSITION
SB_THUMBTRACK
SB_TOP
Descripcin
Indica un desplazamiento total hacia abajo.
Indica el final de la operacin de desplazamiento.
Indica un desplazamiento hacia abajo de una unidad.
Indica un desplazamiento hacia arriba de una unidad.
Indica un desplazamiento hacia abajo del ancho de la
ventana.
Indica un desplazamiento hacia arriba del ancho de la
ventana.
Indica un desplazamiento a la posicin absoluta especificada
en el campo Pos.
Arrastra el botn de la barra de desplazamiento a la
posicin indicada por el campo Pos. Esto es normalmente
utilizado para ofrecer retroalimentacin.
Indica un desplazamiento total hacia arriba.
WM_VSCROLLCLIPBOARD
Sintaxis
TWMVScrollClipboard = record
Msg: Cardinal;
Viewer: HWND;
ScrollCode: Word;
ThumbPos: Word;
Result: Longint;
end;
Descripcin
El mensaje WM_VSCROLLCLIPBOARD es enviado por una ventana visualizadora del
portapapeles a la propietaria del portapapeles, cuando se produce un evento en la barra
de desplazamiento vertical del visualizador y el portapapeles contiene datos en formato
CF_OWNERDISPLAY. La propietaria del portapapeles tiene que desplazar la imagen y
entonces reinicializar el valor de la barra de desplazamiento vertical.
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_VSCROLLCLIPBOARD.
879
Vase adems
WM_HSCROLLCLIPBOARD
Tabla A-51: Valores de TWMVScrollClipboard.ScrollCode
Valor
SB_BOTTOM
SB_ENDSCROLL
SB_LINEDOWN
SB_LINEUP
SB_PAGEDOWN
SB_PAGEUP
SB_THUMBPOSITION
SB_TOP
Descripcin
Indica un desplazamiento total hacia abajo.
Indica el final de la operacin de desplazamiento.
Indica un desplazamiento hacia abajo de una unidad.
Indica un desplazamiento hacia arriba de una unidad.
Indica un desplazamiento hacia abajo del ancho de la
ventana.
Indica un desplazamiento hacia arriba del ancho de la
ventana.
Indica un desplazamiento a la posicin absoluta especificada
en el campo Pos.
Indica un desplazamiento total hacia arriba.
WM_WINDOWPOSCHANGED
Sintaxis
TWMWindowPosChanged = record
Msg: Cardinal;
{identificador del mensaje}
Unused: Integer;
{no se utiliza}
WindowPos: PWindowPos; {puntero a un registro TWindowPos}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Este mensaje es enviado cuando el tamao de una ventana, su posicin o el orden Z han
sido reajustados como resultado de una llamada a una funcin de movimiento o
posicionamiento de ventana, como SetWindowPos o EndDeferWindowPos. Los
mensajes WM_SIZE y WM_MOVE no sern enviados si la funcin DefWindowProc no
es llamada por una ventana en respuesta a este mensaje.
A
2
Apndice
Captulo
Mensajes
880
Apndice A
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_WINDOWPOSCHANGED.
Unused: Este campo no es utilizado por este mensaje.
WindowPos: Especifica un puntero a un registro TWindowPos que contiene la nueva
informacin sobre el tamao y posicin de la ventana. El registro TWindowPos se
define como:
TWindowPos = packed record
hwnd: HWND;
hwndInsertAfter: HWND;
x: Integer;
y: Integer;
cx: Integer;
cy: Integer;
flags: UINT
end;
{manejador de ventana}
{manejador de ventana o indicador de posicin}
{posicin horizontal}
{posicin vertical}
{ancho de la ventana}
{altura de la ventana}
{opciones de tamao y posicin}
Vase adems
DefWindowProc, EndDeferWindowPos, SetWindowPos, WM_MOVE,
WM_NCCALCSIZE, WM_SIZE, WM_WINDOWPOSCHANGING
WM_WINDOWPOSCHANGING
Sintaxis
TWMWindowPosChanging = record
Msg: Cardinal;
{identificador del mensaje}
Unused: Integer;
{no se utiliza}
WindowPos: PWindowPos; {puntero a un registro TWindowPos}
Result: Longint;
{devuelve cero (0) si fue manejado}
end;
Descripcin
Este mensaje es enviado cuando el tamao de una ventana, su posicin o el orden Z van
a ser reajustados como resultado de una llamada a una funcin de movimiento o
posicionamiento de ventana, como SetWindowPos o EndDeferWindowPos. Si la
ventana tiene los estilos WS_OVERLAPPED o WS_THICKFRAME y enva este
mensaje a la funcin DefWindowProc, un mensaje WM_GETMINMAXINFO ser
enviado a la ventana. Este valida el nuevo tamao y posicin de la ventana, de manera
881
Campos
Msg: El identificador del mensaje. Este campo contiene la constante de identificador de
mensaje WM_WINDOWPOSCHANGED.
Unused: Este campo no es utilizado por este mensaje.
WindowPos: Especifica un puntero a un registro TWindowPos que contiene la nueva
informacin sobre el tamao y posicin de la ventana. El registro TWindowPos se
define como:
TWindowPos = packed record
hwnd: HWND;
hwndInsertAfter: HWND;
x: Integer;
y: Integer;
cx: Integer;
cy: Integer;
flags: UINT
end;
{manejador de ventana}
{manejador de ventana o indicador de posicin}
{posicin horizontal}
{posicin vertical}
{ancho de la ventana}
{altura de la ventana}
{opciones de tamao y posicin}
Vase adems
DefWindowProc, EndDeferWindowPos, SetWindowPos, WM_GETMINMAXINFO,
WM_MOVE, WM_NCCALCSIZE, WM_SIZE, WM_WINDOWPOSCHANGING
A
2
Apndice
Captulo
Mensajes
883
Apndice B
Cdigo ROP
$00000042
$00010289
$00020C89
$000300AA
$00040C88
$000500A9
$00060865
$000702C5
$00080F08
$00090245
$000A0329
$000B0B2A
$000C0324
$000D0B25
$000E08A5
$000F0001
$00100C85
$001100A6
$00120868
$001302C8
$00140869
$001502C9
$00165CCA
$00171D54
$00180D59
Operacin booleana
El resultado es todo negro
NOT (brocha OR origen OR destino)
NOT (brocha OR origen) AND destino
NOT (brocha OR origen)
NOT (brocha OR destino) AND origen
NOT (brocha OR destino)
NOT (brocha OR NOT(origen XOR destino))
NOT (brocha OR (origen AND destino))
NOT brocha AND origen AND destino
NOT (brocha OR (origen XOR destino))
NOT brocha AND destino
NOT (brocha OR (origen AND NOT destino))
NOT brocha AND origen
NOT (brocha OR (NOT origen AND destino))
NOT (brocha OR NOT (origen OR destino))
NOT brocha
brocha AND NOT (origen OR destino)
NOT (origen OR destino)
NOT (origen OR NOT (brocha XOR destino))
NOT (origen OR (brocha AND destino))
NOT (destino OR NOT (brocha XOR origen))
NOT (destino OR (brocha AND origen))
brocha XOR (origen XOR (destino AND NOT (brocha AND origen)))
NOT (origen XOR (( origen XOR brocha) AND (origen XOR destino)))
(brocha XOR origen) AND (brocha XOR destino)
B
Apndice
884
Apndice B
Cdigo ROP
$00191CC8
$001A06C5
$001B0768
$001C06CA
$001D0766
$001E01A5
$001F0385
$00200F09
$00210248
$00220326
$00230B24
$00240D55
$00251CC5
$002606C8
$00271868
$00280369
$002916CA
$002A0CC9
$002B1D58
$002C0784
$002D060A
$002E064A
$002F0E2A
$0030032A
$00310B28
$00320688
$00330008
$003406C4
$00351864
$003601A8
$00370388
$0038078A
$00390604
$003A0644
$003B0E24
$003C004A
$003D18A4
$003E1B24
$003F00EA
Operacin booleana
NOT (origen XOR (destino AND NOT (brocha AND origen)))
brocha XOR (destino OR (origen AND brocha))
NOT (origen XOR (destino AND (brocha XOR origen)))
brocha XOR (origen OR (brocha AND destino))
NOT (destino XOR (origen AND (brocha XOR destino)))
brocha XOR (origen OR destino)
NOT (brocha AND (origen OR destino))
brocha AND NOT origen AND destino
NOT (origen OR (brocha XOR destino))
NOT origen AND destino
NOT (origen OR (brocha AND NOT destino))
(origen XOR brocha) AND (origen XOR destino)
NOT (brocha XOR (destino AND NOT (origen AND brocha)))
origen XOR (destino OR (brocha AND origen))
origen XOR (destino OR NOT (brocha XOR origen))
destino AND (brocha XOR origen)
NOT (brocha XOR (origen XOR (destino OR (brocha AND origen))))
destino AND NOT (brocha AND origen)
NOT (origen XOR ((origen XOR brocha) AND (brocha AND destino)))
origen XOR (brocha AND (origen OR destino))
brocha XOR (origen OR NOT destino)
brocha XOR (origen OR (brocha XOR destino))
NOT (brocha AND (origen OR NOT destino))
brocha AND NOT origen
NOT (origen OR (NOT brocha AND destino))
origen XOR (brocha OR origen OR destino)
NOT origen
origen XOR (brocha OR (origen AND destino))
origen XOR (brocha OR NOT (origen XOR destino))
origen XOR (brocha OR destino)
NOT (origen AND (brocha OR destino))
brocha XOR (origen AND (brocha OR destino))
origen XOR (brocha OR NOT destino)
origen XOR (brocha XOR (origen XOR destino))
NOT (origen AND (brocha OR NOT destino))
brocha XOR origen
origen XOR (brocha OR NOT (origen OR destino))
origen XOR (brocha OR (NOT origen AND destino))
NOT (brocha AND origen)
Cdigo ROP
$00400F0A
$00410249
$00420D5D
$00431CC4
$00440328
$00450B29
$004606C6
$0047076A
$00480368
$004916C5
$004A0789
$004B0605
$004C0CC8
$004D1954
$004E0645
$004F0E25
$00500325
$00510B26
$005206C9
$00530764
$005408A9
$00550009
$005601A9
$00570389
$00580785
$00590609
$005A0049
$005B18A9
$005C0649
$005D0E29
$005E1B29
$005F00E9
$00600365
$006116C6
$00620786
$00630608
$00640788
$00650606
$00660046
885
Operacin booleana
brocha AND origen AND NOT destino
NOT (destino OR (brocha XOR origen))
(origen XOR destino) AND (brocha XOR destino)
NOT (origen XOR (brocha AND NOT (origen AND destino)))
origen AND NOT destino
NOT (destino OR (brocha AND NOT origen))
destino XOR (origen OR (brocha AND destino))
NOT (brocha XOR (origen AND (brocha XOR destino)))
origen AND (brocha XOR destino)
NOT (brocha XOR (destino XOR (origen OR (brocha AND destino))))
destino XOR (brocha AND (origen OR destino))
brocha XOR (NOT origen OR destino)
origen AND NOT (brocha AND destino)
NOT (origen XOR ((brocha XOR origen) OR (origen XOR destino)))
brocha XOR (destino OR (brocha XOR origen))
NOT (brocha AND (NOT origen OR destino))
brocha AND NOT destino
NOT (destino OR (NOT brocha AND origen))
destino XOR (brocha OR (origen AND destino))
NOT (origen XOR (brocha AND (origen XOR destino)))
NOT (destino OR NOT (brocha OR origen))
NOT destino
destino XOR (brocha OR origen)
NOT (destino AND (brocha OR origen))
brocha XOR (destino AND (brocha OR origen))
destino XOR (brocha OR NOT origen)
brocha XOR destino
destino XOR (brocha OR NOT (origen OR destino))
destino XOR (brocha OR (origen XOR destino))
NOT (destino AND (brocha OR NOT origen))
destino XOR (brocha OR (origen AND NOT destino))
NOT (brocha AND destino)
brocha AND (origen XOR destino)
NOT (destino XOR (origen XOR (brocha OR (origen AND destino))))
destino XOR (origen AND (brocha OR destino))
origen XOR (NOT brocha OR destino)
origen XOR (destino AND (brocha OR origen))
destino XOR (NOT brocha OR origen)
origen XOR destino
B
Apndice
886
Apndice B
Cdigo ROP
$006718A8
$006858A6
$00690145
$006A01E9
$006B178A
$006C01E8
$006D1785
$006E1E28
$006F0C65
$00700CC5
$00711D5C
$00720648
$00730E28
$00740646
$00750E26
$00761B28
$007700E6
$007801E5
$00791786
$007A1E29
$007B0C68
$007C1E24
$007D0C69
$007E0955
$007F03C9
$008003E9
$00810975
$00820C49
$00831E04
$00840C48
$00851E05
$008617A6
$008701C5
$00800C6
$00891B08
$008A0E06
$008B0666
$008C0E08
Operacin booleana
origen XOR (destino OR NOT (brocha OR origen))
NOT (destino XOR (origen XOR (brocha OR NOT (origen OR
destino))))
NOT (brocha XOR (origen XOR destino))
destino XOR (brocha AND origen)
NOT (brocha XOR (origen XOR (destino AND (origen OR brocha))))
origen XOR (brocha AND destino)
NOT (brocha XOR (destino XOR (origen AND (brocha OR destino))))
origen XOR (destino AND (brocha OR NOT origen))
NOT (brocha AND NOT (origen XOR destino))
brocha AND NOT (origen AND destino)
NOT (origen XOR ((origen XOR destino) AND (brocha XOR destino)))
origen XOR (destino OR (brocha XOR origen))
NOT (origen AND (NOT brocha OR destino))
destino XOR (origen OR (brocha XOR destino))
NOT (destino AND (NOT brocha OR origen))
origen XOR (destino OR (brocha AND NOT origen))
NOT (origen AND destino)
brocha XOR (origen AND destino)
NOT (destino XOR (origen XOR (brocha AND (origen OR destino))))
destino XOR (brocha AND (origen OR NOT destino))
NOT (origen AND NOT (brocha XOR destino))
origen XOR (brocha AND (NOT origen OR destino))
NOT(destino AND NOT (origen XOR brocha))
(brocha XOR origen) OR (origen XOR destino)
NOT (brocha AND origen AND destino)
brocha AND origen AND destino
NOT ((brocha XOR origen) OR (origen XOR destino))
NOT (brocha XOR origen) AND destino
NOT (origen XOR (brocha AND (NOT origen OR destino)))
origen AND NOT (brocha XOR destino)
NOT (brocha XOR (destino AND (NOT brocha OR origen)))
destino XOR (origen XOR (brocha AND (origen OR destino)))
NOT (brocha XOR (origen AND destino))
origen AND destino
NOT (origen XOR (destino OR (brocha AND NOT origen)))
(NOT brocha OR origen) AND destino
NOT (destino XOR (origen OR (brocha OR destino)))
origen AND (NOT brocha OR destino)
Cdigo ROP
$008D0668
$008E1D7C
$008F0CE5
$00900C45
$00911E08
$009217A9
$009301C4
$009417AA
$009501C9
$00960169
$0097588A
$00981888
$00990066
$009A0709
$009B07A8
$009C0704
$009D07A6
$009E16E6
$009F0345
$00A000C9
$00A11B05
$00A20E09
$00A30699
$00A41885
$00A50065
$00A60706
$00A707A5
$00A803A9
$00A90189
$00AA0029
$00AB0889
$00AC0744
$00AD06E9
$00AE0B06
$00AF0229
$00B00E05
$00B10665
$00B12974
$00B03CE8
887
Operacin booleana
NOT (origen XOR (destino OR (brocha XOR origen)))
origen XOR (origen XOR destino AND (brocha XOR destino))
NOT (brocha AND NOT (origen AND destino))
brocha AND NOT (origen XOR destino)
NOT (origen XOR (destino AND (brocha OR NOT origen)))
destino XOR (brocha XOR (origen AND (brocha OR destino)))
NOT (origen XOR (brocha AND destino))
brocha XOR (origen XOR (destino AND (brocha OR origen)))
NOT (destino XOR (brocha AND origen))
brocha XOR origen XOR destino
brocha XOR (origen XOR (destino OR NOT (brocha OR origen)))
NOT (origen XOR (destino OR NOT (brocha OR origen)))
NOT (origen XOR destino)
(brocha AND NOT origen) XOR destino
NOT (origen XOR (destino AND (brocha OR origen)))
origen XOR (brocha AND NOT destino)
NOT (destino XOR (origen AND (brocha OR destino)))
(origen XOR (brocha OR (origen AND destino))) XOR destino
NOT (brocha AND (origen XOR destino))
brocha AND destino
NOT (brocha XOR (destino OR (NOT brocha AND origen)))
(brocha OR NOT origen) AND destino
NOT (destino XOR (brocha OR (origen XOR destino)))
NOT (brocha XOR (destino OR NOT (brocha OR origen)))
NOT (brocha XOR destino)
(NOT brocha AND origen) XOR destino
NOT (brocha XOR (destino AND (brocha OR origen)))
(brocha OR origen) AND destino
NOT ((brocha OR origen) XOR destino)
destino
NOT (brocha OR origen) OR destino
origen XOR (brocha AND (origen XOR destino))
NOT (destino XOR (brocha OR (origen AND destino)))
(NOT brocha AND origen) OR destino
NOT brocha OR destino
brocha AND (NOT origen OR destino)
NOT (brocha OR (destino OR (brocha XOR origen)))
origen XOR ((brocha XOR origen) OR (origen XOR destino))
NOT (origen AND NOT (brocha AND destino))
B
Apndice
888
Apndice B
Cdigo ROP
$00B4070A
$00B507A9
$00B616E9
$00B70348
$00B8074A
$00B906E6
$00BA0B09
$00BB0226
$00BC1CE4
$00BD0D7D
$00BE0269
$00BF08C9
$00C000CA
$00C11B04
$00C21884
$00C3006A
$00C40E04
$00C50664
$00C60708
$00C707AA
$00C803A8
$00C90184
$00CA0749
$00CB06E4
$00CC0020
$00CD0888
$00CE0B08
$00CF0224
$00D00E0A
$00D1066A
$00D20705
$00D307A4
$00D41D78
$00D50CE9
$00D616EA
$00D70349
$00D80745
$00D906E8
$00DA1CE9
Operacin booleana
brocha XOR (origen AND NOT destino)
NOT (destino XOR (brocha AND (origen OR destino)))
destino XOR (brocha XOR (origen OR (brocha AND destino)))
NOT (origen AND (brocha XOR destino))
brocha XOR (origen AND (brocha XOR destino))
NOT ( destino XOR (origen OR (brocha AND destino)))
(brocha AND NOT origen) OR destino
NOT origen OR destino
origen XOR (brocha AND NOT (origen AND destino))
NOT ((brocha XOR destino) AND (origen XOR destino))
(brocha XOR origen) OR destino
NOT (brocha AND origen) OR destino
brocha AND origen
NOT (origen XOR (brocha OR (NOT origen AND destino)))
NOT (origen XOR (brocha OR NOT(origen OR destino)))
NOT (brocha XOR origen)
origen AND (brocha OR NOT destino)
NOT (origen XOR (brocha OR (origen XOR destino)))
origen XOR (NOT brocha AND destino)
NOT (brocha XOR (origen AND (brocha OR destino))
origen AND (brocha OR destino)
NOT (origen XOR (brocha OR destino))
destino XOR (brocha AND (origen XOR destino))
NOT (origen XOR (brocha OR (origen AND destino)))
origen
origen OR NOT (brocha OR destino)
origen OR (NOT brocha AND destino)
origen OR NOT brocha
brocha AND (origen OR NOT destino)
NOT (brocha XOR (origen OR (brocha XOR destino)))
brocha XOR (NOT origen AND destino)
NOT (origen XOR (brocha AND (origen OR destino)))
origen XOR (brocha XOR origen AND (brocha XOR destino))
NOT (destino AND NOT (brocha AND origen))
brocha XOR (origen XOR (destino OR (brocha AND origen)))
NOT (destino AND (brocha XOR origen))
brocha XOR (destino AND (brocha XOR origen))
NOT (origen XOR (destino OR (brocha AND origen)))
destino XOR (brocha AND NOT (origen XOR destino))
Cdigo ROP
$00DB0D75
$00DC0B04
$00DD0228
$00DE0268
$00DF08C8
$00E003A5
$00E10185
$00E20746
$00E306EA
$00E40748
$00E506E5
$00E61CE8
$00E70D79
$00E81D74
$00E95CE6
$00EA02E9
$00EB0849
$00EC02E8
$00ED0848
$00EE0086
$00EF0A08
$00F00021
$00F10885
$00F20B05
$00F3022A
$00F40B0A
$00F50225
$00F60265
$00F708C5
$00F802E5
$00F90845
$00FA0089
$00FB0A09
$00FC008A
$00FD0A0A
$00FE02A9
$00FF0062
889
Operacin booleana
NOT ((brocha XOR origen) AND (origen XOR destino))
origen OR (brocha AND NOT destino)
origen OR NOT destino
origen OR (brocha XOR destino)
origen OR NOT (brocha AND destino)
brocha AND (destino OR origen)
NOT (brocha XOR (origen OR destino))
destino XOR (origen AND (brocha XOR destino))
NOT (brocha XOR (origen OR (brocha AND destino)))
origen XOR (destino AND (brocha XOR origen))
NOT (brocha XOR (destino OR (brocha AND origen)))
origen XOR (destino AND NOT (brocha AND origen))
NOT ((brocha XOR origen) AND (brocha XOR destino))
origen XOR ((brocha XOR origen) AND (origen XOR destino))
NOT (destino XOR (origen XOR (brocha AND NOT (origen AND
destino))))
(brocha AND origen) OR destino
NOT (brocha XOR origen) OR destino
origen OR (brocha AND destino)
origen OR NOT (brocha XOR destino)
origen OR destino
NOT brocha OR origen OR destino
brocha
brocha OR NOT (origen OR destino)
brocha OR (NOT origen AND destino)
brocha OR NOT origen
brocha OR (origen AND NOT destino)
brocha OR NOT destino
brocha OR (origen XOR destino)
brocha OR NOT (origen AND destino)
brocha OR (origen AND destino)
brocha OR NOT (origen XOR destino)
brocha OR destino
brocha OR NOT origen OR destino
brocha OR origen
brocha OR origen OR NOT destino
brocha OR origen OR destino
El resultado es todo blanco
B
Apndice
891
Apndice C
Car.
NULL
Descripcin
Nulo
Comienzo de encabezamiento
Comienzo de texto
Fin de texto
Fin de la transmisin
Pregunta
Reconocimiento
Campana
Retroceso
Tabulacin horizontal
Nueva lnea
Tabulacin vertical
Nueva pgina
Retorno
Deplazamiento hacia afuera (Shift out)
Deplazamiento hacia dentro (Shift in)
Escape de enlace de datos
Control de dispositivo 1
Control de dispositivo 2
Control de dispositivo 3
Control de dispositivo 4
Reconocimiento negativo
Tiempo ocioso sncrono
Fin de la transmisin de bloque
Cancelar
Fin de medio
Sustituir
Escape
C
Apndice
Dec.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
892
Apndice C
Dec.
28
29
30
31
Dec.
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Hex.
1C
1D
1E
1F
Hex.
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F
40
Car.
Car.
Descripcin
Separador de fichero
Separador de grupo
Separador de registro
Separador de unidad
Dec.
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Hex.
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
Car.
Dec.
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
Hex.
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
7F
80
81
82
Car.
Dec.
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
Hex.
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
Car.
Dec.
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
Hex.
AA
AB
AC
AD
AE
AF
B0
B1
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
Car.
Dec.
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
Hex.
D1
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF
F0
F1
F2
F3
F4
F5
F6
F7
893
Car.
C
Apndice
894
Apndice C
Dec.
248
249
250
Hex.
F8
F9
FA
Car.
Dec.
251
252
253
Hex.
FB
FC
FD
Car.
Dec.
254
255
Hex.
FE
FF
Car.
895
Apndice D
Hex.
$1
$2
$3
$4
$8
$9
$C
$D
$10
$11
$12
$13
$14
$1B
$20
$21
$22
$23
$24
$25
$26
$27
$28
$2C
$2D
$2E
Descripcin
Botn izquierdo del ratn.
Botn derecho del ratn.
Combinacin de teclas Ctrl+Break.
Botn central del ratn.
Retroceso.
Tabulacin.
5 del teclado numrico, BloqNum apagado.
Intro.
Mayscula.
Ctrl.
Alt.
Pausa.
BloqMays.
Esc.
Barra espaciadora.
Re.Pg.
Av.Pg.
Fin.
Inicio.
Tecla de cursor a la izquierda.
Tecla de cursor arriba.
Tecla de cursor a la derecha.
Tecla de cursor abajo.
Impr.Pant.
Ins.
Supr.
D
Apndice
896
Apndice D
Hex.
$5B
VK_RWIN
92
$5C
VK_APPS
93
$5D
VK_NUMPAD0
VK_NUMPAD1
VK_NUMPAD2
VK_NUMPAD3
VK_NUMPAD4
VK_NUMPAD5
VK_NUMPAD6
VK_NUMPAD7
VK_NUMPAD8
VK_NUMPAD9
VK_MULTIPLY
VK_ADD
VK_SUBTRACT
VK_DECIMAL
VK_DIVIDE
VK_F1
VK_F2
VK_F3
VK_F4
VK_F5
VK_F6
VK_F7
VK_F8
VK_F9
VK_F10
VK_F11
VK_F12
VK_F13
VK_F14
VK_F15
VK_F16
VK_F17
VK_F18
VK_F19
96
97
98
99
100
101
102
103
104
105
106
107
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
$60
$61
$62
$63
$64
$65
$66
$67
$68
$69
$6A
$6B
$6D
$6E
$6F
$70
$71
$72
$73
$74
$75
$76
$77
$78
$79
$7A
$7B
$7C
$7D
$7E
$7F
$80
$81
$82
Descripcin
Tecla de Windows izquierda en un teclado
compatible Windows 95/98.
Tecla de Windows derecha en un teclado
compatible Windows 95/98.
Tecla de men en un teclado compatible
Windows 95/98.
0 del teclado numrico.
1 del teclado numrico.
2 del teclado numrico.
3 del teclado numrico.
4 del teclado numrico.
5 del teclado numrico.
6 del teclado numrico.
7 del teclado numrico.
8 del teclado numrico.
9 del teclado numrico.
Multiplicar (*) del teclado numrico.
Sumar (+) del teclado numrico.
Restar (-) del teclado numrico.
Punto decimal (.) del teclado numrico.
Dividir (/) del teclado numrico.
F1.
F2.
F3.
F4.
F5.
F6.
F7.
F8.
F9.
F10.
F11.
F12.
F13.
F14.
F15.
F16.
F17.
F18.
F19.
Dec.
131
132
133
134
135
144
145
160
161
162
163
164
165
Hex.
$83
$84
$85
$86
$87
$90
$91
$A0
$A1
$A2
$A3
$A4
$A5
897
Descripcin
F20.
F21.
F22.
F23.
F24.
Bloq.Num.
Bloq.Scroll.
Tecla May. izquierda.
Tecla May. derecha.
Tecla Ctrl izquierda.
Tecla Ctrl derecha.
Tecla Alt izquierda.
Tecla Alt derecha.
D
Apndice
Bibliografa
899
Apndice E
Bibliografa
Se dispone de una base de conocimientos bastante amplia acerca de la programacin
para Windows en general y la programacin en Delphi en particular. La informacin
contenida en este libro se apoya parcialmente en nuestra investigacin y en
conocimientos extrados de los siguientes libros:
Calvert, Charles, Delphi 4 Unleashed [Sams Publishing, 1998]
Pacheco y Teixeira, Delphi 4 Developers Guide [Sams Publishing, 1998]
Thorpe, Danny, Delphi Component Design [Addison-Wesley Developers Press, 1997]
Konopka, Ray, Developing Custom Delphi 3 Components [Coriolis Group Books,
1997]
Petzold y Yao, Programming Windows 95 [Microsoft Press, 1996]
Rector y Newcomer, Win32 Programming [Addison-Wesley Developers Press, 1997]
Richter, Jeffrey, Advanced Windows, [Microsoft Press, 1997]
Beveridge and Wiener, Multithreading Applications in Win32, [Addison-Wesley
Developers Press, 1997]
E
Apndice
901
Apndice F
Cdigo fuente
y servicios en la Web
Nuestro equipo ha revisado el texto y cdigo fuente para evitar cualquier tipo de error,
pero no podemos prometerle que ste est o estar siempre libre de errores. Por ello y
para que esto no sea una molestia para usted, hemos habilitado en
http://www.danypress.com un apartado especial para cada libro que publiquemos, con
el objetivo de que el libro permanezca vivo.
En este apartado encontrar por cada ttulo :
Informacin detallada del libro.
Una lista de las erratas.
Comentarios de los lectores.
Una lista de libros relacionados.
Asimismo, podr enviarnos por email a editorial@danysoft.com, (le rogamos no se
olvide de indicarnos el ttulo del libro y sus datos):
Sus comentarios sobre el libro.
Aadir una errata a lista existente (le rogamos no se olvide de indicarnos la
pgina).
Decirnos exactamente lo que piensa, para que conozcamos sus inquietudes. Todo
comentario ser muy bien recibido y tenido en cuenta en futuras acciones de
nuestro equipo para intentar satisfacer sus necesidades.
Apndice
902
Indice
A
CloseFigure - 208
CreateIcon - 379
AbortPath - 206
CloseWindow - 618
CreateIconFromResource - 382
AddFontResource - 484
CombineRgn - 210
CreateIconFromResourceEx - 384
AdjustWindowRect - 610
CreateIconIndirect - 386
AdjustWindowRectEx - 612
Constantes - 4
CreateMenu - 707
AnimatePalette - 420
Contextos de Dispositivos - 11
CreatePalette - 427
ANSI, funciones - 8
Convenios - XXVIII
CreatePatternBrush - 96
AppendMenu - 701
CopyEnhMetaFile - 293
CreatePen - 97
Arc - 85
CopyIcon - 373
CreatePenIndirect - 99
CopyImage - 293
CreatePolygonRgn - 216
CopyRect - 213
CreatePolyPolygonRgn - 219
CreateBitmap - 296
CreatePopupMenu - 709
BeginDeferWindowPos - 614
CreateBitmapIndirect - 299
CreateRectRgn - 222
BeginPaint - 87
CreateBrushIndirect - 91
CreateRectRgnIndirect - 223
BeginPath - 207
CreateCaret - 374
CreateRoundRectRgn - 224
BitBlt - 290
CreateCompatibleBitmap - 302
CreateScalableFontResource - 499
BringWindowToTop - 616
CreateCompatibleDC - 28
CreateSolidBrush - 102
Brochas - 82
CreateCursor - 376
CreateDIBitmap - 304
cursores - 368
Cadenas de caracteres - 4
CreateDIBSection - 308
CascadeWindows - 617
CreateEllipticRgn - 214
DeferWindowPos - 619
ChangeDisplaySettings - 21
CreateEllipticRgnIndirect - 215
DeleteDC - 31
CheckMenuItem - 704
CreateEnhMetaFile - 316
DeleteEnhMetaFile - 319
CheckMenuRadioItem - 705
CreateFont - 484
DeleteMenu - 712
Chord - 89
CreateFontIndirect - 492
DestroyCaret - 388
ClientToScreen - 26
CreateHalftonePalette - 424
DestroyCursor - 389
CloseEnhMetaFile - 292
CreateHatchBrush - 94
DestroyIcon - 390
Indice
903
DestroyMenu - 713
ExtCreatePen - 123
DPtoLP - 32
ExtCreateRegion - 231
Importadas incorrectamente - 5
DragAcceptFiles - 650
ExtFloodFill - 127
Parmetros - 7
DragFinish - 652
ExtractAssociatedIcon - 393
DragQueryFile - 653
ExtractIcon - 394
GetBitmapBits - 323
DragQueryPoint - 654
ExtractIconEx - 396
GetBitmapDimensionEx - 325
DrawCaption - 103
ExtSelectClipRgn - 234
GetBkColor - 135
DrawEdge - 105
GetBkMode - 136
DrawFocusRect - 108
FillPath - 128
GetBoundsRect - 136
DrawFrameControl - 109
FillRect - 129
GetBrushOrgEx - 138
DrawIcon - 390
FillRgn - 131
GetBValue - 432
DrawIconEx - 391
FindExecutable - 655
GetCharABCWidths - 523
DrawState - 114
FindResource - 595
GetCharWidth - 525
DrawText - 502
FindResourceEx - 597
GetClipBox - 236
DrawTextEx - 506
FlattenPath - 235
GetClipRgn - 237
FrameRgn - 133
GetCurrentObject - 139
Fuentes - 473
GetCurrentPositionEx - 140
Ellipse - 117
Funciones
GetCursor - 399
EnableMenuItem - 714
de cursores - 367
GetDC - 37
EndDeferWindowPos - 622
de dibujo - 81
GetDCOrgEx - 37
EndPaint - 119
de iconos - 367
GetDeviceCaps - 37
EndPath - 226
de Importacin - 5
GetDIBColorTable - 433
EnumDisplaySettings - 32
de la interfaz grfica - 20
GetDIBits - 325
EnumFontFamilies - 511
GetEnhMetaFile - 329
EnumFontFamiliesEx - 516
de men - 695
GetEnhMetaFileDescription - 332
EnumObjects - 120
de metaficheros - 279
GetEnhMetaFileHeader - 333
EnumResourceLanguages - 584
GetEnhMetaFilePaletteEntries - 437
EnumResourceNames - 589
de paleta - 415
GetFontData - 526
EnumResourceTypes - 591
de recursos - 579
GetGlyphOutline - 527
EqualRect - 226
GetGValue - 440
EqualRgn - 227
de respuesta - 6
GetIconInfo - 399
ExcludeClipRect - 228
GetKerningPairs - 532
904
GetMapMode - 46
GetTabbedTextExtent - 552
InvertRgn - 246
GetMenu - 716
GetTextAlign - 553
IsMenu - 735
GetMenuDefaultItem - 718
GetTextCharacterExtra - 555
IsRectEmpty - 246
GetMenuItemCount - 719
GetTextColor - 555
GetMenuItemID - 719
GetTextExtentExPoint - 556
LineDDA - 163
GetMenuItemInfo - 720
GetTextExtentPoint32 - 559
LineTo - 165
GetMenuItemRect - 724
GetTextFace - 560
LoadBitmap - 336
GetMenuState - 725
GetTextMetrics - 561
LoadCursor - 403
GetMenuString - 727
GetUpdateRect - 154
LoadCursorFromFile - 405
GetMiterLimit - 141
GetUpdateRgn - 155
LoadIcon - 406
GetNearestColor - 441
GetViewportExtEx - 53
LoadImage - 340
GetNearestPaletteIndex - 442
GetViewportOrgEx - 54
LoadResource - 599
GetObject - 142
GetWindowExtEx - 56
LoadString - 599
GetObjectType - 147
GetWindowOrgEx - 57
LockResource - 601
GetOutlineTextMetrics - 534
GetWindowPlacement - 623
LockWindowUpdate - 166
GetPaletteEntries - 445
GrayString - 156
LookupIconIdFromDirectory - 407
GetPath - 238
GetPixel - 148
HideCaret - 403
GetPolyFillMode - 148
HiliteMenuItem - 730
LookupIconIdFromDirectoryEx 408
LPtoDP - 58
M
GetRasterizerCaps - 551
MakeIntResource - 602
GetRegionData - 241
iconos - 368
GetRgnBox - 242
GetROP2 - 150
GetRValue - 447
Importacin de funciones de
Windows - 5
GetStockObject - 152
InflateRect - 243
GetStretchBltMode - 335
InsertMenu - 731
GetSubMenu - 728
InsertMenuItem - 734
Mensajes - 753
GetSysColor - 447
Interfaz Grfica - 20
GetSystemMenu - 729
IntersectRect - 244
GetSystemMetrics - 48
InvalidateRect - 159
GetSystemPaletteEntries - 450
InvalidateRgn - 161
Metaficheros - 287
GetSystemPaletteUse - 454
InvertRect - 244
ModifyMenu - 736
Manejadores - 4
MapWindowPoints - 59
Indice
MoveToEx - 167
905
SetDIBColorTable - 463
RealizePalette - 456
SetDIBits - 351
Rectangle - 181
SetDIBitsToDevice - 355
OffsetClipRgn - 247
RectInRegion - 260
SetMapMode - 74
OffsetRect - 249
RectVisible - 260
SetMenu - 740
OffsetRgn - 253
recursos - 579
SetMenuDefaultItem - 741
OffsetViewportOrgEx - 61
Regiones - 199
SetMenuItemBitmaps - 743
OffsetWindowOrgEx - 62
ReleaseDC - 63
SetMenuItemInfo - 745
OpenIcon - 625
RemoveFontResource - 567
SetMiterLimit - 190
Orden Z - 607
RemoveMenu - 739
SetPaletteEntries - 465
ResizePalette - 458
SetPixel - 191
PaintDesktop - 168
RestoreDC - 64
SetPixelV - 192
PaintRgn - 168
RGB - 461
SetPolyFillMode - 193
RoundRect - 183
SetRect - 269
PaletteIndex - 455
Rutas - 202
SetRectEmpty - 270
MoveWindow - 624
O
PaletteRGB - 455
SetRectRgn - 271
PatBlt - 343
SaveDC - 64
SetROP2 - 195
PathToRegion - 255
ScaleViewportExtEx - 65
SetStretchBltMode - 358
Pie - 170
ScaleWindowExtEx - 70
SetSysColors - 466
PlayEnhMetaFile - 345
ScreenToClient - 71
SetSystemCursor - 410
PlayEnhMetaFileRecord - 346
ScrollDC - 71
SetSystemPaletteUse - 468
Plumas - 82
SelectClipPath - 261
SetTextAlign - 568
PolyBezier - 172
SelectClipRgn - 266
SetTextCharacterExtra - 572
PolyBezierTo - 173
SelectObject - 185
SetTextColor - 572
Polygon - 175
SelectPalette - 461
SetTextJustification - 573
Polyline - 175
SetBitmapBits - 347
SetViewportExtEx - 76
PolylineTo - 177
SetBitmapDimensionEx - 350
SetViewportOrgEx - 77
PolyPolygon - 178
SetBkColor - 186
SetWindowExtEx - 78
PolyPolyline - 179
SetBkMode - 187
SetWindowOrgEx - 78
PtInRect - 257
SetBoundsRect - 187
SetWindowPlacement - 626
PtInRegion - 258
SetBrushOrgEx - 189
SetWindowPos - 629
PtVisible - 259
SetCursor - 409
SetWindowRgn - 272
906
SHAddToRecentDocs - 658
SHAppBarMessage - 659
Unicode - 7
SHBrowseForFolder - 665
Unicode, funciones - 8
Shell_NotifyIcon - 680
UnionRect - 276
W
ShellAbout - 670
ShellExecute - 671
WidenPath - 277
ShellExecuteEx - 675
Windows
SHFileOperation - 683
Cadenas de caracteres - 4
SHFreeNameMappings - 686
Constantes - 4
SHGetFileInfo - 687
Importacin de funciones - 5
SHGetPathFromIDList - 691
WM_ACTIVATE - 753
SHGetSpecialFolderLocation - 691
WM_ACTIVATEAPP - 754
ShowCaret - 412
ShowCursor - 413
WM_ASKCBFORMATNAME 755
ShowOwnedPopups - 632
WM_CANCELMODE - 756
ShowWindow - 634
WM_CHANGECBCHAIN - 756
ShowWindowAsync - 636
WM_CHAR - 757
Sistemas de Coordenadas - 14
WM_CHARTOITEM - 758
SizeofResource - 604
WM_CHILDACTIVATE - 759
StretchBlt - 359
WM_CLEAR - 760
StretchDIBits - 362
WM_CLOSE - 760
StrokeAndFillPath - 196
WM_COMMAND - 761
StrokePath - 197
WM_COMPACTING - 762
SubtractRect - 275
WM_COMPAREITEM - 762
WM_COPY - 764
TabbedTextOut - 574
WM_COPYDATA - 765
WM_CREATE - 766
TextOut - 577
WM_CTLCOLORBTN - 767
TileWindows - 638
WM_CTLCOLOREDIT - 767
WM_CTLCOLORLISTBOX - 768
TrackPopupMenu - 747
WM_CTLCOLORMSGBOX - 769
WM_CTLCOLORSCROLLBAR 770
WM_CTLCOLORSTATIC - 770
WM_CUT - 771
WM_DEADCHAR - 772
WM_DELETEITEM - 773
WM_DESTROY - 774
WM_DESTROYCLIPBOARD 775
WM_DEVMODECHANGE - 775
WM_DISPLAYCHANGE - 776
WM_DRAWCLIPBOARD - 777
WM_DRAWITEM - 777
WM_DROPFILES - 780
WM_ENABLE - 780
WM_ENDSESSION - 781
WM_ENTERIDLE - 782
WM_ENTERMENULOOP - 783
WM_ERASEBKGND - 783
WM_EXITMENULOOP - 784
WM_FONTCHANGE - 784
WM_GETFONT - 785
WM_GETHOTKEY - 786
WM_GETICON - 786
WM_GETMINMAXINFO - 787
WM_GETTEXT - 788
WM_GETTEXTLENGTH - 789
WM_HELP - 790
WM_HSCROLL - 791
WM_HSCROLLCLIPBOARD 792
WM_ICONERASEBKGND - 794
WM_INITMENU - 794
Indice
907
WM_INITMENUPOPUP - 795
WM_NCDESTROY - 827
WM_RBUTTONUP - 852
WM_KEYDOWN - 796
WM_NCHITTEST - 827
WM_KEYUP - 797
WM_NCLBUTTONDBLCLK 829
WM_RENDERALLFORMATS 853
WM_KILLFOCUS - 798
WM_LBUTTONDBLCLK - 799
WM_LBUTTONDOWN - 800
WM_LBUTTONUP - 801
WM_MBUTTONDBLCLK - 802
WM_MBUTTONDOWN - 803
WM_MBUTTONUP - 804
WM_MDIACTIVATE - 805
WM_MDICASCADE - 806
WM_RENDERFORMAT - 854
WM_NCLBUTTONDOWN - 830
WM_SETCURSOR - 855
WM_NCLBUTTONUP - 830
WM_SETFOCUS - 856
WM_NCMBUTTONDBLCLK 831
WM_SETFONT - 856
WM_NCMBUTTONDOWN - 832
WM_NCMBUTTONUP - 833
WM_NCMOUSEMOVE - 834
WM_NCPAINT - 834
WM_SETHOTKEY - 857
WM_SETICON - 858
WM_SETREDRAW - 859
WM_SETTEXT - 860
WM_SHOWWINDOW - 861
WM_MDICREATE - 807
WM_NCRBUTTONDBLCLK 835
WM_MDIDESTROY - 809
WM_NCRBUTTONDOWN - 836
WM_MDIGETACTIVE - 809
WM_NCRBUTTONUP - 837
WM_MDIICONARRANGE - 810
WM_NEXTDLGCTRL - 838
WM_MDIMAXIMIZE - 810
WM_NOTIFY - 838
WM_MDINEXT - 811
WM_NOTIFYFORMAT - 840
WM_MDIREFRESHMENU - 812
WM_PAINT - 841
WM_MDIRESTORE - 812
WM_PAINTCLIPBOARD - 842
WM_MDISETMENU - 813
WM_PALETTECHANGED - 843
WM_MDITILE - 814
WM_MEASUREITEM - 815
WM_PALETTEISCHANGING 844
WM_MENUCHAR - 816
WM_PARENTNOTIFY - 844
WM_TIMECHANGE - 874
WM_MENUSELECT - 817
WM_PASTE - 846
WM_TIMER - 875
WM_MOUSEACTIVATE - 818
WM_QUERYDRAGICON - 847
WM_UNDO - 876
WM_MOUSEMOVE - 819
WM_QUERYENDSESSION - 847
WM_VKEYTOITEM - 876
WM_MOVE - 820
WM_QUERYNEWPALETTE - 848
WM_VSCROLL - 877
WM_NCACTIVATE - 821
WM_QUERYOPEN - 849
WM_NCCALCSIZE - 822
WM_QUIT - 849
WM_VSCROLLCLIPBOARD 878
WM_NCCREATE - 827
WM_RBUTTONDBLCLK - 850
WM_RBUTTONDOWN - 851
WM_SIZE - 863
WM_SIZECLIPBOARD - 863
WM_SPOOLERSTATUS - 863
WM_STYLECHANGED - 864
WM_STYLECHANGING - 865
WM_SYSCHAR - 866
WM_SYSCOLORCHANGE - 868
WM_SYSCOMMAND - 868
WM_SYSDEADCHAR - 870
WM_SYSKEYDOWN - 872
WM_SYSKEYUP - 873
WM_WINDOWPOSCHANGED 879
908
WM_WINDOWPOSCHANGING - 880