Ver Mensaje Individual
  #3
Antiguo 12 de marzo de 2015, 09:42
Kuk
Administrador
Última Actividad 03.10.2026 00:00
Posts Posts: 2.500
Likes enviados Enviados: 1038
Likes recibidos Recibidos: 1207

Rapinto, en princpio lo que intento es simular MDI Form en PowerCOBOL.
En realidad, cada Form en PowerCOBOL se compone de:
  • Una WindowForm que es la que contiene SystemMenu, Border etc.
  • Un Frame (Frame de C++, loadable. No hablo de CmFrame), que es en el que realmente ponemos los controles.

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:
  1. Definir propia procedure equivalente a CallWindowProc y posicionar un PROCEDURE-POINTER MyWndProc.
  2. Obtener PROCEDURE-POINTER de CallWindowProc actual, el que actualmente es llamado por el Window:
  3. En el evendo Window.Opened

Código COBOL:
  1. ******** MyWndProc. Va a ser llamado por Windows, por eso tiene STDCALL
  2.  IDENTIFICATION DIVISION.
  3.  PROGRAM-ID. MyWndProc.
  4.  
  5.  WORKING-STORAGE SECTION.
  6.  01  PTR-OldWndProc IS EXTERNAL PIC S9(9) COMP-5.
  7.  
  8.  LINKAGE SECTION.
  9.  01 LNK-RESULT      PIC S9(9) COMP-5.
  10.  
  11.  01 LNK-HWND        PIC S9(9) COMP-5.
  12.  01 LNK-MSG         PIC S9(9) COMP-5.
  13.  01 LNK-WPARAM      PIC  9(9) COMP-5.
  14.  01 LNK-LPARAM      PIC S9(9) COMP-5.
  15.  
  16.  PROCEDURE DIVISION WITH STDCALL USING LNK-HWND LNK-MSG LNK-WPARAM LNK-LPARAM RETURNING LNK-RESULT.
  17.      
  18.      IF  LNK-MSG = <<LOST FOCUS MESSAGE>> NO ME ACURDO EXACTAMENTE
  19.          MOVE 0 TO LNK-MSG
  20.      END-IF
  21.      
  22.      CALL "CallWindowProc" WITH STDCALL USING BY VALUE PTR-OldWndProc
  23.                                               BY VALUE LNK-HWND
  24.                                               BY VALUE LNK-MSG
  25.                                               BY VALUE LNK-WPARAM
  26.                                               BY VALUE LNK-LPARAM
  27.                                               RETURNING LNK-RESULT.
  28.      
  29.      EXIT PROGRAM.
  30.  END PROGRAM MyWndProc.

Código COBOL:
  1. ******** MainForm.Opened
  2.  WORKING-STORAGE SECTION.
  3.  01  WS-HWND        PIC S9(9) COMP-5.
  4.  01  ParentHWND     PIC S9(9) COMP-5.
  5.  01  PTR-OldWndProc IS EXTERNAL PIC S9(9) COMP-5.
  6.  01  PPTR REDEFINES PTR-OldWndProc PROCEDURE-POINTER.
  7.  01  PTR-MyWndProc  PROCEDURE-POINTER.
  8.  
  9.  PROCEDURE DIVISION.
  10.      
  11.      MOVE "hwnd" OF POW-SELF TO WS-HWND
  12.          
  13.      CALL "GetParent" WITH STDCALL USING BY VALUE LNK-HWND
  14.                                          RETURNING ParentHWND.
  15.      
  16.      CALL "GetWindowLong" WITH STDCALL USING BY VALUE ParentHWND
  17.                                              BY VALUE GWL_WNDPROC
  18.                                              RETURNING PPTR.
  19.      
  20.      SET PTR-MyWndProc TO ENTRY "MyWndProc"
  21.      
  22.      CALL "SetWindowLong" WITH STDCALL USING BY VALUE ParentHWND
  23.                                              BY VALUE GWL_WNDPROC
  24.                                              BY VALUE PTR-MyWndProc
  25.                                              RETURNING PPTR.

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.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita