Dave:
Thanks for the suggestions. In this particular case I don't really care when things are drawn, but in other apps I have it makes a difference.
I'll explore your suggestions along with others I've thought about.
Announcement
Collapse
No announcement yet.
Graphic attach, .... Redraw
Collapse
X
-
An alternative to the suggestion in post #8
Code:CASE %WM_INITDIALOG ' Initialization handler GRAPHIC ATTACH DlgHnd, %GFX_Relations, Redraw DIALOG POST DlgHnd, %WM_USER + 1000, 0, 0 CASE %WM_USER + 1000 DIALOG REDRAW CBHNDL ' this makes sure that WM_PAINT ' at end of Dialog creation doesn't ' occur after drawing statements ' (which causes 'Graphic Redraw') PostMessage(DlgHnd, %DLG_MESS, %LB_SETSEL, 1) PostMessage(DlgHnd, %DLG_MESS, %LB_GETSEL, 0)
Code:ShowWindow hWnd&, iCmdShow UpdateWindow hWnd&
Leave a comment:
-
..I'll have to make some changes.
Code:CASE %WM_INITDIALOG ' Initialization handler GRAPHIC ATTACH DlgHnd, %GFX_Relations, Redraw DIALOG POST DlgHnd, %WM_USER + 1000, 0, 0 CASE %WM_USER + 1000 LOCAL Msg As tagMsg ' this makes sure that WM_PAINT DO WHILE PeekMessage(Msg, 0, 0, 0, %PM_NOREMOVE) ' at end of Dialog creation doesn't Dialog DoEvents 1 ' occur after drawing statements LOOP ' (which causes 'Graphic Redraw') PostMessage(DlgHnd, %DLG_MESS, %LB_SETSEL, 1) PostMessage(DlgHnd, %DLG_MESS, %LB_GETSEL, 0)
Leave a comment:
-
Dave,
Actually, it shouldn't matter where GRAPHIC ATTACH is specified. However, I found out why the behavior is as it is. I made the assumption that "posted" messages are placed at the end of the message que and processed after all other messages are processed. This is apparently not the case during setup. Therefore, I'll have to make some changes.
Just goes to show that ASSUME makes "an *** out of me".
Leave a comment:
-
Walt,
I get the same results from your short version code whether compiled with PBWin804, 90 or 901.
I'm not sure the graphic is being 'updated' except for the first time through, when the code in the %WM_INITDIALOG case is processed.
If I comment out all statements in %WM_INITDIALOG and move the GRAPHIC ATTACH.. statement to..
Code:IF CtlMess = %LBN_SELCHANGE OR CtlMess = %LBN_DBLCLK Then GRAPHIC ATTACH DlgHnd, %GFX_Relations
Leave a comment:
-
No, Cliff.
In PBWIN8, if GRAPHIC ATTACH ........ REDRAW was specified, the graphic was drawn to a buffer and would not be updated unless GRAPHIC REDRAW was specifically requested or the graphic control was covered by another window, the control was moved, or the dialog was moved. That made it possible for an app to have several threads performing graphic operations and the graphic would not be updated until GRAPHIC REDRAW was specified.
In the above examples GRAPHIC ATTACH .... REDRAW is specified but GRAPHIC REDRAW is not. The graphic control is updated anyway.
Leave a comment:
-
From the docs
All PowerBASIC graphical displays are persistent -- they will be automatically redrawn even if minimized or temporarily covered by another window.
Leave a comment:
-
Steve:
Below is compilable code. However, without the databases no drawing will occur. Perhaps it's the way I'm implementing the routines.
Code:#COMPILE EXE DEFLNG A - Z #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF %IDD_DIALOG1 = 101 %LBX_Relations = 1001 %LBL_Relations = 1002 %GFX_Relations = 1003 %DLG_MESS = %WM_USER + 500 $NULSPC = CHR$(0 TO 32) DECLARE FUNCTION Set_Box(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, Ag$(), Sz) AS LONG DECLARE FUNCTION Relations_DLG(BYVAL hParent AS DWORD) AS LONG DECLARE CALLBACK FUNCTION Relations_CB() FUNCTION PBMAIN() Relations_DLG %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION Relations_CB() STATIC NumHeads AS DWORD STATIC NumDatas AS DWORD STATIC Nd AS DWORD STATIC TxtWide AS DWORD STATIC ChrWide AS DWORD STATIC ChrHigh AS DWORD STATIC NumAg AS DWORD STATIC Dstart() AS DWORD STATIC Dfield() AS DWORD STATIC Dheads() AS STRING STATIC Ddat() AS STRING STATIC Abbr() AS STRING STATIC Ag() AS STRING STATIC Dcat AS STRING LOCAL DlgHnd AS DWORD LOCAL CtlHnd AS DWORD LOCAL Wparam AS LONG LOCAL Lparam AS LONG LOCAL CtlMess AS LONG LOCAL TxtHigh AS LONG LOCAL A AS STRING DlgHnd = CBHNDL CtlHnd = CBCTL Lparam = CBLPARAM Wparam = CBWPARAM SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG ' Initialization handler DIM Ag$(1 TO 1) DIM Dstart(1 TO 1) DIM Dfield(1 TO 1) DIM Dheads$(1 TO 1) DIM Ddat$(1 TO 1) CALL Agreements(Ag$(), NumAg) CALL Read_Db(CURDIR$ + "\gamedb\$Leaders.FDB", Numheads, NumDatas, Dstart(), _ Dfield(), Dheads$(), Dcat$, Ddat$()) CALL Read_Db(CURDIR$ + "\gamedb\$Relations.FDB", Numheads, Nd, Dstart(), _ Dfield(), Dheads$(), Dcat$, Ddat$()) 'if Val(Mid$(Ddat$(1), Dstart(5), Dfield(5)) = 0 then ' DestroyWindow(DlgHnd) 'end if Set_Box(DlgHnd, %LBX_Relations, Ag$(), NumAg) GRAPHIC ATTACH DlgHnd, %GFX_Relations, REDRAW GRAPHIC COLOR RGB(128, 0, 0), -2 FONT NEW "courier new", 10, 3, 0, 1, 0 TO Fhndl GRAPHIC SET FONT Fhndl A$ = "0" GRAPHIC CHR SIZE TO ChrWide, ChrHigh ChrWide = ChrWide * 2 ChrHigh = ChrHigh * 2 A$ = SPACE$(Dfield(2)) GRAPHIC TEXT SIZE A$ TO TxtWide, TxtHigh PostMessage(DlgHnd, %DLG_MESS, %LB_SETSEL, 1) PostMessage(DlgHnd, %DLG_MESS, %LB_GETSEL, 0) CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE Wparam THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND ' Process control notifications CtlMess = CBCTLMSG SELECT CASE AS LONG CtlHnd CASE %LBX_Relations IF CtlMess = %LBN_SELCHANGE OR CtlMess = %LBN_DBLCLK THEN GRAPHIC CLEAR X = TxtWide + ChrWide Y = 0 CONTROL GET SIZE DlgHnd, %GFX_Relations TO Gfxx, Gfxy FOR I = 1 TO NumDatas A$ = RTRIM$(MID$(Ddat$(I), Dstart(2), Dfield(2)), ANY $NULSPC) IF VAL(MID$(Ddat$(I), Dstart(5), Dfield(5))) = 0 THEN A$ = "?" GRAPHIC SET POS(X, Y) GRAPHIC PRINT A$ Lx! = X + TxtWide \ 2 Ly! = Y + ChrHigh \ 2 GRAPHIC LINE (Lx!, Ly!) - (Lx!, Gfxy), %BLUE X = X + TxtWide + ChrWide NEXT I X = 0 Y = ChrHigh FOR I = 1 TO NumDatas A$ = RTRIM$(MID$(Ddat$(I), Dstart(2), Dfield(2)), ANY $NULSPC) IF VAL(MID$(Ddat$(I), Dstart(5), Dfield(5))) = 0 THEN A$ = "?" GRAPHIC SET POS(X, Y) GRAPHIC PRINT A$ Lx! = X + TxtWide + ChrWide Ly! = Y + ChrHigh \ 4 GRAPHIC LINE (Lx!, Ly!) - (Gfxx, Ly!), %BLUE Y = Y + ChrHigh NEXT I Rad! = 4 * ATN(1) Rad! = Rad! / 180 Radius = 5 FOR I = 1 TO Nd IF VAL(MID$(Ddat$(I), Dstart(5), Dfield(5))) < 1 THEN ITERATE FOR A$ = RTRIM$(MID$(Ddat$(I), Dstart(2), Dfield(2)), ANY $NULSPC) B$ = RTRIM$(MID$(Ddat$(I), Dstart(4), Dfield(4)), ANY $NULSPC) Peace = VAL(MID$(Ddat$(I), Dstart(7), Dfield(7))) Row = 0 Col = 0 FOR J = 1 TO NumDatas IF VAL(MID$(Ddat$(I), Dstart(5), Dfield(5))) < 1 THEN ITERATE FOR C$ = RTRIM$(MID$(Ddat$(J), Dstart(2), Dfield(2)), ANY $NULSPC) IF A$ = C$ THEN Row = J EXIT FOR END IF NEXT J FOR J = 1 TO NumDatas IF VAL(MID$(Ddat$(I), Dstart(5), Dfield(5))) < 1 THEN ITERATE FOR C$ = RTRIM$(MID$(Ddat$(J), Dstart(2), Dfield(2)), ANY $NULSPC) IF B$ = C$ THEN Col = J EXIT FOR END IF NEXT J Cx! = ((TxtWide + ChrWide) * Col) + TxtWide \ 2 Cy! = (ChrHigh * Row) + ChrHigh \ 4 Lx! = Cx! Ly! = Cy! - Radius GRAPHIC SET POS(Lx!, Ly!) FOR K = 0 TO 360 XX! = Cx! + Radius * SIN(K * Rad!) YY! = Cy! - Radius * COS(K * Rad!) IF Peace > 0 THEN GRAPHIC LINE (Lx!, Ly!) - (XX!, YY!), %RED ELSE GRAPHIC LINE (Lx!, Ly!) - (XX!, YY!), %GREEN END IF Lx! = XX! Ly! = YY! NEXT K IF Peace > 0 THEN GRAPHIC PAINT (Cx!, Cy!), %RED, %RED ELSE GRAPHIC PAINT (Cx!, Cy!), %GREEN, %GREEN END IF NEXT I END IF 'GRAPHIC REDRAW END SELECT CASE %DlG_MESS IF Wparam = %LB_SETSEL THEN LISTBOX SELECT DlgHnd, %LBX_Relations, Lparam IF Wparam = %LB_GETSEL THEN Wparam = MAK(DWORD, %LBX_Relations, %LBN_DBLCLK) CONTROL HANDLE DlgHnd, %LBX_Relations TO CtlHnd Lparam = MAK(DWORD, CtlHnd, 0) PostMessage(DlgHnd, %WM_COMMAND, Wparam, Lparam) END IF END SELECT END FUNCTION '------------------------------------------------------------------------------ ' ** Sample Code ** '------------------------------------------------------------------------------ FUNCTION Set_Box(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, Ag$(), Sz) AS LONG LOCAL I AS LONG FOR I = 1 TO Sz LISTBOX ADD hDlg, lID, Ag$(I) NEXT I END FUNCTION '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION Relations_DLG(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG LOCAL hDlg AS DWORD DIALOG NEW hParent, "Foreign Relations", 86, 55, 429, 223, %WS_OVERLAPPED _ OR %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _ %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _ %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD LISTBOX, hDlg, %LBX_Relations, , 5, 10, 95, 195, %WS_CHILD OR _ %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %WS_HSCROLL OR %LBS_NOTIFY OR _ %LBS_HASSTRINGS, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING _ OR %WS_EX_RIGHTSCROLLBAR CONTROL ADD LABEL, hDlg, %LBL_Relations, "War", 100, 10, 325, 10, _ %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER, %WS_EX_LEFT OR %WS_EX_LTRREADING CONTROL ADD GRAPHIC, hDlg, %GFX_Relations, "", 110, 25, 315, 195 CONTROL SET COLOR hDlg, %LBL_Relations, RGB(128, 0, 0), -1 'Set_Box hDlg, %LBX_Relations, 30 DIALOG SHOW MODAL hDlg, CALL Relations_CB TO lRslt FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB Agreements(Ag$(), Sz) DATA "War" DATA "Preferred Trading Partner" DATA "Trade Embargos" DATA "Mutual Protection Pact" DATA "War Passage" DATA "Safe Passage" DATA "Trade Passage" DATA "Worker Passage" DATA "Military Alliances" Sz = DATACOUNT REDIM Ag$(1 TO Sz) FOR I = 1 TO Sz Ag$(I) = READ$(I) NEXT I END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB Read_Db(FPname$, Numheads, NumDatas, Ds(), Df(), Dh$(), Dct$, Ddt$()) LOCAL Cnt AS LONG LOCAL Offs AS LONG Cnt = 1 Offs = 4 OPEN FPname$ FOR BINARY AS #1 GET #1, Cnt, NumHeads Cnt = Cnt + Offs GET #1, Cnt, NumDatas Cnt = Cnt + Offs REDIM Dh$(1 TO NumHeads) REDIM Ds(1 TO NumHeads) REDIM Df(1 TO NumHeads) REDIM Ddt$(1 TO NumDatas) FOR I = 1 TO NumHeads GET #1, Cnt, Ds(I) Cnt = Cnt + Offs GET #1, Cnt, Df(I) Cnt = Cnt + Offs NEXT I FOR I = 1 TO NumHeads Dh$(I) = SPACE$(Df(I)) GET #1, Cnt, Dh$(I) Cnt = Cnt + Df(I) NEXT I Dct$ = SPACE$(Ds(NumHeads) + Df(NumHeads)) GET #1, Cnt, Dct$ Cnt = Cnt + NumHeads Offs = Ds(NumHeads) + Df(NumHeads) FOR I = 1 TO NumDatas Ddt$(I) = SPACE$(Ds(NumHeads) + Df(NumHeads)) GET #1, Cnt, Ddt$(I) Cnt = Cnt + Offs NEXT I CLOSE #1 END SUB
Code:#COMPILE EXE DEFLNG A - Z '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #PBFORMS BEGIN INCLUDES #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #IF NOT %DEF(%COMMCTRL_INC) #INCLUDE "COMMCTRL.INC" #ENDIF #INCLUDE "PBForms.INC" #PBFORMS END INCLUDES '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------ #PBFORMS BEGIN CONSTANTS %IDD_DIALOG1 = 101 %LBX_Relations = 1001 %GFX_Relations = 1002 #PBFORMS END CONSTANTS %DLG_MESS = %WM_USER + 500 '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Declarations ** '------------------------------------------------------------------------------ DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION SampleListBox(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, BYVAL _ lCount AS LONG) AS LONG DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG #PBFORMS DECLARATIONS '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------ FUNCTION PBMAIN() PBFormsInitComCtls (%ICC_WIN95_CLASSES OR %ICC_DATE_CLASSES OR _ %ICC_INTERNET_CLASSES) ShowDIALOG1 %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION ShowDIALOG1Proc() LOCAL DlgHnd AS DWORD LOCAL CtlHnd AS DWORD LOCAL DlgMess AS DWORD LOCAL Wparam AS LONG LOCAL Lparam AS LONG DlgHnd = CBHNDL CtlHnd = CBCTL Wparam = CBWPARAM Lparam = CBLPARAM SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG ' Initialization handler GRAPHIC ATTACH DlgHnd, %GFX_Relations, REDRAW PostMessage(DlgHnd, %DLG_MESS, %LB_SETSEL, 1) PostMessage(DlgHnd, %DLG_MESS, %LB_GETSEL, 0) CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND CtlMess = CBCTLMSG ' Process control notifications SELECT CASE AS LONG CtlHnd CASE %LBX_Relations IF CtlMess = %LBN_SELCHANGE OR CtlMess = %LBN_DBLCLK THEN GRAPHIC CLEAR GRAPHIC GET CLIENT TO X, Y Rad! = 4 * ATN(1) Rad! = Rad! / 180 Radius = 25 Cx! = X \ 2 Cy! = Y \ 2 Lx! = Cx! Ly! = Cy! - Radius GRAPHIC SET POS(Lx!, Ly!) FOR K = 0 TO 360 STEP 15 XX! = Cx! + Radius * SIN(K * Rad!) YY! = Cy! - Radius * COS(K * Rad!) GRAPHIC LINE (Lx!, Ly!) - (XX!, YY!), %RED Lx! = XX! Ly! = YY! NEXT K GRAPHIC PAINT (Cx!, Cy!), %RED, %RED END IF CASE %GFX_Relations END SELECT CASE %DlG_MESS IF Wparam = %LB_SETSEL THEN LISTBOX SELECT DlgHnd, %LBX_Relations, Lparam IF Wparam = %LB_GETSEL THEN Wparam = MAK(DWORD, %LBX_Relations, %LBN_DBLCLK) CONTROL HANDLE DlgHnd, %LBX_Relations TO CtlHnd Lparam = MAK(DWORD, CtlHnd, 0) PostMessage(DlgHnd, %WM_COMMAND, Wparam, Lparam) END IF END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Sample Code ** '------------------------------------------------------------------------------ FUNCTION SampleListBox(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, BYVAL lCount _ AS LONG) AS LONG LOCAL i AS LONG FOR i = 1 TO lCount LISTBOX ADD hDlg, lID, USING$("Test Item #", i) NEXT i END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG #PBFORMS BEGIN DIALOG %IDD_DIALOG1->-> LOCAL hDlg AS DWORD DIALOG NEW hParent, "Dialog1", 133, 70, 314, 180, %WS_POPUP OR %WS_BORDER _ OR %WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _ %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD LISTBOX, hDlg, %LBX_Relations, , 10, 5, 80, 160, %WS_CHILD OR _ %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %LBS_NOTIFY, _ %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _ %WS_EX_RIGHTSCROLLBAR CONTROL ADD GRAPHIC, hDlg, %GFX_Relations, "", 100, 5, 210, 160 #PBFORMS END DIALOG SampleListBox hDlg, %LBX_Relations, 30 DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt #PBFORMS BEGIN CLEANUP %IDD_DIALOG1 #PBFORMS END CLEANUP FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------
Last edited by Walt Decker; 1 Apr 2009, 05:06 PM.
Leave a comment:
-
Sometimes Windows may redraw the window, for example if you move the window, minimize and then maximize the window, cover it with another window then uncover it, etc. If it is something else, can you post code that exhibits this behavior or send it to support @ powerbasic.com?
Leave a comment:
-
Graphic attach, .... Redraw
GRAPHIC ATTACH, Hndl, CtrlID, REDRAW appears to work differently in 9x than in 8x. The redraw seems to happen automatically without specifically requesting GRAPHIC REDRAW.
Is there some way to suppress this behavior?Tags: None
Leave a comment: