![]() |
CALLBACK WindowProc
Hola a todos. Ya puse un post sobre este asunto en el otro foro, pero no he logrado desde entonces arreglar el tema.
Estoy intentando crear una funcion COBOL para imitar/sustituit o lo que es lo mismo hacer subclassing de CallWindoProc. Para ello hay que simular algo asi: Código CPP:
Lo hago de la siguiente manera: Código COBOL:
Pero no recibe los parametros bien y no logro entender por que. A veces recibe los recibe, pero solo 1 campo por cada llamada y no los 4 a la vez, y encima lo hace casi siempre en el primer campo, otras veces no recibe nada... En teoria llamamos al WinAPI con STDCALL y va bien, o sea que en teoria deberia funcionar bien con WITh stdcall en PROCEDURE pero no se por que no funciona... A lo mejor alguna opcion de compilacion? He mirado el manual pero no he visto nada que pueda cambiar algo en esto. |
Kuk,
Não entendo muito bem o que pretendes fazer e qual é o erro. Desculpa lá, o meu espanhol é muito fraco e não consigo entender muito bem. No entanto, pelo que vejo, tens uma Procedure Division "with STDCALL" - eu nunca utilizei isso. Nas chamadas a WINAPI aí sim utilizei em muitos casos : Código COBOL:
Tenta explicar-me melhor, pode ser que eu consiga ajudar, Reparei que podes ter problemas com o tipo de USING : pode ser por 2 processos: By Reference or By Value. Isto pode fazer muita diferença. Un Saludo, Rui Pinto |
Rapinto, en princpio lo que intento es simular MDI Form en PowerCOBOL.
En realidad, cada Form en PowerCOBOL se compone de:
Pero a nivel del compilador en modo Diseño, nosotros pensamos que es un Form. Si en en un Form haces GetParent, obtienes el hwnd del ParentForm. Lo que yo hago para simular MDI, es ChildForm.SetParent = ParentForm.hwnd y asi el ParentForm se hace Container del ChildForm. El problema es que cuando haces click en ChildForm, el ParentForm pierde focus, y vice versa. Hablé con gente de C++/Delphi + WinAPI. Me dijeron que en este caso hay que hacer subclassing de la ventana. Es decir:
Código COBOL:
Código COBOL:
Rui, el codigo no es exacto, lo acabo de escribir de memoria (estoy en el trabajo). Pero entenderas lo que hago. Es sustiuir CallWindoProc por MyWndProc, camptar WindowMessage, si es desactivar Focus visual, muevo 0, y llamo default CallWindoProc con PTR-OldWndProc. A ver que opians. |
Kuk,
Estive a analisar melhor e encontrei este texto: AllAPI.net - Your #1 source for using API-functions in Visual Basic! que explica Subclassing muito bem. (Tem exemplo a funcionar bem com a source em VB6). Segundo este texto, o que estás a fazer parece-me numa primeira analise correto. Mas vou continuar a ver melhor. Se descobrires mais alguma coisa diz-me. Saludos, Rui |
Rapinto, ando un poco mal de tiempo, pero lo que he pensafo de probar es en modo OO COBOL. Es decir, crear aplicacion con la opcion 2. Ahi a lo mejor funciona...
Lo que no entiendo es que si llamamos API-s con STDCALL bien, significa que la CALL-CONVENTION es correcta para WinAPI. Pero (!!!), al ser llamada MyWndProc, recibe parametros pero no todos, y en campos diferentes. Lo que he podido detectar ha sido que a veces (no siempre), es como si por cada campo hay 1 llamada. Es decir:
En lugar de llamarse 1 vez con los 4:
Lo que a mi me dice que:
Añadido despues de 13 horas 38 minutos Rui, he encontrado esto en el NetCOBWinUsersGuide.pdf: Cita:
|
Al final he hecho una DLL en C++ a la cual paso el OldWndProc y en la cual he definido MyWndProc.
Funciona 100%! Asi que he podido simular MDI MainForm en PowerCOBOL! :mola: |
Olá,
fiquei curioso para ver como fica uma aplicação Powercobol MDI. Poderia compartilhar um screenshot? Saludos, Emerson |
1 Archivos Adjunto(s)
eslopes, aquí lo tienes ;)
Pero ojo, no es MDI realmente, es sólo una simulación. Lo que se hace es que la ventana "MDI" no pierda foco visualmente. Como verás en los marcos amarillos, visualmente los 2 ControlBox están activos. |
Gracias pelo screenshot.
Entendo que seja uma simulação, pero me parece que a janela CfForm1 não pode ultrapassar os limites da janela principal, certo ? |
eslopes, claro, de eso se trata. La ventana principal se hace Parent de las ventanas Child. Si muevo la ventana Principal, se mueven todas las ventanas.
|
Perdona la ignorancia, pero ... ¿para que necesitas ésto realmente?, porque, por lo que entiendo, con esto puedes tener el foco en 2 form a la vez, creo, ¿no?
Un saludo.- |
Josber, no es eso. Una ventana MDI controla las ventanas "hijo". Entonces, una ventana MDI es como si fuese lo mismo que el escritorio para los programas de Windows.
La ventaja de esto, es que puedes tener una ventana principal a lo Escritorio de Windows, con varias ventanas dentro, las cuales puedes incluso "pestañear" y etc. Muchos programas que usamos son MDI, el UltraEdit, no sé, los compiladores, por jemeplo NetExpress... Lo bueno de esto es poder cargar y cerrar ventanas en el mismo rango de pantalla, es cómodo para aplicaciones grandes. ;) |
| La franja horaria es GMT +2. Ahora son las 14:46. |
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.