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

📄 haictrl.c

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

	hCtrl = hai_CreateCtrl(CT_LISTAREA, CtrlID, style, x, y, w, h);
	if (hCtrl)
		ok = hai_SetListAreaCtrlInfo(hCtrl, LineH);
	if (hCtrl && !ok)
	{
		_hai_DestroyCtrl(hCtrl, S_FALSE);
		hCtrl = S_NULL;
	}
	return hCtrl;
}

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

	x = HAI_GETLOWORD(lParam);
	y = HAI_GETHIWORD(lParam);

	switch (event)
	{
	case EVT_CREAT:
		break;
	case EVT_PAINT:
		break;	
	case EVT_TIMER:
		break;	
	case EVT_KEYDN:
		break;	
	case EVT_SYSKEY:
		break;
	case EVT_DESTROY:
		break;
	case EVT_MOUSEDN:
		hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(EVT_MOUSEDN,pCtrl->CtrlID), (y - pCtrl->y) / pCtrl->ListAreaData.LineH);
		break;
	case EVT_MOUSEUP:
		hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(EVT_MOUSEUP,pCtrl->CtrlID), (y - pCtrl->y) / pCtrl->ListAreaData.LineH);
		break;
	case EVT_MOUSEDB:
		hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(EVT_MOUSEDB,pCtrl->CtrlID), (y - pCtrl->y) / pCtrl->ListAreaData.LineH);
		break;
	case EVT_MOUSEMV:
		break;
	case EVT_RESTORE:
		break;
	case EVT_COMMAND:
		break;
	default:
		break;
	}
	return 0;
}

//scroll bar
//
S_BOOL hai_SetScrlBarCtrlInfo(SH_CTRL hCtrl, S_DWORD TotalLine, S_DWORD CurStart, S_WORD LinePerPage)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	S_DWORD totallines;

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

	if (TotalLine <= LinePerPage)
		CurStart = 0;
	else
	{
		if (CurStart > TotalLine - LinePerPage)
			CurStart = 0;
	}
	if ((pCtrl->style&BS_SCRLBAR_VH_MASK) == BS_VSCRLBAR)
	{
		if (pCtrl->h < BS_SCRLBAR_WIDTH*3)
			pCtrl->h = BS_SCRLBAR_WIDTH*3;
		pCtrl->w = BS_SCRLBAR_WIDTH;
	}
	else
	{
		if (pCtrl->w < BS_SCRLBAR_WIDTH*3)
			pCtrl->w = BS_SCRLBAR_WIDTH*3;
		pCtrl->h = BS_SCRLBAR_WIDTH;
	}
	pCtrl->ScrlBarData.TotalLine = TotalLine;
	pCtrl->ScrlBarData.CurStart  = CurStart;
	pCtrl->ScrlBarData.LinePerPage = LinePerPage;

	totallines = pCtrl->ScrlBarData.TotalLine ? pCtrl->ScrlBarData.TotalLine : 1;
	if ((pCtrl->style&BS_SCRLBAR_VH_MASK) == BS_VSCRLBAR)
		pCtrl->ScrlBarData.ThumbW = pCtrl->h - BS_SCRLBAR_WIDTH*2;
	else
		pCtrl->ScrlBarData.ThumbW = pCtrl->w - BS_SCRLBAR_WIDTH*2;

	if(pCtrl->ScrlBarData.LinePerPage && pCtrl->ScrlBarData.LinePerPage < totallines)
	{
		pCtrl->ScrlBarData.ThumbW = (S_WORD)(pCtrl->ScrlBarData.ThumbW * pCtrl->ScrlBarData.LinePerPage / totallines);
		if( pCtrl->ScrlBarData.ThumbW < 8 ) 
			pCtrl->ScrlBarData.ThumbW = 8;
	}

	pCtrl->ScrlBarData.ThumbPos = 0;
	if ((pCtrl->style&BS_SCRLBAR_VH_MASK) == BS_VSCRLBAR)
	{
		if(pCtrl->ScrlBarData.CurStart)
		{
			pCtrl->ScrlBarData.ThumbPos = (S_WORD)((pCtrl->h-BS_SCRLBAR_WIDTH*2)*(pCtrl->ScrlBarData.CurStart+pCtrl->ScrlBarData.LinePerPage)/totallines-pCtrl->ScrlBarData.ThumbW);
			if( pCtrl->ScrlBarData.ThumbPos < 0 )
				pCtrl->ScrlBarData.ThumbPos = 0;
		}
		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.CurStart)
		{
			pCtrl->ScrlBarData.ThumbPos = (S_WORD)((pCtrl->w-BS_SCRLBAR_WIDTH*2)*(pCtrl->ScrlBarData.CurStart+pCtrl->ScrlBarData.LinePerPage)/totallines-pCtrl->ScrlBarData.ThumbW);
			if( pCtrl->ScrlBarData.ThumbPos < 0 )
				pCtrl->ScrlBarData.ThumbPos = 0;
		}
		if(pCtrl->ScrlBarData.ThumbPos + pCtrl->ScrlBarData.ThumbW > pCtrl->w-BS_SCRLBAR_WIDTH*2)
			pCtrl->ScrlBarData.ThumbPos = pCtrl->w-BS_SCRLBAR_WIDTH*2-pCtrl->ScrlBarData.ThumbW;
	}

	return S_TRUE;
}

SH_CTRL hai_CreateScrlBar(S_DWORD style, S_BYTE CtrlID, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h, S_DWORD TotalLine, S_DWORD CurStart, S_WORD LinePerPage)
{
	S_BOOL  ok;
	SH_CTRL hCtrl;

	hCtrl = hai_CreateCtrl(CT_SCRLBAR, CtrlID, style, x, y, w, h);
	if (hCtrl)
		ok = hai_SetScrlBarCtrlInfo(hCtrl, TotalLine, CurStart, LinePerPage);
	if (hCtrl && !ok)
	{
		_hai_DestroyCtrl(hCtrl, S_FALSE);
		hCtrl = S_NULL;
	}
	return hCtrl;
}

S_BOOL hai_GetScrlBarInfo(SH_CTRL hCtrl, S_DWORD *CurStart, S_DWORD *TotalLines, S_WORD *LinesPerPage)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;

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

	if (CurStart) *CurStart = pCtrl->ScrlBarData.CurStart;
	if (TotalLines) *TotalLines = pCtrl->ScrlBarData.TotalLine;
	if (LinesPerPage) *LinesPerPage = pCtrl->ScrlBarData.LinePerPage;

	return S_TRUE;
}

S_BOOL hai_SetScrlBarInfo(SH_CTRL hCtrl, S_DWORD CurStart, S_DWORD TotalLines, S_WORD LinesPerPage)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	S_DWORD totallines;

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

	if (TotalLines <= LinesPerPage)
		CurStart = 0;
	else
	{
		if (CurStart > TotalLines - LinesPerPage)
			CurStart = 0;
	}
//	if (pCtrl->ScrlBarData.TotalLine == TotalLines && pCtrl->ScrlBarData.CurStart == CurStart
//				&& pCtrl->ScrlBarData.LinePerPage == LinesPerPage)
//		return S_FALSE;


	pCtrl->ScrlBarData.TotalLine = TotalLines;
	pCtrl->ScrlBarData.CurStart  = CurStart;
	pCtrl->ScrlBarData.LinePerPage = LinesPerPage;

	totallines = pCtrl->ScrlBarData.TotalLine ? pCtrl->ScrlBarData.TotalLine : 1;
	if ((pCtrl->style&BS_SCRLBAR_VH_MASK) == BS_VSCRLBAR)
		pCtrl->ScrlBarData.ThumbW = pCtrl->h - BS_SCRLBAR_WIDTH*2;
	else
		pCtrl->ScrlBarData.ThumbW = pCtrl->w - BS_SCRLBAR_WIDTH*2;

	if(pCtrl->ScrlBarData.LinePerPage && pCtrl->ScrlBarData.LinePerPage < totallines)
	{
		pCtrl->ScrlBarData.ThumbW = (S_WORD)(pCtrl->ScrlBarData.ThumbW * pCtrl->ScrlBarData.LinePerPage / totallines);
		if( pCtrl->ScrlBarData.ThumbW < 8 ) 
			pCtrl->ScrlBarData.ThumbW = 8;
	}

	pCtrl->ScrlBarData.ThumbPos = 0;
	if ((pCtrl->style&BS_SCRLBAR_VH_MASK) == BS_VSCRLBAR)
	{
		if(pCtrl->ScrlBarData.CurStart)
		{
			pCtrl->ScrlBarData.ThumbPos = (S_WORD)((pCtrl->h-BS_SCRLBAR_WIDTH*2)*(pCtrl->ScrlBarData.CurStart+pCtrl->ScrlBarData.LinePerPage)/totallines-pCtrl->ScrlBarData.ThumbW);
			if( pCtrl->ScrlBarData.ThumbPos < 0 )
				pCtrl->ScrlBarData.ThumbPos = 0;
		}
		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.CurStart)
		{
			pCtrl->ScrlBarData.ThumbPos = (S_WORD)((pCtrl->w-BS_SCRLBAR_WIDTH*2)*(pCtrl->ScrlBarData.CurStart+pCtrl->ScrlBarData.LinePerPage)/totallines-pCtrl->ScrlBarData.ThumbW);
			if( pCtrl->ScrlBarData.ThumbPos < 0 )
				pCtrl->ScrlBarData.ThumbPos = 0;
		}
		if(pCtrl->ScrlBarData.ThumbPos + pCtrl->ScrlBarData.ThumbW > pCtrl->w-BS_SCRLBAR_WIDTH*2)
			pCtrl->ScrlBarData.ThumbPos = pCtrl->w-BS_SCRLBAR_WIDTH*2-pCtrl->ScrlBarData.ThumbW;
	}

	pCtrl->CtrlProc(hCtrl, EVT_RESTORE, 0, 0);

	return S_TRUE;
}

S_DWORD hai_VScrlBarCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
	SP_CTRL pCtrl = (SP_CTRL)hCtrl;
	S_SHORT x, y, i;
	SH_DC hDC;
	SH_BRUSH hBrush;
	S_DWORD PreStart;

	switch (event)
	{
	case EVT_CREAT:
		break;
	case EVT_PAINT:
		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);
		y += pCtrl->h - BS_SCRLBAR_WIDTH;
		hai_Draw3DBlock(hDC, x, y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
		x = pCtrl->x + BS_SCRLBAR_WIDTH/2;
		y = pCtrl->y + (BS_SCRLBAR_WIDTH - (BS_SCRLBAR_WIDTH+3)/4)/2-1;
		for(i = 0 ; i < (BS_SCRLBAR_WIDTH + 3)/4+1 ; ++i)
			_hai_DrawHLine(hDC, (S_SHORT)(x-i), (S_SHORT)(x+i), y++, COLOR_BLACK);
		y = pCtrl->y+pCtrl->h-1-(BS_SCRLBAR_WIDTH-(BS_SCRLBAR_WIDTH+3)/4)/2+1;
		for(i=0 ; i < (BS_SCRLBAR_WIDTH+3)/4+1; ++i)
			_hai_DrawHLine(hDC, (S_SHORT)(x-i), (S_SHORT)(x+i), y--, COLOR_BLACK);
		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_TIMER:
		break;	
	case EVT_KEYDN:
		switch (wParam)
		{
		case VK_PRIOR:
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_PAGEUP,pCtrl->CtrlID), 0);
			break;
		case VK_NEXT:
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_PAGEDOWN,pCtrl->CtrlID), 0);
			break;
		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_UP:
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_LINEUP,pCtrl->CtrlID), 0);
			break;
		case VK_DOWN:
			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_PRIOR:
		case VK_NEXT:
		case VK_END:
		case VK_HOME:
		case VK_UP:
		case VK_DOWN:
			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:
		hai_SetCapture(hCtrl);
		x = HAI_GETLOWORD(lParam);
		y = HAI_GETHIWORD(lParam);
		hDC = hai_GetSceneDC();
		if (y < pCtrl->y+BS_SCRLBAR_WIDTH)
		{
			pCtrl->ScrlBarData.ClickArea = 1;
			hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_DN, GRAY_BRUSH);
			x = pCtrl->x + BS_SCRLBAR_WIDTH/2;
			y = pCtrl->y + (BS_SCRLBAR_WIDTH - (BS_SCRLBAR_WIDTH+3)/4)/2-1;
			for(i = 0 ; i < (BS_SCRLBAR_WIDTH + 3)/4+1 ; ++i)
				_hai_DrawHLine(hDC, (S_SHORT)(x-i), (S_SHORT)(x+i), y++, COLOR_BLACK);
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_LINEUP, pCtrl->CtrlID), 0);
		}
		else if (y < pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos)
		{
			pCtrl->ScrlBarData.ClickArea = 2;
			hBrush = (SH_BRUSH)hai_GetStockObject(GRAY_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->ScrlBarData.ThumbPos), S_NULL, 0, 0, PATCOPY);
			hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_PAGEUP, pCtrl->CtrlID), 0);
		}
		else if (y < pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW)
		{
			pCtrl->ScrlBarData.ClickArea = 3;
			pCtrl->ScrlBarData.PriorMouseY = y;
		}
		else if (y < pCtrl->y+pCtrl->h-BS_SCRLBAR_WIDTH)
		{
			pCtrl->ScrlBarData.ClickArea = 4;
			hBrush = (SH_BRUSH)hai_GetStockObject(GRAY_BRUSH);
			hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_BitBlt(hDC, pCtrl->x, (S_SHORT)(pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW), BS_SCRLBAR_WIDTH, (S_SHORT)(pCtrl->h-pCtrl->ScrlBarData.ThumbPos-pCtrl->ScrlBarData.ThumbW-BS_SCRLBAR_WIDTH*2), S_NULL, 0, 0, PATCOPY);
			hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_PAGEDOWN, pCtrl->CtrlID), 0);
		}
		else
		{
			pCtrl->ScrlBarData.ClickArea = 5;
			y = pCtrl->y + pCtrl->h - BS_SCRLBAR_WIDTH;
			hai_Draw3DBlock(hDC, pCtrl->x, y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_DN, GRAY_BRUSH);
			x = pCtrl->x + BS_SCRLBAR_WIDTH/2;
			y = pCtrl->y+pCtrl->h-1-(BS_SCRLBAR_WIDTH-(BS_SCRLBAR_WIDTH+3)/4)/2+1;
			for(i=0 ; i < (BS_SCRLBAR_WIDTH+3)/4+1; ++i)
				_hai_DrawHLine(hDC, (S_SHORT)(x-i), (S_SHORT)(x+i), y--, COLOR_BLACK);
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_LINEDOWN, pCtrl->CtrlID), 0);
		}
		hai_ReleaseDC(hDC);
		_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		break;
	case EVT_MOUSEUP:
		x = HAI_GETLOWORD(lParam);
		y = HAI_GETHIWORD(lParam);
		hDC = hai_GetSceneDC();
		if (pCtrl->ScrlBarData.ClickArea == 1)//(y < pCtrl->y+BS_SCRLBAR_WIDTH)
		{
			hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
			x = pCtrl->x + BS_SCRLBAR_WIDTH/2;
			y = pCtrl->y + (BS_SCRLBAR_WIDTH - (BS_SCRLBAR_WIDTH+3)/4)/2-1;
			for(i = 0 ; i < (BS_SCRLBAR_WIDTH + 3)/4+1 ; ++i)
				_hai_DrawHLine(hDC, (S_SHORT)(x-i), (S_SHORT)(x+i), y++, COLOR_BLACK);
		}
		else if (pCtrl->ScrlBarData.ClickArea == 2)//(y < pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos)
		{
			hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
			hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			if (pCtrl->ScrlBarData.ThumbPos)
				hai_BitBlt(hDC, pCtrl->x, (S_SHORT)(pCtrl->y+BS_SCRLBAR_WIDTH), BS_SCRLBAR_WIDTH, (S_SHORT)(pCtrl->ScrlBarData.ThumbPos), S_NULL, 0, 0, PATCOPY);
			hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
		}
		else if (pCtrl->ScrlBarData.ClickArea == 3)//(y < pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW)
		{
			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;
			}
			hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_THUMBPOSITION, pCtrl->CtrlID), PreStart);
			hai_SetScrlBarInfo(hCtrl, pCtrl->ScrlBarData.CurStart, pCtrl->ScrlBarData.TotalLine, pCtrl->ScrlBarData.LinePerPage);
			pCtrl->ScrlBarData.PriorMouseY = 0;
		}
		else if (pCtrl->ScrlBarData.ClickArea == 4)//(y < pCtrl->y+pCtrl->h-BS_SCRLBAR_WIDTH)
		{
			hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
			hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
			if (pCtrl->h-pCtrl->ScrlBarData.ThumbPos-pCtrl->ScrlBarData.ThumbW-BS_SCRLBAR_WIDTH*2)
				hai_BitBlt(hDC, pCtrl->x, (S_SHORT)(pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW), BS_SCRLBAR_WIDTH, (S_SHORT)(pCtrl->h-pCtrl->ScrlBarData.ThumbPos-pCtrl->ScrlBarData.ThumbW-BS_SCRLBAR_WIDTH*2), S_NULL, 0, 0, PATCOPY);
			hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
		}
		else if (pCtrl->ScrlBarData.ClickArea == 5)
		{
			y = pCtrl->y + pCtrl->h - BS_SCRLBAR_WIDTH;
			hai_Draw3DBlock(hDC, pCtrl->x, y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
			x = pCtrl->x + BS_SCRLBAR_WIDTH/2;
			y = pCtrl->y+pCtrl->h-1-(BS_SCRLBAR_WIDTH-(BS_SCRLBAR_WIDTH+3)/4)/2+1;
			for(i=0 ; i < (BS_SCRLBAR_WIDTH+3)/4+1; ++i)
				_hai_DrawHLine(hDC, (S_SHORT)(x-i), (S_SHORT)(x+i), y--, COLOR_BLACK);
		}
		hai_ReleaseDC(hDC);
		pCtrl->ScrlBarData.ClickArea = 0;
		_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
		hai_ReleaseCapture();
		break;
	case EVT_MOUSEDB:
		hai_ReleaseCapture();
		break;
	case EVT_MOUSEMV:
		x = HAI_GETLOWORD(lParam);
		y = HAI_GETHIWORD(lParam);
		hDC = hai_GetSceneDC();
		if (x>pCtrl->x && x<pCtrl->x+pCtrl->w && y>pCtrl->y && y<pCtrl->y+pCtrl->h)
		{
			if (pCtrl->ScrlBarData.ClickArea == 0)
			{
			}
			else
			{
				if (y < pCtrl->y+BS_SCRLBAR_WIDTH)
				{
					if (pCtrl->ScrlBarData.ClickArea != 1)
					{
						hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
					}
				}
				else if (y < pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos)
				{
					if (pCtrl->ScrlBarData.ClickArea != 2)
					{
						hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
					}

⌨️ 快捷键说明

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