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

📄 winitial.c

📁 MinGUI 可视化程序代码
💻 C
字号:
 /******************************************************************************** Copyright  2006 National ASIC Center, All right Reserved** FILE NAME:      winitial.c* PROGRAMMER:     ming.c* Date of Creation:   2006/08/8** DESCRIPTION:** NOTE:** FUNCTIONS LIST:* -----------------------------------------------------------------------------** -----------------------------------------------------------------------------*      To My JunHang* MODIFICATION HISTORY*     LastModify  2006/10/30******************************************************************************/#include "mingui.h"//---------------------------------------------------------------------------TMsgQueue g_SysMsgQueue;TWndCanvas *g_ScreenCanvas=NULL;TWndCanvas *DC_FreeList=NULL;
VRAM    *g_LcdFrameVram=NULL;
void    *GUI_LcdFrameBuffer=NULL; //LCD帧缓冲区首地址static  BOOL GUI_Running=false;extern  TBLOCKHEAP g_ClipRegionHeap;extern  TREGION WndClipRegion;//---------------------------------------------------------------------------extern void  SimulatorInitialize(void *,void *,void *,int,int,int,int,int,int,int,int,char *);extern void *SimulatorAllocateLcdFrameBuffer(void);
extern void  SimulatorDestroyLcdFrameBuffer(void);extern void  DeleteLcdFrameBuffer(void);extern void  GAL_Initialize(void);extern void  GAL_Destroy(void);extern void  GUI_TimerPulse(void);extern void  DispatchUserMsg(DWORD msg,DWORD wParam,DWORD lParam);extern void  UnregisterAllClass(void);extern void  GUI_RegisterControls(void);
extern void  ReexposeRootWnd(void);
static BOOL  CreateRootWindow(void);static void  DestroyRootWindow(void);static BOOL  InitMsgQueue(TMsgQueue *pMsgQueue);static void  FreeMsgQueue(TMsgQueue *pMsgQueue);
static HRESULT CALLBACK RootWindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);/*---------------------------------------------------------------------------FUNCTION  GUI_InitializeDESCRIPTION  初始化GUI系统,包括:      (1)初始化LCD驱动      (2)初始化调色板      (3)初始化控件类  该函数在创建第一个窗体时被隐式调用,不允许用户手动调用---------------------------------------------------------------------------*/BOOL GUI_Initialize(void){ if(!GUI_Running)  { GUI_Running=true;     #if(BASE_OS_TYPE==1)    SimulatorInitialize(GUI_TimerPulse,DispatchUserMsg,PixelMapToColor,GUI_CLK_CYCLE,LCD_WIDTH,LCD_HEIGHT,BITS_PER_PIXEL,PIXEL_BIG_ENDIAN,INDEX_RED_BITWIDTH,INDEX_GREEN_BITWIDTH,INDEX_BLUE_BITWIDTH,"1.1");    #endif     #if(DC_PRELOAD_COUNT>0)    { DC_FreeList=(TWndCanvas *)GetMem(DC_PRELOAD_COUNT * sizeof(TWndCanvas));      if(DC_FreeList)      { int i=0;        TWndCanvas *node=DC_FreeList;        while(i<DC_PRELOAD_COUNT)        { node->Next = node+1;          node->Prev = node-1;          node++;          i++;        }        DC_FreeList->Prev=DC_FreeList+DC_PRELOAD_COUNT-1;        DC_FreeList->Prev->Next=DC_FreeList;      }    }    #endif	InitBlockDataHeap(&g_ClipRegionHeap, sizeof (TClipRect), CLIPRGN_HEAP_SIZE);	InitRegion(&WndClipRegion, &g_ClipRegionHeap);	if(!InitMsgQueue(&g_SysMsgQueue)) return false;    	if(!CreateRootWindow()) return false;    GUI_RegisterControls();  }  return true;}/*---------------------------------------------------------------------------FUNCTION  GUI_DestroyDESCRIPTION  销毁GUI系统,释放占用资源,包括:    (1)销毁调色板    (2)销毁LCD驱动所占用的资源  该函数在销毁GUI系统最后一个窗体时被隐式调用,不允许用户手动调用---------------------------------------------------------------------------*/void GUI_Destroy(void){ if(GUI_Running)  {     FreeBlockDataHeap(&g_ClipRegionHeap);	FreeMsgQueue(&g_SysMsgQueue);	DestroyRootWindow();	UnregisterAllClass();    GUI_Running=false;/*GUI服务结束标*/  }}/*---------------------------------------------------------------------------FUNCTION   CreateMsgQueueDESCRIPTION  创建消息队列  每个消自己大小:  sizeof(TMSG)  队列中消息总数:  MSG_QUEUE_CAPACITY---------------------------------------------------------------------------*/BOOL InitMsgQueue(TMsgQueue *pMsgQueue){ if(pMsgQueue)  { int MsgQueueBufSize=sizeof(TMSG)*MSG_QUEUE_CAPACITY;    pMsgQueue->messagesize=sizeof(TMSG);    pMsgQueue->startaddress=(char *)GetMem(MsgQueueBufSize);    pMsgQueue->endaddress=pMsgQueue->startaddress+MsgQueueBufSize;    pMsgQueue->readpos=pMsgQueue->startaddress;    pMsgQueue->writepos=pMsgQueue->startaddress;    #if(BASE_OS_TYPE>1)  /*Kernel of EmbedOS available*/    pMsgQueue->Waiting=false;    pMsgQueue->Semaphor=Semaphore_Create();    #endif  }  return (pMsgQueue && pMsgQueue->startaddress);}/*---------------------------------------------------------------------------FUNCTION   DestroyMsgQueueDESCRIPTION  销毁消息队列---------------------------------------------------------------------------*/void  FreeMsgQueue(TMsgQueue *pMsgQueue){ if(pMsgQueue && pMsgQueue->startaddress)  { FreeMem(pMsgQueue->startaddress);    memset(pMsgQueue,0,sizeof(TMsgQueue));    #if(BASE_OS_TYPE>1)  /*Kernel of EmbedOS available*/    Semaphore_Destroy(pMsgQueue->Semaphore);    #endif  }}/*---------------------------------------------------------------------------FUNCTION  CreateRootWindowDESCRIPTION  RootWindow是一个虚构的特殊的窗口结点,它是GUI窗口与GDI库函数的接口。  不允许用户对根结点窗口进行任何操作,因为它其实不是一个真实的窗口。---------------------------------------------------------------------------*/
BOOL CreateRootWindow(void){  TWNDCLASS	wc;
   VRAM   *RootWndVram;   memset(&wc,0,sizeof(wc));
   wc.lpfnWndProc = RootWindowProc;   wc.lpszClassName = "MinGUI";   RegisterClass( &wc);   g_RootWnd = (PWND)GetMem(sizeof(TWND)+sizeof(TWndFamily));
   if(!g_RootWnd) return false;
   if(!GUI_LcdFrameBuffer)
   {
     #if BASE_OS_TYPE==1 
     GUI_LcdFrameBuffer=SimulatorAllocateLcdFrameBuffer();
     #else
        #ifdef LCD_FrameBuffer
	    GUI_LcdFrameBuffer=(void *)LCD_FrameBuffer;
        #else
		GUI_LcdFrameBuffer=NULL;
        #endif
     #endif
   }
   RootWndVram=CreateVRAM(0,0,LCD_WIDTH,LCD_HEIGHT,GUI_LcdFrameBuffer,true);
   g_LcdFrameVram=(GUI_LcdFrameBuffer)?RootWndVram:NULL; /*if support frame buffer*/
   if(!RootWndVram)return false;   InitRegion(&RootWndVram->ExposeRegion, &g_ClipRegionHeap);   g_RootWnd->Family=(TWndFamily *)&g_RootWnd->ExtraLong[1];   g_RootWnd->Family->TopWnd=g_RootWnd;   g_RootWnd->Family->HisFocus=g_RootWnd;   g_RootWnd->Family->Vram=RootWndVram;
   g_RootWnd->Family->CanvasChanged=false;   g_RootWnd->WinClass = FindClassByName("MinGUI");   g_RootWnd->Background=0;
   g_RootWnd->Foreground=(PIXEL)(-1);   g_RootWnd->Style=0;   g_RootWnd->Parent = NULL;   g_RootWnd->Children = NULL;   g_RootWnd->Next = NULL;   g_RootWnd->Prev = NULL;
   
   g_RootWnd->unmapcount = 0;   g_RootWnd->Mark=GUI_MARK_WND; /*设置窗体标志*/   g_RootWnd->ID = 0;   g_RootWnd->Canvas=NULL;
   g_RootWnd->HookProc=NULL;
   g_RootWnd->Caption.Text[0]=0;   g_RootWnd->WndRect.left=0;   g_RootWnd->WndRect.top=0;   g_RootWnd->WndRect.right=LCD_WIDTH;   g_RootWnd->WndRect.bottom=LCD_HEIGHT;
   g_RootWnd->ClientRect=g_RootWnd->WndRect;      strncpy(g_RootWnd->Caption.Text,"MinGUI",FixedWndTextSize);     g_ScreenCanvas=(TWndCanvas *)GetDC(g_RootWnd);   /*DC_FreeList的第一个DC*/   g_LastFocus=NULL;         /*上次焦点*/   g_CurrentFocus=g_RootWnd; /*当前焦点*/   return true;}/*---------------------------------------------------------------------------FUNCTION  DestroyRootWindowDESCRIPTION。销毁GUI窗口的根节点---------------------------------------------------------------------------*/void DestroyRootWindow(void){   g_RootWnd->Mark=0;
    FreeVRAM(g_RootWnd->Family->Vram);    FreeMem(g_RootWnd);    #if BASE_OS_TYPE==1 
     SimulatorDestroyLcdFrameBuffer();
    #endif     FreeMem(g_ScreenCanvas);    g_ScreenCanvas=NULL;    g_LcdFrameVram=NULL;	g_LastFocus=NULL;    g_CurrentFocus=NULL;
	GUI_LcdFrameBuffer=NULL;
}

//////////////////////////////////////////////////////////////////////////////////
HRESULT CALLBACK RootWindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{ switch(message)
  {
	case WM_ERASEBKGND:
		 { HDC dc=(HDC)wParam;
		   TRECT *prc=(TRECT *)lParam;
		   ClearRect(dc,prc->left,prc->top,prc->right-prc->left,prc->bottom-prc->top);
		 }
         return 0;
    case WM_EXPOSE:
		   ReexposeRootWnd();
         return 0;

    case WM_LBUTTONDOWN:
		 if(hWnd!=(HWND)g_CurrentFocus)
         { SetFocus(hWnd);
         }
         return 0;
  }
  return 0;
}/*---------------------------------------------------------------------------END --- Thank you!                                                     ming.c---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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