一个嵌入式系统的C代码

源代码在线查看: btn.cpp

软件大小: 435 K
上传用户: pipinooad
关键词: 嵌入式系统 C代码
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*************************************************************************				*  MODULE : Btn - Class Body						 *				*  AUTHOR : Ron Chernich						 *				*  PURPOSE: Class actions used to build "button" like objects used in	 *				*	     RCOS system.  These actions support button construction and *				*	     activation only.  All visual aspects are handled by a class *				*	     based on this class.					 *				*  HISTORY:								 *				*   18-JAN-93  First (MSC/C++ 7.00) version				 *				*   04-JUN-93  Allocation of button label made conditional		 *				*   29-MAR-94  Button class being deleted twice (allow to DblList do it) *				*************************************************************************/												#include "btn.hpp"												/////////////////				// table used to lookup the raw key values returned by ALT keys				//				static unsigned char RawKey[] = {				  ALT_A, ALT_B, ALT_C, ALT_D, ALT_E, ALT_F, ALT_G, ALT_H, ALT_I,				  ALT_J, ALT_K, ALT_L, ALT_M, ALT_N, ALT_O, ALT_P, ALT_Q, ALT_R,				  ALT_S, ALT_T, ALT_U, ALT_V, ALT_W, ALT_X, ALT_Y, ALT_Z, ALT_0,				  ALT_1, ALT_2, ALT_3, ALT_4, ALT_5, ALT_6, ALT_7, ALT_8, ALT_9				};												//////////////////////////////////////////////////////////////////////////				// Class destructor:  Kills off all buttons in a linked list,				// and then the list itself				//				Btn::~Btn()				{								  pb = (btn*)DblGetHead();				  while (pb) {				    if (pb->pst)				      delete pb->pst;				    pb = (btn*)DblGetNext();				  }				  DblDrop();				  pb = NULL;				};								/////////////////				// Add a new button to the linked list.  The params decode as:				//     n .. the ID to be returned when the button is activated				//   str .. Button label (with optional hot key char prefixed by "&")				// x1,y1 .. Upper-Left boundary for "hot reigon"				// x2,y2 .. width and height of hot area from upper-left reference				// RETURNS: TRUE  .. action complete (Btn::pb references new data object)				//	    FALSE .. unable to allocate storage for item				//				BOOL Btn::BtnNew(const UINT16 n, char *str, rect &r)				{				  btn  *p;				  int  idx;				  char *cp;				  BOOL bOk = FALSE;								  if (p = new btn) {				    p->r  = r;				    p->Id = n;				    p->status = 0;				    if (strlen(str) == 0)				      p->pst = NULL;				    else {				      p->pst = new Str(str);				      if (cp = strchr(str, '&')) {					++cp;					idx = (((*cp >= 'a') && (*cp 					      ((*cp >= 'A') && (*cp 					      ((*cp >= '0') && (*cp 					p->HotKey = ((idx >= 0) ? RawKey[idx] : 0);				      }				    }				    if (DblAppend((void*)p, (UINT16)sizeof(btn)))				      bOk = TRUE;				    else				      delete p->pst;				  }				  if (pb = p)  // bit naughty: combined assignment and test (not comparison!)				    delete p;				  return bOk;				}								///////////////				// See if a member button has the passed Hot Key code				// RETURNS:  button reference (or NULL if Hot Key unsegistered)				//				btn *Btn::BtnHit (const char ch)				{				  pb = (btn*)DblGetHead();				  while (pb) {				    if (ch == pb->HotKey)				      break;				    pb = (btn*)DblGetNext();				  }				  return pb;				}								///////////////				// See if the passed point lies in a member button Hot Zone				// RETURNS:  button reference (or NULL if point unsegistered)				//				btn *Btn::BtnHit (point &pt)				{								  pb = (btn*)DblGetHead();				  while (pb) {				    if (pb->r.InRect(pt))				      break;				    pb = (btn*)DblGetNext();				  }				  return pb;				}								/////////////				// Locate button by ID				// RETURNS: TRUE  .. ID found, pb -> data				//	    FALSE .. unknown ID				//				BOOL Btn::BtnFind (const UINT16 id)				{								  pb = (btn*)DblGetHead();				  while (pb) {				    if (pb->Id == id)				      return TRUE;				    pb = (btn*)DblGetNext();				  }				  return FALSE;				}								/////////////				// Delete string label of button with passed ID from list, then allow				// the linked list class to free the rest.  If the passed ID is ZERO				// (an illegal ID), kill off all controls in the list.				//				void Btn::BtnKill (const UINT16 nTarg)				{								  pb = (btn*)DblGetHead();				  while (pb) {				    if (!nTarg || (pb->Id == nTarg)) {				      if (pb->pst)				        delete pb->pst;				      DblDelete();				      break;				    }				    pb = (btn*)DblGetNext();				  }				}								/************************************ EOF ********************************/							

相关资源