Un formulario
circular
Por Por Anatoliy Mogylevets
http://www.news2news.com/vfp redondo.prg
En Visual FoxPro no estás limitado a
formularios rectangulares, puedes hacer elipses, polígonos o combinaciones de
ambos.
Basado en las funciones del Win32 GDI el código
que se muestra a continuación crea un formulario redondo en tres simples pasos:
- Crea un
formulario rectangular normal con algunos controles como: Label, TextBox,
CommandButton.
- Establece el
fondo del formulario mediante un gráfico que sea circular.
- Corta todo en el
formulario excepto la parte que contiene el gráfico.
Si ejecutas el código verás lo siguiente:
que aunque
no lo parezca es un formulario redondo. El código para ejecutar este ejemplo te
lo pongo a continuación.
PUBLIC oForm
oForm =
CreateObject("Tform")
oForm.Visible = .T.
DEFINE CLASS Tform As
Form
#DEFINE badgeDiameter
264
#DEFINE topMargin 4
#DEFINE leftMargin 2
Width=300
Height=350
AutoCenter=.T.
Picture="badge1.bmp"
hRgn=0
ADD OBJECT lbl As Label WITH Caption="Your ID:",;
FontName="Arial", FontSize=14, Bold=.T., BackStyle=0,
Alignment=2,;
Forecolor=Rgb(255,255,225), Left=82, Top=105, Width=100, Height=25
ADD OBJECT txt As TextBox WITH Width=100, Height=24,;
Left=82, Top=130, PasswordChar="*"
ADD OBJECT cmd As CommandButton WITH Width=60, Height=25,;
Left=104, Top=165, Caption="Ok", Default=.T.
PROCEDURE Init
DO decl
PROCEDURE Activate
IF THIS.hRgn = 0
THIS.RegionOn
ENDIF
PROCEDURE RegionOn
#DEFINE SM_CYSIZE 31
#DEFINE SM_CXFRAME 32
#DEFINE SM_CYFRAME 33
LOCAL hwnd, x0, y0, x1, y1
* calculating position of the region
x0 = GetSystemMetrics(SM_CXFRAME) + leftMargin
y0 = GetSystemMetrics(SM_CYSIZE) +;
GetSystemMetrics(SM_CYFRAME) + topMargin
x1 = x0 + badgeDiameter
y1 = y0 + badgeDiameter
* creating an elliptical region
THIS.hRgn = CreateEllipticRgn (x0, y0, x1, y1)
hwnd = GetFocus()
* applying the region to the form
IF SetWindowRgn(hwnd, THIS.hRgn, 1) = 0
* if failed then release the handle
= DeleteObject (THIS.hRgn)
THIS.hRgn = 0
ENDIF
ENDPROC
PROCEDURE MouseDown
LPARAMETERS nButton,
nShift, nXCoord, nYCoord
#DEFINE
WM_SYSCOMMAND 0x112
#DEFINE
WM_LBUTTONUP 0x202
#DEFINE MOUSE_MOVE 0xf012
IF nButton = 1
LOCAL hWindow
hWindow = GetFocus()
= ReleaseCapture()
= SendMessage(hWindow, WM_SYSCOMMAND, MOUSE_MOVE, 0)
= SendMessage(hWindow, WM_LBUTTONUP, 0, 0)
ENDIF
PROCEDURE cmd.Click
ThisForm.Release
ENDDEFINE
PROCEDURE decl
DECLARE INTEGER GetFocus IN user32
DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
DECLARE INTEGER GetSystemMetrics IN user32 INTEGER nIndex
DECLARE INTEGER ReleaseCapture IN user32
DECLARE INTEGER SendMessage IN user32 INTEGER hWnd, INTEGER Msg,;
INTEGER wParam, INTEGER lParam
DECLARE INTEGER CreateEllipticRgn IN gdi32 INTEGER nLeftRect, INTEGER
nTopRect,INTEGER nRightRect, INTEGER
nBottomRect
DECLARE INTEGER SetWindowRgn IN user32;
INTEGER hWnd, INTEGER hRgn, INTEGER bRedraw
Si le
pones un gráfico en la propiedad picture, te saldría el gráfico seleccionado,
pero ten en cuenta que debe ser redondo (en este caso).
FoxPress – Octubre de 2003