@asman,
post #9
Nie mam nawet pomysłu na dalsze próby.... więc jak rozumiem chodzi o przykład na jakim testowałem?
Oto prosty gadget do wprowadzania cyfr. Wprowadzane w nim wartości są zawsze w kolorze podstawowym jak to zmienić?
;--------------------------------------------------------------------
;Program: (1).Test otwarcia Okna na ekranie Workbench.
; (2).Test gadgetu typu pole wprowadzania tekstu.
; (3).Test odbierania komunikatu IDCMP z okna i gadgetu.
; (4).Pobranie wartości cyfrowej wpisanej w polu edycyjnym.
;Procesor: MC68000 (68k)
;Assembler: DevPac v3.02 (HiSoft)
;Platforma: Amiga 500 (OS v1.3) Kickstart (v34)
;Data/Czas: 2009-07-15/23:40
Exec: equ 4
OldOpenLibrary: equ -408
CloseLibrary: equ -414
OpenWindow: equ -204
CloseWindow: equ -72
WaitPort: equ -384
GetMsg: equ -372
ReplyMsg: equ -378
;Pola bitowe zmiennej (Type) struktury (NewWindow)
CUSTOMSCREEN: EQU $000F ;Wyswietl okno na osobnym Screen
WBENCHSCREEN: EQU $0001 ;Wyswietl okno na Workbench'u
;Pola bitowe zmiennej (Flags) struktury (NewWindow)
WINDOWEMPTY: EQU $0000 ;Puste okno jedynie obramowane.
WINDOWSIZING: EQU $0001 ;Gadget do zmiany rozmiaru okna.
WINDOWDRAG: EQU $0002 ;Belka do przemieszczania okna.
WINDOWDEPTH: EQU $0004 ;Gadgety do chowania/odkrywania okna.
WINDOWCLOSE: EQU $0008 ;Gadget do zamykania okna.
REPORTMOUSE: EQU $0200 ;Informacje o poruszaniu myszki.
GIMMEZEROZERO: EQU $0400 ;Rysowanie w oknie od pozycji 0,0
BORDERLESS: EQU $0800 ;Okno nie ma linii obramowania.
ACTIVATE: EQU $1000 ;Otwierane okno ustawione jako aktywne.
RMBTRAP: EQU $10000 ;Gdy to okno aktywne brak opcji menu.
;Pola bitowe zmiennej (IDCMP_Flags) struktury (NewWindow)
GADGETDOWN: EQU $0020 ;Lwey przycisk myszy jest wciśnięty.
GADGETUP: EQU $0040 ;Lewy przycisk myszki wciśnięto i zwolniono.
CLOSEWINDOW: EQU $0200 ;Dostaniemy komunikat z gadgetu zamykania.
;Flags bit status for Gadget struct.
GADGHCOMP: EQU $0000 ;Po wcisnieciu gadget zmienia kolor tla.
GADGHBOX: EQU $0001 ;Po wcisnieciu gadgetu rysuje na okolo niego ramke.
GADGHIMAGE: EQU $0002 ;Po wcisnieciu wstawia grafike z danych pola (Image Ptr)
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.
STRINGCENTERED: EQU $0200 ;centruje text w gadgecie
LONGINT: EQU $0800 ;tylko cyfry możemy wprowadzac do pola edycyjnego.
;Gadget Type bits status for Gadget struct.
BOOLGADGET: EQU $1 ;przycisk
STRGADGET: EQU $4 ;pole do wprowadzania tekstu
;Umieszczenie programu w pamięci CHIP-RAM.
SECTION Program,CODE_C
Start: move.l Exec,a6
lea IntName(pc),a1
jsr OldOpenLibrary(a6)
tst.l d0
beq Error_0
move.l d0,IntBase ;przechowanie uchwytu biblioteki
;-----------------------
move.l IntBase,a6
move.l #NewWindow,a0
jsr OpenWindow(a6)
tst.l d0
beq Error_1
move.l d0,WindowBase ;przechowanie uchwytu okna
;----------------------
;UWAGA: Funkcja WaitPort czeka na komunikat czyli gdy port MsgPort przestanie byc pusty.
Loop: move.l WindowBase(pc),a0
move.l $56(a0),a0 ;pobieramy MsgPort czyli UserPort okna.
move.l Exec,a6
jsr WaitPort(a6) ;czekamy na jakikolwiek komunikat dostarczony oknu.
move.l WindowBase(pc),a0
move.l $56(a0),a0
move.l Exec,a6
jsr GetMsg(a6) ;odbieramy komunikat.
tst.l d0
beq.s Loop
move.l d0,a1
move.l 20(a1),d2 ;do rej.D2 pobieramy rodzaj komunikatu IDCMP
move.l 28(a1),a2 ;do rej.A2 pobieramy adres gadgetu ktory wyslal komunikat.
move.l Exec,a6
jsr ReplyMsg(a6) ;zwracamy strukture komunikatu.
cmp.l #CLOSEWINDOW,d2 ;czy to gadget zamykania okna.
beq.s Koniec
cmp.l #GADGETUP,d2 ;czy to nasz gadget.
beq.s Gadget_Click
bra.s Loop ;wracamy do oczekiwania na kolejny komunikat.
;----------------------
Gadget_Click: ;teraz w rej. a2 mamy adres gadgetu który wyslal komunikat "GADGETUP"
clr.l d0
move.w 38(a2),d0 ;teraz do rej. d0 pobieramy pole Gadget_ID
;z gadgetu ktory wyslal komunikat i na podstawie
;numeru z pola Gadget_ID identyfikujemy dany gadget!
cmp.w #1,d0 ;Tu sprawdzamy numer gadgetu z pola Gadget_ID struktury gadget'u
beq.s Gadget_Nr1
bra.s Loop ;Wracamy do oczekiwania na komunikaty IDCMP
;----------------------
Gadget_Nr1: ;Teraz po wprowadzeniu liczby i wciśnięciu (Enter) pobieramy liczbę.......
move.l WprowadzonaLiczba,d0
;..................
;tu reszta programu!!!!!
;........ bra.s Loop
;----------------------
Koniec: move.l IntBase,a6
move.l WindowBase,a0
jsr CloseWindow(a6)
;-----------------------
Error_1: move.l Exec,a6
move.l IntBase,a1
jsr CloseLibrary(a6)
clr.l d0
rts
Error_0: moveq #-1,d0
rts
;--------------------------------------------------------------
NewWindow: DC.W 0 ;X Lewy gorny rog okna
DC.W 0 ;Y Lewy gorny rog okna
DC.W 320 ;Szerokosc okna
DC.W 200 ;Wysokosc okna
DC.B 0 ;Kolor tla
DC.B 1 ;Kolor atramentu
DC.L CLOSEWINDOW+GADGETUP ;IDCMP_Flags
DC.L WINDOWCLOSE+WINDOWDRAG+ACTIVATE ;Window Flags
DC.L Gadget ;Gadget Ptr
DC.L 0 ;Image Ptr
DC.L NazwaOkna ;wskaznik do nazwy na belce
DC.L 0 ;Screen Ptr
DC.L 0 ;BitMap Ptr
DC.W 100 ;Minimalna wysokosc
DC.W 100 ;Minimalna szerokosc
DC.W 320 ;Maksymalna wysokosc
DC.W 180 ;Maksymalna szerokosc
DC.W WBENCHSCREEN ;Type ScreenFlagSet
NazwaOkna: DC.B '<-- Close Window!',0
WindowBase: DC.L 0
;--------------------------------------------------------------
IntBase: DC.L 0
IntName: DC.B 'intuition.library',0
;--------------------------------------------------------------
Gadget: dc.l 0 ;Next Gadget Ptr
dc.w 50 ;Left Edge
dc.w 50 ;Top Edge
dc.w 100 ;Width
dc.w 30 ;Height
dc.w GADGHCOMP+GADG_SELECTED ;Flags
dc.w GADGIMMEDIATE+RELVERIFY+LONGINT ;Activation
dc.w STRGADGET ;Gadget Type
dc.l Border ;Render Ptr adres Border lub Image
dc.l 0 ;Image Ptr
dc.l 0 ;GadgetText Ptr
dc.l 0 ;MutualExclude
dc.l StringInfo ;SpecialInfo
dc.w 1 ;Gadget_ID
dc.l 0 ;UserData
;---------------------------------------------------------------
Border: dc.w -4 ;Left Edge
dc.w -2 ;Top Edge
dc.b 1 ;FrontPen kolor linii
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 ;XY Ptr adres tabeli zawierajacej wspolrzedne punktow ramki.
dc.l 0 :Next Border Ptr
;--------------------------------------------------------
TabelaLini: dc.w 0,0 ;Tu rysujemy ramke
dc.w 94,0 ; przycisku
dc.w 94,11 ;rozmiary ramki moga
dc.w 0,11 ;byc mniejsze od rozmiaru
dc.w 0,0 ;pola przycisku.
dc.w 1,0
dc.w 1,11
dc.w 93,11
dc.w 93,0
;--------------------------------------------------------
StringInfo: dc.l BuforNapisu ;wskaznik na bufor zawierajacy tekst edytowany.
dc.l 0 ;wskaznik na fufor do operacji undo(Amiga+Q) lub 0.
dc.w 0 ;tu podajemy ktory znak z BuforaNapisu jest pod kursorem.
dc.w 11 ;wielkosc bufora na edytowane lub wprowadzane znaki.
dc.w 0 ;pierwszy znak z bufora wyswietlany w obrembie gadget'u
dc.w 0
dc.w 0
dc.w 0
dc.w 0
dc.w 0
dc.l 0
dc.l 0
WprowadzonaLiczba: dc.l 0 ;wartość wpisana w gadgecie typu LONGINT
dc.l 0
;--------------------------------------------------------
BuforNapisu: dc.b '0123456789'
dcb.b 32,0 ;rezerwujemy 32 bajty wypełniając zerami.
;--------------------------------------------------------