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

📄 brw_key.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
                                                                          
              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 + -