brw_mark.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 786 行 · 第 1/2 页
C
786 行
/**************************************************************************
Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD
FILE NAME: brw_mark.C
MODULE NAME: browser
DESCRIPTION: 浏览器对mark相关的函数
对外函数声明:
BrowserMarkKeyProcess mark按键处理
BrowserMarkWordMemLen Mark块内存长度
BrowserGetNewCursor 确定mark位置
**************************************************************************
DTAE AUTHOR VERSION REMARKS
=========== ========== ========= ======================================
2006-3-5 gaolinhui V1.0 create
***************************************************************************/
#include "kernel.h"
#include "BrowserIn.h"
/************************************************************************/
/* 函数名称: BrowserMarkKeyProcess */
/* 函数描述: 按键处理函数 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* pEvent - 消息指针 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 消息处理返回值 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
INT BrowserMarkKeyProcess(MBrowser *handle, UINT uEvent, UINT uParam)
{
UINT bIsMarking;
UINT8 *pNewCursor, *pOldCursor, *pCurrent, *pStart,
*pOldEnd, *pOldStart;
UINT32 dwLine, dwTopLine, dwLineNum;
UINT16 wCol;
BOOL bShifKey;
UINT uKey;
/*是否有MARK属性*/
if (!(handle->pBrwInfo->wOptions & BROWSER_OPTION_MARK))
{
return 0L;
}
/*MARK开始位置*/
pStart = handle->pBrwInfo->pMarkStart;
pOldStart = handle->pBrwInfo->pMarkStart;
/*MARK结束位置*/
pOldEnd = handle->pBrwInfo->pMarkEnd;
/*MARK当前位置*/
pOldCursor = handle->pBrwInfo->pMarkCur;
uKey = READKB_VALUE(uParam);
bShifKey = READKB_SHIFTMASK(uParam);
/*是否在MARK状态?*/
bIsMarking = (handle->pBrwInfo->wStates & BROWSER_STATE_MARKING);
if (!bIsMarking)
{
/*非MARK状态*/
if ((uKey == MVK_RIGHT) /*&& bShifKey*/)
{
/*右键MARK屏幕第一个单元*/
MsgSend2((APGUI_STRUCT_MODEL*)handle, EVENT_COMMAND, CM_BROWSER_MARKSTART);
return 1;
}
else if ((uKey == MVK_LEFT) /*&& bShifKey*/)
{
/*左键MARK屏幕最后一个单元*/
MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND,CM_BROWSER_MARKEND);
return 1;
}
else
{
return 0L;
}
}
/*MARK状态下的处理*/
/*得到新的位置*/
pNewCursor = BrowserGetNewCursor(handle, pOldCursor, uKey);
if (pNewCursor == (UINT8*)NULL)
{
if(uKey == MVK_LEFT || uKey == MVK_RIGHT)
MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND, CM_BROWSER_CANCELMARK);
return 1;
}
pCurrent = pNewCursor;
if (bShifKey)
{
pCurrent = BrowserGetRealCursor(handle, pNewCursor, pOldCursor);
}
BrowserPosToLineCol(handle, pCurrent, &dwLine, &wCol);
dwTopLine = handle->pBrwInfo->dwTopLine;
dwLineNum = BrowserPageLineSum(handle,dwTopLine);
/*MRAK不可以超出屏幕范围*/
if (dwTopLine > dwLine)
{
if(uKey == MVK_LEFT || uKey == MVK_RIGHT)
MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND, CM_BROWSER_CANCELMARK);
return 1;
}
else if (dwLine > dwTopLine + dwLineNum - 1)
{
if(uKey == MVK_LEFT || uKey == MVK_RIGHT)
MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND, CM_BROWSER_CANCELMARK);
return 1;
}
/*取消以前的MARK块*/
BrowserMarkPage(handle);
if (!bShifKey)
{
/*没有shift键组合,则MARK下一个单元*/
handle->pBrwInfo->pMarkStart = pCurrent;
handle->pBrwInfo->pMarkEnd = pCurrent
+ BrowserMarkWordMemLen(pCurrent);
}
else
{
/*有shift键组合,则连续MARK*/
/*调整MARK范围*/
pNewCursor = pCurrent + BrowserMarkWordMemLen(pCurrent);
if ((pOldStart < pNewCursor) && (pNewCursor <= pOldEnd))
{
/*新的结束位置在以前MARK块中间*/
if (pOldCursor == pStart)
{
/*当前MARK位置和MARK开始位置相同,表示在SHIFT组和MARK中*/
handle->pBrwInfo->pMarkStart = pCurrent;
}
else
{
handle->pBrwInfo->pMarkEnd = pCurrent
+ BrowserMarkWordMemLen(pCurrent);
}
}
else
{
if (pNewCursor <= pStart)
{
handle->pBrwInfo->pMarkStart = pCurrent;
}
else
{
handle->pBrwInfo->pMarkEnd = pCurrent
+ BrowserMarkWordMemLen(pCurrent);
}
}
}
/*调整新的MARK位置*/
handle->pBrwInfo->pMarkCur = pCurrent;
BrowserMarkPage(handle);
return 1;
}
/************************************************************************/
/* 函数名称: BrowserMarkWordMemLen */
/* 函数描述: MARK块内存长度 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* pCurrent - 数据指针 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 内存长度 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT16 BrowserMarkWordMemLen(UINT8 *pCurrent)
{
UINT16 wTmp, wLen;
UINT uChar,uChar2;
wLen = 0;
while (wTmp = BrowserJudgeMarkAbility(pCurrent))
{
uChar = *pCurrent;
uChar2 = *(pCurrent + 1);
if ((wTmp == 2) && !BrowserJudgeUserFont(pCurrent))
{
/*单个汉字是一个MARK单元,也是一个MARK单元的结束标记*/
if (wLen == 0)
{
wLen = 2;
}
break;
}
else
{
wLen += wTmp;
}
pCurrent += wTmp;
}
return wLen;
}
/************************************************************************/
/* 函数名称: BrowserGetNewCursor */
/* 函数描述: 确定MARK位置 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* pOldCursor - 数据指针 */
/* wDir - MARK方向 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 新位置 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT8* BrowserGetNewCursor(MBrowser *handle, UINT8 *pOldCursor, UINT uDir)
{
UINT8 *pCursor,*pCheck;
UINT32 dwLine, dwCursorLine;
UINT16 wCol, wCursorCol;
UINT32 totalLine,i = 0;
BrowserPosToLineCol(handle, pOldCursor, &dwLine, &wCol);
pCursor = pOldCursor;
totalLine = handle->pBrwInfo->dwTotalLine;
switch (uDir)
{
case MVK_LEFT: /*左键*/
pCursor = BrowserLocateMarkPosition(handle,
pOldCursor, BROWSER_GO_BACKWARD);
break;
case MVK_RIGHT: /*右键*/
pOldCursor += BrowserMarkWordMemLen(pOldCursor);
pCursor = BrowserLocateMarkPosition(handle,
pOldCursor, BROWSER_GO_FORWARD);
break;
case MVK_UP: /*上键*/
if (dwLine != 0)
{
UINT8 *pTemp;
/*上一行对应数据位置*/
pCursor = BrowserLineColToPos(handle, dwLine - 1, wCol);
/*园整行列位置*/
pCursor = BrowserLocateMarkPosition(handle, pCursor,
BROWSER_GO_FORWARD);
if (pCursor == NULL)
{
break;
}
BrowserPosToLineCol(handle, pCursor, &dwCursorLine,
&wCursorCol);
/*得到新位置*/
while (dwCursorLine >= dwLine)
{
pCheck = pCursor;
pCursor = BrowserLocateMarkPosition(handle, pCursor,
BROWSER_GO_BACKWARD);
if ((pCursor == NULL) || (pCheck == pCursor))
{
pCursor = NULL;
break;
}
BrowserPosToLineCol(handle, pCursor, &dwCursorLine,
&wCursorCol);
}
pTemp = BrowserLocateMarkPosition(handle,
pOldCursor, BROWSER_GO_BACKWARD);
if (pTemp && pCursor && (pTemp < pCursor))
{
pCursor = pTemp;
}
}
break;
case MVK_DOWN: /*下键*/
if (dwLine < totalLine - 1)
{
UINT8 *pTemp;
/*下一行对应位置*/
pCursor = BrowserLineColToPos(handle, dwLine + 1, wCol);
if (pCursor == NULL)
{
pOldCursor += BrowserMarkWordMemLen(pOldCursor);
pCursor = BrowserLocateMarkPosition(handle,
pOldCursor, BROWSER_GO_FORWARD);
break;
}
pCursor = BrowserLocateMarkPosition(handle,
pCursor, BROWSER_GO_FORWARD);
if (pCursor == NULL)
{
do {
if (!BrowserJudgeMarkAbility(pOldCursor)) {
break;
}
pOldCursor += BrowserMarkWordMemLen(pOldCursor);
pCursor = BrowserLocateMarkPosition(handle, pOldCursor, BROWSER_GO_FORWARD);
} while (pCursor);
break;
}
BrowserPosToLineCol(handle, pCursor, &dwCursorLine,
&wCursorCol);
if (dwCursorLine > (dwLine + 1))
{
pCursor = BrowserLocateMarkPosition(handle,
pCursor, BROWSER_GO_BACKWARD);
if (pCursor == NULL)
{
break;
}
}
pTemp = pOldCursor;
pTemp += BrowserMarkWordMemLen(pOldCursor);
while (pCursor < pTemp)
{
pCursor = BrowserLineColToPos(handle, dwLine + i, wCol);
if (pCursor == NULL)
{
break;
}
i ++;
}
pCursor = BrowserLocateMarkPosition(handle,
pCursor, BROWSER_GO_FORWARD);
if (pCursor == NULL)
{
break;
}
BrowserPosToLineCol(handle, pCursor, &dwCursorLine,
&wCursorCol);
/*得到新位置*/
while (dwCursorLine <= dwLine)
{
pCheck = pCursor;
pCursor += BrowserMarkWordMemLen(pCursor);
pCursor = BrowserLocateMarkPosition(handle, pCursor,
BROWSER_GO_FORWARD);
if ((pCursor == NULL) || (pCursor == pCheck))
{
pCursor = NULL;
break;
}
BrowserPosToLineCol(handle, pCursor, &dwCursorLine,
&wCursorCol);
}
}
break;
default:
break;
}
return pCursor;
}
/************************************************************************/
/* 函数名称: BrowserGetRealCursor */
/* 函数描述: 连续MARK时候的具体位置 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?