http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,07ac6929-b3ed-410f-a29d-dca6b7e8cf5d.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé York
Alguien estuvo preguntando en Universal Thread (http://www.universalthread.com) sobre cómo colocar el cursor del ratón sobre una cadena de texto. Hacer esto es bastante fácil utilizando GDI+ y Visual FoxPro 9.0. El siguiente ejemplo, listo para ejecutar, va a guardar el icono actual del cursor y luego lo cambia por la cadena "VFP ROCKS!" Permitirá además seleccionar un archivo imagen para que se utilice como icono del cursor, lo que en realidad es la técnica que emplea el ejemplo de la cadena. Finalmente, después de ejecutar los dos ejemplos, va a restablecer el cursor en la misma forma en que estaba (lo que ahorra el tiempo de ir al Panel de Control -> Ratón). Basta con copiar y pegar el siguiente código en un archivo PRG en VFP 9.0 y ejecutarlo.
NOTAS IMPORTANTES: La porción activa del ratón es el centro de la imagen. Las imágenes para el segundo ejemplo no se limitan solamente a iconos, se admiten la mayoría de los formatos de imagen. Pero; tenga cuidado sobre el tamaño de la imagen que selecciona para el segundo ejemplo. He captado una pequeña, muy pequeña, ya que el cursor del ratón en un punto ... lo que hace muy difícil hacer clic sobre los objetos. (risas)
LOCAL lnPreviousIconHandle, lnNewIconHandle, lcImageFile, loExc AS EXCEPTION
*!* Guarda el icono actual del controlador del ratón para poderlo recuperar luego
m.lnPreviousIconHandle = GetCurrentCursorHandle()
IF m.lnPreviousIconHandle != 0
TRY
m.lnNewIconHandle = ;
GetHICONFromString("VFP ROCKS!", 0, 0, "Arial", 12, 1, 3, RGB(255,0,0), 255, 0)
IF m.lnNewIconHandle != 0
SetSystemCursorToHICON(m.lnNewIconHandle)
ENDIF
MESSAGEBOX("Oprima Aceptar cuando esté lista para el siguiente ejemplo.")
SET DEFAULT TO (ADDBS(HOME(4)) + "Icons\Computer\")
m.lcImageFile = GETPICT("","Seleccione un archivo imagen", "Seleccionar")
m.lnNewIconHandle = GetHICONFromImage(m.lcImageFile)
IF m.lnNewIconHandle != 0
SetSystemCursorToHICON(m.lnNewIconHandle)
ENDIF
MESSAGEBOX("Oprima Aceptar cuando esté listo para " + ;
"devolverle la imagen original al cursor.")
CATCH TO loExc
*!* Ups Error!
FINALLY
*!* Establecer el icono del cursor de misma manera que estaba
SetSystemCursorToHICON(m.lnPreviousIconHandle)
ENDTRY
ENDIF
***************************************
FUNCTION GetCurrentCursorHandle()
***************************************
LOCAL lnReturn
DECLARE INTEGER CopyIcon IN Win32Api INTEGER
DECLARE INTEGER GetCursor IN Win32Api AS _GetCursor
*!* Guardar el cursor actual para que pueda recuperarlo
m.lnReturn = CopyIcon(_GetCursor())
CLEAR DLLS "CopyIcon", "_GetCursor"
RETURN (lnReturn)
ENDFUNC
***************************************
FUNCTION SetSystemCursorToHICON(tnIconHandle, tnCursorStateToSet)
***************************************
*!* Las directivas del procesador se proporcionan
*!* para que sepamos lo que está disponible
#DEFINE OCR_NORMAL 32512
*!* #define OCR_IBEAM 32513
*!* #define OCR_WAIT 32514
*!* #define OCR_CROSS 32515
*!* #define OCR_UP 32516
*!* #define OCR_SIZE 32640 /* OBSOLETE: use OCR_SIZEALL */
*!* #define OCR_ICON 32641 /* OBSOLETE: use OCR_NORMAL */
*!* #define OCR_SIZENWSE 32642
*!* #define OCR_SIZENESW 32643
*!* #define OCR_SIZEWE 32644
*!* #define OCR_SIZENS 32645
*!* #define OCR_SIZEALL 32646
*!* #define OCR_ICOCUR 32647 /* OBSOLETE: use OIC_WINLOGO */
*!* #define OCR_NO 32648
*!* #define OCR_HAND 32649
*!* #define OCR_APPSTARTING 32650
IF PCOUNT() = 1
m.tnCursorStateToSet = OCR_NORMAL
ENDIF
DECLARE SetSystemCursor IN Win32Api INTEGER, INTEGER
SetSystemCursor(m.tnIconHandle,m.tnCursorStateToSet)
CLEAR DLLS "SetSystemCursor"
ENDFUNC
***************************************
FUNCTION GetHICONFromImage(tcImageName)
***************************************
LOCAL lnIconHandle, lnBitmap, lnReturn
STORE 0 TO m.lnIconHandle, m.lnBitmap, m.lnReturn
DECLARE INTEGER GdipCreateBitmapFromFile IN GDIPLUS.DLL ;
STRING wFilename, INTEGER @ nImage
DECLARE LONG GdipCreateHICONFromBitmap IN GDIPLUS.DLL ;
INTEGER nBitmap, INTEGER @hbmReturn
IF !EMPTY(tcImageName)
GdipCreateBitmapFromFile(STRCONV(m.tcImageName+CHR(0),5), @m.lnBitmap)
IF m.lnBitmap != 0
GdipCreateHICONFromBitmap(m.lnBitmap, @m.lnIconHandle)
IF m.lnIconHandle != 0
m.lnReturn = m.lnIconHandle
ENDIF
ENDIF
ENDIF
CLEAR DLLS "GdipCreateHICONFromBitmap", "GdipCreateBitmapFromFile"
RETURN m.lnReturn
ENDPROC
***************************************
PROCEDURE GetHICONFromString(tcString, tnXCoord, tnYCoord, tcFontName, ;
tnFontSize, tnFontStyle, tnUnitofMeasure, ;
tnRGB, tnAlpha, tnStringFormat)
***************************************
LOCAL logpColor, logpSolidBrush, logpFont, ;
logpStringFormat, logpPoint, logpGraphics, ;
logpBitamp, lnBitmap, lnIconHandle
DECLARE LONG GdipCreateHICONFromBitmap IN GDIPLUS INTEGER nBitmap, INTEGER @hbmReturn
DECLARE LONG GdipSetTextRenderingHint IN GDIPLUS LONG graphics, LONG mode
DECLARE LONG GdipSetInterpolationMode IN GDIPLUS LONG graphics, LONG interpolation
DECLARE LONG GdipSetSmoothingMode IN GDIPLUS LONG graphics, LONG SmoothingMd
IF TYPE("m.tcString") = "C" AND TYPE("m.tnXCoord") = "N" ;
AND TYPE("m.tnYCoord") = "N" AND TYPE("m.tcFontName") = "C" ;
AND TYPE("m.tnFontSize") = "N"
SET CLASSLIB TO (ADDBS(HOME(1)) + "FFC\_gdiplus.vcx")
*!* Si los 4 parámetros no se envían, se establecen valores predeterminados
IF TYPE("m.tnFontStyle") != "N"
m.tnFontStyle = 0
ENDIF
IF TYPE("m.tnUnitofMeasure") != "N"
m.tnUnitofMeasure = 3
ENDIF
IF TYPE("m.tnRGB") != "N"
m.tnRGB = 0
ENDIF
IF TYPE("m.tnAlpha") != "N"
m.tnAlpha = 255
ENDIF
IF TYPE("m.tnStringFormat") != "N"
m.tnStringFormat = 0
ENDIF
m.logpColor = CREATEOBJECT("gpcolor", MOD(m.tnRGB, 256), ;
MOD(BITRSHIFT(m.tnRGB, 8), 256), ;
MOD(BITRSHIFT(m.tnRGB, 16), 256), ;
m.tnAlpha)
m.logpSolidBrush = CREATEOBJECT("gpsolidbrush", m.logpColor.argb)
m.logpFont = CREATEOBJECT("gpfont", m.tcFontName, m.tnFontSize, ;
m.tnFontStyle, m.tnUnitofMeasure)
m.logpStringFormat = CREATEOBJECT("gpstringformat", m.tnStringFormat)
m.logpPoint = CREATEOBJECT("gppoint", m.tnXCoord, m.tnYCoord)
m.logpbitmap = CREATEOBJECT("gpBitmap")
*!* Se podría utilizar GdipMeasureString para obtener la medida
*!* para que el tamaño no fuera escrito directamente
m.logpbitmap.CREATE(110, 24)
m.logpGraphics = CREATEOBJECT("gpgraphics")
m.logpGraphics.CreateFromImage(m.logpbitmap)
*!* Las tres líneas de código siguientes hacen que el texto generado
*!* se vea bien, no todo dentado
GdipSetTextRenderingHint(m.logpGraphics.gethandle(), 3)
GdipSetInterpolationMode(m.logpGraphics.gethandle(), 7)
GdipSetSmoothingMode(m.logpGraphics.gethandle(), 4)
m.logpGraphics.DrawStringA(m.tcString, m.logpFont, m.logpPoint, ;
m.logpStringFormat, m.logpSolidBrush)
m.lnIconHandle = 0
GdipCreateHICONFromBitmap(m.logpbitmap.GetHandle(), @m.lnIconHandle)
m.lnReturn = m.lnIconHandle
STORE .NULL. TO m.logpbitmap, m.logpColor, m.logpSolidBrush, m.logpFont, ;
m.logpStringFormat, m.logpPoint, m.logpGraphics
RELEASE m.logpbitmap, m.logpColor, m.logpSolidBrush, m.logpFont, ;
m.logpStringFormat, m.logpPoint, m.logpGraphics
ENDIF
CLEAR DLLS "GdipCreateHICONFromBitmap", "GdipSetTextRenderingHint", ;
"GdipSetInterpolationMode", "GdipSetSmoothingMode"
RETURN m.lnReturn
ENDFUNC
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.