Programación General > Visual Basic 6.0 e inferiores
Como se imprime un PictureBox111?
Jimbenit:
BUeno... gracias Nebire... pero mira la solución que le dí....
Coloca 3 Picturebox y un boton. Prueba el siguiente codigo
MI secreto es capturar la imagen de cada Picture, almacenarla en el App.Path y luego cargarla en los picture, Inteligente, no??
--- Código: Text ---Option ExplicitPrivate Declare Function BitBlt Lib "gdi32" ( _ ByVal hDestDC As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hSrcDC As Long, _ ByVal xSrc As Long, _ ByVal ySrc As Long, _ ByVal dwRop As Long) As Long Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long Function Obtener_Imagen(PictureKE As PictureBox) As StdPicture'25 Sep /2008'Esta función obtiene del presente picture como una imagen BMP'IMPORTANTE:'Cuando llames a esta funcion, debes saber que los picture perderan las escalas, asi que'lo que yo (Nilson) te recomiendo es que una vez guardadas las imagenes como bmp, este formulario'deberá cerrarse, cargar otro con 3 Images y alli cargar las imagenes que generaste para'luego imprimir ese formulario. (esto es mientras perfeciono esta función) Dim hdc As Long Dim Escala_Anterior As Integer Dim Ancho As Long Dim Alto As Long Dim Pictemp As PictureBox ' crea un pic temporal Set Pictemp = Controls.Add("vb.picturebox", "Pic1") With Pictemp Pictemp.AutoRedraw = True .Visible = False .ScaleMode = vbPixels .Width = PictureKE.Width .Height = PictureKE.Height End With ' escalas With PictureKE Escala_Anterior = .ScaleMode .ScaleMode = vbPixels Ancho = .ScaleWidth Alto = .ScaleHeight End With ' Captura el área de pantalla correspondiente al formulario hdc = GetDC(PictureKE.hWnd) ' Copia esa área al picturebox BitBlt Pictemp.hdc, 0, 0, Ancho, Alto, hdc, 0, 0, vbSrcCopy Pictemp.Picture = Pictemp.Image Set Obtener_Imagen = Pictemp.Picture ' restaura la escala PictureKE.ScaleMode = Escala_Anterior ' remueve el control picbox Controls.Remove "Pic1" Set Pictemp = Nothing End Function Private Sub Command1_Click() SavePicture Obtener_Imagen(Me.Picture1), App.Path & "PlanoXY.bmp" SavePicture Obtener_Imagen(Me.Picture2), App.Path & "PLanoXZ.bmp" SavePicture Obtener_Imagen(Me.Picture3), App.Path & "Informacion.bmp" Picture1.Cls Picture1.Picture = LoadPicture(App.Path & "PlanoXY.bmp") Picture2.Cls Picture2.Picture = LoadPicture(App.Path & "PlanoXZ.bmp") Picture3.Cls Picture3.Picture = LoadPicture(App.Path & "Informacion.bmp") Me.PrintForm End Sub Private Sub Form_Load() Me.Picture1.AutoRedraw = True Me.Picture1.ScaleMode = 6 Me.Picture2.AutoRedraw = True Me.Picture2.ScaleMode = 6 Me.Picture3.AutoRedraw = True Me.Picture3.ScaleMode = 6 Me.Picture1.Line (0, 0)-(20, 20) Me.Picture2.Line (0, 0)-(20, 20) Me.Picture3.Line (0, 0)-(20, 20) End Sub
Que tal??... :good: ....
Pero me gustaria ver las posibles soluciones a este problema, tal vez mi codigo lo mejoren ustedes...
Nebire:
Los tiros van por ahí, usando funciones de la API para capturar el área deseada.
No obstante haces cosas no necesarias que ralentizan y complican el proceso, por ejemplo para que guardar imágenes a disco ?... es mejor guardarlas en un 'DC de memoria'... paraqué guardar 3 imágenes ?... si están todas en un formulario basta con capturar sólo una.
Te comento otras cosas... por ejemplo cuando trabajas con API (o con cualquier función) no tienes que cambiar ningún parámetro que no se te haya pasado expresamente en la línea de parámetros de la función. La razón es que a nadie le gusta 8ni siquiera a uno mismo) que se le altere una propiedad que no consta en la lista de parámetros. Por tanto que se pase un handle no es excusa para cambiar valores, el handle debe usarse exclusivamente para hallar valores. Esto es aunque tu hayas tomado temporalmente el scalemode de origen lo cambias y al final lo restaures, no es lo adecuado, sólo debería hacerse como último recurso. El modo de proceder correctamente sería crear tu 'rect' esto es una estructura Point y una Size y convertir los valores de procedencia a la escala deseada, tal como te ilustro en este ejemplo:
--- Código: Visual Basic --- public type RECT ' los ponemos como long, porque usaremos píxeles, si usáramos twips los pondríamos como single, para no perder tamaño en sucesivos cambios X as long Y as long Ancho as long alto as long end type' sea una función cualqiera que recibe una ventana como parámetro, por ejemplo.public function maneja_lo_que_Sea(f as form) as long dim r as rect r.ancho= f.sclaex(f.width, f.scalemode,vbpixels) r.alto= f.sclaey(f.height, f.scalemode,vbpixels) ' lo que sea que hicera la función... end function
Como puedes ver se obtienen valores sin modificar los originales ni cambiar (esto es lo realmente importante) otras propiedades no implicadas directamente, como es scalemode. Tu por ejemplo cambiaste 'PictureKE.scalemode' .Esto siempre tienes que intentar no hacerlo, si no encuentras otra manera, pués no queda más remedio que apañarlo como sea. Esto tiene su importancia porque con el paso del tiempo luego algo se cambia y nadie sabe porqué, especialmente cuando se trabaja asíncronamente y aunque sea por un pequeño lapso de tiempo se entenderá como un bug, que de repende no se recuerda ni se sabe a qué es debido, es como un fantasma que aparece de cuando en cuando... con una buena práctica esto debe evitarse.
Luego capturas sólo el área de cliente, y yo creí que habías dicho el formulario completo, este consta del área de cliente y el marco, si realmente no te explicaste bien, pues vale pero si realmente quieres capturar también ese trozo no lo llevas a cabo. Según para que lo quieras puede o no ser importante, por ejemplo si es una ventana de exploración de internet no capturas la dirección que figura.
Donde me pierdo y no se realmente qué quieres es en lo de los 3 picturebox, creí entender que querías capturar un formulario que tiene 3 picturebox (o los que sean) hasta ahí queda claro, pero luego les 'metes' una imagen a cada uno, no entiendo para qué...?????
Por último sólo recordarte que en todo puedes simplificar funciones (salvo que te resulte más confuso seguirlo) anidándolas... por ejemplo:
--- Código: Visual Basic --- ' siendo la función ... Function Obtener_Imagen(PictureKE As PictureBox) As StdPicture ........ end function ' el código siguiente .... SavePicture Obtener_Imagen(Me.Picture1), App.Path & "PlanoXY.bmp" Picture1.Cls Picture1.Picture = LoadPicture(App.Path & "PlanoXY.bmp") ' puede ponerse así Picture1.Cls Picture1.Picture = Obtener_Imagen(Me.Picture1) Te ahorras guardar a disco y cargar de disco...
saludos.
Jimbenit:
--- Citar ---Nebire:
paraqué guardar 3 imágenes ?... si están todas en un formulario basta con capturar sólo una.
--- Fin de la cita ---
Bueno, como guardar una sola imagen consume mucho recurso si se tiene encuenta que esta imagen es grande, entonces producirá error. Asi que lo mejor es partir la imagen en mas pequeñas para que el consumo sea menor y asi no daqr error (esto solo sucede para algunos computadores que tienen poca memoria).
En mi codigo puedes cambiar solo una linea para decirle que no capture un Picture, sino el formulario completo, pero esto no lo hago por lo que te dije anteriormente.
--- Código: Text ---Obtener_Imagen(PictureKE As PictureBox) As StdPicture
--- Código: Text ---Obtener_Imagen(FormKE As Form) As StdPicture Moskito, me gustaria ver tu solución... Saludos B)
Saludos.
Nebire, pero lo importante es llegar a la solución, cierto??? :P
:good:
Nebire:
--- Cita de: "Nilson Yair" ---Bueno, como guardar una sola imagen consume mucho recurso si se tiene encuenta que esta imagen es grande, entonces producirá error.
[Nebire, pero lo importante es llegar a la solución, cierto??? :P
:good:
--- Fin de la cita ---
Bueno, de cuanta memoria estamos hablando ????.. Piensa que si alguien trabaja con un computador con poca memoria es bastante probable que por las mismas razones también trabaje sobre una baja resolución de pantalla (pongamos 800x600) con lo que el consumo de memoria tampoco es excesivo. En cualquier caso sea la memoria que se tenga siempre ha de poderse trabajar con una imagen de tamaño igual a la pantalla.
Lo que quiero decir es que no es conveniente hacer un programa pensando en las limitaciones de tu computador ni en las limitaciones actuales, ya que con ello 'castigas' al resto yen un futuro posiblemente no muy lejano deje de interesar por las limitaciones que le has impuesto. Una solución adecuada sería ofrecer la posibilidad de que pueda adptarse para usar tanto con pocos recursos como con recursos 'sobrados', por ejemplo consultando la memoria de que dispone el equipo puedes decidir si la limitación tiene o no sentido. si tienes más de 128Mb. de RAM, no merece la pena hacer ese tipo de restricciones. Normalmente si alguien tiene esa memoria o menos suele funcionar con un windows anterior al XP que consumen menos recursos (el S.O.)
--- Cita de: "Nilson Yair" ---Nebire, pero lo importante es llegar a la solución, cierto???
--- Fin de la cita ---
Es bueno ser capaz de alcanzar el objetivo que uno tenía propuesto aunque no sea de la forma más óptima. Eso es señal de que uno investiga, piensa y busca soluciones hay quien es una nulidad completa para pensar. A veces se ven mensajes preguntando por cosas tan simples y evidentes que no merece la pensa ni perder el tiempo en responder porque el individuo es un vago que no se ha tomado la molestia mínima y espera que se lo solucionen los demás.
--- Cita de: "Nilson Yair" ---Moskito, me gustaria ver tu solución...
--- Fin de la cita ---
No es asunto que me incumba, pero no creo que sea pertienente pedir a nadie una solución de algo, especialmente si ni siquiera ha manifestrado nada al respecto. La gente participa libremente y cuando decide no entrar en un tema sus razones tendrá, a menudo suele ser porque ya se dió respuesta al tema, pero en fin cada uno dedica su iempo como le parece.
Jimbenit:
:good: Gracias a todos los que respondieron, me ayudaron mucho.
Navegación
[*] Página Anterior
Ir a la versión completa