www.pudn.com > uC-GUI-V3-98.zip > WIDGET_Effect.c


/* 
********************************************************************************************************* 
*                                             uC/GUI V3.98 
*                        Universal graphic software for embedded applications 
* 
*                       (c) Copyright 2002, Micrium Inc., Weston, FL 
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH 
* 
*              µC/GUI is protected by international copyright laws. Knowledge of the 
*              source code may not be used to write a similar product. This file may 
*              only be used in accordance with a license and should not be redistributed 
*              in any way. We appreciate your understanding and fairness. 
* 
---------------------------------------------------------------------- 
File        : WIDGET_Effect.c 
Purpose     : Example demonstrating the use of a widget effects 
---------------------------------------------------------------------- 
*/ 
 
#include  
#include  
#include "GUI.h" 
#include "DIALOG.h" 
#include "PROGBAR.h" 
#include "LISTVIEW.h" 
 
/********************************************************************* 
* 
*       Defines 
* 
********************************************************************** 
*/ 
 
#define NUM_WIDGETS GUI_COUNTOF(_aID) 
 
/********************************************************************* 
* 
*       Static data 
* 
********************************************************************** 
*/ 
 
/* Dialog resource of main dialog box */ 
static const GUI_WIDGET_CREATE_INFO _aDlgWidgets[] = { 
  { WINDOW_CreateIndirect,    "",             0,                   0,   0, 499, 239, 0}, 
  { TEXT_CreateIndirect,      "Progress bar",  GUI_ID_TEXT0,       10,   5, 100,  15, TEXT_CF_HCENTER}, 
  { PROGBAR_CreateIndirect,   NULL,            GUI_ID_PROGBAR0,    10,  20, 100,  20 }, 
  { TEXT_CreateIndirect,      "Button",        GUI_ID_TEXT0,       10,  50, 100,  15, TEXT_CF_HCENTER}, 
  { BUTTON_CreateIndirect,    "Button",        GUI_ID_BUTTON0,     10,  65, 100,  20 }, 
  { TEXT_CreateIndirect,      "Dropdown",      GUI_ID_TEXT0,       10,  95, 100,  15, TEXT_CF_HCENTER}, 
  { DROPDOWN_CreateIndirect,  NULL,            GUI_ID_DROPDOWN0,   10, 110, 100,  65, DROPDOWN_CF_AUTOSCROLLBAR}, 
  { TEXT_CreateIndirect,      "Edit",          GUI_ID_TEXT0,      120,   5, 100,  15, TEXT_CF_HCENTER}, 
  { EDIT_CreateIndirect,      NULL,            GUI_ID_EDIT0,      120,  20, 100,  20 }, 
  { TEXT_CreateIndirect,      "Listbox",       GUI_ID_TEXT0,      120,  50, 100,  15, TEXT_CF_HCENTER}, 
  { LISTBOX_CreateIndirect,   "",              GUI_ID_LISTBOX0,   120,  65, 100, 125, 0, 0 }, 
  { TEXT_CreateIndirect,      "Listview",      GUI_ID_TEXT0,      230,   5, 100,  15, TEXT_CF_HCENTER}, 
  { LISTVIEW_CreateIndirect,  NULL,            GUI_ID_LISTVIEW0,  230,  20, 100, 100, 0 }, 
  { TEXT_CreateIndirect,      "Multiedit",     GUI_ID_TEXT0,      230, 130, 100,  15, TEXT_CF_HCENTER}, 
  { MULTIEDIT_CreateIndirect, "",              GUI_ID_MULTIEDIT0, 230, 145, 100,  45, 0, 0 }, 
  { TEXT_CreateIndirect,      "Scrollbars",    GUI_ID_TEXT0,      340,   5,  70,  15, TEXT_CF_HCENTER}, 
  { SCROLLBAR_CreateIndirect, NULL,            GUI_ID_SCROLLBAR0, 340, 175,  70,  15, 0 }, 
  { SCROLLBAR_CreateIndirect, NULL,            GUI_ID_SCROLLBAR1, 340,  20,  20, 140, SCROLLBAR_CF_VERTICAL }, 
  { SCROLLBAR_CreateIndirect, NULL,            GUI_ID_SCROLLBAR2, 370,  20,  40, 140, SCROLLBAR_CF_VERTICAL }, 
  { TEXT_CreateIndirect,      "Sliders",       GUI_ID_TEXT0,      420,   5,  70,  15, TEXT_CF_HCENTER}, 
  { SLIDER_CreateIndirect,    NULL,            GUI_ID_SLIDER0,    420, 175,  70,  15, 0 }, 
  { SLIDER_CreateIndirect,    NULL,            GUI_ID_SLIDER1,    420,  20,  20, 140, SLIDER_CF_VERTICAL }, 
  { SLIDER_CreateIndirect,    NULL,            GUI_ID_SLIDER2,    450,  20,  40, 140, SLIDER_CF_VERTICAL }, 
}; 
 
/* Dialog resource of options dialog box */ 
static const GUI_WIDGET_CREATE_INFO _aDlgOptions[] = { 
  { FRAMEWIN_CreateIndirect,  "Effect",    0,                  10,  30, 55,  85,   0}, 
  { CHECKBOX_CreateIndirect,  NULL,            GUI_ID_CHECK0,       0,   2,   0,   0 }, 
  { RADIO_CreateIndirect,     NULL,            GUI_ID_RADIO0,       0,  20,   0,   0,   0,  0x1003 }, 
  { TEXT_CreateIndirect,      "Auto",          GUI_ID_TEXT0,       22,   4, 100,  15, TEXT_CF_LEFT}, 
  { TEXT_CreateIndirect,      "3D",            GUI_ID_TEXT0,       17,  22, 100,  15, TEXT_CF_LEFT}, 
  { TEXT_CreateIndirect,      "Simple",        GUI_ID_TEXT0,       17,  38, 100,  15, TEXT_CF_LEFT}, 
  { TEXT_CreateIndirect,      "None",          GUI_ID_TEXT0,       17,  54, 100,  15, TEXT_CF_LEFT}, 
}; 
 
/* Array of widget ID's */ 
static int _aID[] = { GUI_ID_BUTTON0,    GUI_ID_EDIT0,      GUI_ID_LISTBOX0,   GUI_ID_PROGBAR0,    
                      GUI_ID_LISTVIEW0,  GUI_ID_MULTIEDIT0, GUI_ID_DROPDOWN0,  GUI_ID_SCROLLBAR0,  
                      GUI_ID_SCROLLBAR1, GUI_ID_SCROLLBAR2, GUI_ID_SLIDER0,    GUI_ID_SLIDER1,     
                      GUI_ID_SLIDER2}; 
 
/* Array of widget handles */ 
static WM_HWIN _ahWin[GUI_COUNTOF(_aID)]; 
 
/* Makes it easier to access the array _ahWin */ 
static enum { BUTTON0,    EDIT0,      LISTBOX0,   PROGBAR0,  
              LISTVIEW0,  MULTIEDIT0, DROPDOWN0,  SCROLLBAR0,  
              SCROLLBAR1, SCROLLBAR2, SLIDER0,    SLIDER1,     
              SLIDER2};              
 
/* Array of available effects */ 
const WIDGET_EFFECT * _apEffect[] = {&WIDGET_Effect_3D,      
                                     &WIDGET_Effect_Simple,  
                                     &WIDGET_Effect_None}; 
 
/* Array of strings used to label the frame window */ 
const char *   _apEffects[] = {"Widget effect: 3D", 
                               "Widget effect: Simple",  
                               "Widget effect: None"}; 
 
static WM_HWIN _hDlg; 
static WM_HWIN _hFrameWin; 
static int     _AutoMode = 1; 
 
/********************************************************************* 
* 
*       Static code 
* 
********************************************************************** 
*/ 
 
/********************************************************************* 
* 
*       _SetWidgetEffect 
* 
* Purpose: 
*   Sets the effect for the given widget and its child windows 
*/ 
static void _SetWidgetEffect(WM_HWIN hWin, const WIDGET_EFFECT * pEffect) { 
  WM_HWIN hChild; 
  if (hWin) { 
    WIDGET_SetEffect(hWin, pEffect); /* Set effect for the widget*/ 
    /* Iterate over the child windows */ 
    hChild = WM_GetFirstChild(hWin); 
    while (hChild) { 
      WIDGET_SetEffect(hChild, pEffect); /* Set effect for the child windows */ 
      hChild = WM_GetNextSibling(hChild); 
    } 
  } 
} 
 
/********************************************************************* 
* 
*       _SetEffect 
*/ 
static void _SetEffect(int Index) { 
  int i; 
  const WIDGET_EFFECT * pEffect; 
  pEffect = _apEffect[Index]; 
  WIDGET_SetDefaultEffect(pEffect); 
  FRAMEWIN_SetText(_hFrameWin, _apEffects[Index]); 
  /* Iterate over all dialog widgets */ 
  for (i = 0; i < NUM_WIDGETS; i++) { 
    _SetWidgetEffect(_ahWin[i], _apEffect[Index]); /* Set effect */ 
  } 
} 
 
/********************************************************************* 
* 
*       _cbBkWindow 
*/ 
static void _cbBkWindow(WM_MESSAGE * pMsg) { 
  switch (pMsg->MsgId) { 
  case WM_PAINT: 
    GUI_SetBkColor(GUI_BLUE); 
    GUI_Clear(); 
    GUI_SetColor(GUI_WHITE); 
    GUI_SetFont(&GUI_Font24_ASCII); 
    GUI_DispStringHCenterAt("WIDGET_Effect - Sample", 160, 5); 
  default: 
    WM_DefaultProc(pMsg); 
  } 
} 
 
/********************************************************************* 
* 
*       _cbCallbackWidgets 
* 
* Purpose: 
*   Initializes the widgets of the main dialog box 
*/ 
static void _cbCallbackWidgets(WM_MESSAGE * pMsg) { 
  int i; 
  WM_HWIN hDlg; 
  hDlg = pMsg->hWin; 
  switch (pMsg->MsgId) { 
    case WM_INIT_DIALOG: 
      /* Get handles of widgets */ 
      for (i = 0; i < NUM_WIDGETS; i++) { 
        _ahWin[i] = WM_GetDialogItem(hDlg, _aID[i]); 
      } 
      /* Init dropdown widget */ 
      for (i = 0; i < 8; i++) { 
        char acBuffer[] = {"Item x"}; 
        int Len = strlen(acBuffer); 
        acBuffer[Len - 1] = '1' + i; 
        DROPDOWN_AddString(_ahWin[DROPDOWN0], acBuffer); 
      } 
      /* Init edit widget */ 
      EDIT_SetText(_ahWin[EDIT0], "Edit"); 
      /* Init listbox widget */ 
      LISTBOX_SetAutoScrollV(_ahWin[LISTBOX0], 1); 
      for (i = 0; i < 4; i++) { 
        char acBuffer[] = {"Item x"}; 
        int Len = strlen(acBuffer); 
        acBuffer[Len - 1] = '1' + i; 
        LISTBOX_AddString(_ahWin[LISTBOX0], acBuffer); 
      } 
      /* Init listview widget */ 
      for (i = 0; i < 2; i++) { 
        char acBuffer[] = {"Col. x"}; 
        int Len = strlen(acBuffer); 
        acBuffer[Len - 1] = '1' + i; 
        LISTVIEW_AddColumn(_ahWin[LISTVIEW0], 40, acBuffer, GUI_TA_CENTER); 
      } 
      for (i = 0; i < 9; i++) { 
        int j; 
        LISTVIEW_AddRow(_ahWin[LISTVIEW0], NULL); 
        for (j = 0; j < (int)LISTVIEW_GetNumColumns(_ahWin[LISTVIEW0]); j++) { 
          char acBuffer[] = {"Rx / Cx"}; 
          acBuffer[1] = '1' + i; 
          acBuffer[6] = '1' + j; 
          LISTVIEW_SetItemText(_ahWin[LISTVIEW0], j, i, acBuffer); 
        } 
      } 
      LISTVIEW_SetGridVis(_ahWin[LISTVIEW0], 1); 
      SCROLLBAR_CreateAttached(_ahWin[LISTVIEW0], SCROLLBAR_CF_VERTICAL); 
      /* Init multiedit widget */ 
      MULTIEDIT_SetText(_ahWin[MULTIEDIT0], "This text could be modified by the MULTIEDIT widget"); 
      MULTIEDIT_SetWrapWord(_ahWin[MULTIEDIT0]); 
      MULTIEDIT_SetAutoScrollV(_ahWin[MULTIEDIT0], 1); 
      /* Init progbar widget */ 
      WIDGET_SetEffect(_ahWin[PROGBAR0], &WIDGET_Effect_3D); 
      break; 
    default: 
      WM_DefaultProc(pMsg); 
  } 
} 
 
/********************************************************************* 
* 
*       _cbCallbackFramewin 
* 
* Purpose: 
*   Handles the scroll messages of the scrollbar 
*/ 
static void _cbCallbackFramewin(WM_MESSAGE * pMsg) { 
  WM_HWIN hDlg; 
  hDlg = pMsg->hWin; 
  switch (pMsg->MsgId) { 
    case WM_NOTIFY_PARENT: 
      if (pMsg->Data.v == WM_NOTIFICATION_VALUE_CHANGED) { 
        if (pMsg->hWinSrc == WM_GetScrollbarH(hDlg)) { 
          int xPos, yPos; 
          WM_SCROLL_STATE ScrollState; 
          WM_GetScrollState(pMsg->hWinSrc, &ScrollState); 
          xPos = WM_GetWindowOrgX(WM_GetParent(_hDlg)) - ScrollState.v; 
          yPos = WM_GetWindowOrgY(_hDlg); 
          WM_MoveTo(_hDlg, xPos, yPos); 
        } 
      } 
      break; 
    default: 
      WM_DefaultProc(pMsg); 
  } 
} 
 
/********************************************************************* 
* 
*       _cbCallbackOptions 
* 
* Purpose: 
*   Callback of the options dialog box, sets the widget effects 
*/ 
static void _cbCallbackOptions(WM_MESSAGE * pMsg) { 
  WM_HWIN hDlg, hItem; 
  hDlg = pMsg->hWin; 
  switch (pMsg->MsgId) { 
    case WM_INIT_DIALOG: 
      /* Init check box */ 
      hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0); 
      CHECKBOX_Check(hItem); 
      break; 
    case WM_NOTIFY_PARENT: 
      if (pMsg->Data.v == WM_NOTIFICATION_VALUE_CHANGED) { 
        hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0); 
        if (pMsg->hWinSrc == hItem) { 
          _SetEffect(RADIO_GetValue(hItem)); 
        } 
      } else if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) { 
        hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0); 
        if (pMsg->hWinSrc == hItem) { 
          _AutoMode = CHECKBOX_IsChecked(hItem); 
        } 
      } 
      break; 
    default: 
      WM_DefaultProc(pMsg); 
  } 
} 
 
/********************************************************************* 
* 
*       MainTask 
* 
*       Demonstrates the use of widget effects 
* 
********************************************************************** 
*/ 
 
void MainTask(void) { 
  WM_HWIN hScrollbar, hDlgOptions; 
  GUI_RECT RectDlg, RectClient; 
  int Cnt = 0, IndexEffect = 0, ButtonState = 0, DropdownState = 0; 
  int ProgbarValue   = 0, ProgbarInc   = 1; 
  int SliderValue    = 0, SliderInc    = 1; 
  int ScrollbarValue = 0, ScrollbarInc = 1; 
  int Vz = 1; 
  const WIDGET_EFFECT * _apEffect[] = {&WIDGET_Effect_3D,     /* Array of effects */ 
                                      &WIDGET_Effect_Simple,  
                                      &WIDGET_Effect_None}; 
  const char * _apEffects[] = {"Widget effect: 3D", "Widget effect: Simple", "Widget effect: None"}; 
  GUI_Init(); 
  GUI_CURSOR_Show(); 
  WM_SetCallback(WM_HBKWIN, _cbBkWindow); 
  WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */ 
  WM_EnableMemdev(WM_HBKWIN);       /* Enable use of memory devices for desktop windows */ 
  /* Create framewindow and set its properties */ 
  _hFrameWin = FRAMEWIN_CreateEx(0, 0, 319, 239, 0, WM_CF_SHOW, 0, 0, "", &_cbCallbackFramewin); 
  FRAMEWIN_SetMoveable(_hFrameWin, 1); 
  FRAMEWIN_SetText(_hFrameWin, _apEffects[0]); 
  FRAMEWIN_SetFont(_hFrameWin, &GUI_Font13B_ASCII); 
  /* Create main dialog window as child from framewindows client window */ 
  _hDlg = GUI_CreateDialogBox(_aDlgWidgets, 
                              GUI_COUNTOF(_aDlgWidgets),  
                              &_cbCallbackWidgets,  
                              WM_GetClientWindow(_hFrameWin), 0, 0); 
  /* Attach scrollbar to framewindows client window and set its properties */ 
  hScrollbar = SCROLLBAR_CreateAttached(WM_GetClientWindow(_hFrameWin), 0); 
  WM_GetWindowRectEx(_hDlg, &RectDlg); 
  WM_GetClientRectEx(WM_GetClientWindow(_hFrameWin), &RectClient); 
  SCROLLBAR_SetNumItems(hScrollbar, RectDlg.x1); 
  SCROLLBAR_SetPageSize(hScrollbar, RectClient.x1); 
  /* Create options dialog with 'stay on top' and 'moveable' attribute */ 
  hDlgOptions = GUI_CreateDialogBox(_aDlgOptions,  
                                    GUI_COUNTOF(_aDlgOptions),  
                                    &_cbCallbackOptions,  
                                    WM_HBKWIN, 0, 0); 
  FRAMEWIN_SetMoveable(hDlgOptions, 1); 
  WM_SetStayOnTop(hDlgOptions, 1); 
  /* Main loop for modifying the widgets */ 
  while (1) { 
    if (_AutoMode) { 
      Cnt++; 
      /* Modify progbar */ 
      if ((Cnt % 2) == 0) { 
        ProgbarValue += ProgbarInc; 
        if ((ProgbarValue == 110) || (ProgbarValue == -10)) { 
          ProgbarInc *= -1; 
        } 
        PROGBAR_SetValue(_ahWin[PROGBAR0], ProgbarValue); 
      } 
      /* Modify slider */ 
      if ((Cnt % 2) == 0) { 
        int j; 
        SliderValue += SliderInc; 
        if ((SliderValue == 100) || (SliderValue == 0)) { 
          SliderInc *= -1; 
        } 
        for (j = 0; j < 3; j++) { 
          SLIDER_SetValue(_ahWin[SLIDER0 + j], SliderValue); 
        } 
      } 
      /* Modify scrollbar */ 
      if ((Cnt % 3) == 0) { 
        int j; 
        ScrollbarValue += ScrollbarInc; 
        if ((ScrollbarValue == 90) || (ScrollbarValue == 0)) { 
          ScrollbarInc *= -1; 
        } 
        for (j = 0; j < 3; j++) { 
          SCROLLBAR_SetValue(_ahWin[SCROLLBAR0 + j], ScrollbarValue); 
        } 
      } 
      /* Modify dropdown */ 
      if ((Cnt % 120) == 0) { 
        DropdownState ^= 1; 
        if (DropdownState) { 
          DROPDOWN_Expand(_ahWin[DROPDOWN0]); 
        } else { 
          DROPDOWN_Collapse(_ahWin[DROPDOWN0]); 
        } 
      } 
      /* Modify button */ 
      if ((Cnt % 40) == 0) { 
        ButtonState ^= 1; 
        BUTTON_SetPressed(_ahWin[BUTTON0], ButtonState); 
      } 
      /* Move window */ 
      if ((Cnt % 1200) == 0) { 
        int Inc; 
        WM_HWIN hScroll; 
        WM_SCROLL_STATE ScrollState; 
        hScroll = WM_GetScrollbarH(WM_GetClientWindow(_hFrameWin)); 
        WM_GetScrollState(hScroll, &ScrollState); 
        Inc = (ScrollState.NumItems - ScrollState.PageSize) / 2; 
        ScrollState.v += Inc * Vz; 
        if ((ScrollState.v >= Inc * 2) || (ScrollState.v <= 0)) { 
          Vz *= -1; 
        } 
        SCROLLBAR_SetValue(hScroll, ScrollState.v); 
      } 
      /* Change effect */ 
      if ((Cnt % 400) == 0) { 
        int Index; 
        WM_HWIN hWin; 
        IndexEffect++; 
        Index = IndexEffect % GUI_COUNTOF(_apEffect); 
        _SetEffect(Index); 
        hWin = WM_GetDialogItem(hDlgOptions, GUI_ID_RADIO0); 
        RADIO_SetValue(hWin, Index); 
      } 
    } 
    /* Wait a while */ 
    GUI_Delay(10); 
  } 
}