📄 ebedit.c
字号:
SetPenColor(hdc, pEBEditData->bordercolor);
MoveTo(hdc, rect.left, rect.top + 1);
LineTo(hdc, rect.right - 1, rect.top +1);
LineTo(hdc, rect.right - 1, rect.bottom - 1);
MoveTo(hdc, rect.left, rect.top + 1);
LineTo(hdc, rect.left, rect.bottom - 1);
LineTo(hdc, rect.right - 1, rect.bottom - 1);
}
}
else if ((dwStyle & EES_STYLESMASK) == EES_USEUNDERLINE)
{
RECT rect;
GetClientRect(hWnd, &rect);
if (pEBEditData->bordercolor != PIXEL_invalid)
{
SetPenColor(hdc, pEBEditData->bordercolor);
MoveTo(hdc, rect.left, rect.bottom-1);
LineTo(hdc, rect.right, rect.bottom-1);
}
}
if (fGetDC)
ReleaseDC (hdc);
}
static int EBEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
DWORD dwStyle= GetWindowStyle (hWnd);
const char* spCaption;
PEBEDITDATA2 pEBEditData =(PEBEDITDATA2)GetWindowAdditionalData2 (hWnd);
int id = GetDlgCtrlID (hWnd);
switch (message)
{
case MSG_CREATE:
{
BITMAP bmp;
HDC hdc;
int fheight = GetSysCharHeight();
PLOGFONT pfont = GetSystemFont (SYSLOGFONT_WCHAR_DEF);
if(pfont)
fheight = pfont->size;
if (!(pEBEditData = (PEBEDITDATA2)malloc (sizeof (EBEDITDATA2)))) {
fprintf (stderr, "EDIT: malloc error!\n");
return -1;
}
#if 0
hdc = GetClientDC(hWnd);
if ( LoadBitmap(hdc , &bmp, "res/mycaret.gif")<0 )
{
printf("___Err: LoadBitmap failed!\n");
break;
}
printf("____________debug width=%d,height=%d!\n",bmp.bmWidth, bmp.bmHeight);
if( !CreateCaret(hWnd, &bmp, bmp.bmWidth, bmp.bmHeight))
{
printf("___Err: CreateCaret failed!\n");
break;
}
ReleaseDC(hdc);
ChangeCaretSize(hWnd,2,10);
#else
if (!CreateCaret (hWnd, NULL, 5, 36))
{
fprintf (stderr, "EDIT: Create Caret error!\n");
free (pEBEditData);
return -1;
}
ChangeCaretSize(hWnd,1,fheight+2);
if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
{
RECT rc;
GetWindowRect(hWnd, &rc);
SetCaretPos (hWnd, pEBEditData->leftMargin, (RECTH(rc)-fheight)/2-1);;
}
#endif
pEBEditData->status = 0;
pEBEditData->bufferLen = LEN_EBEDIT_BUFFER;
pEBEditData->editPos = 0;
pEBEditData->caretOff = 0;
pEBEditData->startPos = 0;
pEBEditData->selStart = 0;
pEBEditData->selEnd = 0;
pEBEditData->passwdChar = '*';
pEBEditData->leftMargin = MARGIN_EDIT_LEFT;
pEBEditData->topMargin = MARGIN_EDIT_TOP;
pEBEditData->rightMargin = MARGIN_EDIT_RIGHT;
pEBEditData->bottomMargin = MARGIN_EDIT_BOTTOM;
pEBEditData->textcolor = PIXEL_black;
pEBEditData->bordercolor = PIXEL_lightgray; //默认是没有边框或下划线的
pEBEditData->hardLimit = -1;
pEBEditData->data = GetWindowAdditionalData (hWnd);
spCaption = GetWindowCaption (hWnd);
pEBEditData->dataEnd = strlen (spCaption);
SetWindowFont(hWnd,pfont);
if(spCaption)
{
int fontsize = GetSysCharWidth();
memcpy (pEBEditData->buffer, spCaption,
MIN (LEN_EBEDIT_BUFFER, pEBEditData->dataEnd));
pEBEditData->editPos = strlen(spCaption);
pEBEditData->caretOff = pEBEditData->editPos;
fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
pEBEditData->caretOff);
if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
{
POINT oldpos;
GetCaretPos(hWnd, &oldpos);
SetCaretPos (hWnd, fontsize + pEBEditData->leftMargin, oldpos.y);
}
else
SetCaretPos (hWnd, fontsize + pEBEditData->leftMargin, pEBEditData->topMargin);
}
SetWindowAdditionalData2 (hWnd, (DWORD)pEBEditData);
}
break;
case EEM_SETUSERCARET:
{
PBITMAP pbmp;
HDC hdc;
if (!lParam)
break;
pbmp = malloc(sizeof(BITMAP));
hdc = GetClientDC(hWnd);
printf("_____debug: EbEdit filename=%s!\n",(char*)lParam);
if ( LoadBitmap(hdc , pbmp, (char*)lParam)<0 )
{
printf("___Err: LoadBitmap failed!\n");
break;
}
DestroyCaret(hWnd);
if( !CreateCaret(hWnd, pbmp, pbmp->bmWidth, pbmp->bmHeight))
{
printf("___Err: CreateCaret failed!\n");
break;
}
ReleaseDC(hdc);
}
return 0;
case MSG_DESTROY:
{
DestroyCaret (hWnd);
if(pEBEditData)
free ((void*)pEBEditData);
}
break;
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_FONTCHANGED:
{
int fheight = GetSysCharHeight();
PLOGFONT pfont = GetWindowFont(hWnd);
if(pfont)
{
fheight = pfont->size;
}
ChangeCaretSize(hWnd,1,fheight+2);
if (dwStyle & EES_VCENTER)
{
RECT rc;
GetWindowRect(hWnd, &rc);
SetCaretPos(hWnd, pEBEditData->leftMargin, (RECTH(rc)-fheight)/2-1);
}
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
break;
case MSG_SETCURSOR:
if (dwStyle & WS_DISABLED)
{
SetCursor (GetSystemCursor (IDC_ARROW));
return 0;
}
break;
case MSG_KILLFOCUS:
pEBEditData->status &= ~EEST_FOCUSED;
HideCaret (hWnd);
NotifyParent (hWnd, id, EEN_KILLFOCUS);
break;
case MSG_SETFOCUS:
{
int fsize = GetSysCharWidth();
PLOGFONT pfont = GetWindowFont(hWnd);
if(pfont)
{
fsize = GetFontCharWidth(pfont);
}
if (pEBEditData->status & EEST_FOCUSED)
return 0;
pEBEditData->status |= EEST_FOCUSED;
// only implemented for ES_LEFT align format.
fsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
pEBEditData->caretOff);
if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
{
RECT rc;
GetWindowRect(hWnd, &rc);
SetCaretPos (hWnd, fsize + pEBEditData->leftMargin, (RECTH(rc)-pfont->size)/2-1);;
}
else
SetCaretPos (hWnd, fsize + pEBEditData->leftMargin, pEBEditData->topMargin);
//pEBEditData->caretOff * fsize
ShowCaret (hWnd);
ActiveCaret (hWnd);
NotifyParent (hWnd, id, EEN_SETFOCUS);
}
break;
case MSG_ENABLE:
/*if ( (!(dwStyle & WS_DISABLED) && !wParam)
|| ((dwStyle & WS_DISABLED) && wParam) ) {
if (wParam)
pCtrl->dwStyle &= ~WS_DISABLED;
else
pCtrl->dwStyle |= WS_DISABLED;
InvalidateRect (hWnd, NULL, TRUE);
}
*/
return 0;
case MSG_NCPAINT:
return 0;
case MSG_PAINT:
{
HDC hdc;
int dispLen;
char* dispBuffer;
RECT rect;
PLOGFONT pfont = GetWindowFont(hWnd);
UINT uFormat;
hdc = BeginPaint (hWnd);
if (pfont)
SelectFont (hdc, pfont);
GetClientRect (hWnd, &rect);
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)
{
// SetBrushColor(hdc, RGBA2Pixel(hdc, 0, 0, 0, 255));
SetBkMode(hdc, BM_TRANSPARENT);
FillBox(hdc, 0, 0, RECTW(rect), RECTH(rect));
}
else
FillBox(hdc, rect.left, rect.top, RECTW(rect), RECTH(rect));
if ((dwStyle & EES_STYLESMASK) == EES_USEBORDER)
{
if (pEBEditData->bordercolor != PIXEL_invalid)
{
SetPenColor(hdc, pEBEditData->bordercolor);
#if 0
MoveTo(hdc, rect.left , rect.top+1);
LineTo(hdc, rect.right - 1, rect.top+1);
LineTo(hdc, rect.right - 1, rect.bottom - 1);
MoveTo(hdc, rect.left, rect.top +1);
LineTo(hdc, rect.left, rect.bottom - 1);
LineTo(hdc, rect.right - 1, rect.bottom - 1);
#else
MoveTo(hdc, rect.left , rect.top);
LineTo(hdc, rect.right , rect.top);
MoveTo(hdc, rect.right-1, rect.top);
LineTo(hdc, rect.right-1 , rect.bottom);
MoveTo(hdc, rect.left, rect.top);
LineTo(hdc, rect.left, rect.bottom);
MoveTo(hdc, rect.left, rect.bottom-1);
LineTo(hdc, rect.right, rect.bottom-1);
#endif
}
}
else if ((dwStyle & EES_STYLESMASK) == EES_USEUNDERLINE)
{
SetPenColor(hdc, pEBEditData->bordercolor);
MoveTo(hdc, rect.left, rect.bottom -1);
LineTo(hdc, rect.right, rect.bottom -1);
}
if(dwStyle & EES_BKIMAGEMASK)
{
BITMAP bmp;
memset(&bmp,0,sizeof(BITMAP));
if(pEBEditData && pEBEditData->data)
{
switch(dwStyle & EES_BKIMAGEMASK)
{
case EES_BKBITMAP:
{
FillBoxWithBitmap(hdc, 0, 0, 0, 0,(PBITMAP)(pEBEditData->data));
}
break;
case EES_BKBMPFILE:
{
char * szimage = (char *)(pEBEditData->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)(pEBEditData->data));
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -