⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 status.c

📁 NASA 开发使用的一个专家系统
💻 C
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*                  A Product Of The                   */   /*             Software Technology Branch              */   /*             NASA - Johnson Space Center             */   /*                                                     */   /*               CLIPS Version 6.00  10/01/92          */   /*                                                     */   /*                   STATUS MODULE                     */   /*******************************************************//**************************************************************//* Purpose: Callback and support for all Status Trace Windows *//*                                                            *//* Principal Programmer(s):                                   *//*      Christopher J. Ortiz                                  *//*                                                            *//* Contributing Programmer(s):                                *//*                                                            *//* Revision History:                                          *//*                                                            *//**************************************************************//*-------------------------------+| Windows & System Include Files |+-------------------------------*/#include <windows.h>#include <string.h>/*------------------------+| CLIPS 6.0 Include Files |+------------------------*/#include "setup.h"#include "engine.h"#include "inscom.h"#include "globldef.h"#include "insfun.h"#include "factmngr.h"/*------------------------+| Interface Include Files |+------------------------*/#include "ids.h"#include "status.h"#include "main.h"/*--------------------------+| Local Function Prototypes |+--------------------------*/VOID DrawFacts ( VOID );VOID RedrawScreen (SCREEN *,VOID(*)(),VOID*(*)(), HDC);VOID UpdateWnd ( SCREEN * );VOID GetFocusPPForm ( char *, int, VOID *);VOID UpdateStatusWndTitle ( HWND, char*);int  CountInstances( VOID );int  CountDefglobals( VOID );int  CountFocus( VOID );int  CountFacts ( VOID );int  ProcessScrollMsg (SCREEN *, WORD, LONG, int );int ChangeToFocus = 1;/*-----------------------------------+| Setup Screen Information Variables |+-----------------------------------*/SCREEN WinGlobal;SCREEN WinFact;SCREEN WinInst;SCREEN WinAgenda;SCREEN WinFocus;/******************************************************************** StatusWndProc: Callback Function for Status Windows.*******************************************************************/long FAR PASCAL StatusWndProc(hWnd, message, wParam, lParam)   HWND     hWnd;   unsigned message;   WORD     wParam;   LONG     lParam;{  extern SCREEN WinFact, WinAgenda, WinInst, WinGlobal, WinFocus;   SCREEN *Window;   VOID (*GetPPForm)(char*,int,VOID*) = NULL;   VOID *(*GetNextValue)(VOID*) = NULL;   /*---------------------------------------------------+   | Determine which Window the message is intended for |   +---------------------------------------------------*/#if DEFTEMPLATE_CONSTRUCT   if ( hWnd == WinFact.hWnd )   {  Window = &WinFact;      GetNextValue = GetNextFactInScope;      GetPPForm = GetFactPPForm;   }#endif#if OBJECT_SYSTEM   if ( hWnd == WinInst.hWnd )   {  Window = &WinInst;      GetNextValue = GetNextInstanceInScope;      GetPPForm = GetInstancePPForm;   }#endif#if DEFGLOBAL_CONSTRUCT   if ( hWnd == WinGlobal.hWnd )   {  Window = &WinGlobal;      GetNextValue = GetNextDefglobalInScope;      GetPPForm = GetDefglobalValueForm;   }#endif#if DEFRULE_CONSTRUCT   if ( hWnd == WinAgenda.hWnd )   {  Window = &WinAgenda;      GetNextValue = GetNextActivation;      GetPPForm = GetActivationPPForm;   }   if ( hWnd == WinFocus.hWnd )   {  Window = &WinFocus;      GetNextValue = GetNextFocus;      GetPPForm = GetFocusPPForm;   }#endif   switch (message)   {  case WM_VSCROLL:	 return ( ProcessScrollMsg ( Window, wParam, lParam, SB_VERT ));      case WM_HSCROLL:	 return ( ProcessScrollMsg ( Window, wParam, lParam, SB_HORZ ));      case WM_SIZE:      {  /*-----------------------+	 | Window Changes in Size |	 +-----------------------*/	 (*Window).NoLines = HIWORD (lParam) / (*Window).LineSize;	 UpdateWnd ( Window );	 break;      }      case WM_KEYDOWN:      {  /*----------------------------------------------------+	 | Key input was detected in window send to Dialog Wnd |	 +----------------------------------------------------*/         extern SCREEN WinDialog;         PostMessage ( WinDialog.hWnd, message, wParam, lParam);	 SetFocus ( WinDialog.hWnd );         break;      }      case WM_PAINT:      {  /*---------------------+	 | Screen Update Needed |         +---------------------*/         PAINTSTRUCT ps;         HDC  hDC; 	 BeginPaint (hWnd, (LPPAINTSTRUCT)&ps);	    hDC = ps.hdc;            SetMapMode (hDC, MM_TEXT);            RedrawScreen ( Window, GetPPForm, GetNextValue, hDC );	    ValidateRect (hWnd, (LPRECT)NULL);         EndPaint (hWnd, (LPPAINTSTRUCT)&ps);	 return (TRUE);      }      default:         return (DefWindowProc(hWnd, message, wParam, lParam));   }   return ( TRUE );}/******************************************************************** ProcessScrollMsg: Generic Procedure to process scroll bar messages.*******************************************************************/int ProcessScrollMsg ( Window, wParam, lParam, Bar)   SCREEN *Window;   WORD wParam;   LONG lParam;   int Bar;{  int min, max, cp;   /*------------------------+   | Vertical Scroll Message |   +------------------------*/   cp = GetScrollPos ( (*Window).hWnd, Bar );   switch (wParam)   {  case SB_LINEDOWN:      {  cp++;         break;      }      case SB_LINEUP:      {  cp--;         break;      }      case SB_PAGEDOWN:      {  cp += (*Window).NoLines;         break;      }      case SB_PAGEUP:      {  cp -= (*Window).NoLines;         break;      }      case SB_THUMBTRACK:      {  cp = LOWORD(lParam);         break;      }      default:         return (0);   }   GetScrollRange ((*Window).hWnd ,Bar, &min, &max);   if (cp < min) cp = min;   if (cp > max) cp = max;   SetScrollPos ((*Window).hWnd, Bar, cp, TRUE);   InvalidateRect ( (*Window).hWnd, NULL, TRUE );   return (1);}/******************************************************************** RedrawScreen: Function will clear and redraw a status screen.*******************************************************************/VOID RedrawScreen ( Window, GetPPForm, GetNextValue, hDC )   SCREEN *Window;   VOID (*GetPPForm)(char*,int,VOID*);   VOID *(*GetNextValue)(VOID*);   HDC hDC;{  VOID *ValuePtr;   char Buffer[300];   RECT Rect;   int count, pos, sbmax = 0;   pos = GetScrollPos ( (*Window).hWnd, SB_VERT );   /*-----------------------------------------------------------+   |Skip over any facts that fall out of range above the window.|   +-----------------------------------------------------------*/   count = 0;   ValuePtr = (*GetNextValue)(NULL);   while ( ValuePtr != NULL && count < pos )   {  ValuePtr = (*GetNextValue)(ValuePtr);      count++;   }     if ( ValuePtr != NULL )   {  /*-------------+      | Clear Window |      +-------------*/      GetClientRect ( (*Window).hWnd, &Rect );      Rectangle ( hDC, Rect.left-2, Rect.top-2, Rect.right+2, Rect.bottom+2 );      /*-----------------------------------------------------+      | Display the items that fall within the status window.|      +-----------------------------------------------------*/      count = 0;      do      {  int bufsize;         pos = GetScrollPos ( (*Window).hWnd, SB_HORZ );         (*GetPPForm)(Buffer, 299, ValuePtr);         bufsize = lstrlen (Buffer);         if (bufsize > sbmax ) sbmax = bufsize;         if ( pos < bufsize )         {  char * buffer = Buffer + pos;            DrawText(hDC, buffer, lstrlen(buffer), &Rect, DT_LEFT );         }         Rect.top = Rect.top + (*Window).LineSize;         count ++;      }      while (((ValuePtr=(*GetNextValue)(ValuePtr)) != NULL) && (count < (*Window).NoLines));      SetScrollRange ( (*Window).hWnd, SB_HORZ, 0, sbmax-1, TRUE );   }}/************************************************************** EnableStatusWindows:  Function is used to initialize status*    window menu items.**************************************************************/VOID EnableStatusWindows ( VOID ){  extern SCREEN WinDialog;   HMENU hMenu = GetMenu ( WinDialog.hWnd );#if DEFRULE_CONSTRUCT   /* Enable Agenda Status Window */   EnableMenuItem(hMenu,IDM_WIN_AGENDA,MF_BYCOMMAND|MF_ENABLED);   /* Enable Focus Status Window */   EnableMenuItem(hMenu,IDM_WIN_FOCUS,MF_BYCOMMAND|MF_ENABLED);#endif#if DEFTEMPLATE_CONSTRUCT   /* Enable Facts Status Window */   EnableMenuItem(hMenu,IDM_WIN_FACTS,MF_BYCOMMAND|MF_ENABLED);#endif#if DEFGLOBAL_CONSTRUCT   /* Enable Globals Status Window */   EnableMenuItem(hMenu,IDM_WIN_GLOBALS,MF_BYCOMMAND|MF_ENABLED);#endif#if OBJECT_SYSTEM    /* Enable Instance Status Window */    EnableMenuItem(hMenu,IDM_WIN_INSTANCE,MF_BYCOMMAND|MF_ENABLED);#endif}/******************************************************************** GetFocusPPForm: Returns the Focus Names in printable form.*******************************************************************/static VOID GetFocusPPForm ( buffer, bufferLength, vTheFocus )   char *buffer;   int   bufferLength;   VOID *vTheFocus;{  struct focus *theFocus = (struct focus *) vTheFocus;   strncpy (buffer, GetDefmoduleName(theFocus->theModule),bufferLength);}/******************************************************************** CountFocus: Returns the number of Focus in CLIPS*******************************************************************/int CountFocus( VOID ){ int count = 0;  VOID *Ptr = NULL;  while (( Ptr = GetNextFocus(Ptr) )!= NULL)     count ++;  return count;}/******************************************************************** CountFacts: Returns the number of Facts in Scope.*******************************************************************/int CountFacts( VOID ){ int count = 0;  VOID *FactPtr = NULL;  while (( FactPtr = GetNextFactInScope(FactPtr) )!= NULL)     count ++;  return count;}/******************************************************************** CountInstances: Returns the number of instances in Scope.*******************************************************************/int CountInstances( VOID ){ int count = 0;  VOID *InstPtr = NULL;  while (( InstPtr = GetNextInstanceInScope(InstPtr) )!= NULL)     count ++;  return count;}/******************************************************************** CountDefglobals: Returns the number of DefGlobals in Scope*******************************************************************/int CountDefglobals( VOID ){ int count = 0;  VOID *Ptr = NULL;  while (( Ptr = GetNextDefglobalInScope(Ptr) )!= NULL)     count ++;  return count;}/******************************************************************** UpdateStatus: Function called while CLIPS is executing to update*    each visible status window.*******************************************************************/VOID UpdateStatus ( VOID ){  extern SCREEN WinFact, WinAgenda, WinGlobal, WinInst, WinDialog;   static long lastModuleIndex = -1;   extern long ModuleChangeIndex;   if ( lastModuleIndex != ModuleChangeIndex )   {#if DEFRULE_CONSTRUCT      SetFocusChanged     (CLIPS_TRUE);      SetAgendaChanged    (CLIPS_TRUE);#endif#if DEFTEMPLATE_CONSTRUCT      SetFactListChanged  (CLIPS_TRUE);#endif#if OBJECT_SYSTEM      SetInstancesChanged (CLIPS_TRUE);#endif#if DEFGLOBAL_CONSTRUCT      SetGlobalsChanged   (CLIPS_TRUE);#endif      lastModuleIndex = ModuleChangeIndex;   }#if DEFRULE_CONSTRUCT   /*------------------------+   | Update the Focus Window |   +------------------------*/   if (IsWindowVisible(WinFocus.hWnd))   {  if (GetFocusChanged())      {  SetFocusChanged(CLIPS_FALSE);	 WinFocus.LastLine = (int) CountFocus();	 UpdateWnd ( &WinFocus );      }   }   /*-------------------------+   | Update the Agenda Window |   +-------------------------*/   if (IsWindowVisible(WinAgenda.hWnd))   {  if ( GetAgendaChanged() )      {  SetAgendaChanged ( CLIPS_FALSE );	 WinAgenda.LastLine = (int) GetNumberOfActivations();         UpdateStatusWndTitle(WinAgenda.hWnd, "Agenda");	 UpdateWnd ( &WinAgenda );      }   }#endif#if DEFTEMPLATE_CONSTRUCT   /*-----------------------+   | Update the Fact Window |   +-----------------------*/   if (IsWindowVisible(WinFact.hWnd))   {  if ( GetFactListChanged())      {  SetFactListChanged ( CLIPS_FALSE );	 WinFact.LastLine = CountFacts();	 UpdateStatusWndTitle(WinFact.hWnd, "Facts");	 UpdateWnd ( &WinFact );      }   }#endif#if OBJECT_SYSTEM   /*---------------------------+   | Update the Instance Window |   +---------------------------*/   if (IsWindowVisible(WinInst.hWnd))   {  if (GetInstancesChanged())      {  SetInstancesChanged (CLIPS_FALSE);	 UpdateStatusWndTitle(WinInst.hWnd, "Instances");	 WinInst.LastLine = CountInstances();	 UpdateWnd ( &WinInst );      }   }#endif#if DEFGLOBAL_CONSTRUCT   /*--------------------------+   | Update the Globals Window |   +--------------------------*/   if (IsWindowVisible(WinGlobal.hWnd))   {  if (GetGlobalsChanged())      {  SetGlobalsChanged(CLIPS_FALSE);	 UpdateStatusWndTitle(WinGlobal.hWnd, "Globals");	 WinGlobal.LastLine = CountDefglobals();	 UpdateWnd ( &WinGlobal );      }   }#endif}/******************************************************************** UpdateWnd: Calculates the Maximum Value for the Vertical*    Scrollbar, Current position and Redraws Window.*******************************************************************/VOID UpdateWnd ( Window )   SCREEN *Window;{  /*------------------------------------------------+   | Calculate the Maximum Value for the Vert Scroll |   +------------------------------------------------*/   int max = (int) (*Window).LastLine - (*Window).NoLines;   if (max < 0 )      max = 0;   SetScrollRange ((*Window).hWnd ,SB_VERT,0, max ,FALSE);   /*-----------------------------------------------+   | If Agenda Window Then start display at the top |   +----------------------------------------------*/   if ( (*Window).hWnd == WinAgenda.hWnd )      max = 0;   SetScrollPos   ((*Window).hWnd, SB_VERT, max ,TRUE);   InvalidateRect ( (*Window).hWnd, NULL, TRUE);}/******************************************************************** UpdateStatusWndTitle: Function will append the Current Module*   name to the Window Title Bar.*******************************************************************/VOID UpdateStatusWndTitle ( hWnd, prefix)   HWND hWnd;   char *prefix;{  struct defmodule *theModule = GetCurrentModule();   char buffer[255];   sprintf ( buffer, "%s (%s)",prefix, GetDefmoduleName(theModule));   SetWindowText (hWnd, buffer);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -