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

📄 haictrl.c

📁 HGui4.1.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
	return S_TRUE;
}

S_BOOL hai_SetFocusCtrl(SH_CTRL hCtrl)
{
	return _hai_SetFocusCtrl(hCtrl, 1);
}

S_DWORD  hai_SendCtrlEvt(SH_CTRL hCtrl, S_BYTE EventType, WPARAM wParam, LPARAM lParam)
{
	return (((SP_CTRL)hCtrl)->CtrlProc(hCtrl, EventType, wParam, lParam));
}

#define CTRL_TEXT_DISPLAY_OFFSET	2

S_VOID hai_CtrlDrawText(SH_CTRL hCtrl, SH_DC hDC)
{
	S_BYTE *pText, bkmode = BKM_TRANSPARENT;
	S_WORD w, h;
	S_SHORT x, y;
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	S_COLOR textcolor = ((SP_DC)hDC)->TextColor;

	if (!hCtrl || !hDC)
		return;

	if (pCtrl->CtrlType == CT_BUTTON)
	{
		if (!(pCtrl->ButtonData.pText))
			return;
		pText = pCtrl->ButtonData.pText;
		hai_GetStringExtent(hDC, pCtrl->ButtonData.pText, &w, &h);
		switch (pCtrl->style & BS_BTN_TYPE_MASK)
		{
		case BS_PUSHBTN:
		case BS_SELECTBTN:
			if ((pCtrl->style & BS_BTN_TYPE_MASK) == BS_PUSHBTN)
				textcolor = (pCtrl->grayed?  COLOR_GRAY15:COLOR_GRAY00);
			if (h > pCtrl->h)
				y = pCtrl->y;
			else
			{
				if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_TOP)
					y = pCtrl->y;
				else if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_BUTTOM)
					y = (pCtrl->y + pCtrl->h) - h;
				else
					y = pCtrl->y + (pCtrl->h - h)/2;
			}
			if (w > pCtrl->w)
				x = pCtrl->x;
			else
			{
				if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_LEFT)
					x = pCtrl->x;
				else if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_RIGHT)
					x = (pCtrl->x + pCtrl->w) - w;
				else
					x = pCtrl->x + (pCtrl->w - w)/2;
			}
			break;
		case BS_CHECKBTN:
		case BS_RADIOBTN:
			if (h > pCtrl->h)
				y = pCtrl->y;
			else
				y = pCtrl->y + (pCtrl->h - h)/2;
			if (w > pCtrl->w)
				x = pCtrl->x;
			else
				x = pCtrl->x + CTRL_CHECKBTN_FLAG_W+6;
			break;
		default:
			break;
		}
	}
	else if (pCtrl->CtrlType == CT_STATIC)
	{
		if (!(pCtrl->StaticData.pText))
			return;
		pText = pCtrl->StaticData.pText;
		hai_GetStringExtent(hDC, pText, &w, &h);
		textcolor = ((SP_DC)hDC)->TextColor;
		bkmode = ((SP_DC)hDC)->BkMode;
		if (h > pCtrl->h)
			y = pCtrl->y;
		else
		{
			if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_TOP)
				y = pCtrl->y;
			else if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_BUTTOM)
				y = (pCtrl->y + pCtrl->h) - h;
			else
				y = pCtrl->y + (pCtrl->h - h)/2;
		}
		if (w > pCtrl->w)
			x = pCtrl->x;
		else
		{
			if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_LEFT)
				x = pCtrl->x;
			else if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_RIGHT)
				x = (pCtrl->x + pCtrl->w) - w;
			else
				x = pCtrl->x + (pCtrl->w - w)/2;
		}
	}
	else if (pCtrl->CtrlType == CT_EDITBOX)
	{
		if (!(pCtrl->EditBoxData.pText))
			return;
		pText = pCtrl->EditBoxData.pText;
		hai_GetStringExtent(hDC, pText, &w, &h);
		textcolor = ((SP_DC)hDC)->TextColor;
		bkmode = ((SP_DC)hDC)->BkMode;
		if (h > pCtrl->h)
			y = pCtrl->y;
		else
		{
//			if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_TOP)
//				y = pCtrl->y + CTRL_TEXT_DISPLAY_OFFSET;
//			else if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_BUTTOM)
//				y = (pCtrl->y + pCtrl->h) - h - CTRL_TEXT_DISPLAY_OFFSET;
//			else
				y = pCtrl->y + (pCtrl->h - h)/2;
		}
		if (w > pCtrl->w)
			x = pCtrl->x;
		else
		{
//			if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_LEFT)
				x = pCtrl->x + CTRL_TEXT_DISPLAY_OFFSET;
//			else if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_RIGHT)
//				x = (pCtrl->x + pCtrl->w) - w - CTRL_TEXT_DISPLAY_OFFSET;
//			else
//				x = pCtrl->x + (pCtrl->w - w)/2;
		}
	}
	else
		return;
	bkmode = hai_SetBkMode(hDC, bkmode);
	textcolor = hai_SetTextColor(hDC, textcolor);
	hai_TextOut(hDC, x, y, pText, 0);
	hai_SetTextColor(hDC, textcolor);
	hai_SetBkMode(hDC, bkmode);
}

//button
//
S_BOOL hai_SetButtonCtrlInfo(SH_CTRL hCtrl, S_BYTE *pText, S_BYTE  *UpPicID, S_BYTE  *DownPicID, S_BYTE  *GrayPicID)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;

	if (!pCtrl || pCtrl->CtrlType != CT_BUTTON)
		return S_FALSE;

	if (pCtrl->ButtonData.pText)
		hai_MemFree(pCtrl->ButtonData.pText);

	pCtrl->ButtonData.pText = pText;
	if (pText)
	{
		pCtrl->ButtonData.pText = hai_MemAlloc(hai_strlen(pText)+1);
		if (!pCtrl->ButtonData.pText)
			return S_FALSE;
		hai_strcpy(pCtrl->ButtonData.pText, pText);
	}
	pCtrl->ButtonData.UpPicID   = UpPicID;
	pCtrl->ButtonData.DownPicID = DownPicID;
	pCtrl->ButtonData.GrayPicID = GrayPicID;

	return S_TRUE;
}

SH_CTRL hai_CreateButton(S_DWORD style, S_BYTE CtrlID, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h, S_BYTE *pText, S_BYTE  *UpPicID, S_BYTE  *DownPicID, S_BYTE  *GrayPicID)
{
	S_BOOL  ok;
	SH_CTRL hCtrl;

	hCtrl = hai_CreateCtrl(CT_BUTTON, CtrlID, style, x, y, w, h);
	if (hCtrl)
		ok = hai_SetButtonCtrlInfo(hCtrl, pText, UpPicID, DownPicID, GrayPicID);
	if (hCtrl && !ok)
	{
		_hai_DestroyCtrl(hCtrl, S_FALSE);
		hCtrl = S_NULL;
	}
	return hCtrl;
}

S_DWORD hai_PushBtnCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	S_SHORT x, y;

	switch (event)
	{
	case EVT_CREAT:
		break;
	case EVT_PAINT:
		{
			SH_DC hDC;
			SH_BITMAP hTemp, hbitmap;

			if (!pCtrl->visible)
				break;
			hDC = hai_GetSceneDC();
			hai_SendEvent(EVT_CTRLCOLOR, (WPARAM)(pCtrl->CtrlID), (LPARAM)hDC);
			if (pCtrl->grayed)
			{
				if (pCtrl->ButtonData.GrayPicID)
				{
					hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.GrayPicID));
					hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
					hai_DeleteObject((SH_GDIOBJ)hTemp);
					hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
					hai_DeleteObject((SH_GDIOBJ)hbitmap);
				}
				else
					hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, BLOCK_3D_UP, DKGRAY_BRUSH);
			}
			else
			{
				if (pCtrl->state == BS_PUSHBTN_UP)
					if (pCtrl->ButtonData.UpPicID)
					{
						hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.UpPicID));
						hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
						hai_DeleteObject((SH_GDIOBJ)hTemp);
						hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
						hai_DeleteObject((SH_GDIOBJ)hbitmap);
					}
					else
					{
						hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, BLOCK_3D_UP, GRAY_BRUSH);
					}
				else if (pCtrl->state == BS_PUSHBTN_DN)
					if (pCtrl->ButtonData.DownPicID)
					{
						hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.DownPicID));
						hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
						hai_DeleteObject((SH_GDIOBJ)hTemp);
						hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
						hai_DeleteObject((SH_GDIOBJ)hbitmap);
					}
					else
					{
						hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, BLOCK_3D_DN, GRAY_BRUSH);
					}
			}
			if (pCtrl->ButtonData.pText)
				hai_CtrlDrawText(hCtrl, hDC);
			if (!pCtrl->grayed && pCtrl->state == BS_PUSHBTN_UP && pCtrl->focus)
				hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->w-5), (S_SHORT)(pCtrl->h-5), COLOR_BLACK);
			hai_ReleaseDC(hDC);
			_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		}
		break;	
	case EVT_TIMER:
		break;	
	case EVT_KEYDN:
		if (wParam == ' ' || wParam == VK_RETURN)
		{
			pCtrl->state = BS_PUSHBTN_DN;
			_hai_SetFocusCtrl(hCtrl, S_FALSE);
			hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_DN,pCtrl->CtrlID), 0);
		}
		else
			hai_SendEvent(EVT_KEYDN, wParam, lParam);
		break;	
	case EVT_KEYUP:
		if (wParam == ' ' || wParam == VK_RETURN)
		{
			pCtrl->state = BS_PUSHBTN_UP;
			hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_UP,pCtrl->CtrlID), 0);
		}
		else
			hai_SendEvent(EVT_KEYUP, wParam, lParam);
		break;
	case EVT_CHAR:
		break;
	case EVT_SYSKEY:
		break;
	case EVT_DESTROY:
		break;
	case EVT_MOUSEDN:
		hai_SetCapture(hCtrl);
		pCtrl->state = BS_PUSHBTN_DN;
		_hai_SetFocusCtrl(hCtrl, S_FALSE);
		hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
		hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_DN,pCtrl->CtrlID), 0);
		break;
	case EVT_MOUSEUP:
		pCtrl->state = BS_PUSHBTN_UP;
		hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
		hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_UP,pCtrl->CtrlID), 0);
		hai_ReleaseCapture();
		break;
	case EVT_MOUSEDB:
		hai_ReleaseCapture();
		break;
	case EVT_MOUSEMV:
		x = HAI_GETLOWORD(lParam);
		y = HAI_GETHIWORD(lParam);
		if (x>pCtrl->x && x<pCtrl->x+pCtrl->w && y>pCtrl->y && y<pCtrl->y+pCtrl->h)
		{
			if (pCtrl->state == BS_PUSHBTN_UP)
			{
				hai_SetCapture(hCtrl);
				pCtrl->state = BS_PUSHBTN_DN;
				_hai_SetFocusCtrl(hCtrl, S_FALSE);
				hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
			}
		}
		else
		{
			((SP_CTRL)hCtrl)->state = BS_PUSHBTN_UP;
			hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
			hai_ReleaseCapture();
		}
		break;
	case EVT_RESTORE:
		break;
	case EVT_COMMAND:
		break;
	default:
		break;
	}
	return 0;
}

S_VOID hai_DrawRight(SH_DC hDC, S_SHORT x, S_SHORT y)
{
	hai_MoveTo(hDC, (S_SHORT)(x+1), (S_SHORT)(y+5), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+2), (S_SHORT)(y+5));
	hai_MoveTo(hDC, (S_SHORT)(x+2), (S_SHORT)(y+6), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+3), (S_SHORT)(y+6));
	hai_MoveTo(hDC, (S_SHORT)(x+3), (S_SHORT)(y+7), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+6), (S_SHORT)(y+7));
	hai_MoveTo(hDC, (S_SHORT)(x+4), (S_SHORT)(y+8), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+5), (S_SHORT)(y+8));
	hai_MoveTo(hDC, (S_SHORT)(x+6), (S_SHORT)(y+6), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+7), (S_SHORT)(y+6));
	hai_MoveTo(hDC, (S_SHORT)(x+7), (S_SHORT)(y+5), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+8), (S_SHORT)(y+5));
	hai_MoveTo(hDC, (S_SHORT)(x+8), (S_SHORT)(y+4), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+9), (S_SHORT)(y+4));
	hai_MoveTo(hDC, (S_SHORT)(x+9), (S_SHORT)(y+3), S_NULL);
	hai_LineTo(hDC, (S_SHORT)(x+10), (S_SHORT)(y+3));
}

S_DWORD hai_CheckBtnCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;

	switch (event)
	{
	case EVT_CREAT:
		break;
	case EVT_PAINT:
		{
			SH_DC hDC;
			SH_BITMAP hTemp, hbitmap;

			if (!pCtrl->visible)
				break;
			if (pCtrl->h < CTRL_CHECKBTN_FLAG_W)
				pCtrl->h = CTRL_CHECKBTN_FLAG_W;
			hDC = hai_GetSceneDC();
			hai_SendEvent(EVT_CTRLCOLOR, (WPARAM)(pCtrl->CtrlID), (LPARAM)hDC);
			hai_BitBlt(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, S_NULL, 0, 0, PATCOPY);
			if (pCtrl->grayed)
			{
				if (pCtrl->ButtonData.GrayPicID)
					{
						hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.GrayPicID));
						hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
						hai_DeleteObject((SH_GDIOBJ)hTemp);
						hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
						hai_DeleteObject((SH_GDIOBJ)hbitmap);
					}
				else
					hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2), CTRL_CHECKBTN_FLAG_W, CTRL_CHECKBTN_FLAG_W, BLOCK_3D_DN, GRAY_BRUSH);
			}
			else
			{
				if (pCtrl->state == BS_CHECKBTN_CHECKED)
					if (pCtrl->ButtonData.UpPicID)
					{
						hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.UpPicID));
						hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
						hai_DeleteObject((SH_GDIOBJ)hTemp);
						hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
						hai_DeleteObject((SH_GDIOBJ)hbitmap);
					}
					else
					{
						hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2), CTRL_CHECKBTN_FLAG_W, CTRL_CHECKBTN_FLAG_W, BLOCK_3D_DN, WHITE_BRUSH);
						hai_DrawRight(hDC, (S_SHORT)(pCtrl->x + 2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2));
					}
				else if (pCtrl->state == BS_CHECKBTN_NOCHECK)
					if (pCtrl->ButtonData.DownPicID)
					{
						hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.DownPicID));
						hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
						hai_DeleteObject((SH_GDIOBJ)hTemp);
						hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
						hai_DeleteObject((SH_GDIOBJ)hbitmap);
					}
					else
					{
						hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2), CTRL_CHECKBTN_FLAG_W, CTRL_CHECKBTN_FLAG_W, BLOCK_3D_DN, WHITE_BRUSH);
					}
			}
			if (pCtrl->ButtonData.pText)
				hai_CtrlDrawText(hCtrl, hDC);
			if (!pCtrl->grayed && pCtrl->focus)
				hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->w-5), (S_SHORT)(pCtrl->h-5), COLOR_BLACK);
			hai_ReleaseDC(hDC);
			_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		}
		break;	
	case EVT_TIMER:
		break;	
	case EVT_SYSKEY:
		break;
	case EVT_DESTROY:
		break;
	case EVT_CHAR:
		break;
	case EVT_KEYUP:
		if (wParam != ' ' && wParam != VK_RETURN)
			hai_SendEvent(EVT_KEYUP, wParam, lParam);
		break;
	case EVT_KEYDN:
		if (wParam != ' ' && wParam != VK_RETURN)
		{
			hai_SendEvent(EVT_KEYDN, wParam, lParam);
			break;
		}
	case EVT_MOUSEDN:
		pCtrl->state = !pCtrl->state;
		_hai_SetFocusCtrl(hCtrl, S_FALSE);
		hai_CheckBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
		hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(pCtrl->state,pCtrl->CtrlID), 0);

⌨️ 快捷键说明

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