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

📄 uiviewport.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}

		//modi wVScroll_Page
		wExt=bottom-top-1;
		if(pVport->base.style&VPORT_H_SCROLLBAR)
		{
			wExt-=_SCROLLBAR_WIDTH_;
		}

		if(pVport->wVScroll_Page*pVport->wVScroll_Dot>wExt)
		{
			pVport->wVScroll_Page=wExt/pVport->wVScroll_Dot;
		}

		//bottom=pScroll->base.bottom+((pVport->base.bottom-pVport->base.top+1)-(pScroll->base.bottom-pScroll->base.top+1+gap));

		guiControl_SetLocation(pVport->hVScroll,right-_SCROLLBAR_WIDTH_,top+1,right-1,bottom-gap);
		guiScroll_Update(pVport->hVScroll,
						 (pVport->iVirtualHeight+pVport->wVScroll_Dot-1)/pVport->wVScroll_Dot,
			             pVport->wVScroll_Page,
			             pVport->iCurrentTop/pVport->wVScroll_Dot);}

	if(pVport->hHScroll)
	{
		pScroll=(TGUISCROLL *)pVport->hHScroll;

		gap=1;
		if(pVport->hVScroll)
		{
			gap+=_SCROLLBAR_WIDTH_;
		}

		//modi wHScroll_Page
		wExt=right-left-1;
		if(pVport->base.style&VPORT_V_SCROLLBAR)
		{
			wExt-=_SCROLLBAR_WIDTH_;
		}

		if(pVport->wHScroll_Page*pVport->wVScroll_Dot>wExt)
		{
			pVport->wHScroll_Page=wExt/pVport->wHScroll_Dot;
		}

		guiControl_SetLocation(pVport->hHScroll,left+1,bottom-_SCROLLBAR_WIDTH_,right-gap,bottom-1);
		guiScroll_Update(pVport->hHScroll,
						 (pVport->iVirtualWidth+pVport->wHScroll_Dot-1)/pVport->wHScroll_Dot,
						 pVport->wHScroll_Page,
						 pVport->iCurrentLeft/pVport->wHScroll_Dot);
	}

	guiViewport_Repaint(hVport);

	guiExitWCS();

	return STATUS_OK;
}

/*	change view */
DLL_EXP(int) _guiViewport_Move(HNDL hVport,int iNewX,int iNewY) 
{
	TViewport *pVport;

	//guiEnterWCS();

	//check hVport is or not valid;
	pVport=(TViewport *)hVport;
	if(pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG||pVport->base.type!=CONTROL_VIEWPORT)
	{
		return STATUS_ERR;
	}
	
	pVport->iCurrentLeft=iNewX;
	pVport->iCurrentTop=iNewY;

	guiCaret_Disable();
	guiControl_Clear(hVport);
	guiViewport_Show(hVport);
	guiCaret_Enable();

//	guiExitWCS();

	return STATUS_OK;
}

DLL_EXP(int) guiViewport_Move(HNDL hVport,int iNewX,int iNewY)
{

	guiEnterWCS();

	_guiViewport_Move(hVport,iNewX,iNewY);

	guiExitWCS();

	return STATUS_OK;
}

