⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newedit.c

📁 microwindows最新源码
💻 C
📖 第 1 页 / 共 3 页
字号:
{	PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2);	pSLEditData->selStart = 0;	pSLEditData->selEnd = pSLEditData->dataEnd;	neInvalidateClient(hWnd);}/* *  Hadle WM_TIMER message for selection scrolling */static voidneTimerMessage(HWND hWnd, WPARAM wParam){	PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2);	int lastpos = pSLEditData->editPos;	if (wParam == IDTM_SELSCROLLLEFT) {		if (pSLEditData->editPos > 0)			pSLEditData->editPos--;	} else if (wParam == IDTM_SELSCROLLRIGHT) {		if (pSLEditData->editPos < pSLEditData->dataEnd)			pSLEditData->editPos++;	}	if (lastpos != pSLEditData->editPos) {		neMoveSelection(pSLEditData);		if (neRecalcScrollPos(hWnd, NULL, pSLEditData, FALSE))			neInvalidateClient(hWnd);	}}/* *  Delete the text in the selection */static BOOLneCutSelectedText(HWND hWnd, BOOL bCopyToClipb){	PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2);	int count;	if (bCopyToClipb)		neCopyToCliboard(hWnd, pSLEditData);	if (pSLEditData->selStart < pSLEditData->selEnd) {		if (pSLEditData->selStart < 0)			pSLEditData->selStart = 0;		if (pSLEditData->selEnd > pSLEditData->dataEnd)			pSLEditData->selEnd = pSLEditData->dataEnd;		count = pSLEditData->selEnd - pSLEditData->selStart;		memmove(pSLEditData->buffer + pSLEditData->selStart,			pSLEditData->buffer + pSLEditData->selEnd,			pSLEditData->dataEnd - pSLEditData->selEnd);		pSLEditData->dataEnd -= count;		pSLEditData->editPos = pSLEditData->selStart;		if (pSLEditData->editPos > pSLEditData->dataEnd)			pSLEditData->editPos = pSLEditData->dataEnd;		neRecalcScrollPos(hWnd, NULL, pSLEditData, FALSE);		neInvalidateClient(hWnd);		pSLEditData->selStart = pSLEditData->selEnd = 0;		neCheckBufferSize(hWnd, pSLEditData);		return TRUE;	}	return FALSE;}/* *  A Control character has been pressed */static intneKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam){	PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2);	int lastPos = pSLEditData->editPos;	RECT InvRect;	BOOL bRedraw = FALSE;	BOOL onWord = FALSE;	DWORD dwStyle = hWnd->style;	//DPRINTF( "KEYDOWN: %08X %08X\n", (int)wParam, (int)lParam );	//  If key isn't a control key, exit	if (!(lParam & (1 << 24)) && (wParam != VK_BACK))		return 0;	if (wParam == VK_TAB) {		PostMessage(GetParent(hWnd), WM_KEYDOWN, wParam, lParam);		return 0;	}	switch (wParam) {	case VK_LEFT:		if (pSLEditData->editPos > 0)			pSLEditData->editPos--;		if ((hWnd->userdata & EST_CTRL)		    && (pSLEditData->editPos < pSLEditData->dataEnd)) {			onWord = neIsWord(pSLEditData->buffer[pSLEditData->editPos]);			while ((pSLEditData->editPos > 0)			       && (neIsWord(pSLEditData->buffer[pSLEditData->editPos]) == onWord))				pSLEditData->editPos--;		}		if ((hWnd->userdata & EST_SHIFT))			bRedraw = neMoveSelection(pSLEditData);		else {			bRedraw =				(pSLEditData->selStart < pSLEditData->selEnd);			pSLEditData->selStart = pSLEditData->selEnd =				pSLEditData->editPos;		}		break;	case VK_RIGHT:		if (pSLEditData->editPos < pSLEditData->dataEnd)			pSLEditData->editPos++;		if ((hWnd->userdata & EST_CTRL)		    && (pSLEditData->editPos < pSLEditData->dataEnd)) {			onWord = neIsWord(pSLEditData->					  buffer[pSLEditData->editPos]);			while ((pSLEditData->editPos < pSLEditData->dataEnd)			       && (neIsWord (pSLEditData->buffer[pSLEditData->editPos]) == onWord))				pSLEditData->editPos++;		}		if ((hWnd->userdata & EST_SHIFT))			bRedraw = neMoveSelection(pSLEditData);		else {			bRedraw = (pSLEditData->selStart < pSLEditData->selEnd);			pSLEditData->selStart = pSLEditData->selEnd =				pSLEditData->editPos;		}		break;	case VK_UP:	case VK_DOWN:		if (!(dwStyle & ES_MULTILINE))			break;		pSLEditData->epX = pSLEditData->caretX + pSLEditData->scrollX;		pSLEditData->epY = (pSLEditData->caretRow +			 pSLEditData->scrollRow) * pSLEditData->charHeight;		if (wParam == VK_UP) {			pSLEditData->epY -= pSLEditData->charHeight;			if (pSLEditData->epY < 0) {				pSLEditData->epY = 0;				if (pSLEditData->scrollRow > 0)					pSLEditData->scrollRow--;			}		} else {			pSLEditData->epY += pSLEditData->charHeight;		}		neDrawAllText(hWnd, NULL, pSLEditData, NEDRAW_CALC_EDITPOS);		break;	case VK_HOME:		pSLEditData->editPos = 0;		if ((hWnd->userdata & EST_SHIFT))			bRedraw = neMoveSelection(pSLEditData);		else {			bRedraw = (pSLEditData->selStart < pSLEditData->selEnd);			pSLEditData->selStart = pSLEditData->selEnd =				pSLEditData->editPos;		}		break;	case VK_END:		pSLEditData->editPos = pSLEditData->dataEnd;		if ((hWnd->userdata & EST_SHIFT))			bRedraw = neMoveSelection(pSLEditData);		else {			bRedraw = (pSLEditData->selStart < pSLEditData->selEnd);			pSLEditData->selStart = pSLEditData->selEnd =				pSLEditData->editPos;		}		break;	case VK_BACK:		if (neCutSelectedText(hWnd, FALSE));		else if (pSLEditData->editPos > 0) {			pSLEditData->editPos--;			memmove(pSLEditData->buffer + pSLEditData->editPos,				pSLEditData->buffer + pSLEditData->editPos + 1,				(pSLEditData->dataEnd - pSLEditData->editPos) * SZEDITCHAR);			pSLEditData->dataEnd--;			neCheckBufferSize(hWnd, pSLEditData);			bRedraw = TRUE;		}		SendMessage(GetParent(hWnd), WM_COMMAND,			    (WPARAM) MAKELONG(hWnd->id, EN_CHANGE), (LPARAM) hWnd);		break;	case VK_DELETE:		if (neCutSelectedText		    (hWnd, ((hWnd->userdata & EST_SHIFT) != 0)));		else if (pSLEditData->editPos < pSLEditData->dataEnd) {			memmove(pSLEditData->buffer + pSLEditData->editPos,				pSLEditData->buffer + pSLEditData->editPos + 1,				(pSLEditData->dataEnd - pSLEditData->editPos) * SZEDITCHAR);			pSLEditData->dataEnd--;			neCheckBufferSize(hWnd, pSLEditData);			bRedraw = TRUE;		}		SendMessage(GetParent(hWnd), WM_COMMAND,			    (WPARAM) MAKELONG(hWnd->id, EN_CHANGE), (LPARAM) hWnd);		break;	case VK_INSERT:		if ((hWnd->userdata & EST_SHIFT))			neCharPressed(hWnd, -1, -1);		else if ((hWnd->userdata & EST_CTRL))			neCopyToCliboard(hWnd, pSLEditData);		else {			hWnd->userdata ^= EST_REPLACE;			if (GetFocus() == hWnd) {				DestroyCaret();				if ((hWnd->userdata & EST_REPLACE))					CreateCaret(hWnd, NULL, 3,						    pSLEditData->charHeight);				else					CreateCaret(hWnd, NULL, 1,						    pSLEditData->charHeight);				neUpdateCaretPos(hWnd);				ShowCaret(hWnd);			}		}		break;	case VK_LCONTROL:	case VK_RCONTROL:	case VK_CONTROL:		hWnd->userdata |= EST_CTRL;		break;	case VK_LSHIFT:	case VK_RSHIFT:	case VK_SHIFT:		if (GetCapture() != hWnd) {			hWnd->userdata |= EST_SHIFT;			pSLEditData->selCenter = pSLEditData->editPos;		}		break;	}	if ((lastPos != pSLEditData->editPos) || bRedraw) {		if (neRecalcScrollPos(hWnd, NULL, pSLEditData, FALSE)		    || bRedraw) {			InvRect.left = pSLEditData->leftMargin;			InvRect.top = pSLEditData->topMargin;			InvRect.right =				hWnd->clirect.right - hWnd->clirect.left;			InvRect.bottom =				hWnd->clirect.bottom - hWnd->clirect.top;			InvalidateRect(hWnd, &InvRect, FALSE);		}		neUpdateCaretPos(hWnd);	}	return 0;}/* *  Key released */static intneKeyUp(HWND hWnd, WPARAM wParam, LPARAM lParam){	//  If key isn't a control key, exit	if (!(lParam & (1 << 24)) && (wParam != VK_BACK))		return 0;	switch (wParam) {	case VK_LCONTROL:	case VK_RCONTROL:		hWnd->userdata &= ~EST_CTRL;		break;	case VK_LSHIFT:	case VK_RSHIFT:	case VK_SHIFT:		hWnd->userdata &= ~EST_SHIFT;		break;	}	return 0;}/* *  A Character has been pressed */static intneCharPressed(HWND hWnd, WPARAM wParam, LPARAM lParam){	EDITCHAR locBuffer[2];	EDITCHAR *charBuffer = locBuffer;	int i, chars, inserting;	PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2);	DWORD dwStyle = hWnd->style;	BOOL isPasting = (((long) wParam == -1) && ((long) lParam == -1));	if (dwStyle & ES_READONLY)		return 0;	//DPRINTF ( "char: %08X - %08X\n", (int)wParam, (int)lParam );	if ((wParam == 0xD) && (hWnd->userdata & EST_CTRL))		DPRINTF("CTRL+ENTER!!!!!\n");	//   check if called for pasting clipboard	if (isPasting) {		if (neClipboard == NULL)			return 0;		charBuffer = neClipboard;		chars = neClipboardSize;	} else {		chars = 1;		charBuffer[0] = (EDITCHAR) LOWORD(wParam);		switch (LOWORD(wParam)) {		case 0x00:	/* NULL */		case 0x07:	/* BEL */		case 0x08:	/* BS */		case 0x09:	/* HT */		case 0x0A:	/* LF */		case 0x0B:	/* VT */		case 0x0C:	/* FF */		case 0x1B:	/* Escape */			return 0;		case 0x0D:	/* CR */			charBuffer[0] = '\n';			break;		}	}	//  If there is a selection, remove it.	neCutSelectedText(hWnd, FALSE);	if ((hWnd->userdata & EST_REPLACE) && !isPasting) {		if (pSLEditData->dataEnd == pSLEditData->editPos)			inserting = chars;		else			inserting = 0;	} else		inserting = chars;	/* check space */	if ((pSLEditData->hardLimit >= 0) &&	    (pSLEditData->dataEnd + inserting > pSLEditData->hardLimit)) {		SendMessage(GetParent(hWnd), WM_COMMAND,			    (WPARAM) MAKELONG(hWnd->id, EN_MAXTEXT),			    (LPARAM) hWnd);		return 0;	}	//   Increase dataEnd and check buffer size	if (!neIncDataEnd(pSLEditData, inserting)) {		SendMessage(GetParent(hWnd), WM_COMMAND,			    (WPARAM) MAKELONG(hWnd->id, EN_MAXTEXT),			    (LPARAM) hWnd);		return 0;	}	if (inserting == -1) {		for (i = pSLEditData->editPos; i < pSLEditData->dataEnd - 1;		     i++)			pSLEditData->buffer[i] = pSLEditData->buffer[i + 1];	} else if (inserting > 0) {		for (i = pSLEditData->dataEnd - 1;		     i > pSLEditData->editPos - 1; i--)			pSLEditData->buffer[i] =				pSLEditData->buffer[i - inserting];	}	for (i = 0; i < chars; i++) {		if (dwStyle & ES_UPPERCASE)			pSLEditData->buffer[pSLEditData->editPos + i] =				toupper(charBuffer[i]);		else if (dwStyle & ES_LOWERCASE)			pSLEditData->buffer[pSLEditData->editPos + i] =				tolower(charBuffer[i]);		else			pSLEditData->buffer[pSLEditData->editPos + i] =				charBuffer[i];	}	pSLEditData->editPos += chars;	pSLEditData->selCenter = pSLEditData->editPos;	if (neRecalcScrollPos(hWnd, NULL, pSLEditData, TRUE))		neInvalidateClient(hWnd);	else		neDrawAllText(hWnd, NULL, pSLEditData, NEDRAW_ROW);	neUpdateCaretPos(hWnd);	SendMessage(GetParent(hWnd), WM_COMMAND,		    (WPARAM) MAKELONG(hWnd->id, EN_CHANGE), (LPARAM) hWnd);	return 0;}/* * WINDOW PROCEDURE */LRESULT CALLBACKSLEditCtrlProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){	HWND pCtrl;	DWORD dwStyle;	PSLEDITDATA pSLEditData;	pCtrl = hWnd;	dwStyle = pCtrl->style;	switch (message) {	case WM_CREATE:		neCreate(hWnd);		break;	case WM_DESTROY:		neDestroy(hWnd);		break;	case WM_SETFONT:		neSetFont(hWnd, (HFONT) wParam, (BOOL) LOWORD(lParam));		break;	case WM_GETFONT:		pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);		return (LRESULT) pSLEditData->hFont;	case WM_KILLFOCUS:		neKillFocus(hWnd);		break;	case WM_SETFOCUS:		neSetFocus(hWnd, wParam, lParam);		break;	case WM_ENABLE:		if ((!(dwStyle & WS_DISABLED) && !wParam) ||		    ((dwStyle & WS_DISABLED) && wParam)) {			if (wParam)				pCtrl->style &= ~WS_DISABLED;			else				pCtrl->style |= WS_DISABLED;			InvalidateRect(hWnd, NULL, FALSE);		}		break;	case WM_NCCALCSIZE:		{			LPNCCALCSIZE_PARAMS lpnc;			/* calculate client rect from passed window rect in rgrc[0] */			lpnc = (LPNCCALCSIZE_PARAMS) lParam;			if (GetWindowLong(hWnd, GWL_STYLE) & WS_BORDER)				InflateRect(&lpnc->rgrc[0], -2, -2);		}		break;	case WM_NCPAINT:		neNCPaint(hWnd, wParam);		break;	case WM_PAINT:		nePaint(hWnd, wParam, lParam);		break;	case WM_KEYDOWN:		return neKeyDown(hWnd, wParam, lParam);	case WM_KEYUP:		return neKeyUp(hWnd, wParam, lParam);	case WM_CHAR:		return neCharPressed(hWnd, wParam, lParam);	case WM_GETTEXTLENGTH:		pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);		return pSLEditData->dataEnd;	case WM_GETTEXT:		{			char *buffer = (char *) lParam;			int len;			pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);			len = min((int) wParam, pSLEditData->dataEnd);			//memcpy_fromedit (buffer, pSLEditData->buffer, len);			GdConvertEncoding(pSLEditData->buffer, MWTF_UC16, len,					  buffer, mwTextCoding);			return strlen(buffer);		}	case WM_SETTEXT:		neSetText(hWnd, (const char *) lParam);		break;	case WM_LBUTTONDBLCLK:		neMouseDblClk(hWnd, wParam, lParam);		break;	case WM_LBUTTONDOWN:		neMouseLButtonDown(hWnd, wParam, lParam);		break;	case WM_LBUTTONUP:	case WM_NCLBUTTONUP:		neMouseLButtonUp(hWnd, wParam, lParam);		break;	case WM_NCMOUSEMOVE:		neMouseMove(hWnd, wParam, lParam);		break;	case WM_TIMER:		neTimerMessage(hWnd, wParam);		break;	case WM_GETDLGCODE:		if (!(pCtrl->style & ES_WANTRETURN))			return DLGC_WANTCHARS | DLGC_HASSETSEL |				DLGC_WANTARROWS;		else			return DLGC_WANTALLKEYS | DLGC_HASSETSEL;	case EM_SETREADONLY:		if (wParam)			pCtrl->style /*dwStyle */  |= ES_READONLY;		else			pCtrl->style /*dwStyle */  &= ~ES_READONLY;		return 0;	case EM_SETPASSWORDCHAR:		pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);		if (pSLEditData->passwdChar != (int) wParam) {			if (dwStyle & ES_PASSWORD) {				pSLEditData->passwdChar = (int) wParam;				InvalidateRect(hWnd, NULL, TRUE);			}		}		return 0;	case EM_GETPASSWORDCHAR:		pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);		return pSLEditData->passwdChar;	case EM_LIMITTEXT:		{			int newLimit = (int) wParam;			if (newLimit >= 0) {				pSLEditData =					(PSLEDITDATA) (pCtrl->userdata2);				if (pSLEditData->bufferLen < newLimit)					pSLEditData->hardLimit = -1;				else					pSLEditData->hardLimit = newLimit;			}		}		return 0;	default:		return DefWindowProc(hWnd, message, wParam, lParam);		break;	}	return 0;}int WINAPIMwRegisterEditControl(HINSTANCE hInstance){	WNDCLASS wc;	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_GLOBALCLASS;	wc.lpfnWndProc = (WNDPROC) SLEditCtrlProc;	wc.cbClsExtra = 0;	wc.cbWndExtra = 0;	wc.hInstance = hInstance;	wc.hIcon = NULL;	wc.hCursor = 0;		/*LoadCursor(NULL, IDC_ARROW); */	wc.hbrBackground = GetStockObject(WHITE_BRUSH);	wc.lpszMenuName = NULL;	wc.lpszClassName = "EDIT";	return RegisterClass(&wc);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -