📄 uiviewport.c
字号:
}
//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 + -