@cholok,
post #19
Testowałem biblioteki są bardzo fajne i prawidłowo działają pod os 1.3
Pomocny będzie zwłaszcza "Cycle.Gadget" zawarty w gadget.library
Widząc ten rodzaj gadget'u w DevPac'u 3.02 sądziłem,że jest on umieszczony w intuition.library.
Czy to oznacza ,że amiga OS nie posiada go standardowo...?
Sprawdziłem z ciekawości sam DevPac nie stosuje biblioteki gadget.library więc jak to jest?
Pozdrawiam.
P.S
Rozwiązałem wreszcie problem RadioButton'ów pisząc własną implementację koncepcji "MutualExclude"
w oparciu o funkcję RectFill().Zamieszczam cały działający przykład..
;----------------------------------------------------------------------
;Program testowy: gadgety typu RadioButton
;(1).Otwieramy okno i wstawiamy na nim przyciski podzielona na dwie grupy.
;(2).Przyciski funkcjonują w trybie (GADHNONE)
;(3).Chcemy aby aktywowanie jednego przycisku gasiło pozostałe w grupie?
;(4).Gadgety reagują na klawisz myszy w trybie (GADGETDOWN)
;Testy: OK!!! Działa!!!
;Zastosowanie:
;Funkacja "RadioButtonSwitch" obsługuje przyciski RadioButton
;Po otwarciu okna musimy wywołać procedurę RadioButtonSwitch by
;ustawiona w polu (Flags) struktury (Gadget) flaga (SELECTED)
;została podświetlona na oknie. Teraz po odebraniu komunikatu
;(IDCMP) o wciśnieciu dowolnego gadgetu ponownie wywołujemy
;procedurę RadioButtonSwitch aby doszło do podmiany podświetlenia.
;CPU: MC68000
;Assembler: DevPac v3.02
;Platforma: Amiga 500/OS 1.3/Kickstart(v34)
Exec: equ 4
OldOpenLibrary: equ -408
CloseLibrary: equ -414
OpenWindow: equ -204
CloseWindow: equ -72
WaitPort: equ -384
GetMsg: equ -372
ReplyMsg: equ -378
SetDrMd: equ -354 ;Tryb rysowania na RastPort.
RectFill: equ -306 ;Rysuje wypełniony kwadrat.
RefreshGadgets: equ -222
DisplayBeep: equ -96
;Pola bitowe zmiennej (Type) struktury (NewWindow)
WBENCHSCREEN: EQU $0001 ;Wyswietl okno na Workbench'u
;Pola bitowe zmiennej (Flags) struktury (NewWindow)
WINDOWDRAG: EQU $0002 ;Belka do przemieszczania okna.
WINDOWDEPTH: EQU $0004 ;Gadgety do przeslaniania okien.
WINDOWCLOSE: EQU $0008 ;Gadget do zamykania okna.
ACTIVATE: EQU $1000 ;Wyswietlone jako aktywne.
;Pola bitowe zmiennej (IDCMP_Flags) struktury (NewWindow)
GADGETDOWN: EQU $0020 ;Jedynie wćiśnieto przycisk myszy nad gadgetem.
GADGETUP: EQU $0040 ;Wciśnięto i puszczono przycisk myszy.
CLOSEWINDOW: EQU $0200 ;Dostaniemy komunikat z gadgetu zamykania.
;Flags bit status for Gadget struct.
GADGHCOMP: EQU $0000
GADGHBOX: EQU $0001 ;Po wcisnieciu gadgetu rysuje na okolo ramke.
GADHNONE: EQU $0003 ;Po wcisnieciu gadgetu nie dzieje sie nic.
DISABLED: EQU $0100
SELECTED: EQU $0080 ;Aktywny odrazu
;Activation bit status for Gadget struct.
RELVERIFY: EQU $0001 ;Sygnalizuj oknu puszczenie lewego przycisku myszy.
GADGIMMEDIATE: EQU $0002 ;Sygnalizuj oknu wcisniecie lewego przycisku myszy.
TOGGLESELECT: EQU $0100 ;Gadget przelacznik typu CheckBox
;Gadget Type bits status for Gadget struct.
BOOLGADGET: EQU $1 ;przycisk
Start: move.l Exec.w,a6
lea GfxName(pc),a1
jsr OldOpenLibrary(a6)
tst.l d0
beq Error_0
move.l d0,GfxBase
;-----------------------
move.l Exec.w,a6
lea IntName(pc),a1
jsr OldOpenLibrary(a6)
tst.l d0
beq Error_1
move.l d0,IntBase
;-----------------------
move.l IntBase,a6
move.l #NewWindow,a0
jsr OpenWindow(a6)
tst.l d0
beq Error_2
move.l d0,WindowBase
;-----------------------
RadioButtonInit: move.l #Gadget_Button_001,a0 ; A0 = Początek listy modyfikowanych gadgetów.
move.l #0,a1 ; A1 = Adres gadgetu,który od teraz będzie SELECTED.
move.l #$55555555,d0 ; Identyfikator grupy przycisków typu (Radio_Button).
bsr RadioButtonSwitch
move.l #$66666666,d0 ; Identyfikator grupy przycisków typu (Radio_Button).
bsr RadioButtonSwitch
;-----------------------
Wait_Message: move.l WindowBase(pc),a0
move.l $56(a0),a0 ;MsgPort czyli UserPort okna.
move.l Exec.w,a6
jsr WaitPort(a6)
move.l WindowBase(pc),a0
move.l $56(a0),a0
move.l Exec.w,a6
jsr GetMsg(a6)
tst.l d0
beq.s Wait_Message
move.l d0,a1
move.l 20(a1),d2 ;do d2 pobieramy rodzaj komunikatu IDCMP
move.l 28(a1),a2 ;do a2 pobieramy adres gadgetu ktory wyslal komunikat.
move.l Exec.w,a6
jsr ReplyMsg(a6)
cmp.l #CLOSEWINDOW,d2
beq Koniec
cmp.l #GADGETDOWN,d2
beq.s Gadget_Click
bra.s Wait_Message
Gadget_Click:
;teraz w rej. a2 mamy adres gadgetu ktory wyslal komunikat "GADGETDOWN"
clr.l d0
move.w 38(a2),d0
;teraz rej. d0 = odczytane pole Gadget_ID
;z gadgetu ktory wyslal komunikat i na podstawie
;numeru z pola Gadget_ID identyfikujemy dany gadget!
cmp.w #1,d0
beq.s Gadget_Nr1
cmp.w #2,d0
beq Gadget_Nr2
cmp.w #3,d0
beq Gadget_Nr3
cmp.w #4,d0
beq Gadget_Nr4
cmp.w #5,d0
beq.s Gadget_Nr1
cmp.w #6,d0
beq Gadget_Nr2
cmp.w #7,d0
beq Gadget_Nr3
cmp.w #8,d0
beq Gadget_Nr4
bra Wait_Message
;teraz reakcja na wybranie danego przycisku
Gadget_Nr1:
Gadget_Nr2:
Gadget_Nr3:
Gadget_Nr4:
Gadget_Nr5:
Gadget_Nr6:
Gadget_Nr7:
Gadget_Nr8:
Gadget_End:
Switch_RadioButton_01: move.l #Gadget_Button_001,a0 ; A0 = Początek listy modyfikowanych gadgetów.
move.l a2,a1 ; A1 = Adres gadgetu,który od teraz będzie SELECTED.
move.l #$55555555,d0 ; Identyfikator grupy przycisków typu (Radio_Button).
bsr RadioButtonSwitch
Switch_RadioButton_02: move.l #Gadget_Button_001,a0 ; A0 = Początek listy modyfikowanych gadgetów.
move.l a2,a1 ; A1 = Adres gadgetu,który od teraz będzie SELECTED.
move.l #$66666666,d0 ; Identyfikator grupy przycisków typu (Radio_Button).
bsr RadioButtonSwitch
Refresh_Gadgets: move.l IntBase,a6
move.l WindowBase,a1
move.l #Gadget_Button_001,a0
move.l #0,a2
;jsr RefreshGadgets(a6)
bra Wait_Message
Koniec: move.l IntBase,a6
move.l WindowBase,a0
jsr CloseWindow(a6)
;-----------------------
Error_2: move.l Exec.w,a6
move.l IntBase,a1
jsr CloseLibrary(a6)
;-----------------------
Error_1: move.l Exec.w,a6
move.l GfxBase,a1
jsr CloseLibrary(a6)
;-----------------------
clr.l d0
rts
Error_0: moveq.l #-1,d0
rts
;--------------------------------------------------------------
;Sygnalizacyjny błysk na ekranach graficznych.
Blink_All_Screen: move.l IntBase,a6
move.l #0,A0
jsr DisplayBeep(a6)
rts
;--------------------------------------------------------------
;Funkcja: RadioButtonSwitch
;
;Wejście: A0 = Adres początku listy gadgetów.
; A1 = Adres gadgetu,który od teraz bedzie tym wybranym.
; D0 = Identyfikator grupujący gadgety typu (Radio_Button)
; jest on umieszczany w polu (MutualExclude) struktury
; gadget pole to nie jest wykorzystywane w Kickstart(v34)
; a w nowszych nie koliduje z jego innymi zastosowaniami.
;UWAGA: Wywołanie tej funkcji z zerową zawartością rej. A1
; powoduje jedynie podświetlenie obszaru gadgetu,który
; posiada ustawioną flage GADG_SELECTED jest to sposób
; na początkową inicjalizację stanu graficznego gadgetów
; którym nadano status GADHNONE.Podświetlenie odbywa się
; poprzez wywołanie funkcji RectFill().
;
;wyjście: zawartość rejestrów bez zmian.
RadioButtonSwitch: movem.l d0/a0/a1,-(sp)
RBS_PP2: cmp.l 30(a0),d0 ;30 = Offset MutualExclude
bne.s RBS_PP1
btst.b #7,13(a0) ;test flag SELECTED
beq.s RBS_PP1
cmp.l a0,a1
beq.s RBS_PP5
cmp.l #0,a1
beq.s RBS_PP6
cmp.l 30(a1),d0 ;30 = Offset MutualExclude
bne.s RBS_PP5
bclr.b #7,13(a0) ;clear flag SELECTED
RBS_PP6: bsr.s RBS_Zamaluj
RBS_PP1: tst.l (a0) ;sprawdzamy NextGadgetPtr
beq.s RBS_PP4
move.l (a0),a0
bra.s RBS_PP2
RBS_PP4: cmp.l #0,a1
beq.s RBS_PP5
cmp.l 30(a1),d0 ;30 = Offset MutualExclude
bne.s RBS_PP5
bset.b #7,13(a1) ;set flag SELECTED
move.l a1,a0
bsr.s RBS_Zamaluj ;wypełniamy obszar gadgetu kolorem.
RBS_PP5: movem.l (sp)+,d0/a0/a1
rts
RBS_Zamaluj: movem.l d0/d1/a0/a1/a6,-(sp)
move.l WindowBase,a1
move.l 50(a1),a1 ;Pobieramy RastPort
moveq #3,d0 ;Nowy tryb rysowania w RastPort
move.l GfxBase,a6
jsr SetDrMd(a6)
movem.l (sp)+,d0/d1/a0/a1/a6
movem.l d0/d1/d2/d3/a0/a1/a6,-(sp)
move.w 4(a0),d0 ;ustalamy pozycje oraz
move.w 6(a0),d1 ;wymiary obszaru do
move.w 8(a0),d2 ;zamalowania na podstawie
move.w 10(a0),d3 ;danych strukury gadget
add.w d0,d2 ;obszar zamalowywany
add.w d1,d3 ;jest idenyczny jak
subq #1,d2 ;wymiary wskazanej
subq #1,d3 ;struktury gadget
move.l WindowBase,a1
move.l 50(a1),a1 ;Pobieramy RastPort
move.l GfxBase,a6
jsr RectFill(a6) ;rysuje wypełniony obszar.
movem.l (sp)+,d0/d1/d2/d3/a0/a1/a6
rts
;--------------------------------------------------------------
NewWindow: DC.W 0
DC.W 0
DC.W 320
DC.W 200
DC.B 0
DC.B 1
DC.L CLOSEWINDOW+GADGETDOWN
DC.L WINDOWCLOSE+WINDOWDRAG+WINDOWDEPTH+ACTIVATE
DC.L Gadget_Button_001
DC.L 0
DC.L NazwaOkna
DC.L 0
DC.L 0
DC.W 100
DC.W 100
DC.W 320
DC.W 180
DC.W WBENCHSCREEN
;--------------------------------------------------------------
NazwaOkna: DC.B '<-- Close Window!',0
WindowBase: DC.L 0
;--------------------------------------------------------------
IntBase: DC.L 0
IntName: DC.B 'intuition.library',0
GfxBase: DC.L 0
GfxName: DC.B 'graphics.library',0
;--------------------------------------------------------------
Font: dc.l TopazFont
dc.w $8 ;wysoksc czcionki
dc.b $0 ;zdefiniowany styl
dc.b $0 ;flagi
TopazFont: dc.b 'topaz.font',0
;---------------------------------------------------------------
BorderButton: dc.w 0 ;Left Edge
dc.w 0 ;Top Edge
dc.b 1 ;FrontPen kolor lini
dc.b 0 ;BackPen kolor tla
dc.b 0 ;DrawMode tryb rysowania
dc.b 9 ;CountLine liczba punktow rysowania ramki jaka zawiera tabela XY.
dc.l TabelaLini_003 ;XY Ptr adres tabeli zawierajacej wspolrzedne punktow ramki.
dc.l 0 :Next Border Ptr
;--------------------------------------------------------
TabelaLini_003: dc.w -2,-1 ;Tu rysujemy ramke
dc.w 73,-1 ;w obrembie przycisku
dc.w 73,13 ;rozmiary ramki moga
dc.w -2,13 ;byc mniejsze od rozmiaru
dc.w -2,-1 ;pola przycisku.
dc.w -1,-1
dc.w -1,13
dc.w 72,13
dc.w 72,-1
;--------------------------------------------------------------
Gadget_Button_001: dc.l Gadget_Button_002
dc.w 16,18,72,13,GADGHCOMP+GADHNONE+SELECTED,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_001,$55555555,0
dc.w 1 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_001: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_001,0
;--------------------------------------------------------------
Gadget_Button_002: dc.l Gadget_Button_003
dc.w 16,36,72,13,GADGHCOMP+GADHNONE,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_002,$55555555,0
dc.w 2 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_002: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_002,0
;--------------------------------------------------------------
Gadget_Button_003: dc.l Gadget_Button_004
dc.w 16,53,72,13,GADGHCOMP+GADHNONE,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_003,$55555555,0
dc.w 3 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_003: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_003,0
;--------------------------------------------------------------
Gadget_Button_004: dc.l Gadget_Button_005 ;pole wyzerowane to brak kolejnego gadgetu.
dc.w 16,71,72,13,GADGHCOMP+GADHNONE,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_004,$55555555,0
dc.w 4 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_004: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_004,0
;--------------------------------------------------------------
Gadget_Button_005: dc.l Gadget_Button_006
dc.w 110,18,72,13,GADGHCOMP+GADHNONE,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_005,$66666666,0
dc.w 5 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_005: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_005,0
;--------------------------------------------------------------
Gadget_Button_006: dc.l Gadget_Button_007
dc.w 110,36,72,13,GADGHCOMP+GADHNONE,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_006,$66666666,0
dc.w 6 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_006: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_006,0
;--------------------------------------------------------------
Gadget_Button_007: dc.l Gadget_Button_008
dc.w 110,53,72,13,GADGHCOMP+GADHNONE,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_007,$66666666,0
dc.w 7 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_007: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_007,0
;--------------------------------------------------------------
Gadget_Button_008: dc.l 0 ;pole wyzerowane to brak kolejnego gadgetu.
dc.w 110,71,72,13,GADGHCOMP+GADHNONE+SELECTED,GADGIMMEDIATE,BOOLGADGET
dc.l BorderButton,0,TextButton_008,$66666666,0
dc.w 8 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_008: dc.b 1,0,0,0
dc.w 4+4,3
dc.l Font,TXT_008,0
;--------------------------------------------------------------
TXT_001: dc.b 'Button1',0
TXT_002: dc.b 'Button2',0
TXT_003: dc.b 'Button3',0
TXT_004: dc.b 'Button4',0
TXT_005: dc.b 'Button5',0
TXT_006: dc.b 'Button6',0
TXT_007: dc.b 'Button7',0
TXT_008: dc.b 'Button8',0
;--------------------------------------------------------------