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