📄 ebmedit.c
字号:
else
pMLEditData->linesDisp = MIN(lineNO , pMLEditData->MaxlinesDisp);
pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp -1;
}
PEBLINEDATA GetLineData(PEBMLEDITDATA pMLEditData,int lineNO)
{
PEBLINEDATA pLineData=pMLEditData->head;
for (; pLineData; pLineData=pLineData->next)
{
if(pLineData->lineNO==lineNO)
return pLineData;
}
return NULL;
}
int GetMaxLen (HWND hWnd, PEBMLEDITDATA pMLEditData)
{
int i;
PEBLINEDATA pLineData = pMLEditData->head;
i = 0;
while (pLineData)
{
edtGetLineInfo (hWnd, pLineData);
if (pMLEditData->sz.cx > i)
i = pMLEditData->sz.cx;
pLineData = pLineData->next;
}
return i;
}
// get the valid unit position in the array
// according to the pos
// which is relative to the original point of current line (0)
static int edtGetNewvPos (HWND hWnd, PEBLINEDATA pLineData , int pos)
{
int i = 0;
int dist = MAX_IMPOSSIBLE;
int newdist = 0;
PEBMLEDITDATA pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
edtGetLineInfo (hWnd, pLineData);
if (pos < 0) return -1;
if (pos > pMLEditData->sz.cx) return -2;
for (i=0; i<pMLEditData->fit_chars + 1; i++) {
newdist = pos - pMLEditData->dx_chars[i];
if (newdist > 0 && newdist < dist)
dist = newdist;
else
return i;
}
return 0;
}
static void edtSetScrollInfo (HWND hWnd, PEBMLEDITDATA pMLEditData, BOOL fRedraw)
{
SCROLLINFO si;
PEBLINEDATA pLineData;
RECT rc;
int viLn;
// Vscroll
GetClientRect (hWnd, &rc);
viLn = (rc.bottom - rc.top - pMLEditData->topMargin - pMLEditData->bottomMargin) / pMLEditData->lineHeight;
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
if ((GetWindowStyle(hWnd)) & EES_AUTOWRAP)
si.nMax = pMLEditData->wraplines - 1;
else
si.nMax = pMLEditData->lines - 1;
si.nMin = 0;
si.nPage = MIN (pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1, viLn);
si.nPos = pMLEditData->StartlineDisp;
if ((si.nMax < viLn) && (!si.nPos)) {
si.nMax = 100;
si.nMin = 0;
si.nPage = 10;
si.nPos = 0;
SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);
// EnableScrollBar (hWnd, SB_VERT, FALSE);
} else {
SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);
// EnableScrollBar (hWnd, SB_VERT, TRUE);
}
if ((GetWindowStyle(hWnd)) & EES_AUTOWRAP)
{
EnableScrollBar (hWnd, SB_HORZ, FALSE);
return;
}
// Hscroll
pLineData = GetLineData(pMLEditData, pMLEditData->editLine);
si.nMax = GetMaxLen(hWnd, pMLEditData) - 1;
si.nMin = 0;
si.nPage = edtGetOutWidth (hWnd);
edtGetLineInfo (hWnd, pLineData);
si.nPos = pMLEditData->dispPos;
if (si.nMax < si.nPage && (!si.nPos))
{
si.nMax = 100;
si.nMin = 0;
si.nPage = 10;
si.nPos = 0;
SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);
// EnableScrollBar (hWnd, SB_HORZ, FALSE);
}
else
{
SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);
// EnableScrollBar (hWnd, SB_HORZ, TRUE);
}
}
//根据当前行的位置获得其所属的行号
int edtGetLineNums (PEBMLEDITDATA pMLEditData, int curline, int* line, int* wrapLine)
{
PEBLINEDATA pLineData = pMLEditData->head;
int startline = 0;
if (!curline)
{
*line = 0;
*wrapLine = 0;
return 0;
}
for (; pLineData; pLineData=pLineData->next)
{
if (startline+pLineData->nwrapline-1 >= curline)
{
*line = pLineData->lineNO;
*wrapLine = curline - startline;
return 0;
}
startline +=pLineData->nwrapline;
}
return -1;
}
// to set the Caret to a valid pos
BOOL edtGetCaretValid (HWND hWnd, int lineNO, int olddispPos, int newOff/*of caret*/)
{
int line, wrapline;
int dist = MAX_IMPOSSIBLE;
int i, newdist = 0;
PEBLINEDATA temp;
PEBMLEDITDATA pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
if (GetWindowStyle(hWnd) & EES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, lineNO, &line, &wrapline);
temp = GetLineData (pMLEditData, line);
edtGetLineInfo (hWnd, temp);
if( newOff >= pMLEditData->dx_chars[temp->wrapStartPos[wrapline+1]]
- pMLEditData->dx_chars[temp->wrapStartPos[wrapline]])
{
if (wrapline < temp->nwrapline-1)
pMLEditData->veditPos = temp->wrapStartPos[wrapline+1]-1;
else
pMLEditData->veditPos = temp->wrapStartPos[wrapline+1];
}
else
{
newOff += pMLEditData->dx_chars[temp->wrapStartPos[wrapline]];
for (i=temp->wrapStartPos[wrapline]; i<temp->wrapStartPos[wrapline+1]+1; i++)
{
newdist = newOff - pMLEditData->dx_chars[i];
if (newdist > 0 && newdist < dist)
dist = newdist;
else
{
pMLEditData->veditPos =i;
return FALSE;
}
}
}
}
else
{
temp = GetLineData (pMLEditData, lineNO);
edtGetLineInfo (hWnd, temp);
if( olddispPos > pMLEditData->sz.cx )
{
pMLEditData->veditPos = pMLEditData->fit_chars;
pMLEditData->vdispPos = edtGetStartDispPosAtEnd (hWnd, temp);
return TRUE;
}else
{
pMLEditData->veditPos = edtGetNewvPos (hWnd, temp, newOff);
if (pMLEditData->veditPos == -2)
pMLEditData->veditPos = pMLEditData->fit_chars;
pMLEditData->vdispPos = edtGetNewvPos (hWnd, temp, olddispPos);
if (olddispPos != pMLEditData->dx_chars[pMLEditData->vdispPos])
return TRUE;
}
}
return FALSE;
}
//edit by tjb 2005-7-5
//修改原因: 当翻页后,光标消失了
/******************************************************
*
*参数:showflags 是否显示光标
*
******************************************************/
void edtSetCaretPos (HWND hWnd, BOOL showflags)
{
int line = 0, wrapline = 0;
PEBMLEDITDATA pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
PEBLINEDATA temp;
if (GetWindowStyle(hWnd) & EES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
temp = GetLineData (pMLEditData, line);
edtGetLineInfo (hWnd, temp);
SetCaretPos (hWnd,
pMLEditData->dx_chars[pMLEditData->veditPos]
- pMLEditData->dx_chars[temp->wrapStartPos[wrapline]]
+ pMLEditData->leftMargin,
(pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight
+ pMLEditData->topMargin);
}
else
{
temp = GetLineData (pMLEditData, pMLEditData->editLine);
edtGetLineInfo (hWnd, temp);
SetCaretPos (hWnd,
pMLEditData->dx_chars[pMLEditData->veditPos]
- pMLEditData->dx_chars[pMLEditData->vdispPos]
+ pMLEditData->leftMargin,
(pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight
+ pMLEditData->topMargin);
}
#if 1//add by tjb 2005-6-27
if (showflags)//当控键无效时,不显示光标 edit by tjb 2005/5/10
ShowCaret (hWnd);
#endif
}
void edtPosProc (HWND hWnd)
{
int line, wrapline;
PEBMLEDITDATA pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
PEBLINEDATA pLineData;
if (pMLEditData->diff)
{
pMLEditData->editLine = pMLEditData->realeditLine;
pMLEditData->vdispPos = pMLEditData->realdispPos;
pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];
pMLEditData->StartlineDisp = pMLEditData->realStartLine;
pMLEditData->EndlineDisp = pMLEditData->realEndLine;
pMLEditData->diff = FALSE;
if (GetWindowStyle(hWnd) & EES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
}
else
pLineData= GetLineData(pMLEditData, pMLEditData->editLine);
edtGetLineInfo (hWnd, pLineData);
ActiveCaret (hWnd);
pMLEditData->bSCROLL = TRUE;
}
else
pMLEditData->bSCROLL = FALSE;
}
/* add end*/
/**********************************************************************
*功能:在多页时计算当前显示的页面的位置
*返回:百分比
***********************************************************************/
int CountPos(HWND hWnd)
{
int pos;
DWORD dwStyle=GetWindowStyle(hWnd);
PEBMLEDITDATA pMLEditData=(PEBMLEDITDATA)GetWindowAdditionalData2(hWnd);
if (dwStyle & EES_AUTOWRAP)
{
if (pMLEditData->StartlineDisp >= (pMLEditData->wraplines - pMLEditData->MaxlinesDisp))
pos = 100;
else
pos=(100*pMLEditData->StartlineDisp)/(pMLEditData->wraplines - pMLEditData->MaxlinesDisp);
}
else
{
if (pMLEditData->StartlineDisp >= (pMLEditData->lines - pMLEditData->MaxlinesDisp))
pos = 100;
else
pos=(100*pMLEditData->StartlineDisp)/(pMLEditData->lines - pMLEditData->MaxlinesDisp);
}
return pos;
}
/**********************************************************************
*功能:通知父窗口显示改变了,根据pos来同步滚动条
***********************************************************************/
void NotifyParentPos(HWND hWnd)
{
int id = GetDlgCtrlID(hWnd);
int pos= CountPos(hWnd);
SendNotifyMessage(GetParent(hWnd),MSG_COMMAND,(WPARAM)MAKELONG(id,EEN_VSCROLL),(LPARAM)pos);
}
#if 0
static void edtOnEraseBackground (HWND hWnd, DWORD dwStyle, HDC hdc, const RECT* pClipRect)
{
int i;
RECT rcTemp;
BOOL fGetDC = FALSE;
PEBMLEDITDATA pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
if (hdc == 0)
{
hdc = GetClientDC (hWnd);
fGetDC = TRUE;
}
GetClientRect (hWnd, &rcTemp);
if (pClipRect)
ClipRectIntersect (hdc, pClipRect);
if(dwStyle & EES_BKIMAGEMASK)
{
BITMAP bmp;
memset(&bmp,0,sizeof(BITMAP));
if(pMLEditData && pMLEditData->data)
{
if (pClipRect)
ClipRectIntersect (hdc, pClipRect);
switch(dwStyle & EES_BKIMAGEMASK)
{
case EES_BKBITMAP:
{
FillBoxWithBitmap(hdc, 0, 0, 0, 0,(PBITMAP)(pMLEditData->data));
}
break;
case EES_BKBMPFILE:
{
char * szimage = (char *)(pMLEditData->data);
if(!LoadBitmap( HDC_SCREEN, &bmp, szimage))
{
if(dwStyle &EES_BKALPHA)
{
unsigned char r,g,b,a;
Pixel2RGBA(HDC_SCREEN,GetWindowBkColor (hWnd),&r,&g,&b,&a);
bmp.bmType |= BMP_TYPE_ALPHACHANNEL;
bmp.bmAlpha = a;
FillBoxWithBitmap(hdc, 0, 0, 0, 0,&bmp);
}
else
{
FillBoxWithBitmap(hdc, 0, 0, 0, 0,&bmp);
}
UnloadBitmap(&bmp);
}
}
break;
case EES_BKICON:
{
DrawIcon (hdc, 0, 0, 0, 0, (HICON)(pMLEditData->data));
}
break;
default:
break;
}
}
}
else
{
if (dwStyle & WS_DISABLED)
SetBrushColor (hdc, PIXEL_lightgray);
else
{
SetBrushColor (hdc, GetWindowBkColor(hWnd));
SetBkColor(hdc, GetWindowBkColor(hWnd));
}
if (dwStyle & EES_BKTRANSPARENT)
{
SetBkMode(hdc, BM_TRANSPARENT);
// FillBox (hdc, rcTemp.left, rcTemp.top, RECTW (rcTemp), RECTH (rcTemp));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -