📄 uitextw.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 + -