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

📄 haictrl.c

📁 HGui4.1.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
//---------------------------------------------------------------------------------
// 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 + -