📄 haictrl.c
字号:
//---------------------------------------------------------------------------------
// Copyright (c) Haisoft 2006-9-1
// Copyright jinhailiao 2008-2010
// E-mail: jinhailiao@163.com
// Project: HGui
// File: haictrl.c
// Description:
//-------------------------------------------------------------
// Reversion Histroy:
//-------------------------------------------------------------
// Version date operations by who
// 2.0.0 2006-12-24 create Kingsea
// 3.0.0 2008-03-01 update Kingsea
//---------------------------------------------------------------------------------
#include "haitype.h"
#include "haihandle.h"
#include "_haictrl.h"
#include "haictrl.h"
#include "_haiscene.h"
#include "haiscene.h"
#include "_haigdi.h"
#include "haigdi.h"
#include "haimem.h"
#include "hailib.h"
#include "haigui.h"
#include "virkey.h"
#include "haitime.h"
#include "haicaret.h"
#include "bmpicon.h"
static SH_CTRL pCtrlCapture = S_NULL;
Hai_CtrlProc *hai_GetCtrlTypeProc(S_BYTE CtrlType);
S_VOID _hai_InitCtrlSystem(S_VOID)
{
pCtrlCapture = S_NULL;
}
SH_CTRL hai_SetCapture(SH_CTRL hCtrl)
{
SH_CTRL pPrevCapture = pCtrlCapture;
if (hCtrl)
pCtrlCapture = hCtrl;
return pPrevCapture;
}
S_BOOL hai_ReleaseCapture(S_VOID)
{
if (pCtrlCapture)
{
pCtrlCapture = S_NULL;
return S_TRUE;
}
else
return S_FALSE;
}
SH_CTRL hai_CreateCtrl(S_BYTE CtrlType, S_BYTE CtrlID, S_DWORD style, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h)
{
SP_CTRL pCtrl;
SP_CTRL pListHead, pListEnd;
if (!(CtrlType > CT_START && CtrlType < CT_END) || !CtrlID)
return S_NULL;
if (x < 0 || y < 0 || x >= LCD_WIDTH || y >= LCD_HEIGHT)
return S_NULL;
if (w < 0 || h < 0 || w > LCD_WIDTH || h > LCD_HEIGHT)
return S_NULL;
pCtrl = hai_MemAlloc(sizeof(S_CTRL));
if (!pCtrl)
return S_NULL;
memset(pCtrl, 0x00, sizeof(S_CTRL));
HAI_SETHDLTYPE(pCtrl, HT_CTRL);
pListHead = hai_GetCurSceneCtrlListHead();
pListEnd = hai_GetCurSceneCtrlListEnd();
if (pListEnd)
{
pCtrl->prev = S_NULL;
pListHead->prev = pCtrl;
}
else
{
pCtrl->prev = S_NULL;
pListEnd = pCtrl;
hai_SetCurSceneCtrlListEnd(pListEnd);
}
pCtrl->next = pListHead;
pListHead = pCtrl;
hai_SetCurSceneCtrlListHead(pListHead);
pCtrl->CtrlType = CtrlType;
pCtrl->CtrlID = CtrlID;
pCtrl->visible = !!(style & CS_VISIBLE);
pCtrl->grayed = !!(style & CS_GRAYED);
pCtrl->style = style & CS_STYLE_MASK;
pCtrl->x = x;
pCtrl->y = y;
pCtrl->w = w;
pCtrl->h = h;
if (style & CS_GROUP_FLAG)
{
if (pCtrl->prev)
pCtrl->group = (pCtrl->prev)->group + 1;
else
pCtrl->group = 0;
}
else
{
if (pCtrl->prev)
pCtrl->group = (pCtrl->prev)->group;
else
pCtrl->group = 0;
}
pCtrl->CtrlProc = hai_GetCtrlTypeProc(CtrlType);
return (SH_CTRL)pCtrl;
}
S_BOOL _hai_DestroyCtrl(SH_CTRL hCtrl, S_BYTE bShow)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
SP_CTRL pListHead, pListEnd;
if (!hCtrl || HAI_GETHDLTYPE(hCtrl) != HT_CTRL)
return S_FALSE;
if (hai_SetCapture(S_NULL) == hCtrl)
hai_ReleaseCapture();
pListHead = hai_GetCurSceneCtrlListHead();
pListEnd = hai_GetCurSceneCtrlListEnd();
if (pCtrl->next)
{
if (pCtrl->prev)
pCtrl->prev->next = pCtrl->next;
else
{
pListHead = pCtrl->next;
pListHead->prev = S_NULL;
hai_SetCurSceneCtrlListHead(pListHead);
}
}
else
{
pListEnd = pCtrl->prev;
if (pListEnd)
pListEnd->next = S_NULL;
hai_SetCurSceneCtrlListEnd(pListEnd);
}
if (pCtrl->prev)
{
if (pCtrl->next)
pCtrl->next->prev = pCtrl->prev;
else
{
pListEnd = pCtrl->prev;
pListEnd->next = S_NULL;
hai_SetCurSceneCtrlListEnd(pListEnd);
}
}
else
{
pListHead = pCtrl->next;
if (pListHead)
pListHead->prev = S_NULL;
hai_SetCurSceneCtrlListHead(pListHead);
}
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_DESTROY, 0, 0);
switch (pCtrl->CtrlType)
{
case CT_BUTTON:
if (pCtrl->ButtonData.pText)
hai_MemFree(pCtrl->ButtonData.pText);
break;
case CT_STATIC:
if (pCtrl->StaticData.pText)
hai_MemFree(pCtrl->StaticData.pText);
break;
case CT_EDITBOX:
if (pCtrl->EditBoxData.pText)
hai_MemFree(pCtrl->EditBoxData.pText);
default:
break;
}
if (bShow && !hai_IsNeedRedraw())
{
S_WORD x, y;
hai_GetSceneRect(&x, &y, S_NULL, S_NULL);
hai_InvalidRectEx((S_WORD)(x+pCtrl->x), (S_WORD)(y+pCtrl->y), pCtrl->w, pCtrl->h);
}
hai_MemFree(pCtrl);
return S_TRUE;
}
S_BOOL hai_DestroyCtrl(SH_CTRL hCtrl)
{
return _hai_DestroyCtrl(hCtrl, S_TRUE);
}
S_BOOL _hai_DestroyAllCtrl(S_BYTE bShow)
{
S_WORD x, y;
SP_CTRL pListHead;
hai_GetSceneRect(&x, &y, S_NULL, S_NULL);
pListHead = hai_GetCurSceneCtrlListHead();
if (!pListHead)
return S_FALSE;
while (pListHead)
{
if (bShow)
_hai_SetInvalidRectEx((S_WORD)(x+pListHead->x), (S_WORD)(y+pListHead->y), pListHead->w, pListHead->h);
_hai_DestroyCtrl((SH_CTRL)pListHead, bShow);
pListHead = hai_GetCurSceneCtrlListHead();
}
if (bShow)
hai_SendEvent(EVT_PAINT, 0, 0);
return S_TRUE;
}
S_BOOL hai_DestroyAllCtrl(S_VOID)
{
return _hai_DestroyAllCtrl(S_TRUE);
}
S_BOOL hai_ShowCtrl(SH_CTRL hCtrl, S_BOOL bShow)
{
if (!hCtrl || ((SP_CTRL)hCtrl)->visible == bShow)
return S_FALSE;
((SP_CTRL)hCtrl)->visible = bShow;
if (!hai_IsNeedRedraw())
((SP_CTRL)hCtrl)->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
return S_TRUE;
}
S_BOOL hai_ShowAllCtrl(S_VOID)
{
SP_CTRL pCtrl;
pCtrl = hai_GetCurSceneCtrlListHead();
if (!pCtrl)
return S_FALSE;
while (pCtrl)
{
if (pCtrl->visible != 1)
{
pCtrl->visible = 1;
if (!hai_IsNeedRedraw())
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_PAINT, 0, 0);
}
pCtrl = pCtrl->next;
}
return S_TRUE;
}
S_BOOL hai_EnableCtrl(SH_CTRL hCtrl, S_BOOL bEnable)
{
if (!hCtrl)
return S_FALSE;
if (_AlwaysGrayCtrl((SP_CTRL)hCtrl))
return S_FALSE;
if (((SP_CTRL)hCtrl)->grayed == (S_UINT)(!bEnable))
return S_FALSE;
((SP_CTRL)hCtrl)->grayed = !bEnable;
((SP_CTRL)hCtrl)->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
return S_TRUE;
}
SH_CTRL hai_GetCurSceneCtrl(S_BYTE ID)
{
SP_CTRL pCtrl;
pCtrl = hai_GetCurSceneCtrlListHead();
while (pCtrl)
{
if (pCtrl->CtrlID == ID)
break;
pCtrl = pCtrl->next;
}
return (SH_CTRL)pCtrl;
}
S_BYTE hai_GetCurSceneCtrlID(SH_CTRL hCtrl)
{
if (!hCtrl)
return 0;
return ((SP_CTRL)hCtrl)->CtrlID;
}
SH_CTRL hai_GetSpecifiedCtrl(S_SHORT x, S_SHORT y)
{
SP_CTRL pCtrl = hai_GetCurSceneCtrlListHead();
while (pCtrl)
{
if (pCtrl->visible && !pCtrl->grayed)
if (x>pCtrl->x && x<pCtrl->x+pCtrl->w && y>pCtrl->y && y<pCtrl->y+pCtrl->h)
break;
pCtrl = pCtrl->next;
}
return (SH_CTRL)pCtrl;
}
S_BOOL _hai_SetNextFocusCtrl(S_VOID)
{
SP_CTRL pCtrl, pOldFocusCtrl = S_NULL;
pCtrl = hai_GetCurSceneCtrlListEnd();
if (!pCtrl)
return S_FALSE;
while (pCtrl) //found current focus ctrl
{
if (pCtrl->focus)
{
pOldFocusCtrl = pCtrl;
break;
}
pCtrl = pCtrl->prev;
}
if (pCtrl)//current focus at ctrl
{
pCtrl = pCtrl->prev;
while (pCtrl)
{
if (pCtrl->visible && !pCtrl->grayed && !_CantCtrlGetFocus(pCtrl))
break;
pCtrl = pCtrl->prev;
}
}
else //current focus at scene
{
pCtrl = hai_GetCurSceneCtrlListEnd();
while (pCtrl)
{
if (pCtrl->visible && !pCtrl->grayed && !_CantCtrlGetFocus(pCtrl))
break;
pCtrl = pCtrl->prev;
}
}
if (pCtrl)
{
pCtrl->focus = 1;
if (pOldFocusCtrl)
{
pOldFocusCtrl->focus = 0;
pOldFocusCtrl->CtrlProc((SH_CTRL)pOldFocusCtrl, EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_KILLFOCUS, pCtrl->CtrlID), 0);
pOldFocusCtrl->CtrlProc((SH_CTRL)pOldFocusCtrl, EVT_PAINT, 0, 0);
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_GETFOCUS, pOldFocusCtrl->CtrlID), 0);
}
else
{
hai_SendEvent(EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_KILLFOCUS, pCtrl->CtrlID), 0);
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_GETFOCUS, SCENE_FOCUS), 0);
}
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_PAINT, 0, 0);
}
else
{
if (pOldFocusCtrl)
{
pOldFocusCtrl->focus = 0;
pOldFocusCtrl->CtrlProc((SH_CTRL)pOldFocusCtrl, EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_KILLFOCUS, SCENE_FOCUS), 0);
pOldFocusCtrl->CtrlProc((SH_CTRL)pOldFocusCtrl, EVT_PAINT, 0, 0);
hai_SendEvent(EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_GETFOCUS, pOldFocusCtrl->CtrlID), 0);
}
}
return S_TRUE;
}
SH_CTRL hai_GetCurSceneFocusCtrl(S_VOID)
{
SP_CTRL pCtrl;
pCtrl = hai_GetCurSceneCtrlListHead();
while (pCtrl)
{
if (pCtrl->focus)
break;
pCtrl = pCtrl->next;
}
return (SH_CTRL)pCtrl;
}
S_BOOL _hai_SetFocusCtrl(SH_CTRL hCtrl, S_BOOL draw)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
if (!hCtrl || !pCtrl->visible || pCtrl->grayed)
return S_FALSE;
if (_CantCtrlGetFocus(pCtrl))
return S_FALSE;
pCtrl = hai_GetCurSceneCtrlListHead();
while (pCtrl)
{
if (pCtrl->focus)
{
if (pCtrl == (SP_CTRL)hCtrl)
return S_TRUE;
else
break;
}
pCtrl = pCtrl->next;
}
((SP_CTRL)hCtrl)->focus = 1;
if (pCtrl)
{
pCtrl->focus = 0;
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_KILLFOCUS, ((SP_CTRL)hCtrl)->CtrlID), 0);
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_PAINT, 0, 0);
((SP_CTRL)hCtrl)->CtrlProc(hCtrl, EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_GETFOCUS, pCtrl->CtrlID), 0);
}
else
{
hai_SendEvent(EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_KILLFOCUS, ((SP_CTRL)hCtrl)->CtrlID), 0);
((SP_CTRL)hCtrl)->CtrlProc(hCtrl, EVT_FOCUS, (WPARAM)HAI_COMBWORD(HG_GETFOCUS, SCENE_FOCUS), 0);
}
if (draw)
((SP_CTRL)hCtrl)->CtrlProc(hCtrl, EVT_PAINT, 0, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -