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

📄 haictrl.c

📁 HGui4.1.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
				}
				else if (y < pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW)
				{
					if (pCtrl->ScrlBarData.ClickArea != 3)
					{
						hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
					}
					else
//					if (pCtrl->ScrlBarData.ClickArea == 3)
					{
						pCtrl->ScrlBarData.PriorMouseY -= y;
						if (pCtrl->ScrlBarData.PriorMouseY && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
						{
							if (pCtrl->ScrlBarData.PriorMouseY < 0 && pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW < pCtrl->h-BS_SCRLBAR_WIDTH*2)
							{//the thumb down
								pCtrl->ScrlBarData.ThumbPos += -pCtrl->ScrlBarData.PriorMouseY;
								if (pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW > pCtrl->h-BS_SCRLBAR_WIDTH*2)
									pCtrl->ScrlBarData.ThumbPos = (pCtrl->h-BS_SCRLBAR_WIDTH*2)-pCtrl->ScrlBarData.ThumbW;
							}
							else if (pCtrl->ScrlBarData.PriorMouseY > 0 && pCtrl->ScrlBarData.ThumbPos > 0)
							{//the thumb up
								if (pCtrl->ScrlBarData.ThumbPos > pCtrl->ScrlBarData.PriorMouseY)
									pCtrl->ScrlBarData.ThumbPos -= pCtrl->ScrlBarData.PriorMouseY;
								else
									pCtrl->ScrlBarData.ThumbPos = 0;
							}
							hai_VScrlBarCtrlProc(hCtrl, EVT_RESTORE, 0, 0);
							PreStart = 0;
							if (pCtrl->ScrlBarData.TotalLine && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
							{
								PreStart = (pCtrl->ScrlBarData.ThumbPos + pCtrl->ScrlBarData.ThumbW) * pCtrl->ScrlBarData.TotalLine;
								PreStart = PreStart / (pCtrl->h - BS_SCRLBAR_WIDTH*2); 
								if (PreStart > pCtrl->ScrlBarData.LinePerPage)
									PreStart = PreStart - pCtrl->ScrlBarData.LinePerPage;
								else
									PreStart = 0;
								if (pCtrl->ScrlBarData.PriorMouseY > 0)//the thumb up
								{
									PreStart += 1;
									if (pCtrl->ScrlBarData.ThumbPos == 0)
										PreStart = 0;
								}
							}
							if (PreStart != pCtrl->ScrlBarData.CurStart)
								hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_THUMBTRACK, pCtrl->CtrlID), PreStart);
						}
						pCtrl->ScrlBarData.PriorMouseY = y;
					}
				}
				else if (y < pCtrl->y+pCtrl->h-BS_SCRLBAR_WIDTH)
				{
					if (pCtrl->ScrlBarData.ClickArea != 4)
					{
						hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
					}
				}
				else
				{
					if (pCtrl->ScrlBarData.ClickArea != 5)
					{
						hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
					}
				}
			}
			_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		}
		else
		{
			if (pCtrl->ScrlBarData.ClickArea == 3)
			{
				pCtrl->ScrlBarData.PriorMouseY -= y;
				if (pCtrl->ScrlBarData.PriorMouseY && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
				{
					if (pCtrl->ScrlBarData.PriorMouseY < 0 && pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW < pCtrl->h-BS_SCRLBAR_WIDTH*2)
					{
						pCtrl->ScrlBarData.ThumbPos += -pCtrl->ScrlBarData.PriorMouseY;
						if (pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW > pCtrl->h-BS_SCRLBAR_WIDTH*2)
							pCtrl->ScrlBarData.ThumbPos = (pCtrl->h-BS_SCRLBAR_WIDTH*2)-pCtrl->ScrlBarData.ThumbW;
					}
					else if (pCtrl->ScrlBarData.PriorMouseY > 0 && pCtrl->ScrlBarData.ThumbPos > 0)
					{
						if (pCtrl->ScrlBarData.ThumbPos > pCtrl->ScrlBarData.PriorMouseY)
							pCtrl->ScrlBarData.ThumbPos -= pCtrl->ScrlBarData.PriorMouseY;
						else
							pCtrl->ScrlBarData.ThumbPos = 0;
					}
					hai_VScrlBarCtrlProc(hCtrl, EVT_RESTORE, 0, 0);
					PreStart = 0;
					if (pCtrl->ScrlBarData.TotalLine && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
					{
						PreStart = (pCtrl->ScrlBarData.ThumbPos + pCtrl->ScrlBarData.ThumbW) * pCtrl->ScrlBarData.TotalLine;
						PreStart = PreStart / (pCtrl->h - BS_SCRLBAR_WIDTH*2); 
						if (PreStart > pCtrl->ScrlBarData.LinePerPage)
							PreStart = PreStart - pCtrl->ScrlBarData.LinePerPage;
						else
							PreStart = 0;
						if (pCtrl->ScrlBarData.PriorMouseY > 0)//the thumb up
						{
							PreStart += 1;
							if (pCtrl->ScrlBarData.ThumbPos == 0)
								PreStart = 0;
						}
					}
					if (PreStart != pCtrl->ScrlBarData.CurStart)
						hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_THUMBTRACK, pCtrl->CtrlID), PreStart);
				}
				pCtrl->ScrlBarData.PriorMouseY = y;
			}
			else
				hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, 0, 0);
		}
		hai_ReleaseDC(hDC);
		break;
	case EVT_RESTORE:
		{
			SH_DC hDC;
			SH_BRUSH hBrush;

			if (!pCtrl->visible)
				break;
			hDC = hai_GetSceneDC();
			hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
			hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_BitBlt(hDC, pCtrl->x, (S_SHORT)(pCtrl->y+BS_SCRLBAR_WIDTH), BS_SCRLBAR_WIDTH, (S_SHORT)(pCtrl->h-BS_SCRLBAR_WIDTH*2), S_NULL, 0, 0, PATCOPY);
			hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_Draw3DBlock(hDC, pCtrl->x, (S_SHORT)(pCtrl->y+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH), BS_SCRLBAR_WIDTH, pCtrl->ScrlBarData.ThumbW, BLOCK_3D_UP, GRAY_BRUSH);
			if (pCtrl->focus)
				hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH+2), (S_SHORT)(BS_SCRLBAR_WIDTH-5), (S_SHORT)(pCtrl->ScrlBarData.ThumbW-5), COLOR_BLACK);
			hai_ReleaseDC(hDC);
			_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		}
		break;
	case EVT_COMMAND:
		break;
	default:
		break;
	}
	return 0;
}

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

	switch (event)
	{
	case EVT_CREAT:
		break;
	case EVT_PAINT:
		{
			SH_DC hDC;
			SH_BRUSH hBrush;

			if (!pCtrl->visible)
				break;
			hDC = hai_GetSceneDC();
			x = pCtrl->x;
			y = pCtrl->y;
			hai_Draw3DBlock(hDC, x, y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
			x += pCtrl->w - BS_SCRLBAR_WIDTH;
			hai_Draw3DBlock(hDC, x, y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
			y = pCtrl->y + BS_SCRLBAR_WIDTH/2;
			x = pCtrl->x+(BS_SCRLBAR_WIDTH-(BS_SCRLBAR_WIDTH+3)/4)/2-1;
			for(i=0 ; i < (BS_SCRLBAR_WIDTH+3)/4+1; ++i)
				_hai_DrawVLine(hDC, x++, (S_SHORT)(y-i), (S_SHORT)(y+i), COLOR_BLACK);
			x = pCtrl->x+pCtrl->w-1-(BS_SCRLBAR_WIDTH-(BS_SCRLBAR_WIDTH+3)/4)/2+1;
			for(i=0 ; i < (BS_SCRLBAR_WIDTH+3)/4+1; ++i)
				_hai_DrawVLine(hDC, x--, (S_SHORT)(y-i), (S_SHORT)(y+i), COLOR_BLACK);
			hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
			hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_BitBlt(hDC, (S_SHORT)(pCtrl->x+BS_SCRLBAR_WIDTH), pCtrl->y, (S_SHORT)(pCtrl->w-BS_SCRLBAR_WIDTH*2), BS_SCRLBAR_WIDTH, S_NULL, 0, 0, PATCOPY);
			hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH), pCtrl->y, pCtrl->ScrlBarData.ThumbW, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
			if (pCtrl->focus)
				hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->ScrlBarData.ThumbW-5), BS_SCRLBAR_WIDTH-5, COLOR_BLACK);
			hai_ReleaseDC(hDC);
			_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		}
		break;	
	case EVT_TIMER:
		break;	
	case EVT_KEYDN:
		switch (wParam)
		{
		case VK_END:
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_BOTTOM,pCtrl->CtrlID), 0);
			break;
		case VK_HOME:
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_TOP,pCtrl->CtrlID), 0);
			break;
		case VK_LEFT:
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_LINEUP,pCtrl->CtrlID), 0);
			break;
		case VK_RIGHT:
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_LINEDOWN,pCtrl->CtrlID), 0);
			break;
		default:
			hai_SendEvent(EVT_KEYDN, wParam, lParam);
			break;
		}
		break;	
	case EVT_KEYUP:
		switch (wParam)
		{
		case VK_END:
		case VK_HOME:
		case VK_LEFT:
		case VK_RIGHT:
			break;
		default:
			hai_SendEvent(EVT_KEYUP, wParam, lParam);
			break;
		}
		break;
	case EVT_CHAR:
		break;
	case EVT_SYSKEY:
		break;
	case EVT_DESTROY:
		break;
	case EVT_MOUSEDN:
		break;
	case EVT_MOUSEUP:
		break;
	case EVT_MOUSEDB:
		break;
	case EVT_MOUSEMV:
		break;
	case EVT_RESTORE:
		{
			SH_DC hDC;
			SH_BRUSH hBrush;

			if (!pCtrl->visible)
				break;
			hDC = hai_GetSceneDC();
			hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
			hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_BitBlt(hDC, (S_SHORT)(pCtrl->x+BS_SCRLBAR_WIDTH), pCtrl->y, (S_SHORT)(pCtrl->w-BS_SCRLBAR_WIDTH*2), BS_SCRLBAR_WIDTH, S_NULL, 0, 0, PATCOPY);
			hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH), pCtrl->y, pCtrl->ScrlBarData.ThumbW, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
			if (pCtrl->focus)
				hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->ScrlBarData.ThumbW-5), (S_SHORT)(BS_SCRLBAR_WIDTH-5), COLOR_BLACK);
			hai_ReleaseDC(hDC);
			_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		}
		break;
	case EVT_COMMAND:
		break;
	default:
		break;
	}
	return 0;
}

S_DWORD hai_ScrlBarCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
	if ((((SP_CTRL)hCtrl)->style&BS_SCRLBAR_VH_MASK) == BS_VSCRLBAR)
		return hai_VScrlBarCtrlProc(hCtrl, event, wParam, lParam);
	else
		return hai_HScrlBarCtrlProc(hCtrl, event, wParam, lParam);
}


//static
//
S_BOOL hai_SetStaticCtrlInfo(SH_CTRL hCtrl, S_BYTE *pText, S_BYTE *PicID)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;

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

	pCtrl->grayed   = !!CS_GRAYED;

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

	pCtrl->StaticData.pText = pText;
	if (pText)
	{
		pCtrl->StaticData.pText = hai_MemAlloc(hai_strlen(pText)+1);
		if (!pCtrl->StaticData.pText)
			return S_FALSE;
		hai_strcpy(pCtrl->StaticData.pText, pText);
	}
	pCtrl->StaticData.PicID = PicID;
	
	return S_TRUE;
}

SH_CTRL hai_CreateStatic(S_DWORD style, S_BYTE CtrlID, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h, S_BYTE *pText, S_BYTE *PicID)
{
	S_BOOL  ok;
	SH_CTRL hCtrl;

	hCtrl = hai_CreateCtrl(CT_STATIC, CtrlID, style, x, y, w, h);
	if (hCtrl)
		ok = hai_SetStaticCtrlInfo(hCtrl, pText, PicID);
	if (hCtrl && !ok)
	{
		_hai_DestroyCtrl(hCtrl, S_FALSE);
		hCtrl = S_NULL;
	}
	return hCtrl;
}

S_DWORD hai_StaticCtrlProc(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;

			if (!pCtrl->visible)
				break;
			hDC = hai_GetSceneDC();
			hai_SendEvent(EVT_CTRLCOLOR, (WPARAM)(pCtrl->CtrlID), (LPARAM)hDC);
			if (pCtrl->StaticData.PicID)
			{
			}
			else
			{
				hai_BitBlt(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, S_NULL, 0, 0, PATCOPY);
			}
			if (pCtrl->StaticData.pText)
				hai_CtrlDrawText(hCtrl, hDC);
			hai_ReleaseDC(hDC);
			_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		}
		break;	
	case EVT_TIMER:
		break;	
	case EVT_KEYDN:
		break;	
	case EVT_KEYUP:
		break;	
	case EVT_CHAR:
		break;	
	case EVT_SYSKEY:
		break;
	case EVT_DESTROY:
		break;
	case EVT_MOUSEDN:
		break;
	case EVT_MOUSEUP:
		break;
	case EVT_MOUSEDB:
		break;
	case EVT_MOUSEMV:
		break;
	case EVT_RESTORE:
		break;
	case EVT_COMMAND:
		break;
	default:
		break;
	}
	return 0;
}


//progress bar
//
#define PROGRESS_WH_OFFSET	3
S_BOOL hai_SetProgressCtrlInfo(SH_CTRL hCtrl, S_SHORT total, S_SHORT MinPos, S_SHORT CurPos, S_SHORT MaxPos, S_BYTE  *BGPicID, S_BYTE  *FGPicID)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;

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

	if (total<2||MinPos<0||CurPos<0||MaxPos<0)
		return S_FALSE;
	if (total <= MaxPos ||MinPos >= MaxPos)
		return S_FALSE;

	if (pCtrl->w <= PROGRESS_WH_OFFSET<<1 || pCtrl->h <= PROGRESS_WH_OFFSET<<1)
		return S_FALSE;
	if ((pCtrl->style&BS_PROGRESS_VHMASK) == PBS_HPROGRESS)
	{
		if (pCtrl->w-(PROGRESS_WH_OFFSET<<1) < total)
			return S_FALSE;
	}
	else //PBS_VPROGRESS
	{
		if (pCtrl->h-(PROGRESS_WH_OFFSET<<1) < total)
			return S_FALSE;
	}
	
	if (CurPos < MinPos || CurPos > MaxPos)
		CurPos = MinPos;
	
	pCtrl->ProgressData.BGPicID = BGPicID;
	pCtrl->ProgressData.FGPicID = FGPicID;
	pCtrl->ProgressData.total  = total;
	pCtrl->ProgressData.MinPos = MinPos;
	pCtrl->ProgressData.CurPos = CurPos;
	pCtrl->ProgressData.MaxPos = MaxPos;

	return S_TRUE;
}

SH_CTRL hai_CreateProgress(S_DWORD style, S_BYTE CtrlID, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h, S_SHORT total, S_SHORT MinPos, S_SHORT CurPos, S_SHORT MaxPos, S_BYTE  *BGPicID, S_BYTE  *FGPicID)
{
	S_BOOL  ok;
	SH_CTRL hCtrl;

	hCtrl = hai_CreateCtrl(CT_PROGRESS, CtrlID, style, x, y, w, h);
	if (hCtrl)
		ok = hai_SetProgressCtrlInfo(hCtrl, total, MinPos, CurPos, MaxPos, BGPicID, FGPicID);
	if (hCtrl && !ok)
	{
		_hai_DestroyCtrl(hCtrl, S_FALSE);
		hCtrl = S_NULL;
	}
	return hCtrl;
}

S_SHORT hai_GetProgressCurPos(SH_CTRL hCtrl)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	
	if (!pCtrl || pCtrl->CtrlType != CT_PROGRESS)
		return -1;

	return pCtrl->ProgressData.CurPos;
}

S_BOOL hai_SetProgressCurPos(SH_CTRL hCtrl, S_SHORT CurPos)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	
	if (!pCtrl || pCtrl->CtrlType != CT_PROGRESS)
		return S_FALSE;

	if (CurPos < pCtrl->ProgressData.MinPos ||

⌨️ 快捷键说明

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