Autor Tema: Problemas con API's  (Leído 3749 veces)

0 Usuarios y 1 Visitante están viendo este tema.

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Problemas con API's
« en: Julio 15, 2011, 09:25:47 pm »
Saludos a todos !!!

Tengo un pequeño problema (más bien diría un "miserable problema") que no he podido resolver con un par de API's en VB 2008:

- CreateRoundRectRgn
- SetWindowRgn

Las mismas las utilizo para redondear un Form (las esquinas) o un PictureBox (las esquinas).

Código: [Seleccionar]
Public Class frmTest01
       Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Integer, _
                                                                ByVal Y1 As Integer, _
                                                                ByVal X2 As Integer, _
                                                                ByVal Y2 As Integer, _
                                                                ByVal X3 As Integer, _
                                                                ByVal Y3 As Integer) _
                                                                As Integer
       Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Integer, _
                                                           ByVal hRgn As Integer, _
                                                           ByVal bRedraw As Boolean) _
                                                           As Integer
       Private Sub MakeRoundObject(ByVal Pict As PictureBox, ByRef Radius As Integer)
              Dim _width, _height As Integer
              '// _width = (Pict.Width / VB6.TwipsPerPixelX) * 10
              '// _height = (Pict.Height / VB6.TwipsPerPixelY) * 10
              _width = Pict.Width
              _height = Pict.Height
              SetWindowRgn(Pict.Handle.ToInt32, CreateRoundRectRgn(0, 0, _width, _height, _
                           Radius, Radius), True)
       End Sub

       Private Sub frmTest01_Load(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles MyBase.Load
              MakeRoundObject(pctBox, 40)
       End Sub
End Class

En el cçodigo de arriba, estoy proponiendo redondear las esquinas de un PictureBox (llamado 'pctBox'). Funciona de mil maravillas !!! ;D ;D ;D
Pero cuando quiero colocar las API's en un módulo para hacerlas tipo públicas (bueno me refiero a la Sub que realiza la tarea) para reutilizarlas... Ahí es donde se presenta el problema :o.

Código: [Seleccionar]
Option Explicit On
Option Strict On
'//
Module modOp
       Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, _
                                                                ByVal Y1 As Long, _
                                                                ByVal X2 As Long, _
                                                                ByVal Y2 As Long, _
                                                                ByVal X3 As Long, _
                                                                ByVal Y3 As Long) As Long
       '//-------------------------------------------------------------------------------------------------
       Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, _
                                                           ByVal hRgn As Long, _
                                                           ByVal bRedraw As Boolean) As Long
       '//-------------------------------------------------------------------------------------------------
       Public Sub MakeRoundObject(ByVal Pict As PictureBox, ByRef Radius As Integer)
              Dim _width, _height As Integer
              _width = Pict.Width
              _height = Pict.Height
              SetWindowRgn(Pict.Handle.ToInt32, CreateRoundRectRgn(0, 0, _width, _height, Radius, Radius), True)
       End Sub
End Module

Aquí, no realiza absolutamente nada !!! >:(

Por favor, alguien o algunos que puedan tener la solución !!! se los agradezco de antemano !!!

Saludos !!!

Manuel F. Borrego S. 8)
Barcelona, Edo.Anzoátegui. Venezuela.
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

seba123neo

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Problemas con API's
« Respuesta #1 en: Julio 15, 2011, 11:46:20 pm »
primero tenes que saber que VB .NET <> VB 6, con eso en mente podes empezar.

las apis en .NET si bien se usan, casi todo ahora se soluciona sin ellas, para eso esta la potencia del framework y sus clases que tiene .NET, busca independizarse de las apis de windows, pero eso no quiere decir que no se usen en alguna oportunidad.

tenes que leerte por internet los cambios que hay entre vb6 y .Net, hay varios sitios donde lo dicen.

sobre todo cambian los tipos de datos de los parametros de las apis, por ejemplo algo que en VB 6 es Long aca es Integer, ya con tener eso mal, la api no funcionara.

cuando uses una api para .NET busca la declaracion para .NET y no para visual basic 6, a no ser que reemplazes manualmente los tipos de datos correctamente.

no copies y peges de vb6 a .NET, programa estilo .NET sino quedate en VB6.

para hacer lo que queres simplemente se puede hacer algo asi:

Código: [Seleccionar]
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim r As New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height)
        Dim gp As New System.Drawing.Drawing2D.GraphicsPath()
        Dim d As Integer = 50
        gp.AddArc(r.X, r.Y, d, d, 180, 90)
        gp.AddArc(r.X + r.Width - d, r.Y, d, d, 270, 90)
        gp.AddArc(r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90)
        gp.AddArc(r.X, r.Y + r.Height - d, d, d, 90, 90)
        PictureBox1.Region = New Region(gp)
    End Sub

saludos.


ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Problemas con API's
« Respuesta #2 en: Julio 16, 2011, 12:17:38 am »
Saludos seba !!!

Lo de las API's tanto en 6.0 como .Net se que difieren en los parámetros, por ejemplo el parámetro 'hWnd' que se encuentra en muchas API's en 6.0, geralmente es de tipo integer, y los controles Form y PictureBox los tienen como tal (me refiero en el 6.0 y tienen como propiedad 'hWnd'), en .Net estos usan el 'Handle' (y la API lo solicita de tipo 'Long') y hay que realizar algo así por ejemplo: PictureBox.Handle.ToInt64. En fin, colocado como te lo aclaré arriba, de manera local, funciona a la perfección, pero de manera pública no realiza nada, ni siquiera arroja una 'excepción' por decirte algo, sencillamente se queda como está.
Ahora para lo que me estoy preparando, es para construir (o dibujar) botones 3D, y estoy probando con el control PictureBox. He conseguido uno que otro código por allí, pero no es lo que busco. Consegui uno llamado CButtonLib, contiene una librería del mismo nombre, dibuja unos Botones 3D muy buenos !!! pero... cada vez que lo he cargado arroja advertencia que la ubicación de la solución no es de confianza (o segura), he probado cambiando esto y sigue lo mismo, a parte de que de manera esporádica provoca cierta inestabilidad en el VB 2008 mientras estoy programando, por eso he tenido que descartarlo, y como puedes ver estoy experimentando con lo que te mencioné.
Ahora me voy a disponer a poner en ejecución el código que me suministraste.

Muchas gracias seba. En cuanto tenga los resultados, te aviso.


Saludos !!!
Manuel F. Borrego S. 8)
Barcelona. Venezuela
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

seba123neo

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Problemas con API's
« Respuesta #3 en: Julio 16, 2011, 12:21:40 am »
fijate que en el segundo codigo que pusiste tenes mal los tipos de datos de la api. chequea que puede ser eso. cuando la api esta mal no tira error, directamente no hace nada.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Problemas con API's
« Respuesta #4 en: Julio 16, 2011, 12:34:53 am »
seba123neo te ago unas preguntas con respecto a tu respuesta, el echo de no utilizar el api y usar las funciones propias del lenguaje es por algun motivo de compativilidad?, .NET puede correr en otro SO que no sea windows??, en caso que asi fuere las funciones mencionadas no estarian utilizando GDI+ (GraphicsPath)  y todo lo que refiere a las regiones de "user32".
me viene esta duda porque nunca programe algo que pueda correr en otro SO que no sea Winodws, y mi duda es esa si se utiliza un api de windows obiamente no va a funcionar en otro SO pero como carajo se hace en otro so si queres hacer un CreateRoundRectRgn por ejemplo.


seba123neo

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Problemas con API's
« Respuesta #5 en: Julio 16, 2011, 01:24:28 am »
Hola, Leandro como andas, te explico de lo que se, .NET tiene un framework, o sea para decirlo facil, es un conjunto de clases ,ordenadas cada una en un Namespace (que despues uno importa segun la que use). este framework tiene dentro de las clases metodos que digamos "hacen el trabajo" de las apis de windows, o sea en el framework ya vienen varias funciones que antes tenias que escribir chorradas de codigo para hacer, ahora en pocas lineas podes hacerlo, pero me "imagino" que estas clases internamente hacen el mismo trabajo que las apis de windows, algunas por lo que se llaman a estas apis y otras estan nativamente programadas y entonces son 100% independiente de las apis de windows.

te paso una cita que esta bien explicado:

Citar
A largo plazo Microsoft pretende reemplazar el API Win32 o Windows API con la plataforma .NET. Esto debido a que el API Win32 o Windows API fue desarrollada sobre la marcha, careciendo de documentación detallada, uniformidad y cohesión entre sus distintos componentes, provocando múltiples problemas en el desarrollo de aplicaciones para el sistema operativo Windows. La plataforma .NET pretende solventar la mayoría de estos problemas proveyendo un conjunto único y expandible con facilidad, de bloques interconectados, diseñados de forma uniforme y bien documentados, que permitan a los desarrolladores tener a mano todo lo que necesitan para producir aplicaciones sólidas.

Debido a las ventajas que la disponibilidad de una plataforma de este tipo puede darle a las empresas de tecnología y al público en general, muchas otras empresas e instituciones se han unido a Microsoft en el desarrollo y fortalecimiento de la plataforma .NET, ya sea por medio de la implementación de la plataforma para otros sistemas operativos aparte de Windows (Proyecto Mono de Ximian/Novell para GNU/Linux/MacOS X/BSD/Solaris), el desarrollo de lenguajes de programación adicionales para la plataforma (Lexico para hispanoparlantes, ANSI C de la Universidad de Princeton, NetCOBOL de Fujitsu, Delphi de Borland, PowerBuilder de Sybase entre otros) o la creación de bloques adicionales para la plataforma (como controles, componentes y bibliotecas de clases adicionales); siendo algunas de ellas software libre, distribuibles bajo la licencia GPL.

Con esta plataforma, Microsoft incursiona de lleno en el campo de los Servicios Web y establece el XML como norma en el transporte de información en sus productos y lo promociona como tal en los sistemas desarrollados utilizando sus herramientas.

existe el Proyecto mono el cual pudo hacer que se corran aplicaciones de .NET en linux o MAC OS, usando CLR (Common Language Runtime) que es el nucleo del framework y el que compila el codigo en el famoso CLI (Common Intermediate Language).

sobre tu pregunta, si declaras una api de windows en .NET, no vas a podes usarla en Linux obviamente.

por ejemplo la clase "System.Windows.Forms" que encapsula todo lo necesario para la creacion de ventanas (textbox, botones..etc.). el problema es que esta clase dentro hace llamadas P/Inovoke a las de windows por lo tanto esto en linux obviamente no funcionaria, entocnes lo que hicieron para Mono es usar la clase "System.Drawing" y asi crear las ventanas nativamente sin depender de la api, entonces digamos esta si "funciona" en Linux.

leete todo esta pagina que se te van a aclarar varias cosas, esta interesante:

Llega el .NET a Linux!!!

la pagina del proyecto Mono:

Mono Proyect

aca te paso una cita de un usuario en internet que explica bien el tema, a otro usuario que queria simular el .NET desde el famoso emulador de windows para Linux "Wine", o sea queria instalar el framework ahi y correr la aplicacion del emulador. tambien habla de las llamadas a apis abajo.

Citar
Se debe a que el .NET framework no funciona en wine, asi de sencillo, no está soportado ni siquiera por la última version de wine (la 1.1.13), por lo tanto no lo podrás hacer funcionar.

Soluciones? La hay, y una muy buena: Usa MONO.

Mono es la implementacion libre y open source del .NET framework (mono ES software libre) para Linux y Mac OS que te permite correr programas binarios tanto en windows, linux como en mac Os.

Hay toda una discucion acerca de que si M$ esta detras, y una "campaña" quizas causada por la desinformacion, con trolls metidos detras acerca de la conveniencia de usar Mono y todo relacionado con patentes y demases. En mi opinion personal prefiero no meterme en discuciones sin sentido sobre quien es "mejor" si Java o .NET, ni tampoco meterme en discuciones sobre que Java es libre y todos esos demases. En lo que a mi respecta, .NET me acomoda, me gusta programar con C#, yo prefiero quedarme con que Mono es software libre, sus distintos componentes tienen distintas licencias libres, algunas cosas estan liberadas bajo GPL 2, otras bajo LGPL, y otras bajo MIT/X11.

Consideraciones? Bastantes. Actualmente Mono va en su version 2.2 y es compatible con el framework 2.0, esto quiere decir que puedes usar generics y todas esas cosas. El compilador de C# ya tiene soporte para C# 3.0, por lo que puedes usar metodos anonimos, expresiones lamba y algunas implementaciones de LINQ, aunque no todavia LINQ to SQL.

Para que te funcione una aplicacion, el binario, de .NET en Linux sin siquiera recompilar nada, tu aplicacion debe ser 100% .NET compatible, es decir, debe cumplir con ciertas buenas practicas de programacion, nada de llamadas truchas al sistema operativo (es decir, nada de P/Invokes), nada de librerias no administradas, nada de llamadas a directorios windows (C:/Archivos de Programa.... ), correcto uso de la sensibilidad a las mayusculas, y en general nada de cosas "demasiado Microsoft", tampoco hacer uso de espacio de nombres "Microsoft only" (como por ejemplo Microsoft.VisualBasic)... vamos, que no son cosas imposibles, simplemente tienes que tener buenas practicas de programacion

saludos.
« última modificación: Julio 16, 2011, 01:30:36 am por seba123neo »

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Problemas con API's ahora solucionado
« Respuesta #6 en: Julio 16, 2011, 02:21:39 am »
Saludos Leandro y Seba !!!

Bueno Sebe tenías razón seba... tenía un 'detallito' en los tipos de parámetros pasados. Tenía otros errores que de tanto borrar, corregir, quitar, colocar y demás vain... por hacer (en medio de la desesperación !!! :'() entre la Clase del Form y el módulo que había creado, así que corrigiendo, estaba errando, colocando lo hacía demás y quitando, quitaba de más. Por eso no funcionaba ni amenazándolo !!!
Así que decidí borrar todo y comenzar de cero. Y gracias a DIOS y a uds lo conseguí. He aquí los códigos...

En el Form:
Código: [Seleccionar]
Public Class frmTest01
       Private Sub frmTest01_Load(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles MyBase.Load
              MakeRoundObject(pctBox, 20)
       End Sub
End Class

Y en el módulo:
Código: [Seleccionar]
Option Explicit On
Option Strict On
'//
Module modOperations
       Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Integer, _
                                                                ByVal Y1 As Integer, _
                                                                ByVal X2 As Integer, _
                                                                ByVal Y2 As Integer, _
                                                                ByVal X3 As Integer, _
                                                                ByVal Y3 As Integer) _
                                                                As Integer
       Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Integer, _
                                                           ByVal hRgn As Integer, _
                                                           ByVal bRedraw As Boolean) _
                                                           As Integer

       Public Sub MakeRoundObject(ByVal Pict As PictureBox, ByRef Radius As Integer)
              Dim _width, _height As Integer
              '//
              _width = Pict.Width
              _height = Pict.Height
              SetWindowRgn(Pict.Handle.ToInt32, CreateRoundRectRgn(0, 0, _width, _height, Radius, Radius), True)
       End Sub
End Module

Ahora si funciona perfectamente !!! ;D

Seba, en cuanto al código de solución que colocaste:
Código: [Seleccionar]
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim r As New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height)
        Dim gp As New System.Drawing.Drawing2D.GraphicsPath()
        Dim d As Integer = 50
        gp.AddArc(r.X, r.Y, d, d, 180, 90)
        gp.AddArc(r.X + r.Width - d, r.Y, d, d, 270, 90)
        gp.AddArc(r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90)
        gp.AddArc(r.X, r.Y + r.Height - d, d, d, 90, 90)
        PictureBox1.Region = New Region(gp)
End Sub

Es muy bueno, todavía estoy probándolo, porque tiene 'tendencia' a que las esquinas Sup Izq e Inf Derecha se vean un poquito más grandes que sus contrapartes (pareciera una especie de 'ilusión óptica'), por eso estoy realizando pruebas todavía. Pero Mr Seba Ud. se ganó un +1 (porque no pude colocarle +10 o más) mis felicitaciones y agradecido estoy !!!

Por lo demás, ya me voy a parar de estar frente a mi PC, porque ya tengo más de 12 horas (claro que he comido -a la ligera-) y ya por el cansancio he metido más la pata que un burro !!!

Bueno Saludos a Uds !!! y mil gracias !!!

Manuel F. Borrego S. 8)
Barcelona, Venezuela.

PD: Excelente las citas y aclaratorias Seba en cuanto al futuro de
      las API's en .Net (Por cierto, a mi me ha gustado el usar las API's,
      pero en .Net estas, a parte de un poco engorrosas, se tornan
      casi "indomables" !!!
« última modificación: Julio 16, 2011, 02:26:24 am por ADONAIRAFA »
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Problemas con API's
« Respuesta #7 en: Julio 16, 2011, 02:32:45 am »
Hola, Leandro como andas, te explico de lo que se, .NET tiene un framework, o sea para decirlo facil, es un conjunto de clases ,ordenadas cada una en un Namespace (que despues uno importa segun la que use). este framework tiene dentro de las clases metodos que digamos "hacen el trabajo" de las apis de ....

Mi madre, que buen post que te mandaste Sebas!!! deberian poder puntuarse los post independientemente.

Disculpen la intromisión, pero como se menciono el proyecto Mono, me acorde de una conferencia de Miguel de Icaza (creador de Mono) del 2004 (antiguito pero aun tiene mucho de vigente). Esta conferencia me parece muy buena, muy nutrida y muy cómica. Aunque nos golpea un poquito a los programadores de VB6 (las nenas de closet) no deja de ser indispensable de ver jeje. Aqui les paso el link del vídeo (son 8 retazos) para que los visionen
http://www.tu.tv/videos/miguel-de-icaza-conferencia-mono
Me encuentras en YAcosta.com

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Problemas con API's
« Respuesta #8 en: Julio 18, 2011, 12:36:37 pm »
Esta interesante todo este tema...! Grande seba...!
Miguel Núñez.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Problemas con API's
« Respuesta #9 en: Julio 20, 2011, 03:54:11 am »
Buena data Seba  ;), seguramente deve ser todo un dolor de cabeza lograr que sea Mono, esto sobre todo para los principiantes donde tienen que tener buenas practicas de programacion.

No me imagino haciendo un programa sin poder invocar una api :'(

seba123neo

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Problemas con API's
« Respuesta #10 en: Julio 20, 2011, 09:43:53 pm »
No me imagino haciendo un programa sin poder invocar una api :'(

jaja si, por eso te llaman Mr Leandro "Api" Ascierto  8)

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Problemas con API's
« Respuesta #11 en: Julio 21, 2011, 01:16:00 am »
Saludos a todos !!! :D

Bueno Seba tienes razón, es mucho lo que se puede hacer en VB 2008 sin hacer uso de las API's.
La razón por la que había iniciado este tema, fue porque quería diseñar Botones 3D, en los cuales pudiese manipular las esquinas (de los botones), color de fondo y texto (con cierto efecto).
La de diseñarlos era por medio de UC's. Estaba experimentando, tomando como base un control PictureBox... Pero no hacía falta he logrado crear un UC, sin necesidad de agregarle control alguno.
Tomando como base códigos encontrados en:

http://www.java2s.com/Tutorial/VB/0300__2D-Graphics/1120__LinearGradientBrush.htm Para efectos degradados.
http://elguille.info/colabora/NET2005/FernandoLuque_GDITexto03.htm Para textos con efectos.

Y en cuanto redondear esquinas (aplicable para Forms, PictureBox, UC's), no recuerdo de donde tomé el código, pero no es mío, cuendo lo recuerde haré justicia :-[.
En este último fue donde utilicé las 2 únicas API's requeridas:
- CreateRoundRectRgn
- SetWindowRgn
Que mencioné al inicio del Post.

Cuando lo tenga concluído, publico el código final (aunque espero que sea mejorado) y las imágenes (pero por favor y disculpa mi ignorancia, es como puedo subir una imagen en la respuesta)


Saludos !!!
Manuel F. Borrego S. 8)
Barcelona. Venezuela.
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!