Download text file
#if 0
    ----------------------------                      PowerBASIC v8.x
 ---|          DASoft          |------------------------------------------
    ----------------------------         Code           DATE: 2006-05-04
    | FILE NAME  2 Dialogs.bas |          by
    ----------------------------  Don Schullian, Jr.

              This code is released into the Public Domain
       ----------------------------------------------------------
        No guarantee as to the viability, accuracy, or safety of
         use of this code is implied, warranted, or guaranteed
       ----------------------------------------------------------
                         Use at your own risk!
       ----------------------------------------------------------
                  CONTACT AUTHOR AT don@DASoftVSS.com
 -------------------------------------------------------------------------

The reason this code came about was that I had a small program that needed
2 dialogs. Both of which had a sever amount of data and number of controls
that needed to be placed. As both were static and only needed to be setup
once I felt it better to flip between existing dialogs rather than go
through the setup process each time.

Dialog2 needed to know what transpired on Dialog1 to properly store events
on that screen and Dialog1 needed to know if the current process taking
place on Dialog2 resulted in a termination or continuance of the process.

After much testing I've found the code below presents the smoothest path
to get both dialogs up, running, and reporting. You'll note that there are
no GLOBAL variables used in this code. Also, I'm using DIALOG POST and the
USER DATA AREAs to send messages back and forth and reading the incoming
values in %WM_SHOWWINDOW AND %WM_COMMAND\%MSG_IN. It's basically a "pick
your poison" situation.

#endif

#COMPILE EXE
#DIM ALL
#DEBUG ERROR ON

#INCLUDE "WIN32API.INC"

%IDC_BUTTON1 =    1
%IDC_BUTTON2 =    2
%MSG_IN      = 2003
%MSG_Setup   = 3000

DECLARE SUB ShowDIALOG2(BYVAL hDlg1???)
DECLARE CALLBACK FUNCTION ShowDIALOG1Proc()
DECLARE CALLBACK FUNCTION ShowDIALOG2Proc()
'
'------------------------------------------------------------------------------
'
CALLBACK FUNCTION ShowDIALOG1Proc()

  STATIC hWndSaveFocus AS DWORD
  STATIC  MsgNo        AS LONG

  LOCAL hDlg2          AS DWORD
  LOCAL  Mno           AS LONG
  LOCAL zTxt           AS ASCIIz PTR

  SELECT CASE AS LONG CBMSG
    CASE %WM_INITDIALOG : DIALOG POST CBHNDL, %WM_COMMAND, MAK(DWORD,%MSG_Setup,0), 0
    CASE %WM_NCACTIVATE : IF ISFALSE CBWPARAM THEN
                              hWndSaveFocus = GetFocus()
                            ELSEif hWndSaveFocus THEN
                              SetFocus(hWndSaveFocus)
                              hWndSaveFocus = 0
                          END IF
    CASE %WM_SHOWWINDOW : IF CBWPARAM <> 0 THEN
                            DIALOG GET USER CBHNDL, 1 TO hDlg2
                            DIALOG SHOW STATE hDlg2, %SW_HIDE
                            DIALOG GET USER CBHNDL, 2 TO Mno
                            IF Mno > 0 THEN
                              CONTROL SET TEXT CBHNDL, 1000, "Msg from red" & STR$(Mno)
                              DIALOG SET USER CBHNDL, 2, 0
                            END IF
                          END IF
    CASE %WM_COMMAND    : SELECT CASE AS LONG CBCTL
                            CASE %MSG_Setup   : ShowDIALOG2 CBHNDL
                            CASE %MSG_IN      : IF CBLPARAM > 1 THEN
                                                  zTxt = CBLPARAM
                                                  CONTROL SET TEXT CBHNDL, 1000, @zTxt
                                                END IF
                            CASE %IDC_BUTTON1 : IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                                                  MsgNo = IIF(MsgNo=1,2,1)
                                                  DIALOG GET USER CBHNDL, 1 TO hDlg2
                                                  DIALOG POST hDlg2, %WM_COMMAND, MAK(DWORD,%MSG_IN,0), MsgNo
                                                  DIALOG SHOW STATE hDlg2, %SW_SHOW
                                                END IF
                            CASE %IDC_BUTTON2 : IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                                                  DIALOG GET USER CBHNDL, 1 TO hDlg2
                                                  DIALOG END hDlg2 , 0
                                                  DIALOG END CBHNDL, 0
                                                END IF
                          END SELECT
  END SELECT

END FUNCTION
'
'------------------------------------------------------------------------------
'
CALLBACK FUNCTION ShowDIALOG2Proc()

  STATIC hWndSaveFocus AS DWORD
  STATIC  MsgNo        AS LONG
  STATIC zTxt          AS ASCIIz * 80

  LOCAL  hDlg1         AS DWORD

  SELECT CASE AS LONG CBMSG
    CASE %WM_INITDIALOG : DIALOG POST CBHNDL, %WM_COMMAND, MAK(DWORD,%MSG_Setup,0), 0
    CASE %WM_NCACTIVATE : IF ISFALSE CBWPARAM THEN
                              hWndSaveFocus = GetFocus()
                            ELSEif hWndSaveFocus THEN
                              SetFocus(hWndSaveFocus)
                              hWndSaveFocus = 0
                          END IF
    CASE %WM_SHOWWINDOW : IF CBWPARAM <> 0 THEN
                            DIALOG GET USER CBHNDL, 1 TO hDlg1
                            DIALOG SHOW STATE hDlg1, %SW_HIDE
                          END IF
    CASE %WM_COMMAND    : SELECT CASE AS LONG CBCTL
                            CASE %MSG_Setup   : DIALOG GET USER CBHNDL, 1 TO hDlg1
                                                DIALOG SHOW STATE hDlg1, %SW_SHOW
                            CASE %MSG_IN      : SELECT CASE CBLPARAM
                                                  CASE 1 : CONTROL SET TEXT CBHNDL, 1000, "Msg 1 from blue"
                                                  CASE 2 : CONTROL SET TEXT CBHNDL, 1000, "Msg 2 from blue"
                                                END SELECT
                            CASE %IDC_BUTTON1 : IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                                                  MsgNo = IIF(MsgNo=1,2,1)
                                                  DIALOG GET USER CBHNDL, 1 TO hDlg1
                                                  IF MsgNo = 1 THEN
                                                      DIALOG SET USER hDlg1, 2, 34
                                                      DIALOG POST hDlg1, %WM_COMMAND, MAK(DWORD,%MSG_IN,0), MsgNo
                                                    ELSE
                                                      zTxt = "Hello World"
                                                      DIALOG POST hDlg1, %WM_COMMAND, MAK(DWORD,%MSG_IN,0), VARPTR(zTxt)
                                                  END IF
                                                  DIALOG SHOW STATE hDlg1, %SW_SHOW
                                                END IF
                          END SELECT
  END SELECT

END FUNCTION
'
'------------------------------------------------------------------------------
'
FUNCTION PBMAIN ()

  LOCAL hDlg1 AS DWORD

  DIALOG NEW PIXELS, %HWND_DESKTOP, "", 200, 200, 200, 200, %WS_POPUP OR %WS_BORDER OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING, TO hDlg1
  DIALOG  SET COLOR   hDlg1, -1, %BLUE
  CONTROL ADD BUTTON, hDlg1, %IDC_BUTTON1, "Red" , 128,   8, 56, 24
  CONTROL ADD LABEL , hDlg1, 1000        , ""    ,   8,  90,184, 21, %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER OR %SS_CENTERIMAGE, %WS_EX_LEFT OR %WS_EX_LTRREADING
  CONTROL SET COLOR   hDlg1, 1000, %BLACK, %WHITE
  CONTROL ADD BUTTON, hDlg1, %IDC_BUTTON2, "Exit", 136, 168, 56, 24

  DIALOG SHOW MODAL hDlg1, CALL ShowDIALOG1Proc

END FUNCTION
'
'------------------------------------------------------------------------------
'
SUB ShowDIALOG2(BYVAL hDlg1 AS DWORD)

  LOCAL hDlg2 AS DWORD

  DIALOG NEW PIXELS, %HWND_DESKTOP, "", 400, 200, 200, 200, %WS_POPUP OR %WS_BORDER OR %WS_VISIBLE OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg2
  DIALOG  SET COLOR   hDlg2, -1, %RED
  CONTROL ADD LABEL , hDlg2, 1000        , ""    ,   8,  90,184, 21, %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER OR %SS_CENTERIMAGE, %WS_EX_LEFT OR %WS_EX_LTRREADING
  CONTROL SET COLOR   hDlg2, 1000, %BLACK, %WHITE
  CONTROL ADD BUTTON, hDlg2, %IDC_BUTTON1, "Blue", 128, 8, 56, 24

  DIALOG SET USER hDlg1, 1, hDlg2
  DIALOG SET USER hDlg2, 1, hDlg1
  DIALOG SHOW MODAL hDlg2, CALL ShowDIALOG2Proc

END SUB