{"id":365,"date":"2009-05-10T23:51:41","date_gmt":"2009-05-11T02:51:41","guid":{"rendered":"http:\/\/leandroascierto.com\/blog\/?p=365"},"modified":"2011-08-25T00:49:14","modified_gmt":"2011-08-25T03:49:14","slug":"drawshadowtext","status":"publish","type":"post","link":"https:\/\/leandroascierto.com\/blog\/drawshadowtext\/","title":{"rendered":"DrawShadowText"},"content":{"rendered":"<p style=\"text-align: justify;\">Esta es una Api que sirve para dibujar texto con una sombra difuminada al estilo Windows Vista, en el siguiente ejemplo he creado una peque\u00f1a funci\u00f3n a modo de simplificarla un poco, pero esto depende del uso que se le quiera dar.<br \/>\nLo malo de esta Api es que requiere que est\u00e9 inicializada comctl32.dll, es decir, que tendremos que llamar a InitCommonControls y tener el archivo .manifest para que funcione, por lo tanto desde el IDE si no se tiene aplicado los temas de Windows en el VB6.EXE no se mostrar\u00e1 el dibujo del texto y adem\u00e1s nos dar\u00e1 un error al llamar a esta Api, el cual lo podremos controlar con On Error, pero bien al compilarlo y teniendo el .manifest funcionar\u00e1 perfectamente.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.leandroascierto.com\/blog\/imagenes\/draw_shadow_text.png\" alt=\"Draw Shadow Text\" width=\"320\" height=\"304\" \/><\/p>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n\r\nOption Explicit\r\n\r\nPrivate Type RECT\r\n    Left As Long\r\n    Top As Long\r\n    Right As Long\r\n    Bottom As Long\r\nEnd Type\r\n\r\nPrivate Declare Function OffsetRect Lib &quot;user32&quot; (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long\r\nPrivate Declare Function DrawText Lib &quot;user32.dll&quot; Alias &quot;DrawTextA&quot; (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, ByRef lpRect As RECT, ByVal wFormat As Long) As Long\r\nPrivate Declare Function DrawShadowText Lib &quot;comctl32.dll&quot; (ByVal hdc As Long, ByVal lpStr As Long, ByVal nCount As Long, lpRect As RECT, ByVal dwFlags As Long, ByVal crText As Long, ByVal crShadow As Long, ByVal ixOffset As Long, ByVal iyOffset As Long) As Long\r\nPrivate Declare Function TranslateColor Lib &quot;olepro32.dll&quot; Alias &quot;OleTranslateColor&quot; (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long\r\nPrivate Declare Sub InitCommonControls Lib &quot;comctl32.dll&quot; ()\r\nPrivate Const DT_CALCRECT As Long = &amp;H400\r\n\r\nPublic Function DrawTextShadow (DestDC As Long, Text As String, ByVal x As Long, ByVal y As Long, TextColor As OLE_COLOR, ShadowColor As OLE_COLOR, Optional OffsetX As Long = 1, Optional OffsetY As Long = 1) As Boolean\r\n\r\n    On Error Resume Next     \t'Si no incluye el archivo .manifest el api DrawShadowText provoca un error\r\n\r\n    Dim Color1 As Long\r\n    Dim Color2 As Long\r\n    Dim Rec As RECT\r\n\r\n    TranslateColor TextColor, 0, Color1\r\n    TranslateColor ShadowColor, 0, Color2\r\n\r\n    DrawText DestDC, Text, Len(Text), Rec, DT_CALCRECT\r\n    OffsetRect Rec, x, y\r\n\r\n    If Color1 = 0 Then Color1 = 1\r\n    ' El quinto par\u00e1metro es la alineaci\u00f3n, en este caso 0 = izquierda, 1 centrado, 2 derecha\r\n    DrawTextShadow = DrawShadowText(DestDC, StrPtr(Text), Len(Text), Rec, 0, Color1, Color2, OffsetX, OffsetY)\r\n    ' Esta funci\u00f3n podr\u00eda ser modificada en caso de el api DrawShadowText diera error, podr\u00eda ser suplementada con DrawText\r\n\r\nEnd Function\r\n\r\nPrivate Sub Form_Initialize()\r\n    InitCommonControls\r\nEnd Sub\r\n\r\nPrivate Sub Form_Load()\r\n\r\n    Me.AutoRedraw = True\r\n    Me.Font.Size = 8\r\n\r\n    If DrawTextShadow(Me.hdc, &quot;Hola Mundo&quot;, 10, 10, vbBlack, vbRed) = False Then\r\n        MsgBox &quot;Para probar este ejemplo debe compilar este proyecto y agregar un archivo Proyecto1.exe.manifest&quot;, vbInformation\r\n    End If\r\n\r\n    Me.Font.Size = 12\r\n    DrawTextShadow Me.hdc, &quot;Hola Mundo&quot;, 10, 30, vbBlue, vbRed\r\n    Me.Font.Size = 32\r\n    Me.Font.Name = &quot;Times New Roman&quot;\r\n    DrawTextShadow Me.hdc, &quot;Hola Mundo&quot;, 10, 50, vbGreen, vbMagenta\r\n    DrawTextShadow Me.hdc, &quot;Hola Mundo&quot;, 10, 90, Me.BackColor, vbBlue\r\n    Me.FontBold = True\r\n    DrawTextShadow Me.hdc, &quot;Hola&quot; &amp; vbCrLf &amp; &quot;Mundo&quot;, 10, 130, vbWhite, vbBlack, 3, 3\r\nEnd Sub\r\n\r\nPrivate Sub Timer1_Timer()\r\n    Picture1.Cls\r\n    DrawTextShadow Picture1.hdc, Now, 5, 0, &amp;H333333, &amp;H80000005\r\nEnd Sub\r\n\r\n<\/pre>\n<\/p>\n<p align=\"center\"><a href=\"https:\/\/leandroascierto.com\/blog\/descarga.php?url=DrawShadowText.zip\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" title=\"Descargar\" src=\"https:\/\/leandroascierto.com\/blog\/descarga.php?file=DrawShadowText.zip\" alt=\"\" width=\"280\" height=\"61\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta es una Api que sirve para dibujar texto con una sombra difuminada al estilo Windows Vista, en el siguiente ejemplo he creado una peque\u00f1a funci\u00f3n a modo de simplificarla un poco, pero esto depende del uso que se le quiera dar. Lo malo de esta Api es que requiere que est\u00e9 inicializada comctl32.dll, es <a href='https:\/\/leandroascierto.com\/blog\/drawshadowtext\/' class='excerpt-more'>[&#8230;]<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[],"class_list":["post-365","post","type-post","status-publish","format-standard","hentry","category-graficos","category-41-id","post-seq-1","post-parity-odd","meta-position-corners","fix"],"_links":{"self":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/comments?post=365"}],"version-history":[{"count":4,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/365\/revisions"}],"predecessor-version":[{"id":373,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/365\/revisions\/373"}],"wp:attachment":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/media?parent=365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/categories?post=365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/tags?post=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}