[#1] gadget(button) problem?
Oto max. uproszczona wersja problemu ,który pozostaje bez rozwiązania?

Wyświetlamy w oknie (gadget) przycisku... a w nim umieszczamy napis.
Zmieniamy status przycisku na wybrany (GFLAG_SELECTED) i wywołujemy funkcję RefreshGadget();
Po kolejnej zmianie stanu przycisku kolory tekstu i jego tła są całkiem inne od ustawionych???
Czemu tak jest...? i jak zaradzić temu zjawisku?
[#2] Re: gadget(button) problem?

@68k_tester, post #1

Hej!

Mogć się mylić, ale nie zaszkodzi spróbować.
Kolory zmieniają sić ponieważ masz ustawioną flagę GFLG_GADGHCOMP (ustawiają się kolory komplementarne).
Zatem, w polu "Flags" struktury Gadget ustaw GFLG_GADGHNONE oraz stwórz alternatywną ramkę (strukturć Border) "wybraną" dla przycisku i wstaw jej adres w polu SelectRender struktury Gadget.

Mam nadzieję, że to zadziała.

Powodzenia i pozdrawiam,
Damian.



Ostatnia modyfikacja: 28.05.2009 17:01:13
PS. Niestety nie wyświetla sie poprawnie "ę".

O już działa.... :)

Ostatnia modyfikacja: 28.05.2009 17:02:22



Ostatnia modyfikacja: 28.05.2009 17:02:51
[#3] Re: gadget(button) problem?

@gracka, post #2

Wprowadziłem zakładane zmiany w polu "Flags" oraz dodałem wskazanie na (strukturę Border) w polach GadgetRender i SelectRender.
Wynik pozostaje bez zmian.
Dalej ten sam problem.

Jednak... takie przełączanie aktywności przycisków zastosowano w programach np: "Preferences 1.3" lub "VirusKiller v3.60"
szkoda ,że po tylu latach nikt już nie wie jak to zrobić???


Pozdrawiam.
[#4] Re: gadget(button) problem?

@68k_tester, post #3

A te przyciski są typu bool?
[#5] Re: gadget(button) problem?

@cholok, post #4

Listing całego przykładowego programu
jest na forum pod tematem: "Problem z Button(gadget) w systemach OS 1.3/3.0/ i innych"

Po kolejnych testach pola struktury gadget w testowym programie ustawiłem tak:



;--------------------------------------------------------------
Gadget_Button_001: dc.l Gadget_Button_002
dc.w 16,18,72,13,GADHNONE+GADG_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,1,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,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,1,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,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,1,0
dc.w 4+4,3
dc.l Font,TXT_003,0
;--------------------------------------------------------------
Gadget_Button_004: dc.l 0 ;pole wyzerowane to brak kolejnego gadgetu.
dc.w 16,71,72,13,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,1,0
dc.w 4+4,3
dc.l Font,TXT_004,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
;--------------------------------------------------------------
[#6] Re: gadget(button) problem?

@68k_tester, post #5

Prawidłowo ustawianie flagi selected:
RemoveGadget
ustawienie flagi selected
AddGagdet
RefreshGadgets
[#7] Re: gadget(button) problem?

@cholok, post #6

Poprawiłem zgodnie z zaleceniami ale efekt jest podobny ,tylko teraz
podświetlenie pozostaje na wszystkich buttonach w inversji do tekstu.

Dodatkowo zmieniłem reakcje na klawisz myszy: teraz wystarczy samo
wciśnięcie bez puszczania klawisza myszy ale i to nic nie dało.....


Tu cały listing:


;Program testowy gadgety button jako opcje podswietlane po wybraniu.
;(1).Otwieramy okno i wstawiamy na nim cztery przyciski.
;(2).Chcemy aby aktywowanie jednego przycisku gasiło pozostałe?

;Testy: Nie działa!!! Nie wiem jak dezaktywować pozostałe wybrane przyciski.


;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
AddGList: equ -438
RefreshGList: equ -432
RemoveGList: equ -444
RefreshWindowFrame: equ -456



;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)

GADGETUP: EQU $0040 ;Wciśnięto i puszczono przycisk myszy nad gadgetem.
GADGETDOWN: EQU $0020 ;Jedynie wćiśnieto przycisk myszy nad gadgetem.
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 niego ramke.
GADHNONE: EQU $0003 ;Po wcisnieciu gadgetu nie dzieje sie nic.
GADG_DISABLED: EQU $0100
GADG_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 ;Typ gadgetu (przycisk)


Start: move.l Exec.w,a6
lea IntName(pc),a1
jsr OldOpenLibrary(a6)
tst.l d0
beq Error_0
move.l d0,IntBase
;-----------------------
move.l IntBase,a6
move.l #NewWindow,a0
jsr OpenWindow(a6)
tst.l d0
beq Error_1
move.l d0,WindowBase
;-----------------------
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
move.w d0,LastSelectGadget_ID

;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
bra.s Wait_Message

;teraz reakcja na wybranie danego przycisku

Gadget_Nr1:
Gadget_Nr2:
Gadget_Nr3:
Gadget_Nr4: ;decyduje wartość: LastSelectGadget_ID


;usuwamy gadgety z list okna

Remove_Gadgets: move.l IntBase,a6
move.l WindowBase,a0
move.l #Gadget_Button_001,a1
moveq #-1,d0 ;usuwamy wszystkie gadgety z listy
jsr RemoveGList(a6)


;dokonujemy zmian w strukrurach opisujacych gadgety

move.l #Gadget_Button_001,a0
move.w LastSelectGadget_ID,d0
move.l #$55555555,d1 ;identyfikator grupy przycisków.
bsr ButtonChecked


;dodajemy gadgety do listy okna
Add_Gadgets: move.l IntBase,a6
move.l WindowBase,a0
move.l #Gadget_Button_001,a1
move.l #0,a2 ;to nie requester
moveq #0,d0 ;numer pozycji pierwszego wstawianego gadgetu.
moveq #-1,d1 ;ilosc dodawanych gadgetów (wszystkie = -1).
jsr AddGList(a6)


;odświerzamy gadgety na oknie
Refresh_Gadgets: move.l IntBase,a6
move.l #Gadget_Button_001,a0
move.l WindowBase,a1
move.l #0,a2 ;to nie requester
moveq #-1,d0 ;ilosc odświeżanych gadgetów (wszystkie = -1).
jsr RefreshGList(a6)


bra Wait_Message


Koniec: move.l IntBase,a6
move.l WindowBase,a0
jsr CloseWindow(a6)
;-----------------------
Error_1: move.l Exec.w,a6
move.l IntBase,a1
jsr CloseLibrary(a6)
clr.l d0
rts
Error_0: moveq.l #-1,d0
rts

;--------------------------------------------------------------
;Funkcja: ButtonChecked(A0.l,D0.w,D1.l)
;WEJSCIE:
;Rej. A0.L = Adres pierwszej struktury typu 'Gadget' od ktorej zaczynamy poszukiwanie.
;Rej. D0.W = Wartosc pola 'Gadget_ID' gadgetu ktory ma zostac wlaczony.
;Rej. D1.L = Wartosc pola 'MutualExclude' grupujacego gadgety ktore maja byc objete przełączeniem.

;OPIS:
;Funkcja pozwala na aktywowanie tylko jednego wskazanego
;przycisku z danej grupy przycisków zawierających opcje wyboru.
;Przynależność danego przycisku do ustalonej grupy przycisków
;definujemy wspólną dla danej grupy wartościa pola 'MutualExclude'
;struktury (Gadget)
;Aktywacja danego przycisku odbywa sie poprzez ustawienie w polu
;'Flags' struktury (Gadget) bitu GADG_SELECTED a w pozostałych
;odnalezionych przyciskach z tej grupy bit ten jest zerowany.
;DZIALANIE:
;Funkcja przeszukuje struktury (Gadget) od pierwszej wskazanej rejestrem A0
;do ostatniej w ktorej wskaznik 'NextGadgetPtr' na kolejna zawiera 0.
;W przeszukiwanych strukturach (Gadget) sprawdzane jest pole 'MutualExclude'
;jesli wartosc tego pola pokrywa sie z wartoscia podana w rejestrze D1 wtedy
;dokonywana jest modyfikacja struktury (Gadget) obejmujaca dwie kombinacje.
;1).W przypadku gdy wartość w polu 'Gadget_ID' pokrywa się z rejestrem D0
;ustawiony zostaje bit GADG_SELECTED w polu 'Flags' tej struktury (gadget).
;2).Kiedy wartość w polu 'Gadget_ID' jest inna od zawartej w rejestrze D0
;wyzerowany zostaje bit GADG_SELECTED w polu 'Flags' tej struktury (gadget).


ButtonChecked: movem.l d0-d1/a0,-(sp)
BC_PP2: cmp.l 30(a0),d1 ;30 = Offset MutualExclude
bne.s BC_PP1
cmp.w 38(a0),d0 ;38 = Offset Gadget_ID
bne.s BC_PP3
bset.b #7,13(a0) ;12 = Offset Flags + 1 low byte
bra.s BC_PP1
BC_PP3: bclr.b #7,13(a0) ;12 = Offset Flags + 1 low byte
BC_PP1: tst.l (a0) ;sprawdzamy NextGadgetPtr
beq.s BC_PP4
move.l (a0),a0
bra.s BC_PP2
BC_PP4: movem.l (sp)+,d0-d1/a0
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
;--------------------------------------------------------------
LastSelectGadget_ID: dc.w 0 ;tu ID ostatnio wybranego przycisku
;--------------------------------------------------------------
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+GADG_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,1,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,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,1,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,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,1,0
dc.w 4+4,3
dc.l Font,TXT_003,0
;--------------------------------------------------------------
Gadget_Button_004: dc.l 0 ;pole wyzerowane to brak kolejnego gadgetu.
dc.w 16,71,72,13,GADGHCOMP,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,1,0
dc.w 4+4,3
dc.l Font,TXT_004,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
;--------------------------------------------------------------
[#8] Re: gadget(button) problem?

@68k_tester, post #7

Hej!
Jeśli chcesz aby przyciski nie były mało estetycznie podświetlane, to z pewnością nie możesz używać flagi GFLG_GADGHCOMP (komplementacja jakimś algorytmem).
Ponadto w polu SelectRender musisz mieć alternatywną ramkę (Border) lub Image jeśli chcesz aby to wyglądało jak przyzwoicie wciśnięty przycisk.

Z wysiłkiem grzebię w mojej głowie (8 lat nie pisałem nic na AmigaOS) i coś mi "świta", że trzeba kombinować z flagami.
Ja bym jeszcze spróbował ustawić flagi: GFLG_GADGHIMAGE lub GFLG_GADGHIMAGE + GFLG_GADGHNONE.

Pzdr.
D.



Ostatnia modyfikacja: 29.05.2009 13:14:14
[#9] Re: gadget(button) problem?

@68k_tester, post #7

Udało mi się coś znaleźć. Mam nadzieje, że to pomoże.

http://cd.textfiles.com/zoom2/programming/amigac/c_manual/gadgets/gadgets.doc

Pzdr.
D.



Ostatnia modyfikacja: 29.05.2009 13:39:06
[#10] Re: gadget(button) problem?

@gracka, post #8

Co do GFLG_GADGHIMAGE to raczej odpada, dodawanie osobnej grafiki do programu zajmuje sporo miejsca a dodatkowo przyciski mają różne
wielkości czyli kolejne dodatkowe osobne bitmapy.

Skoro programiści workbench'a zrobili to w programie "Preferences" i to bez bitmap.. więc jest to możliwe!
Wszystko sprowadza się jedynie do odpowiedniego ustawienia tych flag..
Jak opisałem zrobiłem już testy z polami GadgetRender i SelectRender ustawionymi jednocześnie na strukturę (Border) ale to nie to....

Moje obserwacje są takie:
1).Coś nie jest tak z funkcjami RefreshGList() i RefreschGadget() nie odświeżają właściwie gadgetu w oknie????
2).Po dodaniu gadgetów do okna za pomocą AddGadget() operacje na tych strukturach nie dają zmian... czy to oznacza ,że system
ma osobną kopię tych struktur???


Pozdrawiam.
[#11] Re: gadget(button) problem?

@68k_tester, post #10

Hej!
GFLG_GADGHIMAGE to nie to samo co GFLG_GADGIMAGE. Pierwsza oznacza, że do renderowania zaznaczonego przycisku używane jest pole SelectRender (bez znaczenia czy jest to Image czy Border). Druga wymieniona flaga informuje intuition, że pola GadgetRender i SelectRender wskazują na strukturć typu Image.

Zajrzyj do dokumentacji, którą podlinkowałem.

Nie, system raczej nie ma osobnej kopii tych struktur.

W którejś tam wersji Twojego listingu zauważyłem, że usuwasz listć gadgetów zanim je zmodyfikujesz. Nie jestem pewien czy nie jest to zbyt czasochłonne. Wg. mnie takie operacje powinny przynosić skutek:
1. dodawanie gadgetów
2. ewentualne ich zmiany
3. RefreshGadgets(gads list, window, requester)

A do usuwania flagi i jej ponownego ustawiania proponuje użyć funkcji logicznej xor. Dzićki temu nie bćdziesz musiał sprawdzać w jakim stanie jest gadget, zawsze stan zmieni sić na przeciwny.

Pzdr.
D.
[#12] Re: gadget(button) problem?

@68k_tester, post #10

Problemem jest przełączanie flagi selected przez usera. Intuition sam przełącza przyciski typu bool, a stan odczytujemy z pola flags. Pole MutualExlude działa tylko z flagą toggleselect.
[#13] Re: gadget(button) problem?

@68k_tester, post #10

2).Po dodaniu gadgetów do okna za pomocą AddGadget() operacje na tych strukturach nie dają zmian... czy to oznacza ,że system
ma osobną kopię tych struktur???


Po dodaniu gadżetu przez AddGadget() lub AddGList() trzeba je odświeżyć poprzez wywołanie funkcji RefreshGList(), dobiero wtedy zmiany dadzą efekt. Do tego okno powinno być w typie WFLG_SMARTREFRESH (odpowiedni bit w polu Flags), przez co okno będzie odświeżane gdy jego zawartość zostanie skasowana. Oprócz tego musisz ustawić bit IDCMP_REFRESHWINDOW w polu IDCMP i odświeżać okno ręcznie poprzez BeginRefresh() i EndRefresh() po otrzymaniu komunikatu z portu UserPort okna, na przykład tak:

struct IntuiMessage *msg;
ULONG class;

if (msg = (struct IntuiMessage *)GetMsg(win->UserPort))
{
class = msg->Class;
ReplyMsg((struct Message *)msg);
if (class == IDCMP_REFRESHWINDOW)
{
BeginRefresh(win);
EndRefresh(win, TRUE);
}
}



Ostatnia modyfikacja: 30.05.2009 14:50:43
[#14] Re: gadget(button) problem?

@Minniat, post #13

Witam...


;-------------------------------------------------------------------------------------------
W odpowiedzi na [11]

Ustawiłem Flagę GFLG_GADGHIMAGE i polu (SelectRender) przypisałem wskazanie na "Border" ten sam jaki jest wpisany do pola
(GadgetRender) co spowodowało ,że po ponownym wybraniu tego przycisku jego ramka jest już wyświetlana prawidłowo ale
to dotyczy tylko samej ramki. Dalej jednak przycisk ma tło takie jakby ciągle była aktywna flaga GFLG_SELECTED pomimo jej
wyłączenia i odświeżenia wszystkich przycisków w oknie. Wybranie innego przycisku powoduje ,że oba są podświetlone choć tylko
jeden z nich ma flagę GFLG_SELECTED a wszystkie zostały wykasowane poprzez RemoveGList() i po tych zmianach ponownie dodane do okna
poprzez AddGList() i odświeżone!!!

Ta ramka to jednak pierwszy postęp...


;---------------------------------------------------------------------------------------------
W odpowiedzi na [12]


Nie stosuję pola MutualExclude w znaczeniu "podręcznikowym" bo pod systemem (v34) jest to tylko puste pole.
A skoro jest puste postanowiłem nadać mu inną funkcję.....

Pole ( MutualExlude ) to wielka ciekawostaka!!! Jego zastosowanie w systemach (v37) i nowszych zostało precyzyjnie opisane
w "RKM" natomiast jak MutualExlude funkckonuje w OS 1.3 (v34) to zupełna tajemnica. Rozumiem ,że w zamyśle miało pełnić takie funkcje jakich
właśnie potrzebuje w moim programie ( czyli maski przełącznych przycisków tzw. RadioButton ) jednak po wielu testach stwierdziłem ,że to nigdy
nie działało..... niestety.... Potem znalazłem w necie odnośnie "MutualExlude" coś takiego:

MutualExclude:

This field is currently ignored by Intuition, but is reserved. Do not
store information here. Starting with V36, if the GadgetType is
GTYP_CUSTOMGADGET this field is used to point to a Hook for the
custom gadget.

Co prawda w moim przypadku... zastosowałem to pole do przechowania informacji grupującej przyciski ( tylko te przełączane ) ale nie sądzę
aby to było powodem złego odświeżania samej grafiki przycisków pod (v34) bo pod (v39) jest tak samo...
Nigdy nie znalazłem jakiegokolwiek przykładu kodu stosującego MutualExlude po (v34).
;----------------------------------------------------------------------------------------------
W odpowiedzi na [13]

WFLG_SMARTREFRESH - to zaraz testuję....


co do IDCMP_REFRESHWINDOW czy to oznacza ,że mam samemu wszystko narysować na oknie... pomiędzy funkcjami BeginRefresh() i EndRefresh() ????



Pozdrawiam.
[#15] Re: gadget(button) problem?

@68k_tester, post #14

co do IDCMP_REFRESHWINDOW czy to oznacza ,że mam samemu wszystko narysować na oknie... pomiędzy funkcjami BeginRefresh() i EndRefresh() ????

Nie, gadżety rysuje system. Ale zawsze możesz pomiędzy tymi fukcjami wprowadzić własne procedury rysowania, np. jakichś dodatkowych obrazków itp. Nie jest to jednak konieczne. Pamiętaj o RefreshGList(), bo tylko po wywołaniu tej funkcji gadżety rzeczywiście są rysowane!

Tutaj znajdziesz przewodnik po amigowym systemie w wersji 1.3 w tym gadżetów intuition (jest on jednak raczej przeznaczony dla programistów piszących w C):

http://aminet.net/dev/c/CManual.lzh
http://aminet.net/dev/c/CManual2.lzh
http://aminet.net/dev/c/CManual3.lzh
http://aminet.net/dev/c/CManual4.lzh
http://aminet.net/dev/c/CManual5.lzh



Ostatnia modyfikacja: 30.05.2009 16:44:28
[#16] Re: gadget(button) problem?

@Minniat, post #15

Po wielu testach zrezygnowałem. Nie jest realne wykonanie podświetlenia button'a na zasadzie ustawienia znaczników w Amiga OS... a metoda poprzez
flagę GADGIMAGE oraz pola GadgetRender i SelectRender jest zbyt kłopotliwa.

:(


Pozdrawiam.
[#17] Re: gadget(button) problem?

@cholok, post #12

Proszę o wyjaśnienie jak działa pole MutualExclude struktury Gadget w systemach OS 1.3 kick(34) z RKM wynika ,że nie funkcjonuje pod (v34).
Po disasemblacji kodu programu VirusKiller widze jednak coś innego ale nie mogę zrozumieć jego ustawień???
[#18] Re: gadget(button) problem?

@Minniat, post #13

Minniat napisał(a):

> WFLG_SMARTREFRESH (odpowiedni bit w polu Flags), przez co okno
> będzie odświeżane gdy jego zawartość zostanie skasowana. Oprócz
> tego musisz ustawić bit IDCMP_REFRESHWINDOW w polu IDCMP i

Zdecydowanie nie. Okien smartrefresh należy używać tylko jeśli jest to absolutnie konieczne. Jeśli okno zawiera normalne systemowe przyciski to nie ma absolutnie żadnego powodu, dla którego miałoby być typu smart.
[#19] Re: gadget(button) problem?

@68k_tester, post #17

MutualExclude nigdy nie zaimplementowano. Od V36 służy do czego innego.
Przykład do analizy. Biblioteka działająca pod 1.3 ze źródłami i przykładami.
http://aminet.net/dev/gui/gadget100.lha
Zawsze też możesz użyć specjalnej wersji gadtools.library
http://aminet.net/dev/misc/gt34_1.lha



Ostatnia modyfikacja: 16.06.2009 10:23:19
[#20] Re: gadget(button) problem?

@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
;--------------------------------------------------------------
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem