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

📄 editpen.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
字号:
/***************************************************************************
                                                                          
              Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD                   
                                                                          
 FILE NAME:   EditPen.C                                                   
 MODULE NAME: Edit                                                        
 DESCRIPTION: 编辑器笔点的相关处理函数                            
 对外函数声明:

 内部函数声明: 
		笔点的消息处理
		INT	 __EditWinProcPen(MEdit* hEditWin, UINT uEvent,UINT uParam)
                                                                          
**************************************************************************
    DTAE       AUTHOR     VERSION                 REMARKS                 
 =========== ==========  =========  ======================================
 2006-11-31    gaolinhui    V1.0     create                                
***************************************************************************/

#include "kernel.h"
#include "EditIn.h"

extern EdtCmdEx    g_mEdtCmdEx;		//编辑器的扩展命令类型
extern CMDEXP		g_mEditCmdParam;

#ifdef EDIT_SUPPORT_PEN

/****************************************************************************/
/* FUNCTION:   __EditWinProcPen                                            */
/* DESCRIPTION:处理MEditWin类接收到的笔点消息                              */
/* INPUTS:     hEditWin - 句柄                                             */
/*              uEvent - 消息                                               */
/* OUTPUTS:																*/
/* RETURN:     处理消息后的返回值                                          */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  gaolinhui   2006-01-12          创建初始版本                            */
/****************************************************************************/
INT	 __EditWinProcPen(MEdit* hEditWin, UINT uEvent,UINT uParam)
{
    UINT16  wEvX, wEvY;
    UINT32  dwReturn;

    INT     nDcX, nDcY;

    UINT16  wStateOption;
    BOOL    bCanEdit;

    UINT    uNameLen;       /*标题的显示长度*/
    UINT    uOldStart;
    UINT    uOldBlockHead, uOldBlockTail;
    UINT    uOldDspLen;         /*原来的显示长度(只对单行编辑)*/

    UINT    uDspLines, uDspCols;    /*每屏可显示的行数和每行可显示的列数*/
    INT     nCurLine, nCurCol, nCurColBak;
    UINT    uCharWidth, uCharHeight, uSpace;
    UINT    uTempMemLen, uTempDspLen, uTemp;
	UINT16  wFontID;



    wStateOption = hEditWin->pmEditInfo->wState;
    bCanEdit = !(wStateOption & OF_EDITOR_READONLY);
	wFontID = hEditWin->pmEditInfo->wFontID;
    uNameLen = __EditGetCaptionLen(hEditWin->pmEditInfo->pCaption);
    uOldDspLen = hEditWin->pmEditInfo->uUseDspLen + 1;

    /* ASCII字符的宽度和高度 */
    uCharWidth = __EditGetAsciiFontWidth(wFontID);
    uCharHeight = FontGetHeight(wFontID);

    wEvX = GET_PEN_X(uParam);
    wEvY = GET_PEN_Y(uParam);

    nDcX = hEditWin->uX;
    nDcY = hEditWin->uY;
    uSpace = hEditWin->pmEditInfo->uRowSpace;
    uDspLines = __EditGetRectLineNum(wFontID, hEditWin->uHeight, uSpace );/*每屏能显示的行数*/
    uDspCols = hEditWin->uWidth / uCharWidth;  /*编辑器一行能显示的列数*/

    uOldStart = hEditWin->pmEditInfo->uStart;

    dwReturn = 0L;
    switch( uEvent )
    {
    case EVENT_PENDOWN:   /*笔点消息*/
        if( !DotInArea( wEvX, wEvY, nDcX, nDcY,
                        hEditWin->uWidth, hEditWin->uHeight ))
        {   /*如果笔点坐标不在编辑区,不予处理*/
            break;
        }
        hEditWin->pmEditInfo->wXPos = wEvX;
        hEditWin->pmEditInfo->wYPos = wEvY;
        /*计算光标行*/
        nCurLine = (wEvY - nDcY) / (uCharHeight + uSpace);
        /*计算光标列*/
        nCurCol = (wEvX - nDcX) / uCharWidth;

        if( bCanEdit )   /*隐藏光标*/
            __EditCursorHide(hEditWin);
        if( hEditWin->pmEditInfo->m_Block.uBlkHead != hEditWin->pmEditInfo->m_Block.uBlkTail )
            __EditFlushSelBlock( hEditWin );  /*如果有选择块则取消选择块*/

        if( nCurLine >= (INT)uDspLines )   /*超过每屏能显示的行数*/
            nCurLine = uDspLines - 1;
        if( nCurCol >= (INT)uDspCols)
            nCurCol = uDspCols - 1;

        uTemp = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);/*计算光标位置字符在字符缓冲区中的位置*/
        /*设置块头和块尾*/
        hEditWin->pmEditInfo->m_Block.uBlkHead = uTemp;
        hEditWin->pmEditInfo->m_Block.uBlkTail = uTemp;
		dwReturn = 1;
        break;

    case EVENT_PENMOVE:       /*笔移动消息*/
		if(hEditWin->pmEditInfo->wState & OF_EDITOR_NOMARK)
		{
			break;
		}
        hEditWin->pmEditInfo->wXPos = wEvX;
        hEditWin->pmEditInfo->wYPos = wEvY;
        /*计算光标列*/
        nCurCol = ((INT)wEvX - nDcX) / (INT)uCharWidth;
        nCurColBak = nCurCol;

        uOldBlockHead = hEditWin->pmEditInfo->m_Block.uBlkHead;
        uOldBlockTail = hEditWin->pmEditInfo->m_Block.uBlkTail;
        if( wStateOption & OF_EDITOR_MULTILINE )
        {   /*多行编辑中的MARK操作在下面处理*/
            if( nCurCol < 0 )
                nCurCol = 0;
            if( nCurCol >= (INT)uDspCols)
                nCurCol = uDspCols - 1;

            if( wEvY < (UINT)nDcY )
            {
                if( uOldStart > 0 )
                {
					hEditWin->pmEditInfo->uStart = uOldStart - 1;
                    __EditGetScrnStart( hEditWin,uOldStart);
                }
                nCurLine = 0;
                hEditWin->pmEditInfo->m_Block.uBlkTail = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);
            }
            else
            {   /*计算光标行*/
                nCurLine = (wEvY - nDcY) / (uCharHeight + uSpace);
                /*判断笔点是否落在编辑区*/
                if( nCurLine >= (INT)uDspLines )    /*如果笔点在编辑区下方,则继续将后面未显示的行进入选择块*/
                {
                    nCurLine = uDspLines - 1;
                    if( (uOldStart + uDspLines) < hEditWin->pmEditInfo->uDataLines )
                    {
						hEditWin->pmEditInfo->uStart = uOldStart + 1;
                        __EditGetScrnStart( hEditWin, uOldStart);
                        nCurLine = uDspLines - 1;
                    }
                }
                hEditWin->pmEditInfo->m_Block.uBlkTail = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);
            }
			MsgSend2((APGUI_STRUCT_MODEL*)hEditWin,EVENT_DRAW,0);

            /************Mark行尾字符处理************/
            if( nCurColBak >= (INT)uDspCols )
            {
                __EditGetCharLength(wFontID, 
					hEditWin->pmEditInfo->pBuf + hEditWin->pmEditInfo->m_CurSor.uCursorMem,
					&uTempMemLen, &uTempDspLen);
                hEditWin->pmEditInfo->m_Block.uBlkTail += uTempMemLen;
            }

			if( hEditWin->pmEditInfo->m_Block.uBlkTail != uOldBlockTail )
            {
                BOOL    bIsRev;
                uTemp = hEditWin->pmEditInfo->m_Block.uBlkTail;
                bIsRev = TRUE;
                uTempMemLen = uOldBlockTail;
                if( (uOldBlockTail == uOldBlockHead)&&(uTemp != uOldBlockTail) )
                {//之前没有mark并且现在mark尾改变
                    uTempMemLen = uOldBlockHead;
                }
                else if( (uOldBlockTail > uOldBlockHead)&&(uTemp < uOldBlockTail)&&(uTemp >= uOldBlockHead) )
                {//之前的mark尾大于mark头并且当前mark尾在之前mark首尾之间
                    bIsRev = FALSE;
                }
                else if( (uOldBlockTail > uOldBlockHead)&&(uTemp < uOldBlockHead) )
                {//之前mark尾大于mark头且当前mark为在头之前
					//先反显原来的mark块
                    __EditDispBlockStr( hEditWin, uOldBlockHead, uOldBlockTail,FALSE);
                    uTempMemLen = uOldBlockHead;
                }
                else if( (uOldBlockTail < uOldBlockHead)&&(uTemp > uOldBlockTail)&&(uTemp <= uOldBlockHead) )
                {//之前mark尾小于mark头且现在mark尾在之前mark头尾之间
                    bIsRev = FALSE;
                }
                else if( (uOldBlockTail < uOldBlockHead)&&(uTemp > uOldBlockHead) )
                {//之前mark尾小于mark头且现在mark为大于之前mark头
					//先反显原来的mark块
                    __EditDispBlockStr( hEditWin, uOldBlockTail, uOldBlockHead,FALSE);
                    uTempMemLen = uOldBlockHead;
                }
                __EditDispBlockStr( hEditWin, uTempMemLen, uTemp, bIsRev);
            }
        }
        else if( !(wStateOption & OF_EDITOR_PASSWORD) )
        {   /*如果不是编辑密码的单行输入,才能作MARK块处理*/
            nCurLine = 0;
            if( (nCurCol >= (INT)uNameLen) && (nCurCol < (INT)uDspCols) )/*如果在编辑区内*/
            {   /*计算光标位置字符在字符缓冲区中的位置,并调整光标位置使其合理*/
                uTemp = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);
                if( uOldBlockTail == uTemp )
                {
                    break;
                }
                /*设置新块尾*/
                hEditWin->pmEditInfo->m_Block.uBlkTail = uTemp;
            }
            else if( (nCurCol < (INT)uNameLen) && (uOldStart > 0) ) /*在编辑区左边*/
            {   /*计算开始处前一字符的显示长度*/
                uTempMemLen = __EditGetPreCharDspLen(wFontID, hEditWin->pmEditInfo->pBuf, uOldStart );
                hEditWin->pmEditInfo->uStart -= uTempMemLen;
                __EditGetScrnStart( hEditWin,uOldStart);
                nCurCol = uNameLen;
                /*计算新光标在内存中的位置*/
                hEditWin->pmEditInfo->m_CurSor.uCursorMem = hEditWin->pmEditInfo->pScrnStart - hEditWin->pmEditInfo->pBuf;
                hEditWin->pmEditInfo->m_CurSor.wCurLine = 0;
                hEditWin->pmEditInfo->m_CurSor.wCurCol = uNameLen + hEditWin->pmEditInfo->uStart;
                hEditWin->pmEditInfo->m_Block.uBlkTail = hEditWin->pmEditInfo->m_CurSor.uCursorMem;
            }
            else if( nCurCol >= (INT)uDspCols )         /*在编辑区右边*/
            {
                if( uOldStart + uDspCols - uNameLen >= uOldDspLen )
                    break;

                __EditGetCharLength(wFontID, hEditWin->pmEditInfo->pScrnStart, &uTempMemLen, &uTempDspLen);
                hEditWin->pmEditInfo->uStart += uTempDspLen;
                hEditWin->pmEditInfo->pScrnStart += uTempMemLen;
                /*计算新光标在内存中的位置*/
                nCurCol = uDspCols - 1;
                hEditWin->pmEditInfo->m_Block.uBlkTail = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols );
            }
			__EditCursorHide(hEditWin);
            MsgPost(NULL, EVENT_DRAW, 0);
        }
		dwReturn = 1;
        break;

    case EVENT_PENUP: /*抬笔消息*/
        if( bCanEdit )   /*恢复显示光标*/
            __EditShowCursor( hEditWin );
        if( hEditWin->pmEditInfo->m_Block.uBlkHead != hEditWin->pmEditInfo->m_Block.uBlkTail )
		{
			g_mEdtCmdEx.uType = CMEX_EDITOR_HAVEMARKED;
			g_mEdtCmdEx.pEditHdl = (APGUI_STRUCT_MODEL*)hEditWin;
			g_mEditCmdParam.wCmdType = EVENT_CMDEXP_EDT;
			g_mEditCmdParam.pCmdExp = &g_mEdtCmdEx;
			MsgSend2( GetApHandle(), EVENT_CMDEXP, (INT)&g_mEditCmdParam);
		}
		dwReturn = 1;
        break;

    default:
        break;
    }

    return dwReturn;
}


#endif

⌨️ 快捷键说明

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