Listing 7-05

aus dem 7. Teil in die RISC OS C-Programmierung: Symbole: Bilder als Symbole mit indirekte Adressierung.

Alle Listings können heruntergeladen werden.

Bild als Symbol


#include "oslib/wimp.h"
#include "oslib/wimpspriteop.h"
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

int main()
{

 // melde Aufgabe beim Betriebssystem an
 wimp_version_no version_out;
 wimp_t task_handle;
 task_handle=wimp_initialise(310, "Hallo Welt!", NULL, &version_out);

 wimp_window *window;
 window = malloc(sizeof(wimp_window) + 1*sizeof(wimp_icon));
 window->visible.x0 = 0;
 window->visible.y0 = 200;
 window->visible.x1 = 200;
 window->visible.y1 = 400;
 window->xscroll = 0;
 window->yscroll = 0;
 window->next = wimp_TOP;
 window->flags = wimp_WINDOW_MOVEABLE | wimp_WINDOW_AUTO_REDRAW  |
                 wimp_WINDOW_BACK_ICON | wimp_WINDOW_CLOSE_ICON |
                 wimp_WINDOW_TITLE_ICON | wimp_WINDOW_TOGGLE_ICON |
                 wimp_WINDOW_VSCROLL | wimp_WINDOW_SIZE_ICON |
                 wimp_WINDOW_HSCROLL | wimp_WINDOW_NEW_FORMAT;
 window->title_fg = wimp_COLOUR_BLACK;
 window->title_bg = wimp_COLOUR_LIGHT_GREY;
 window->work_fg =  wimp_COLOUR_BLACK;
 window->work_bg = wimp_COLOUR_VERY_LIGHT_GREY;
 window->scroll_outer = wimp_COLOUR_MID_LIGHT_GREY;
 window->scroll_inner = wimp_COLOUR_VERY_LIGHT_GREY;
 window->highlight_bg = wimp_COLOUR_CREAM;
 window->extent.x0 = 0;
 window->extent.y0 = -600;
 window->extent.x1 = 1000;
 window->extent.y1 = 0;
 window->extra_flags = 0;
 window->title_flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED |
                       wimp_ICON_VCENTRED;
 window->work_flags = wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT;
 window->sprite_area = (osspriteop_area *) 1;
 strncpy (window->title_data.text, "Hallo Welt!", 12);
 window->icon_count = 1;
 window->xmin = 0;
 window->ymin = 0;

 window->icons[0].extent.x0 =  100;
 window->icons[0].extent.y0 = -150;
 window->icons[0].extent.x1 =  168;
 window->icons[0].extent.y1 =  -82;
 window->icons[0].flags = wimp_ICON_SPRITE | wimp_ICON_INDIRECTED |
                          wimp_ICON_HCENTRED | wimp_ICON_VCENTRED;
 char symbolname[12] = "information";
 window->icons[0].data.indirected_sprite.id = (osspriteop_id) symbolname;
 window->icons[0].data.indirected_sprite.area = wimpspriteop_AREA;
 window->icons[0].data.indirected_sprite.size = strlen(symbolname);

 wimp_block block;
 block.open.w = wimp_create_window (window);
 block.open.visible.x0 = window->visible.x0;
 block.open.visible.y0 = window->visible.y0;
 block.open.visible.x1 = window->visible.x1;
 block.open.visible.y1 = window->visible.y1;
 block.open.xscroll = window->xscroll;
 block.open.yscroll = window->yscroll;
 block.open.next = window->next;

 // mache Fenster sichtbar
 wimp_open_window (&(block.open));

 // Variablen für's Pollen
 wimp_event_no event;
 wimp_poll_flags mask=1;
 osbool quit_pending = FALSE;

 while (!quit_pending)
    {
      event = wimp_poll(mask, &block, NULL);
      switch (event)
      {
       case wimp_OPEN_WINDOW_REQUEST:
                wimp_open_window(&(block.open));
                break;

       case wimp_CLOSE_WINDOW_REQUEST:
                wimp_close_window(block.close.w);
                quit_pending = true;
                break;

        case wimp_USER_MESSAGE:
        case wimp_USER_MESSAGE_RECORDED:
           if (block.message.action == message_QUIT)
             {
                 quit_pending = true;
                 break;
             }
       }

    }
 wimp_close_down(task_handle);
 return 0;
}