/*
	将某个control加入vport的control list中
*/
DLL_EXP(STATUS) guiViewport_AddControl(HNDL hVport, HNDL hCtrl)
{
	TGuiControl *pCtrl;
	TViewport *pVport;

	pCtrl=(TGuiControl *)hCtrl;
	pVport=(TViewport *)hVport;

	guiEnterWCS();

	if(pCtrl==NULL||pVport==NULL)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	if(pCtrl->checkFlag!=GUI_CONTROL_CHECK_FLAG||pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	if(pVport->base.type!=CONTROL_VIEWPORT||pCtrl->type==CONTROL_VIEWPORT)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	//if the control has in any container,remove from container;
	if(pCtrl->container!=NULL)
	{
		guiControl_Remove(pCtrl->container,hCtrl);
	}
	if(pCtrl->vportHandle!=NULL)
	{
		guiViewport_RemoveControl(pCtrl->vportHandle,hCtrl);
	}

	//add
	insertTo(&pVport->tControlList,pCtrl);
	pCtrl->vportHandle=hVport;

	//modify  vport's width and height;
	if(pCtrl->bottom>pVport->iVirtualHeight)
	{
		pVport->iVirtualHeight=pCtrl->bottom;
		/*
		if(pVport->hVScroll)
		{
			guiScroll_Update(pVport->hVScroll,pVport->iVirtualHeight/pVport->wVScroll_Dot,pVport->wVScroll_Page,pVport->iCurrentTop/pVport->wVScroll_Dot);
		}
		*/
	}

	if(pCtrl->right>pVport->iVirtualWidth)
	{
		pVport->iVirtualWidth=pCtrl->right;
		/*
		if(pVport->hHScroll)
		{
			guiScroll_Update(pVport->hHScroll,pVport->iVirtualWidth/pVport->wHScroll_Dot,pVport->wHScroll_Page,pVport->iCurrentLeft/pVport->wHScroll_Dot);
		}
		*/
	}

	guiExitWCS();
	return STATUS_OK;
}

//called by guiControl_Delete(...);
DLL_EXP(STATUS) guiViewport_RemoveControl(HNDL hVport, HNDL hCtrl)
{
	WORD wNewX,wNewY;
	int iMaxX=0,iMaxY=0;

	struct dLinkList *pLinkList;
	TGuiControl *pCtrl,*pCtrl2;
	TViewport *pVport;

	pCtrl=(TGuiControl *)hCtrl;
	pVport=(TViewport *)hVport;
	pLinkList=&pVport->tControlList;

	if(hVport==0||hCtrl==0)
	{
		return STATUS_ERR;
	}

	guiEnterWCS();

	if(pCtrl->checkFlag!=GUI_CONTROL_CHECK_FLAG||pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	if(guiRemoveControl(pLinkList,hCtrl)!=STATUS_OK)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	//adjust pVport->iVirtualHeight
	if(pCtrl->bottom>=pVport->iVirtualHeight)
	{
		pLinkList=pVport->tControlList.back;
		while(pLinkList)
		{
			pCtrl2=(TGuiControl *)pLinkList->elementPointer;
			if(pCtrl2&&pCtrl2->bottom>iMaxY)
			{
				iMaxY=pCtrl2->bottom;
			}
			pLinkList=pLinkList->back;
		}
		pVport->iVirtualHeight=iMaxY;
	
		//	guiControl_Clear(hVport);
		if(pVport->hVScroll)
		{
			guiScroll_Update(pVport->hVScroll,pVport->iVirtualHeight/pVport->wVScroll_Dot,pVport->wVScroll_Page,pVport->iCurrentTop/pVport->wVScroll_Dot);
		}   // 20002/09/27   by tongxianbiao
	
		wNewX=pVport->iCurrentLeft;
		wNewY=guiScroll_GetPos(pVport->hVScroll)*pVport->wVScroll_Dot;
		guiViewport_Move(hVport,wNewX,wNewY);

	//	guiViewport_Show(hVport);
	}

	//adjust pVport->iVirtualWidth
	if(pCtrl->right>=pVport->iVirtualWidth)
	{
		pLinkList=pVport->tControlList.back;
		while(pLinkList)
		{
			pCtrl2=(TGuiControl *)pLinkList->elementPointer;
			if(pCtrl2&&pCtrl2->right>iMaxY)
			{
				iMaxX=pCtrl2->right;
			}
			pLinkList=pLinkList->back;
		}
		pVport->iVirtualHeight=iMaxX;
		/*
		if(pVport->hHScroll)
		{
			guiScroll_Update(pVport->hHScroll,pVport->iVirtualWidth/pVport->wHScroll_Dot,pVport->wHScroll_Page,pVport->iCurrentLeft/pVport->wHScroll_Dot);
		}
		*/

		wNewY=pVport->iCurrentTop;
		wNewX=guiScroll_GetPos(pVport->hHScroll)*pVport->wHScroll_Dot;
		guiViewport_Move(hVport,wNewX,wNewY);

	}

	guiExitWCS();

	return STATUS_OK;
}

//refresh viewport's width and height.
DLL_EXP(STATUS)	guiViewport_Refresh_WH(HNDL hVport)
{
	int height,width,iVirtualHeight=0,iVirtualWidth=0;
	struct dLinkList *pLinkList;
	TGuiControl *pCtrl;
	TViewport * pVport;

	guiEnterWCS();
	
	pVport=(TViewport *)hVport;
	if(pVport==NULL||pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}
	pLinkList=pVport->tControlList.back;

	while(pLinkList)
	{
		pCtrl=(TGuiControl *)pLinkList->elementPointer;

		if(pCtrl->bottom>iVirtualHeight)
		{
			iVirtualHeight=pCtrl->bottom;
		}
		if(pCtrl->right>iVirtualWidth)
		{
			iVirtualWidth=pCtrl->right;
		}		

		pLinkList=pLinkList->back;
	}

	
	pVport->iVirtualHeight=iVirtualHeight;
	pVport->iVirtualWidth=iVirtualWidth;

	height=pVport->base.bottom-pVport->base.top-2;
	if(pVport->iCurrentTop+height>pVport->iVirtualHeight)
	{
		pVport->iCurrentTop-=pVport->iCurrentTop+height-pVport->iVirtualHeight;
		if(pVport->iCurrentTop<0)
		{
			pVport->iCurrentTop=0;
		}
	}

	width=pVport->base.right-pVport->base.left-2;
	if(pVport->iCurrentLeft+height>pVport->iVirtualWidth)
	{
		pVport->iCurrentLeft-=pVport->iCurrentLeft+width-pVport->iVirtualWidth;
		if(pVport->iCurrentLeft<0)
		{
			pVport->iCurrentLeft=0;
		}
	}
	guiExitWCS();

	return STATUS_OK;
}

DLL_EXP(STATUS) guiViewport_MoveControlFromPos(HNDL hVport,WORD wBeginPos,short nSize,WORD wType)
{
	int iModi_Flag_V=0,iModi_Flag_H=0;
	TViewport *pVport;
	TGuiControl *pCtrl;
	struct dLinkList *pLinkList;

	pVport=(TViewport *)hVport;

	guiEnterWCS();

	if(pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	pLinkList =pVport->tControlList.back;
	while(pLinkList)
	{
		pCtrl=(TGuiControl *)pLinkList->elementPointer;
		if(pCtrl)
		{
			if(wType==VPORT_V_SCROLLBAR&&pCtrl->top>wBeginPos)
			{
				pCtrl->top+=nSize;
				pCtrl->bottom+=nSize;
//				iModi_Flag_V++;
			}
			else if(wType==VPORT_H_SCROLLBAR&&pCtrl->left>wBeginPos)
			{
				pCtrl->left+=nSize;
				pCtrl->right+=nSize;
//				iModi_Flag_H++;
			}
		}
		pLinkList=pLinkList->back;
	}
	
	//refresh vport's width and height.
	guiViewport_Refresh_WH(hVport);
	
	guiCaret_Disable();
	guiControl_Clear(hVport);
	guiViewport_Show(hVport);
	guiCaret_Enable();


	//modify width and height
/*	if(iModi_Flag_V)
	{
		pVport->iVirtualHeight+=nSize;
	}

	if(iModi_Flag_H)
	{
		pVport->iVirtualWidth+=nSize;
	}
*/
//should mask these codes below,if textedit have dealed.
/*	//refresh display
	if(guiControl_IsVisible(hVport))
	{
		if(wType&VPORT_V_SCROLLBAR)
		{
			guiViewport_Move(hVport,pVport->iCurrentLeft,pVport->iCurrentTop+nSize);
		}
		if(wType&VPORT_H_SCROLLBAR)
		{
			guiViewport_Move(hVport,pVport->iCurrentLeft+nSize,pVport->iCurrentTop);
		}
	}
*/
	guiExitWCS();
	return STATUS_OK;
}


/*
	会将可视区内的widget show出来
*/
DLL_EXP(int) guiViewport_Repaint(HNDL hVport) 
{
	struct dLinkList *pLinkList;
	TGuiControl *pCtrl;
	TViewport * pVport;

	pVport=(TViewport *)hVport;
	pLinkList=pVport->tControlList.back;

	guiEnterWCS();

	while(pLinkList)
	{
		pCtrl=(TGuiControl *)pLinkList->elementPointer;
		if(pCtrl->showFun!=NULL)
		{
			pCtrl->showFun((HNDL)pCtrl);
		}
		
		pLinkList=pLinkList->back;
	}

	guiControl_Show(pVport->hHScroll);
	guiControl_Show(pVport->hVScroll);

	guiExitWCS();

	return STATUS_OK;
}

//modify the size of one page and one dot,when the scrollbar rolling;
//wpage 计数以wDot为单位。

DLL_EXP(STATUS) guiViewport_ModiScroll(HNDL hVport,WORD wPage,WORD wDot,WORD wType)
{
	TViewport *pVport;

	pVport=(TViewport *)hVport;

	guiEnterWCS();

	if(pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	if(wType==VPORT_V_SCROLLBAR&&pVport->hVScroll)
	{
		pVport->wVScroll_Dot=wDot;
		pVport->wVScroll_Page=wPage;
		guiScroll_Update(pVport->hVScroll,
						 (pVport->iVirtualHeight+pVport->wVScroll_Dot-1)/pVport->wVScroll_Dot,
			             pVport->wVScroll_Page,
			             pVport->iCurrentTop/pVport->wVScroll_Dot);
	}
	else if(wType==VPORT_H_SCROLLBAR&&pVport->hHScroll)
	{
		pVport->wHScroll_Dot=wDot;
		pVport->wHScroll_Page=wPage;
		guiScroll_Update(pVport->hHScroll,
						 (pVport->iVirtualWidth+pVport->wHScroll_Dot-1)/pVport->wHScroll_Dot,
						 pVport->wHScroll_Page,
						 pVport->iCurrentLeft/pVport->wHScroll_Dot);
	}
	else
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	guiExitWCS();

	return STATUS_OK;
}

DLL_EXP(STATUS) guiViewport_DeleteAllControl(HNDL hVport)
{
	TViewport *pVport;
	struct dLinkList *pLinkList;
	HNDL hControl;
	
	guiEnterWCS();

	pVport=(TViewport *)hVport;
	if(pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}
	
	pLinkList = pVport->tControlList.back;
	while (pLinkList)
	{
		hControl = (HNDL)pLinkList->elementPointer;
		if(hControl!=0)
		{
			guiViewport_RemoveControl(hVport, hControl);
			((TGuiControl *)hControl)->delFun(hControl);
		}
		pLinkList = pLinkList->back;		
	}
	
	guiExitWCS();
	return STATUS_OK;	
}

//get current position
DLL_EXP(STATUS) guiViewport_GetCurrentPos(HNDL hVport,int *pCurrentLeft,int *pCurrentTop)
{
	TViewport *pVport;

	pVport=(TViewport *)hVport;

	guiEnterWCS();

	if(pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	*pCurrentLeft=pVport->iCurrentLeft;
	*pCurrentTop=pVport->iCurrentTop;
	guiExitWCS();

	return STATUS_OK;
}

⌨️ 快捷键说明

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