全部博文(2005)
分类: C/C++
2007-09-15 19:34:46
MultiEdit作为文本浏览器的几处修改
<1>首先在MultiEdit.c文件中添加下面这两个函数,GUI_KEY_UP和GUI_KEY_DOWN按1/3页翻转移动
//2007-09-14 gliethttp
//CacheFirstVisibleLine为不可见的行数,也就是第1个可见的行号
void _Go2PrevLineShow(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj)
{
if (pObj->hText)
{int NumVisLines= _GetNumVisLines(hObj, pObj);
int YDist = GUI_GetYDistOfFont(pObj->pFont);
int NumLines = _GetNumLines(hObj, pObj);
int the_line;int yPos;
the_line = pObj->CacheFirstVisibleLine;
if(the_line == 0)the_line = NumLines+1;
else
{
the_line -= NumVisLines / 3 + 1;
if(the_line < 0)the_line = 0;
}
yPos = the_line * YDist;
_SetCursorXY(hObj, pObj, 0, yPos);
_InvalidateTextArea(hObj);
}
}
void _Go2NextLineShow(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj)
{
if (pObj->hText)
{int NumVisLines= _GetNumVisLines(hObj, pObj);
int YDist = GUI_GetYDistOfFont(pObj->pFont);
int NumLines = _GetNumLines(hObj, pObj);
int the_line;int yPos;
the_line = pObj->CacheFirstVisibleLine + NumVisLines + NumVisLines / 3;
if(pObj->CacheLineNumber >= (NumLines-1))the_line = 0;
yPos = the_line * YDist;
_SetCursorXY(hObj, pObj, 0, yPos);
_InvalidateTextArea(hObj);
}
}
<2>MultiEdit被WM_SET_FOCUS之后,即刻显示出scrollbar
//在MultiEdit.c文件中添加下面这个函数
void _SetMultiEdit_ScrollBarVis(MULTIEDIT_HANDLE hObj)
{MULTIEDIT_OBJ* pObj;
pObj = MULTIEDIT_H2P(hObj);
_MoveCursor2LinePos1(hObj, pObj);
_InvalidateTextArea(hObj);
}
<3>对于MULTIEDIT_SetText()函数使用之后不能自动显示srollbar的修正
//修改对于MULTIEDIT_SetText函数
void MULTIEDIT_SetText(MULTIEDIT_HANDLE hObj, const char* pNew) {
if (hObj) {
......
if (_IsCharsAvailable(pObj, NumCharsNew - NumCharsOld)) {
if (_IsSpaceInBuffer(pObj, NumBytesNew - NumBytesOld)) {
pText = (char*) GUI_ALLOC_h2p(pObj->hText);
pText += GUI_UC__NumChars2NumBytes(pText, pObj->NumCharsPrompt);
if (pNew) {
strcpy(pText, pNew);
} else {
*pText = 0;
}
_SetCursorPos(hObj, pObj, pObj->NumCharsPrompt);
_InvalidateTextArea(hObj);
_InvalidateNumChars(pObj);
_InvalidateNumLines(pObj);
_InvalidateTextSizeX(pObj);
}
}
//2007-09-14 gliethttp
_SetMultiEdit_ScrollBarVis(hObj);
WM_UNLOCK();
}
}
<4>把MultiEdit中的光标去掉
//去掉MultiEdit.c文件中_MULTIEDIT_Paint()函数中的几行代码
static void _MULTIEDIT_Paint(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ * pObj) {
......
//注释掉下面的程序
//2007-09-14 gliethttp
/*
if (WM_HasFocus(hObj)) {
_GetCursorXY(hObj, pObj, &x, &y);
r.x0 = x + xOff;
r.y0 = y + yOff;
r.x1 = r.x0 + _GetCursorSizeX(hObj, pObj) - 1;
r.y1 = r.y0 + FontSizeY - 1;
GUI_InvertRect(r.x0, r.y0, r.x1, r.y1);
}
*/
......
}
<5>自定义MultiEdit回调处理函数
static WM_CALLBACK* _cbCallback_show_multieditT;
static void _cbCallback_show_multiedit(WM_MESSAGE * pMsg)
{MULTIEDIT_OBJ* pObj;
MULTIEDIT_HANDLE hObj;
switch (pMsg->MsgId)
{
case WM_SET_FOCUS:
_SetMultiEdit_ScrollBarVis(pMsg->hWin);
break;
case WM_KEY:
if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0)
{int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key;
hObj = pMsg->hWin;
pObj = MULTIEDIT_H2P(hObj);
switch(Key)
{
case GUI_KEY_LEFT:
case GUI_KEY_UP:_Go2PrevLineShow(hObj, pObj);return;
case GUI_KEY_RIGHT:
case GUI_KEY_ENTER:
case GUI_KEY_DOWN:_Go2NextLineShow(hObj, pObj);return;
}
}
break;
}
_cbCallback_show_multieditT(pMsg);
}
<6>在建立的MultiEdit对象实例中,设置消息回调函数
...
_cbCallback_show_multieditT = WM_SetCallback(_hMEdit,_cbCallback_show_multiedit);;
...
PS:
文件:
MultiEdit控件--中英文混合显示修改源文件.rar
大小:
10KB
下载:
下载