📄 winitial.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 + -