Inferno #10
30 апреля 2007

For Coderz - Building a graphical user interface.

<b>For Coderz</b> - Building a graphical user interface.
               Building

               graphic

       UI

Vitamin / CAIG



   Good day, dear reader
Teli! Our today we will talk about
Some aspects of the graphic
user interface (GUI, if
on-bourgeois). Hopefully, interested in
this issue will find themselves something
useful. Maybe someone will show art
Xia overly structured and decomposed
Noah on the shelves, but in my opinion, this beam
shy way of structuring information.


             0. General framework


   What is the interface? Totality
collection of tools to display information
tion and feedback polzovatelem.Inymi
words, the interaction. Therefore, you
risovyvayutsya three most important parts
 system:

   - Means of entering information;

   - Means of displaying information;

  - Nucleus for organizing the relationship of these
components.


            1. Input means


   Historically, for the Spectrum
used 3 main tool for
User input: Clavey
Atur, joystick and mouse. As the most universal
versal component, the keyboard is often
stands and the only way to enter.
Joystick or a mouse may be a different
degree of comfort proemulirovany on it.
But for the most comfortable use
created a software product is necessary
Dimo provide support and those lips
devices (especially mice). The use of cluster
viatury to input information can be
 as follows:

   - Enter the text information;

   - Emulate joystick;

  - The combined use of different
variants.

   Enter the text information, I think not
represents slozhnosti.Pechatnye Sim
oxen, all firmly fixed on the functional
nye keys also exist de facto standard
dards.

   Joystick emulation is based on binding
different keyboard combinations, respectively
sponding appropriate combinations of contact
Comrade joystick. There are several standard
combinations: QAOPSpace, QAOPM, SXOPSpace,
QCsOPSpace, Sinclair1 / 2, Cursor, etc. Oba
chno presents no great difficulties
implement support for multiple
standards so that users who are accustomed
to any particular option, not ispy
Tyva inconvenience.

   Combined use podrazu
MEVA ispolzovavnie keyboard and how
joystick, and text entry information
tion. This is usually done switching solutions
regimes (input control), support for grief
sneeze keys.

   Working with the mouse, too, is not
too much difficulty, except for the presence
different standards for its connection. But
support the most common variant
anta Kempston Mouse will support
most of the available equipment. From
Other features of the mouse
it is worth noting the definition of functional
keys (fixed or "first pressing
Taya ") and use the last squeak can
hole - video (see articles in the DonNews).


    2. Display facilities


   The main (and, perhaps, only)
mapping tool we have is an ordinary
LIMITED Spectrum screen size of 6912
bayt.V due to the lack of honest word
regime in the "standard" Spectrum, all that
drawn on this screen will be
graphics. What and how to draw - the CCA
Of special.

   A cursory glance at the existing park
system (not only) software, both
Sintered can select more than one STI
Lei design a custom interface
 sa:

  - "Text" mode on the functional
keys (usually inherent in the text results
daktoram, IS-DOS). Characterized by unifying
tsirovannym style of display items
interfeysa.Vozmozhny blotches graphics
 elements;

  - "Text" mode, using
graphic / text cursors. Very
similar to the previous mode, only hot
keys are replaced or supplemented by the possibility
completely control the cursor. The items
Management "text" style use
camping, basically, to simplify the construction
 the interface. Example - ZXZip;

  - Simplified the graphics mode. Use
The use of graphic elements (frame, values
chkov, etc.), and text fields are often
arbitrary position of the press (not tied
Noah to the global screen grid). Tools
I can be very different. Example -
 Real Commander (especially versions prior to 2.0);

  - A more sophisticated graphics mode. ISPO
lzovanie overlapping windows, image
and text controls, etc.
Typical means of entry - a graphic chickens
Sor. Is also possible to support the hot cluster
vish. Text input is applied to situations
tion. A typical representative - BGE (and yes
Almost all image editing - in
them in the genus is written).


   2.1. Organization "text" mode


   Techniques and subtleties in the realization of this
Nogo regime there is a huge set.
Starting from the full text emulation
mode (the text buffer, redrawing the whole
screen during the upgrade) to the Pec
Tew on demand of individual elements.
The second way is usually more efficient because
allows more efficient use of
CPU time (to erase data in screening
not instead of plugging gaps and characters
etc.) and memory and to combine text output
with graphics.


   2.2. Organization graphics mode


   In this mode, the subtleties of the organization
more. The usual concept - pryamougo
lnye region (box) with elements of control
of them. The first asked questions -
how to organize one. drawing and 2. recovered
update folder background? The first question can be at
 think about such decisions:

  - Drawing the windows and controls
 going directly to the screen area;

  - Drawing is carried out in a
screen context, inferred entirely on
 screen;

  - Combined version. Applied
if necessary, more frequent updates
lshoy of windows at the main job
with an off-screen context (an analogue
DirectDraw)

    The second question also has the answers:

  - Remember the background behind the window in front will draw
 koy.Pri closing the window background to recover;

  - Redraw the previously unseen side
screen when the situation changes.

   As the depth of the material can
consider some advantages and nedos
tatki different combinations of the above
solutions (the third variant of the organization is negative
shovels will not be considered, it is essentially
expanded second edition).

  1) Saving / restoring the background, Rizo
 tion in the display area:

   + Is a simple implementation;

  + Maximum speed tradeoff · fundamental
 ktsional;

  - Great difficulty in changing the order
ka display of overlapping windows.

  2) Redraw the invisible parts, rice
 of a screen area:

  + Sometimes leads to a gain in the update
 lenii small areas;

   + The most economical option for storage;

   - Usually the slowest option;

  - The complexity of updating the elements
ntov management.

  3) Saving / restoring the background, Rizo
 tion in context:

  * The pros and cons of drawing
 in context;

  - Not the fastest option (a consequence of
 Drawing in context);

  - High cost of memory (2 times the pain
option 1 above).

  4) Redraw the invisible parts, rice
 of the context:

  + The most functional option out of all
 listed;

   * Memory consumption similar to option 1;

  * The pros and cons of drawing
 in context;

  - The slowest of these variant
Antes (maybe sometimes faster option 2).

   We should also talk about vysheupomya
nutyh pros and cons of drawing
 in context:

  + Appears on the screen is actually a
 object;

  + Comparative ease of updating Fra
 gmentov window;

  - The complexity of the drawing elements of governance
of - depends on the method and attributes before
 representation of context in the memory;

  - Slow enough.

   Selecting a particular way of organizing
rests on the shoulders of the developer. From itself to
Bavli, which implemented the options 1 and 4 and
I can quite objectively judge their
advantages and disadvantages.


   3. Kernel user interface


   As was clear from the foregoing, the kernel
performs a linking function between Used for
tvam input and display devices and
provides the necessary functionality for
organization. Actually, the structure of this
kernel in a nutshell repeat structure of the whole
 Custom Interface:


    Input means


          |

         v

 Procedures for survey input devices

 The logic of interaction NUCLEUS

 Procedures for working with the screen


          |

          v


        Screen


   Set of procedures for the survey of entry for
depends exclusively on the set of supports
Mykh sredstv.Neskolko recommendations on this
 Therefore occasion.

  1) The simultaneous survey of several mouth
REFER. Devices operating on the principle of
joystick (the joystick itself and its
analogues on the keyboard) better poll
procedures, the return status of pressed
button. In this case, the usual association
results will give the final set of flags:
 Driving call KJoy; bit0 - left

                  ; Bit1 - right

                  ; Bit2 - up

                  ; Bit3 - down

                   ; Bit4 - fire

         ld c, a

        call sinc1; bit0 - '6 '

                   ; Bit1 - '7 '

                   ; Bit2 - '9 '

                   ; Bit3 - '8 '

                    ; Bit4 - '0 '

         or c

         ld c, a

        call KBD; bit0 - 'O'

                 ; Bit1 - 'P'

                 ; Bit2 - 'Q'

                 ; Bit3 - 'A'

                  ; Bit4 - 'Space'

         or c

         ld c, a

        call KBD1; bit2 - 'S'

                  ; Bit3 - 'X'

                   ; Bit4 - 'M'

         or c

         ld c, a

         call MouseFire; bit4 - 'mouseL | R'

         or c

         ret

  2) is also useful to have another one bit
under the "Cancel" button. Some models of Joy
sticks support not one but two buttons -
second you can use for this purpose. On
the keyboard is a button can be any
 fight mix - Break, Edit, Extend etc.

  3) Mouse interrogated separately by
its specificity. Poll of the keys can be de
lat in a loop polling the keypad (as long as
shown above).


   Procedures for working with the screen entirely and
fully depends on the concept
function draw (either directly or through con
text) and update (in whole or in hour
tyam). Any more or less sophisticated coder
write the required set (or use
of a set of ready-made, the benefit of their bulk in time
GOVERNMENTAL editions).


   So we slowly get to the
interesting part of the nucleus responsible for the logs
Since the interaction of the above components
nent.Tipichny cycle of the nucleus at
is applicable to one object, the window looks at
 roughly as follows:

   1) Creating a window;

   2) The registration window in the nucleus;

   3) Construction of the window;

   4) The cycle of polling the input devices;

   5) Implementation of the activated functions;

  6) Go to step 4, if the process does not insti
 rshen;

  7) The deregistration of the windows in the nucleus.


    Few details on each item:

  1) From the perspective of the kernel, the window is
a descriptor in the memory area is described
yuschy that the kernel should be displayed. In
simplest case is performed on stage
compiled by static filling
 necessary structures;

  2) Handle to the window (or copy link)
sisteme.V registered in the simplest case
case we have a stack of currently open
windows. If necessary, you can organize a coherent
 list;

  3) Creating a graphical information, not
directly displayed to the user -
substrate and the component window. More will be
 reviewed below;

  4) Obtaining information about the actions of
lzovatelya - pressing buttons on a keyboard
moving the mouse, etc. More will be
 reviewed below;

  5) is directly related to point 3 - in
Depending on what is created, we will
respond differently to the actions of users
 Vatel;

  7) Perform action, return step 2. Phi
Physically, the handle is usually still there
sponded, and can be reused
van.


   Desktriptor window is typically from
a comprehensive system information
 about the object:

  - The dimensions and position on the
 screen;

  - Style information display (Draw
 leniya);

  - Information about the current (s) of context
 degree (s);

  - Where the window keeps the background (if
stores) and where to store its context
 (If stored);

   - A list posted on the window components;

  - Other options.


   Typically, the following methods
 organization of the list of components:

  1) Reservation of pointers to arrays
objects of appropriate types. Exactly
works SupremeGui from BGE - handle
window contains pointers to arrays of inscription
 This, buttons, check boxes, etc.;

  2) array / list of heterogeneous objects
different signatures (IDs).
Procedures for handling objects range over all
items on the list and, depending on the ideal
ntifikatora, differently treated further
 The further information in the facility;

  3) Use a list of objects with defined
graduations in implementing object methods.

   With the first two methods, it is clear -
They are simple to implement, but has
exist one big disadvantage - weak extension
ryaemost. Adding new types of objects
require the completion (or even recycling)
core kernel code.

   To understand the third method, it should be
some idea of ​​polymorphism (from
object-oriented programming
formation - the PLO). The essence of it in the next - for
perform actions on the object meets
the object itself. In other words, in addition to describing
object (the way of presenting it to memory
ty) to determine the number of functions explained
the project, which will be called by the system in
certain situations. In the code, it can
look like this:
; Underlying window handle (and the window object):
Window dw vfpt; pointer to the table

                      ; Virtual functions

        db x, y, w, h; window size

        dw Flags; flags, etc.

        dw Context; pointer to context

        dw Sibling; pointer

                  , The next window in list

        dw Childs; pointer to the list

                            ; Child windows

        ... ; Other data
vfpt dw Create; function pointer

                            ; Create a window

        dw Show; function pointer

                              ; Display window

        dw Update; function pointer

                          ; Window update

        dw OnInput; function pointer

                          ; Input processing

        ... ; Pointers to other functions


   And if the system wants to refresh the window,
it will comply with this code:
 ; IX-object SysUpdate

        ld hl, 4; offset table

                       ; Virtual functions

        jp VCall; call Wirth. function

        ...
 VCall ld a, (ix)

         add a, l

         ld l, a

         ld a, (ix +1)

         add a, h

         ld h, a; HL indicates adr.f-tion

         ld a, (hl)

         inc hl

         ld h, (hl)

         ld l, a; HL contains the address of the function

        jp (hl); function call


   Quite cumbersome. But! Instead, we
we get almost unlimited possibilities
surface enlargement - can create new
types of components, it is absolutely not touching the core!
Importantly - to observe the basic interface.

   With this approach, the kernel is essentially "xy
deet - it is only logical
"Skeleton" of the call virtual functions under
support the basic components (corresponding
function, which may well use
Xia descendants - t.n.nepolnaya overload form
rtualnyh functions). All other components
Options are implemented entirely autonomously, the core
and know do not know what they are in exactly
STPs represent. In addition to solving problems
creation and display of objects removed
challenge response to user input
- Each component is also able to self-
by yourself to respond to emerging
"Outside world" events.

   The attentive reader will probably replace
Teal in the example of the descriptor field is not clear
Sibling. What is it? "And this is another idea
associated with the organization hierarchy of objects
Comrade. For those who may not have fully understood
the essence of what is happening, I will explain: the above
object describes in general any object in the pa
mkah windowing - ranging from no
windows directly to the last
button on most of these windows. All differences
differs only implementation of specific
GOVERNMENTAL funktsiy.Ukazannye field - at least, it is 
necessary sary for the frame. The specific type of

object has the full right to extend the set
these fields (disguised as "other
Data ") and use these extensions.
The main thing - to keep intact the base. Since then
chki of the PLO, this process is called
Inheritance ("heirs" are all
property "parent") and, in some ways, John
enclosure (of "other data" kernel does not
knows they are used only by those who know
 "Successor").

   Note. In what follows the word "heritage
nick "will be mentioned in the context of hierarchical
hierarchy of object instances and not in the context of
the notion of "inheritance" of the PLO.

   Consequently, we are able storage
thread objects in the "tree" - a hierarchical
structure, which greatly facilitated our lives.
The first level - directly to the window. They
make a list - replacing the above
stack of windows. As a "child" windows can
perform nested hierarchical structure
parameters:
 ..- (Sibling) -> Window - (sibling )->...

                 | (Child)

                 v

                 Frame-> Button1-> Button2

                 |

                 v

                Radio1-> Radio2-> Checkbox


    That the screen might look like:

            Window


             Frame

              o Radio1

              o Radio2

              v Checkbox



            [Button1] [Button2]



   Child objects inherit properties
their "parents" - measured its position
mapping with respect to the "parent", inherit
general properties (freezing, style and
etc.)

   Any system procedure to work with
windows and objects will work with the horizontal
zontally tier hierarchy tree - re
move between levels should be maintained
direct object. Let me explain. Assumption
Suppose we need to update (redraw) all
window. Some kind of system procedure gets
on entry to the list of available windows in system
(On the "tree" - the upper line). She
doing very little - for each object
calls the virtual method to update
and moves to the next element in the call list
Re. When you call the element may recur
recursively apply the same procedure for Spies
ka its "descendants" (previously having
opportunity to fulfill some of his action
conditions), which, in turn, can also
has deepened. Example code calling
virtual function in the chain:
; IX - start object, HL - vfpt offset
 ChainVCall

         push hl

         ld l, (ix +10); shift to

         ld h, (ix +11); field Sibling

         ex (sp), hl

         push hl

         call VCall

         pop hl, ix

         ld a, hx

         or lx

         jr nz, ChainVCall

        ret

   And if we have to be like this
structure (describing the example
above):
 Window1 dw WinVfpt

         db ...

         dw ...

         dw ...

         dw Window2; sleduyusch.okno in the chain

        dw Win1Childs

        ...
Win1Childs
 Win1Frame

         dw FrameVfpt

         db ...

         dw ...

         dw ...

         dw Win1Button1

        dw Win1FrameChld

        ...
Win1FrameChld
 Win1Radio1

         dw RadioVfpt

         db ...

         dw ...

         dw ...

         dw Win1Radio2

        dw 0; a switching-Chairman not "descendants"

        ...
 Win1Radio2

         dw RadioVfpt

         db ...

         dw ...

         dw ...

         dw Win1Checkbox

        dw 0; ...

        ...
 Win1Checkbox

         dw CheckboxVfpt

         db ...

         dw ...

         dw ...

         dw 0; last window of tier

        dw 0; not "descendants"
 Win1Button1

         dw ButtonVfpt

         db ...

         dw ...

         dw ...

         dw Win2Button2

        dw 0; ...

        ...
 Win1Button2

         dw ButtonVfpt

         db ...

         dw ...

         dw ...

         dw 0; similarly Win1Checkbox

        dw 0

   ... Then we can draw the following table
virtual functions:
 WinVfpt

        dw WindowCreate

        ...
 FrameVfpt

        dw FrameCreate

        ...
 ButtonVfpt

        dw ButtonCreate

        ...
 RadioVfpt

        dw RadioCreate

        ...
 CheckboxVfpt

        dw CheckboxCreate

        ...

   In this case, all functions in the virtual
GOVERNMENTAL tables inside - it's part of the function
functional core of basic services component
components. Function might look like this:
... Create

         ... ; To do something useful

        jp IterateChildren

        ...
 IterateChildren

         push hl

         ld l, (ix +12); take the "children"

         ld h, (ix +13)

         ld a, l

         or h

         jr z, nochilds

         ex (sp), hl

         pop ix

        jp ChainVCall
 nochilds; if the object has no "children"

         pop hl

        ret


   If the object can not be guaranteed
have the "heirs", instead of switching to
IterateChildren need to perform simple
then return.

   Now, suppose we want instead of Oba
chnyh buttons to implement their own. Very easy
- A description of the object buttons instead of the decree
Telja the standard virtual table
function pointer to put his own
vennuyu table:
 Win1Button1

        dw MyButtonVfpt

        ...
 MyButtonVfpt

        dw MyButtonCreate

        ... ; Not necessarily override

        ... , All functions can be

        ... ; To use and available
MyButtonCreate

         ... ; Make something of their own

         jp ButtonCreate; and can pass

    ; System further management and possible

        , And do everything myself - even to decide

      ; Transmit a control "descendants"


   Not tired? Not scared? :) Actually
everything is quite simple. Importantly - representatives
vit whole thing in the subtleties of sufficient
for the understanding of the processes, but not
overloaded, so as not to get confused.

   Finally we can say a few words
effektivnosti.Privedenny example of the realization
tion polymorphism is almost completely
Copied from existing implementations in other
elastic platforms. You can try different
Options:
Window dw CallbackFunc

        db ...

CallbackFunc

        and a

        jp z, Create

        dec a

        jp z, Show

        dec a

        jp z, Update

        ...

   And the corresponding system call:
VCall push hl

        ld l, (ix)

        ld h, (ix +1)

        ex (sp), hl

        ret


   T.e.vmesto pointer to a table of functions
put function pointer to a dispatcher.
This example of a more secure and
can be very effective for small
set of virtual functions - despite
shorter feature virtual vyzo
Islands, there are overheads manager
parametrization.

   As an exotic option can be
briefly consider the option of asynchronous
(Delayed) call metodov.Danny approach
can be used in multithreaded applications
zheniyah. (Yes, it's not a typo - can
be, and will such early or late, and not
necessarily with the advent of a hypothetical OS
- The application itself is running).
The essence of the method is that instead of calling
object sends a message (placed in
message queue), and it can be formed
nerdy later in the message loop
flow.



   On this optimistic note here Pos
Bolte leave. Waiting for reviews, questions and
ideas.




Other articles:

Likbez - Batteries. Practices.

Likbez - Batteries. Results of experiments with different batteries.

Opportunities Spectrum - The format ani-files on the ZX.

Inferno - The authors of the magazine.

Opportunities Spectrum - How to play multichannel music on beeper.

Opportunities Spectrum - Support for the DVD format on ZX.

Gameland - On the competition absurd (or clumsy) games for the ZX Spectrum - Crap Games Competition.

Graphics - How to quickly draw colorful pictures.

Inferno - Entered from the editor.

Inferno - Errors in the previous numbers.

For Coderz - Gray code and optimization programs.

For Coderz - Building a graphical user interface.

Formats - details on the decoder jpeg.

Iron - Description of Products K561PU4.

Inferno - Letters to the Editor.

Formats - The format of a packed file MegaLZ.

Scorpion ZS - The structure of the markup on a computer hard drive Scorpion.

ZX Clones - multiplatform on the ZX Spectrum. Computers SAM Coupe and MSX.

Advertising - Advertising NedoPC.

Inferno - On the shell.

Activities - The "Spectrum" at the competition on the night orienteering Okinchitsa 2004.

Softinka - Comparative table of the results of packing code files with various packers.

Advertising - Advertising King of Evil.

Softinka - Software for printing in the annex to the magazine.

Softinka - Music Editor Pro Tracker v3.71. Revision history.

Advertising - Ads by V. Bogdanovich.

Iron - Some RND-generators.

Opportunities Spectrum - A hardware scrolling on ZX Spectrum.

Pentagon - Sinhroselektor video at Pentagon. Problems and the scheme.

DIY - Universal TAPE interface. Scheme of loading and recording tapes.

Sound - Features audio device TurboSound FM.

DIY - The scheme of the analyzer state TTL output.

Future Spectrum - Video Display V9990. Enhanced graphics capabilities ZX Spectrum.

Softinka - Updates to the image viewer: ANSI viewer, MCX viewer.

Interview - An interview with musician X-Raizor of Omega Hackers Group.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:

В этот день...   21 November