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

📄 uitextw.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************/
/*  Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File :  uitextw.c
Desc :  文本框
Author : GUI Develop Group.lzj
Date : 2007-08-10
Notes :
$Log: uitextw.c,v $
Revision 1.2  2008/06/19 04:43:21  Administrator
代码整理!

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.1.1.1  2008/03/06 13:29:09  Lingzhaojun
no message

Revision 1.5  2007/10/15 02:58:09  Lingzhaojun
添加GUI控件注释

Revision 1.4  2007/10/08 04:02:23  Lingzhaojun
去除GUI的VC编译警告

Revision 1.3  2007/10/08 02:04:27  Lingzhaojun
GUI添加自动注释

   去掉键盘和触摸屏消息的响应,文本框只做单纯的多行文本显示,自动排版工作
   键盘和触摸屏交由上层应用程序控制。
*********************************************************************/


#include "uitextw.h"

#define FlagUnicStart   0xAA
#define FlagUnicEnd  0x55


static UINT16 UnicodeFlag = 0;

/*----------------------------------------------------------------------
Name  :  TextLabelKey
Desc  :  文本框对按键的响应,正常应用时不使用,在应用模块(如电子书)中响应按键
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
#if  GuiDebug
    W_Text   *W_TextObj = (W_Text *)win->Data;
    UINT16  keyPress = (INT16U)((wParam) >> 16);
    UINT16     KEY_EV = (INT16U)(wParam);
    UINT16  LineStart;
    if (keyPress)
        return FALSE;


    switch (KEY_EV)
    {

        case KE_DN_RELEASE:   //下翻一行
            LineStart = W_TextObj->StartLine + 1;
            WindowSendMessage(win, WM_SetStartLine, LineStart, NULL);
            WindowInvalidateWindow(win);
            break;


        case KE_UP_RELEASE:    //上翻一行
            LineStart = W_TextObj->StartLine;
            if (LineStart)LineStart--;
            WindowSendMessage(win, WM_SetStartLine, LineStart, NULL);
            WindowInvalidateWindow(win);
            break;
            /*
            case KE_NEXT_RELEASE:  //上翻一页
              LineStart=W_TextObj->StartLine;
              if(LineStart>=W_TextObj->WinFullLine)
               LineStart=LineStart-W_TextObj->WinFullLine;
              LineStart=LineStart+W_TextObj->WinFullLine-1;
              WindowSendMessage(win,WM_SetStartLine,LineStart, NULL);
              break;

            case KE_PREV_RELEASE:  //下翻一页
              {
              LineStart=W_TextObj->StartLine;
              LineStart=LineStart+W_TextObj->WinFullLine;
              WindowSendMessage(win,WM_SetStartLine,LineStart, NULL);
              WindowInvalidateWindow(win);
              }
              break;

            */
        case KE_PLAY_RELEASE:
            break;

        case KE_RETURN_RELEASE:
        case KE_EXIT_RELEASE:
            WindowDestroy(win);
            break;

        default:
            break;

    }


#endif
    return TRUE;


}



/*----------------------------------------------------------------------
Name  :  TextLabelPaint
Desc  :  文本框画屏
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Text *W_TextObj = (W_Text *)win->Data;
    UINT16 NumberPerLine, weight, CurrLine, pos = 0;
    ColorDesc TxtColor;
    DispMode TranspLevel = WinGetTranStyle(win->style);


    if (!(WIN_NEEDPAIT(win)))
        return TRUE;

    if (!W_TextObj->pText)
        return TRUE;


    //字颜色
    //if(W_TextObj->Color)
    TxtColor.forward = W_TextObj->Color;
    //else
    // TxtColor.forward = COLOR_WHITE;

    //TxtColor.backward = COLOR_BLACK;
    TxtColor.mode = DSPM_Transp;


    //背景图片
    DrawBmpIdEx(win->x, win->y, win->BmpID, NULL, TranspLevel);

    NumberPerLine = 2 * win->w / W_TextObj->Font;
    pos = 0;

    //不显示前面StartLine行
    CurrLine = W_TextObj->StartLine;
    while (CurrLine)
    {
        memcpy(W_TextObj->LineBuf, W_TextObj->pText + pos, win->w);
        weight = ITextGetLineEnd(W_TextObj->LineBuf, win->w, W_TextObj->Font);
        pos = pos + weight;
        CurrLine--;
    }

    for (CurrLine = 0;CurrLine < W_TextObj->WinFullLine;CurrLine++)
    {

        UnicodeFlag = 0;
        memcpy(W_TextObj->LineBuf, W_TextObj->pText + pos, win->w/*(NumberPerLine+1)*2*/);
        weight = ITextGetLineEnd(W_TextObj->LineBuf, win->w, W_TextObj->Font);
        pos = pos + weight;

        if (UnicodeFlag == FlagUnicStart)
        {
            DrawStringEx(win->x , (UINT16)(win->y + (CurrLine*W_TextObj->LineHeight)) , win->w, W_TextObj->LineBuf + 1 , W_TextObj->Font , &TxtColor , 0);
        }
        else if (UnicodeFlag == FlagUnicEnd)
        {
            DrawStringEx(win->x , (UINT16)(win->y + (CurrLine*W_TextObj->LineHeight)) , win->w, W_TextObj->LineBuf , W_TextObj->Font , &TxtColor , 0);
            break;
        }
        else
            DrawStringEx(win->x , (UINT16)(win->y + (CurrLine*W_TextObj->LineHeight)) , win->w, W_TextObj->LineBuf , W_TextObj->Font , &TxtColor , 0);
    }

    W_TextObj->End = pos;

    WIN_CLEARPAIT(win);



    return TRUE;
}





/*----------------------------------------------------------------------
Name  :  TextLabelCreate
Desc  :  文本框创建
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelCreate(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_Text *W_TextObj = NULL;

    W_TextObj = MallocClass(W_Text);
    if (NULL == W_TextObj)
        return FALSE;

    W_TextObj->IconBackground = win->BmpID;   /*文本框背景图片*/
    W_TextObj->pText = NULL;       /*unicode文本指针*/
    W_TextObj->StartLine = 0;       /*从文本的第几行开始显示*/
    W_TextObj->End = 0;        /*结束位置*/
    W_TextObj->Font = Font16X16;      /*字体*/
    W_TextObj->LineHeight = (UINT16)W_TextObj->Font + 4;  /*行高*/
    W_TextObj->WinFullLine = win->h / W_TextObj->LineHeight; /*可显示行数*/
    W_TextObj->Color = 0;        /*文字颜色*/
    win->Data = W_TextObj;

    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  TextLabelDestroy
Desc  :  文本框关闭
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelDestroy(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{


    W_Text *W_TextObj = (W_Text *)win->Data;

    FreeClass(W_TextObj);


    return TRUE;
}

/*----------------------------------------------------------------------
Name  :  TextLabelSetPic
Desc  :  文本框设置底图
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelSetPic(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Text *W_TextObj = (W_Text *)win->Data;


    W_TextObj->IconBackground = wParam;

    WindowInvalidateWindow(win);

    return TRUE;

}


/*----------------------------------------------------------------------
Name  :  TextLabelSetTxt
Desc  :  文本框设置文本内容
Params:  wParam:字体 lParam:文本buf
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelSetTxt(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Text *W_TextObj = (W_Text *)win->Data;

    if ((wParam == Font12X12) || (wParam == Font16X16) || (wParam == Font24X24))
    {
        W_TextObj->Font = wParam;
        W_TextObj->LineHeight = (UINT16)W_TextObj->Font + 4;
        W_TextObj->WinFullLine = win->h / W_TextObj->LineHeight;
    }


    W_TextObj->pText = (WCHAR *)lParam;
    //W_TextObj->StartLine=0;
    WindowInvalidateWindow(win);

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  TextLabelSetColor
Desc  :  文本框设置文字颜色
Params:  wParam:字颜色
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelSetColor(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Text *W_TextObj = (W_Text *)win->Data;

    W_TextObj->Color = (UINT32)wParam;
    WindowInvalidateWindow(win);

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  TextLabelSetFont
Desc  :  文本框设置字体
Params:  wParam:字体
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelSetFont(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Text *W_TextObj = (W_Text *)win->Data;

    if ((wParam == Font12X12) || (wParam == Font16X16) || (wParam == Font24X24))
    {
        W_TextObj->Font = wParam;
        W_TextObj->LineHeight = (UINT16)W_TextObj->Font + 4;
        W_TextObj->WinFullLine = win->h / W_TextObj->LineHeight;
    }

    WindowInvalidateWindow(win);

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  TextLabelSetStartLine
Desc  :  文本框设置从第几行开始显示
Params:  wParam:从第几行开始显示
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 TextLabelSetStartLine(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Text *W_TextObj = (W_Text *)win->Data;

    if (wParam <= W_TextObj->WinFullLine)
        W_TextObj->StartLine = wParam;

    WindowInvalidateWindow(win);

    return TRUE;
}

UINT16 TextCheckChar1(WCHAR s)
{
    if ((s >= '0') && (s <= '9'))                                       // 数字
    {
        return (0x0001);
    }
    else if (((s >= 'a') && (s <= 'z')) || ((s >= 'A') && (s <= 'Z'))        // 英语, ASCII
             || ((s >= 0xC0) && (s <= 0xFF) && (s != 0xD7) && (s != 0xF7))   // Latin-1 Supplement, CP1250, CP1252, CP1254
             || ((s >= 0x100) && (s <= 0x17F))                               // Latin Extended-A
             || ((s >= 0x180) && (s <= 0x1BF)) || ((s >= 0x1C4) && (s <= 0x241)) // Latin Extended-B

             || ((s >= 0x401) && (s <= 0x45F)) || ((s >= 0x490) && (s <= 0x491)) // 俄语, CP1251
             || ((s >= 0x386) && (s <= 0x3FF) && (s != 0x387))               // 希腊语, CP1253
             || ((s >= 0x5D0) && (s <= 0x5EA))                               // 希伯莱语, CP1255
             || ((s >= 0x621) && (s <= 0x63A)) || ((s >= 0x641) && (s <= 0x64A)) || ((s >= 0x679) && (s <= 0x6D3)) // 阿拉伯, CP1256
            )
    {
        return (0x0002);
    }
    // if((s == ' ') || (s == ',') || (s == '.') || (s == '-') || (s == 0x3000) || (s > 0x00FF))
    else
    {
        return (0x8000);
    }

//    return(0);
}

/*----------------------------------------------------------------------
Name  :  ITextGetLineEnd
Desc  :  内部函数,文本框获取一行
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT16 ITextGetLineEnd(WCHAR*pLine, UINT16 Len, FontType ft)
{
    UINT16 i, CharW = 0, StrLen = 0, j, k;


    for (i = 0;i < Len;i++)
    {

        if (pLine[i] == 0xfeff) //unicode 开始标志
        {
            UnicodeFlag = FlagUnicStart;
            continue;
        }
        if (pLine[i] == 0x0000) //unicode 结束标志
        {
            UnicodeFlag = FlagUnicEnd;
            continue;
        }


        if (pLine[i] == 0x0d)  //回车
        {
            if (pLine[i+1] == 0x0a)  //换行
                return (i + 2);
        }

        CharW = GuiDspGetCharWidth(pLine[i] , ft);
        StrLen = StrLen + CharW;

#if 1
        if ((StrLen > Len)
                && (0x03&(TextCheckChar1(pLine[i])))         // 下一行的第一个字符是字母
                && (0x03&(TextCheckChar1(pLine[i-1]))))  // 当前行的最后一个字符是字母
        {
            UINT16 Vreturn = i;
            for (j = 1; j <= Vreturn; j++)
            {
                if (TextCheckChar1(pLine[Vreturn-j]) == 0x8000)
                {
                    break;
                }
            }

            if (j <= Vreturn)
            {
                for (k = 0;k < j;k++)
                {
                    pLine[Vreturn-k] = 0;
                }
                return Vreturn -k + 1;
            }
        }
        else if (StrLen > Len)
            return i;
#else
        if (StrLen > Len)
        {
            UINT16 Vreturn = i;

            if ((pLine[i] > 0x80))
                return i;

            while ((pLine[i] != 0x20) && (pLine[i] < 0x80))
            {
                if (i == 0)
                    return Vreturn;

                i--;
            }

            if (pLine[i] == 0x20)
                while (Vreturn >= i)
                {
                    pLine[Vreturn] = 0;
                    Vreturn--;
                }
            else
                while (Vreturn > i)
                {
                    pLine[Vreturn] = 0;
                    Vreturn--;
                }
            return (i + 1);
        }

#endif
    }


    return (Len*2 / (UINT16)ft);
}





/*文本框类消息描述表*/
BEGIN_CHILDMESSAGE_MAP(WinTextLabelProcMap , CW_TYPE_TextLabel)
ON_MESSAGE(WM_PAINT ,   TextLabelPaint)
ON_MESSAGE(WM_SetTxt,  TextLabelSetTxt)
ON_MESSAGE(WM_DESTROY , TextLabelDestroy)
ON_MESSAGE(WM_CREATE,   TextLabelCreate)
ON_MESSAGE(WM_SetPic,  TextLabelSetPic)
ON_MESSAGE(WM_SetFont,  TextLabelSetFont)
ON_MESSAGE(WM_SetColor,  TextLabelSetColor)
ON_MESSAGE(WM_SetStartLine,  TextLabelSetStartLine)

#if  GuiDebug
ON_MESSAGE(WM_KEY,   TextLabelKey)
#endif
END_MESSAGE_MAP()








⌨️ 快捷键说明

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