📄 ebmedit.c
字号:
}
else
FillBox (hdc, rcTemp.left, rcTemp.top, RECTW (rcTemp), RECTH (rcTemp));
if ((dwStyle & EES_STYLESMASK) == EES_BASELINE)
{
// SetPenColor (hdc, PIXEL_black);
SetPenColor (hdc, pMLEditData->textcolor);
for (i = 0; i < pMLEditData->MaxlinesDisp; i++)
{
DrawHDotLine (hdc, pMLEditData->leftMargin,
pMLEditData->topMargin + pMLEditData->lineHeight * (i + 1) - 1,
RECTW (rcTemp) - pMLEditData->leftMargin - pMLEditData->rightMargin);
}
}
}
if (fGetDC)
ReleaseDC (hdc);
}
#endif
static int EBMLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
DWORD dwStyle;
HDC hdc;
PEBLINEDATA pLineData;
PEBMLEDITDATA pMLEditData = NULL;
dwStyle = GetWindowStyle(hWnd);
switch (message)
{
case MSG_CREATE:
{
if (!(pMLEditData = calloc (1, sizeof (EBMLEDITDATA))))
return -1;
pMLEditData->lineInterval = 5;//默认
pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;//add by tjb ,行间距离太短
if ((dwStyle & EES_STYLESMASK) == EES_BASELINE)
pMLEditData->lineHeight += 2;
// if (!CreateCaret (hWnd, NULL, 1, pMLEditData->lineHeight))
// if (!CreateCaret (hWnd, NULL, 1, GetWindowFont(hWnd)->size))
if (!CreateCaret (hWnd, NULL, 5, 36)) //创建时尽量大一些,不然在更改了字体后光标的高度调整不过来
{
free (pMLEditData);
return -1;
}
//add by tjb 2005-7-14
ChangeCaretSize(hWnd, 1, GetWindowFont(hWnd)->size);
//end add
pMLEditData->status = 0;
pMLEditData->curtotalLen = 0;
pMLEditData->totalLimit = 100*LEN_MLEDIT_BUFFER;
pMLEditData->lineLimit = LEN_MLEDIT_BUFFER;
pMLEditData->editLine = 0;
pMLEditData->veditPos = 0;
pMLEditData->dispPos = 0;
pMLEditData->vdispPos = 0;
pMLEditData->MaxlinesDisp = 0;
pMLEditData->linesDisp = 0;
pMLEditData->StartlineDisp = 0;
pMLEditData->EndlineDisp = 0;
MLEditInitBuffer (hWnd, pMLEditData, GetWindowCaption(hWnd), dwStyle);
pMLEditData->selStartPos = 0;
pMLEditData->selEndPos = 0;
pMLEditData->passwdChar = '*';
pMLEditData->leftMargin = MARGIN_MEDIT_LEFT;
pMLEditData->topMargin = MARGIN_MEDIT_TOP;
pMLEditData->rightMargin = MARGIN_MEDIT_RIGHT;
pMLEditData->bottomMargin = MARGIN_MEDIT_BOTTOM;
pMLEditData->pos_chars = (int*)calloc(LEN_MLEDIT_BUFFER, sizeof(int));
pMLEditData->dx_chars = (int*)calloc(LEN_MLEDIT_BUFFER, sizeof(int));
pMLEditData->fit_chars = 0;
pMLEditData->realdispPos = 0;
pMLEditData->realStartLine = 0;
pMLEditData->realEndLine = 0;
pMLEditData->diff = FALSE;
pMLEditData->bSCROLL = FALSE;
pMLEditData->wraplines = 0;
pMLEditData->data = GetWindowAdditionalData(hWnd);//背景图句柄或文件名
pMLEditData->textcolor = PIXEL_black;
SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData);
break;
}
case MSG_DESTROY:
{
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
DestroyCaret (hWnd);
MLEditEmptyBuffer(pMLEditData);
free (pMLEditData->pos_chars);
free (pMLEditData->dx_chars);
pMLEditData->pos_chars = NULL;
pMLEditData->dx_chars = NULL;
free(pMLEditData);
}
break;
case EEM_SETMARGINS:
{
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
pMLEditData->leftMargin = wParam;
pMLEditData->rightMargin = wParam;
pMLEditData->topMargin = lParam;
pMLEditData->bottomMargin = lParam;
InvalidateRect(hWnd, NULL, TRUE);
break;
}
case MSG_SIZECHANGED:
{
RECT* clientRect = (RECT*)lParam;
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;
if ((dwStyle & EES_STYLESMASK) == EES_BASELINE)
pMLEditData->lineHeight += 2;
pMLEditData->MaxlinesDisp = (RECTHP(clientRect) - pMLEditData->topMargin
- pMLEditData->bottomMargin)/ pMLEditData->lineHeight;
if (pMLEditData->MaxlinesDisp < 0)
pMLEditData->MaxlinesDisp = 0;
if (dwStyle & EES_AUTOWRAP && pMLEditData->head)
{
PEBLINEDATA pLineData = pMLEditData->head;
pMLEditData->wraplines = 0;
for (; pLineData; pLineData = pLineData->next)
{
calcLineInfo (hWnd, pMLEditData, pLineData);
pMLEditData->wraplines += pLineData->nwrapline;
}
}
if (dwStyle & EES_AUTOWRAP)
pMLEditData->linesDisp = MIN (pMLEditData->MaxlinesDisp, pMLEditData->wraplines);
else
pMLEditData->linesDisp = MIN (pMLEditData->MaxlinesDisp, pMLEditData->lines);
pMLEditData->StartlineDisp = 0;
pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;
pMLEditData->editLine = 0;
pMLEditData->dispPos = 0;
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
InvalidateRect(hWnd, NULL, TRUE);
}
break;
case EEM_SETINTERVAL://设置行间距
{
RECT rc;
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
pMLEditData->lineInterval = (int)lParam;
pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;
if ((dwStyle & EES_STYLESMASK) == EES_BASELINE)
pMLEditData->lineHeight += 2;
GetWindowRect(hWnd, &rc);
pMLEditData->MaxlinesDisp = (RECTH(rc) - pMLEditData->topMargin
- pMLEditData->bottomMargin) / pMLEditData->lineHeight;
InvalidateRect(hWnd, NULL, TRUE);
break;
}
case MSG_FONTCHANGED:
{
RECT rc;
PEBLINEDATA pline;
GetWindowRect(hWnd, &rc);
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
pMLEditData->vdispPos = 0;
pMLEditData->veditPos = 0;
pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;
if (dwStyle & EES_BASELINE)
pMLEditData->lineHeight += 2;
pMLEditData->MaxlinesDisp = (RECTH(rc) - pMLEditData->topMargin
- pMLEditData->bottomMargin)/ pMLEditData->lineHeight;
pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->MaxlinesDisp -1;
ChangeCaretSize(hWnd, 1, GetWindowFont(hWnd)->size);
edtSetCaretPos (hWnd, FALSE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
//add by tjb 2005-7-14
pline = pMLEditData->head;
while(pline)
{
calcLineInfo(hWnd, pMLEditData, pline);
pline = pline->next;
}
InvalidateRect (hWnd, NULL, TRUE);
//end add
return 0;
}
case MSG_SETCURSOR:
if (dwStyle & WS_DISABLED)
{
SetCursor (GetSystemCursor (IDC_ARROW));
return 0;
}
break;
case MSG_KILLFOCUS:
{
pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2 (hWnd);
pMLEditData->status &= ~EEST_FOCUSED;
HideCaret (hWnd);
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_KILLFOCUS);
}
break;
case MSG_SETFOCUS:
{
pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2 (hWnd);
if (pMLEditData->status & EEST_FOCUSED)
return 0;
pMLEditData->status |= EEST_FOCUSED;
// only implemented for ES_LEFT align format.
edtSetCaretPos (hWnd, TRUE);
//add by tjb 2005-6-27
if (! (GetWindowStyle(hWnd)&WS_DISABLED))//当控键无效时,不显示光标
ShowCaret (hWnd);
//add end
ActiveCaret (hWnd);
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_SETFOCUS);
}
break;
case MSG_ENABLE:
if ( (!(dwStyle & WS_DISABLED) && !wParam) || ((dwStyle & WS_DISABLED) && wParam) )
{
if (wParam)
ExcludeWindowStyle(hWnd,WS_DISABLED);
else
IncludeWindowStyle(hWnd,WS_DISABLED);
InvalidateRect (hWnd, NULL, TRUE);
}
return 0;
case MSG_ERASEBKGND:
{
/* BOOL hidden = HideCaret (hWnd);
edtOnEraseBackground (hWnd, dwStyle, (HDC)wParam, (const RECT*)lParam);
if (hidden)
ShowCaret (hWnd);
*/
//修改者,唐建斌 2004-8-16
//修改原因:当包含该控键的窗口隐藏后重新显示时,该控键不能正常显示,注释以上代码则无该问题
return 0;
}
case MSG_PAINT:
{
int i;
char* dispBuffer;
RECT rect;
PLOGFONT pfont = GetWindowFont(hWnd);
pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);
hdc = BeginPaint (hWnd);
if (pfont)
SelectFont (hdc, pfont);
GetClientRect (hWnd, &rect);
if(dwStyle & EES_BKIMAGEMASK)
{
BITMAP bmp;
memset(&bmp,0,sizeof(BITMAP));
if(pMLEditData && pMLEditData->data)
{
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;
}
}
SetBkMode(hdc, BM_TRANSPARENT);
}
else
{
if (dwStyle & WS_DISABLED)
{
SetBrushColor (hdc, PIXEL_lightgray);
SetBkColor (hdc, PIXEL_lightgray);
}
else
{
SetBrushColor (hdc, GetWindowBkColor(hWnd));
SetBkColor (hdc, GetWindowBkColor(hWnd));
}
if(dwStyle & EES_BKTRANSPARENT)
{
SetBkMode(hdc, BM_TRANSPARENT);
FillBox(hdc, 0, 0, RECTW(rect), RECTH(rect));
}
else
FillBox(hdc, rect.left, rect.top, RECTW(rect), RECTH(rect));
}
SetTextColor (hdc, pMLEditData->textcolor);
rect.left += pMLEditData->leftMargin;
rect.top += pMLEditData->topMargin ;
rect.right -= pMLEditData->rightMargin;
rect.bottom -= pMLEditData->bottomMargin;
ClipRectIntersect (hdc, &rect);
for (i = pMLEditData->StartlineDisp; i <= pMLEditData->EndlineDisp; i++)
{
int y, line=i, wrapline=0;
if (dwStyle & EES_AUTOWRAP)
edtGetLineNums (pMLEditData, i, &line, &wrapline);
pLineData= GetLineData(pMLEditData, line);
if (!pLineData)
continue;
edtGetLineInfo (hWnd, pLineData);
if (dwStyle & EES_AUTOWRAP)
{
if (pMLEditData->fit_chars == 0 &&
pMLEditData->EndlineDisp >= pMLEditData->wraplines)
{//FIXME
continue;
}
}
else
{
if (pMLEditData->fit_chars == 0 &&
pMLEditData->EndlineDisp >= pMLEditData->lines)
{//FIXME
continue;
}
}
dispBuffer = alloca (LEN_MLEDIT_BUFFER+1);
//if (dwStyle & EES_AUTOWRAP) edit by tjb 2004-4-6
if (dwStyle & EES_PASSWORD)
memset (dispBuffer, pMLEditData->passwdChar, pLineData->dataEnd);
else
memcpy (dispBuffer, pLineData->buffer, pLineData->dataEnd);
dispBuffer[pLineData->dataEnd] = '\0';
y = pMLEditData->lineHeight * (i - pMLEditData->StartlineDisp)
+ pMLEditData->topMargin;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -