www.pudn.com > uC-GUI-V3-98.zip > WIDGET_EditWinmode.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_EditWinmode.c 
Purpose     : Demonstrates how to use a edit widget in 'windows' mode 
---------------------------------------------------------------------- 
*/ 
 
#include  
 
#include "GUI.h" 
#include "WM.h" 
#include "DIALOG.h" 
 
/********************************************************************* 
* 
*       Static data 
* 
********************************************************************** 
*/ 
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { 
  { FRAMEWIN_CreateIndirect, "Edit winmode", 0,         90,  90, 140, 130, FRAMEWIN_CF_MOVEABLE}, 
  { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT0,    10,  10, 110,  20, 0, 15}, 
  { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT1,    10,  40, 110,  20, 0, 15}, 
  { BUTTON_CreateIndirect,   "Ok",     GUI_ID_OK,       10,  80,  50,  20 }, 
  { BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,   70,  80,  50,  20 }, 
}; 
 
static WM_CALLBACK * _pEditCallback; 
 
static char * _apExplain[] = { 
  {"This sample shows how to use edit widgets with a"}, 
  {"user defined callback function and how to set a"}, 
  {"user defined AddKey function. It selects the"}, 
  {"contents of the edit field on receiving the focus"}, 
  {"and overwrites the contents if a key other than"}, 
  {"a cursor key is pressed."}, 
}; 
 
/********************************************************************* 
* 
*       Static code 
* 
********************************************************************** 
*/ 
/********************************************************************* 
* 
*       _cbEditAddKey 
* 
* Purpose: 
*   This function is called by the edit widget if a character should be added to the contents of the widget. 
*/ 
static void _cbEditAddKey(EDIT_Handle hObj, int Key) { 
  char acBuffer[2] = {0}; 
  switch (Key) { 
  case GUI_KEY_LEFT: 
    EDIT_SetpfAddKeyEx(hObj, 0);                            /* Clear user defined AddKey function */ 
    EDIT_SetCursorAtChar(hObj, EDIT_GetNumChars(hObj) - 1); /* Set cursor if GUI_KEY_LEFT has been pressed */ 
    break; 
  case GUI_KEY_RIGHT: 
    EDIT_SetpfAddKeyEx(hObj, 0);                            /* Clear user defined AddKey function */ 
    EDIT_SetCursorAtChar(hObj, 1);                          /* Set cursor if GUI_KEY_RIGHT has been pressed */ 
    break; 
  case GUI_KEY_UP:                                          /* Do not react on GUI_KEY_UP and GUI_KEY_DOWN */ 
  case GUI_KEY_DOWN: 
    break; 
  default: 
    acBuffer[0] = (U8)Key; 
    EDIT_SetpfAddKeyEx(hObj, 0);                            /* Clear user defined AddKey function */ 
    EDIT_SetText(hObj, acBuffer);                           /* Overwrite contents of edit widget with pressed key */ 
  } 
} 
 
/********************************************************************* 
* 
*       _cbEdit 
* 
* Purpose: 
*   New callback function of edit widgets which should work in 'windows' mode. 
*/ 
static void _cbEdit(WM_MESSAGE * pMsg) { 
  switch (pMsg->MsgId) { 
  case WM_PID_STATE_CHANGED: 
    if (((const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p)->State) { 
      return; /* Do not call edit callback */ 
    } 
    break; 
  case WM_TOUCH: 
    if (pMsg->Data.p) {  /* Something happened in our area (pressed or released) */ 
      const GUI_PID_STATE* pState; 
      pState = (const GUI_PID_STATE*)pMsg->Data.p; 
      if (pState->Pressed) { 
        if (WM_GetFocussedWindow() != pMsg->hWin) { 
          WM_SetFocus(pMsg->hWin); 
          return; /* Do not call edit callback */ 
        } 
      } 
    } 
    break; 
  case WM_SET_FOCUS: 
    if (pMsg->Data.v == 1) { 
      EDIT_SetpfAddKeyEx(pMsg->hWin, _cbEditAddKey); /* Set function pointer for a user defined AddKey function */ 
      EDIT_SetSel(pMsg->hWin, 0, -1);             /* Select the whole contents of the edit field */ 
    } 
  } 
  if (_pEditCallback) { 
    _pEditCallback(pMsg); 
  } 
} 
 
/********************************************************************* 
* 
*       _cbDialog 
*/ 
static void _cbDialog(WM_MESSAGE * pMsg) { 
  int i; 
  int NCode, Id; 
  WM_HWIN hDlg, hItem; 
  hDlg = pMsg->hWin; 
  switch (pMsg->MsgId) { 
  case WM_INIT_DIALOG: 
    FRAMEWIN_SetFont(pMsg->hWin, &GUI_Font13_ASCII); 
    FRAMEWIN_SetTextAlign(pMsg->hWin, GUI_TA_HCENTER); 
    for (i = 0; i < 2; i++) { 
      hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + i);  /* Get the handle of the edit widget */ 
      if (!_pEditCallback) { 
        _pEditCallback = WM_SetCallback(hItem, _cbEdit); /* Overwrite callback function and remember original function */ 
      } else { 
        WM_SetCallback(hItem, _cbEdit);                  /* Overwrite callback function */ 
      } 
      EDIT_SetText(hItem, "Hello world!");               /* Fill widget with text */ 
      EDIT_SetpfAddKeyEx(hItem, _cbEditAddKey);          /* Set function pointer for a user defined AddKey function */ 
      EDIT_SetSel(hItem, 0, -1);                         /* Select the whole contents of the edit field */ 
    } 
    break; 
  case WM_NOTIFY_PARENT: 
    Id    = WM_GetId(pMsg->hWinSrc);      /* Id of widget */ 
    NCode = pMsg->Data.v;                 /* Notification code */ 
    switch (NCode) { 
      case WM_NOTIFICATION_RELEASED:      /* React only if released */ 
        if (Id == GUI_ID_OK) {            /* OK Button */ 
          GUI_EndDialog(hDlg, 0); 
        } 
        if (Id == GUI_ID_CANCEL) {        /* Cancel Button */ 
          GUI_EndDialog(hDlg, 1); 
        } 
        break; 
    } 
    break; 
  default: 
    WM_DefaultProc(pMsg); 
  } 
} 
 
/********************************************************************* 
* 
*       _cbDesktop 
* 
* Purpose: 
*   This routine handles the drawing of the desktop window. 
*/ 
static void _cbDesktop(WM_MESSAGE * pMsg) { 
  int i; 
  switch (pMsg->MsgId) { 
  case WM_PAINT: 
    GUI_SetBkColor(GUI_RED); 
    GUI_Clear(); 
    GUI_SetFont(&GUI_Font24_ASCII); 
    GUI_DispStringHCenterAt("WIDGET_EditWinmode", 160, 5); 
    GUI_DispNextLine(); 
    GUI_SetFont(GUI_DEFAULT_FONT); 
    GUI_DispNextLine(); 
    for (i = 0; i < GUI_COUNTOF(_apExplain); i++) { 
      GUI_DispStringHCenterAt(_apExplain[i], 160, GUI_GetDispPosY()); 
      GUI_DispNextLine(); 
    } 
    break; 
  } 
} 
 
/********************************************************************* 
* 
*       Exported code 
* 
********************************************************************** 
*/ 
/********************************************************************* 
* 
*       MainTask 
*/ 
void MainTask(void) { 
  int Result; 
  GUI_Init(); 
  WM_SetCallback(WM_HBKWIN, _cbDesktop); 
  while(1) { 
    Result = GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 0); 
    GUI_Delay(1000); 
  } 
}