Für PowerBASIC for Windows stehen ab der Version 9.0 verschiedene Befehle SCROLLBAR GET/SET .... neu zur Verfügung.
Bei kritischer Betrachtung kann man zwar feststellen, dass alle Möglichkeiten dieser neuen Befehle bereits bei früheren PB/WIN-Versionen durch entsprechende WIN32API-Aufrufe gegeben waren. Somit ergänzen diese neuen DDT-Befehle lediglich die vielen weiteren DDT-Befehle, mit denen PB/WIN schon in den Versionen 8 und 9 erweitert wurde. Auch bei früheren Befehls-Erweiterungen (z.B. für Drucken und Grafik) gab es schon ähnliche Situationen, wo früher nur durch API-Aufrufe mögliche Aktionen durch neue DDT-Befehle vereinfacht wurden.
Wer also seine Programme gerne von den oftmals ungeliebten WIN32API-Aufrufen freihalten möchte, kann mit den neuen SCROLLBAR-Befehlen ohne die bisher notwendige SCROLLINFO-Struktur und ohne die bisher üblichen Funktionsaufrufe SetScrollInfo() und GetScrollInfo() auskommen.
Nachdem mit PowerBASIC for Windows 9 kein Anwendungsbeispiel für die neuen SCROLLBAR-Befehle mitliefert wird, möchte ich mit meinem folgenden kleinen Demoprogramm zeigen, wie eine Umsetzung ohne SCROLLINFO-Struktur aussehen könnte.
Wer sich ausführlicher über das Steuerelement SCROLLBAR informieren möchte, findet im Internet in der Microsoft MSDN weitaus umfangreichere Informationen. Allerdings berücksichtigt Microsoft innerhalb der MSDN nicht die Möglichkeiten von PowerBASIC PB/WIN und empfiehlt schon deshalb die sonst übliche SCROLLINFO-Struktur zur Behandlung der durch SCROLLBAR ausgelösten Ereignisse.
ACHTUNG: Mir ist aufgefallen, dass in Programmbeispielen im Internet der mögliche Laufbereich immer wieder falsch festgelegt wird. Die Positionen auf der Laufleiste werden durch den linken Rand der Marke (thumb) festgelegt. Arbeitet man mit einer etwas breiteren Marke (d.h. > 1), so ist bei der Festlegung des rechten Randes (SET RANGE) die Breite der Marke zum maximal gewünschten Wert hinzuzufügen (wie hier im Beispiel: HScrollPosMax& + HScrollPage& - 1&).
Code:
'Demo SCROLLBAR für PB/WIN ab Version 9.0
'nur mit PowerBASIC DDT-Befehlen
'ohne SCROLLINFO, ohne WIN32API-Funktionsaufrufe
'Autor: Josef Kirschbaum
'http://www.powerbasic.de
#COMPILE EXE
#DIM ALL
'------------------------------------------------------------------------------
%IDD_DIALOG1 = 101
%IDC_SCROLLBAR1 = 1001
%IDC_BUTTON1 = 1002
%IDC_BUTTON2 = 1003
%IDC_LABEL1 = 1004
%IDC_LABEL2 = 1005
%IDC_LABEL3 = 1006
%IDC_LABEL4 = 1007
%IDC_LABEL5 = 1008
%IDC_LABEL6 = 1009
%IDC_LABEL7 = 1010
'------------------------------------------------------------------------------
CALLBACK FUNCTION ShowDIALOG1Proc()
STATIC HScrollPosMin AS LONG
STATIC HScrollPosMax AS LONG
STATIC HScrollPage AS LONG
STATIC HScrollLine AS LONG
STATIC HScrollPos AS LONG
SELECT CASE AS LONG CB.MSG
CASE %WM_INITDIALOG 'Setzen der Voreinstellungen
HScrollPosMin&=256&
HScrollPosMax&=512&
HScrollPage&=(HScrollPosMax&-HScrollPosMin&)/10&
HScrollLine&=(HScrollPosMax&-HScrollPosMin&)/100&
SCROLLBAR SET RANGE CB.HNDL, %IDC_SCROLLBAR1, HScrollPosMin&, HScrollPosMax& + HScrollPage& - 1&
SCROLLBAR SET PAGESIZE CB.HNDL, %IDC_SCROLLBAR1, HScrollPage&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL1, STR$(HScrollPosMin&)
CONTROL SET TEXT CB.HNDL, %IDC_LABEL3, STR$(HScrollPosMax&)
SCROLLBAR GET POS CB.HNDL, %IDC_SCROLLBAR1 TO HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CONTROL SET TEXT CB.HNDL, %IDC_LABEL4, "Scrollbar position min.: "+STR$(HScrollPosMin&)
CONTROL SET TEXT CB.HNDL, %IDC_LABEL5, "Scrollbar position max.: "+STR$(HScrollPosMax&)
CONTROL SET TEXT CB.HNDL, %IDC_LABEL6, "Scrollbar page size: "+STR$(HScrollPage&)
CONTROL SET TEXT CB.HNDL, %IDC_LABEL7, "Scrollbar line step: "+STR$(HScrollLine&)
CASE %WM_HSCROLL 'Ereignisauswertung horizontale Scrollbar
'ACHTUNG: Auswertung erfolgt nicht über %WM_COMMAND!
SELECT CASE AS LONG CB.CTL
CASE %SB_LEFT 'HOME
HScrollPos& = HScrollPosMin&
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1 , HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CASE %SB_RIGHT 'END
HScrollPos& = HScrollPosMax&
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1 , HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CASE %SB_LINELEFT 'Cursor links
HScrollPos& = MAX&(HScrollPos& - HScrollLine&, HScrollPosMin&)
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1, HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CASE %SB_LINERIGHT 'Cursor rechts
HScrollPos& = MIN&(HScrollPos& + HScrollLine&, HScrollPosMax&)
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1, HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CASE %SB_PAGELEFT 'Page up
HScrollPos& = MAX&(HScrollPos& - HScrollPage&, HScrollPosMin&)
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1, HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CASE %SB_PAGERIGHT 'Page down
HScrollPos& = MIN&(HScrollPos& + HScrollPage&, HScrollPosMax&)
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1, HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CASE %SB_THUMBPOSITION
'Endposition nach dem Ziehen der Marke mit der Maus
SCROLLBAR GET TRACKPOS CB.HNDL, %IDC_SCROLLBAR1 TO HScrollPos&
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1, HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
CASE %SB_THUMBTRACK
'Zwischenpositionen beim Ziehen der Marke mit der Maus
SCROLLBAR GET TRACKPOS CB.HNDL, %IDC_SCROLLBAR1 TO HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
END SELECT
CASE %WM_COMMAND
SELECT CASE AS LONG CB.CTL
CASE %IDC_BUTTON1 'Schaltfläche SB_MIN
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
HScrollPos& = HScrollPosMin&
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1 , HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
END IF
CASE %IDC_BUTTON2 'Schaltfläche SB_MAX
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
HScrollPos& = HScrollPosMax&
SCROLLBAR SET POS CB.HNDL, %IDC_SCROLLBAR1 , HScrollPos&
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, STR$(HScrollPos&)
END IF
END SELECT
END SELECT
END FUNCTION
'------------------------------------------------------------------------------
FUNCTION PBMAIN()
LOCAL hDlg AS DWORD
DIALOG NEW 0, "SCROLLBAR GET/SET ...... - Demo", , , 250, 160, %WS_SYSMENU, TO hDlg
CONTROL ADD SCROLLBAR, hDlg, %IDC_SCROLLBAR1, "", 10, 95, 225, 10
CONTROL SET COLOR hDlg, %IDC_SCROLLBAR1, -1&, %RGB_MIDNIGHTBLUE
CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "SB_MIN", 10, 115, 50, 15
CONTROL ADD BUTTON, hDlg, %IDC_BUTTON2, "SB_MAX", 185, 115, 50, 15
CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "", 5, 80, 40, 10
CONTROL ADD LABEL, hDlg, %IDC_LABEL2, "", 105, 80, 40, 11, %SS_CENTER
CONTROL ADD LABEL, hDlg, %IDC_LABEL3, "", 200, 80, 40, 10, %SS_RIGHT
CONTROL ADD LABEL, hDlg, %IDC_LABEL4, "", 10, 10, 100, 10
CONTROL ADD LABEL, hDlg, %IDC_LABEL5, "", 10, 23, 100, 10
CONTROL ADD LABEL, hDlg, %IDC_LABEL6, "", 10, 36, 100, 10
CONTROL ADD LABEL, hDlg, %IDC_LABEL7, "", 10, 49, 100, 10
DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc
END FUNCTION
Extras: