📄 brw_key.c
字号:
/**************************************************************************
Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD
FILE NAME: brw_key.C
MODULE NAME: browser
DESCRIPTION: 浏览器按键处理
对外函数声明:
BrowserKeyProcess 按键处理
**************************************************************************
DTAE AUTHOR VERSION REMARKS
=========== ========== ========= ======================================
2006-3-5 gaolinhui V1.0 create
***************************************************************************/
#include "kernel.h"
#include "BrowserIn.h"
INT BrowserKeyProcess(MBrowser *handle, UINT uEvent, UINT uParam)
{
BOOL bIsMarking;
UINT32 dwTopLine,dwLine,dwTotalLine,dwOffset;
UINT16 wPageLine,wCol, wStateStock;
BOOL bShiftKey;
UINT uKey;
INT nRet = 0;
/*MARKING标记*/
bIsMarking = (handle->pBrwInfo->wStates & BROWSER_STATE_MARKING);
MsgSend2((APGUI_STRUCT_MODEL*)handle, EVENT_COMMAND, CM_BROWSER_UPDT_PAGELINES);
wPageLine = handle->pBrwInfo->wPageLine;
dwTopLine = handle->pBrwInfo->dwTopLine;
dwTotalLine = handle->pBrwInfo->dwTotalLine;
uKey = READKB_VALUE(uParam);
bShiftKey = READKB_SHIFTMASK(uParam);
dwLine = 0;
wCol = 0;
//,扩展消息类型
g_BrwCmdExp.wCmdType = EVENT_CMDEXP_BWR;
g_BrwCmdExp.pCmdExp = &g_mBrwCmdParam;
/*如果屏幕未更新,重画*/
if (handle->pBrwInfo->wStates & BROWSER_STATE_NODRAW)
{
BrowserDrawPage(handle);
}
switch (uKey)
{
case MVK_LEFT:
case MVK_RIGHT:
nRet = BrowserMarkKeyProcess(handle,uEvent,uParam);
break;
case MVK_UP:
if (bIsMarking)
{
nRet = BrowserMarkKeyProcess(handle,uEvent,uParam);
}
else
{
if (dwTopLine)
{
__BrowserSetTopLine(handle, dwTopLine-1, TRUE);
}
else
{
if (handle->pBrwInfo->wOptions & BROWSER_OPTION_RELOAD)
{
MLineInfo lineinfo;
//先保存当前页首行和页尾之间偏移
if(!GetLineInfo(handle, dwTopLine, &lineinfo))
{
break;
}
dwOffset = (UINT32)(lineinfo.pLinePtr);
wStateStock = lineinfo.wStates; //保存当前页首状态
if(!GetLineInfo(handle, wPageLine, &lineinfo)) //获取当前显示页尾的数据指针
{
break;
}
dwOffset = (UINT32)(lineinfo.pLinePtr - (UINT8*)dwOffset); //保存页首距离页尾的偏移
//向上请求数据,请求长度为从buffer顶到当前页尾的长度
//请求的数据指针为页尾的指针
g_mBrwCmdParam.uType = CMEX_BROWSER_REQUEST_TOP;
g_mBrwCmdParam.pBrwHdl = (APGUI_STRUCT_MODEL* )handle;
g_mBrwCmdParam.cmdparam.ReqData.uDataRemain =
(UINT)(lineinfo.pLinePtr - handle->pBrwInfo->pBuffer);
g_mBrwCmdParam.cmdparam.ReqData.pData = lineinfo.pLinePtr;
g_mBrwCmdParam.cmdparam.ReqData.wState = lineinfo.wStates;
//发送向上请求数据得消息
nRet = MsgSend2(GetApHandle(),EVENT_CMDEXP, (UINT)&g_BrwCmdExp);
if(nRet) //如果请求数据成功
{
//重新加载数据
UINT8* pBuf = g_mBrwCmdParam.cmdparam.ReqData.BufStartRet;
UINT16 state = g_mBrwCmdParam.cmdparam.ReqData.wStateRet;
UINT8* pOld = g_mBrwCmdParam.cmdparam.ReqData.OldPosRet;
UINT32 dwLine;
UINT16 wCol;
BrowserLoadData(handle, pBuf, state, 0);
//重新找到之前页首的指针
pOld = pOld - dwOffset;
BrowserPosToLineCol(handle,pOld,&dwLine,&wCol);
if(dwLine > 0)
dwLine -- ;
__BrowserSetTopLine(handle, dwLine,TRUE);
}
}
}
nRet = 1;
}
break;
case MVK_DOWN:
if (bIsMarking)
{
nRet = BrowserMarkKeyProcess(handle,uEvent,uParam);
}
else
{
if ((handle->pBrwInfo->wOptions & BROWSER_OPTION_RELOAD)
&&(dwTopLine+wPageLine >= dwTotalLine -1 ))
{
MLineInfo lineinfo;
UINT8* pData;
UINT16 wOldState;
//计算剩余的数据(当前页)
if(!GetLineInfo(handle, dwTopLine, &lineinfo))
{
break;
}
pData = lineinfo.pLinePtr;
wOldState = lineinfo.wStates;
if(!GetLineInfo(handle, handle->pBrwInfo->dwTotalLine, &lineinfo))
{
break;
}
g_mBrwCmdParam.cmdparam.ReqData.uDataRemain = (UINT)(lineinfo.pLinePtr - pData);
g_mBrwCmdParam.cmdparam.ReqData.pData = pData;
g_mBrwCmdParam.cmdparam.ReqData.wState = wOldState;
g_mBrwCmdParam.uType = CMEX_BROWSER_REQUEST_BOT;
g_mBrwCmdParam.pBrwHdl = (APGUI_STRUCT_MODEL* )handle;
//发送向下请求数据消息
nRet = MsgSend2(GetApHandle(),EVENT_CMDEXP, (UINT)&g_BrwCmdExp);
if (nRet) //如果请求数据成功
{
//重新加载数据
UINT8* pBuf = g_mBrwCmdParam.cmdparam.ReqData.BufStartRet;
UINT16 state = g_mBrwCmdParam.cmdparam.ReqData.wStateRet;
UINT8* pOld = g_mBrwCmdParam.cmdparam.ReqData.OldPosRet;
UINT32 dwLine;
//load数据
BrowserLoadData(handle, pBuf, state, 0);
//重新计算一页的行数
MsgSend2((APGUI_STRUCT_MODEL*)handle, EVENT_COMMAND, CM_BROWSER_UPDT_PAGELINES);
wPageLine = handle->pBrwInfo->wPageLine;
if(wPageLine >= handle->pBrwInfo->dwTotalLine)
{
dwLine = 0;
}
else
{
//dwLine = 0;
dwLine = 1;
}
__BrowserSetTopLine(handle, dwLine,TRUE);
}
else
{
if(dwTopLine+wPageLine < dwTotalLine)
__BrowserSetTopLine(handle, dwTopLine+1, TRUE);
}
}
else
{
if( dwTopLine+wPageLine < dwTotalLine )
__BrowserSetTopLine(handle, dwTopLine+1, TRUE);
}
nRet = 1;
}
break;
case MVK_PAGEUP:
if (bIsMarking)
{
handle->pBrwInfo->wStates &= ~BROWSER_STATE_MARKING;
MsgPost((APGUI_STRUCT_MODEL*)handle, EVENT_DRAW, 0);
}
//向前搜索一页数据
if(1)
{
UINT16 wLine;
UINT32 dwOldTop;
dwOldTop = dwTopLine;
//顶行先减1为了缩短计算时间
if(dwTopLine)
{
dwTopLine--;
}
while(1)
{
//取当前顶行的一页行数
wLine = BrowserPageLineSum(handle,dwTopLine);
//如果一页的行数+顶行号<=翻页前的顶行,表示向前找一页成功
if(wLine+dwTopLine <= dwOldTop)
break;
//否则顶行减1继续找
if(dwTopLine > 0)
dwTopLine--;
else
{
//如果是数据重载方式,向上请求数据
if(handle->pBrwInfo->wOptions & BROWSER_OPTION_RELOAD)
{
MLineInfo lineinfo;
UINT16 wLineOffset;
//先记录当前顶行和旧顶行的差
wLineOffset = dwOldTop - dwTopLine;
if(!GetLineInfo(handle, dwTopLine, &lineinfo))
{
break;
}
dwOffset = (UINT32)(lineinfo.pLinePtr);
wStateStock = lineinfo.wStates; //保存当前页首状态
if(!GetLineInfo(handle, wPageLine, &lineinfo)) //获取当前显示页尾的数据指针
{
break;
}
dwOffset = (UINT32)(lineinfo.pLinePtr - (UINT8*)dwOffset); //保存页首距离页尾的偏移
//向上请求数据,请求长度为从buffer顶到当前页尾的长度
//请求的数据指针为页尾的指针
g_mBrwCmdParam.uType = CMEX_BROWSER_REQUEST_TOP;
g_mBrwCmdParam.pBrwHdl = (APGUI_STRUCT_MODEL* )handle;
g_mBrwCmdParam.cmdparam.ReqData.uDataRemain =
(UINT)(lineinfo.pLinePtr - handle->pBrwInfo->pBuffer);
g_mBrwCmdParam.cmdparam.ReqData.pData = lineinfo.pLinePtr;
g_mBrwCmdParam.cmdparam.ReqData.wState = lineinfo.wStates;
//发送向上请求数据得消息
nRet = MsgSend2(GetApHandle(),EVENT_CMDEXP, (UINT)&g_BrwCmdExp);
if (!nRet)
{ //请求数据失败,还是原来的数据
break;
}
else
{ //请求数据成功
//重新加载数据
UINT8* pBuf = g_mBrwCmdParam.cmdparam.ReqData.BufStartRet;
UINT16 state = g_mBrwCmdParam.cmdparam.ReqData.wStateRet;
UINT8* pOld = g_mBrwCmdParam.cmdparam.ReqData.OldPosRet;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -