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

📄 medit.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	}    }#endif    return FALSE;}static void str2attr(const char* str,int len){    int i=0;    do    {	if (edtIsACCharAtPosition(str,len,i))	{		attr[i]=ATTCHL;		attr[i+1]=ATTCHR;		i+=2;	}	else	{		attr[i]=ATTENG;		i++;	}    }while(i<len);}static BOOL edtIsACCharBeforePosition (const char* string,int len, int pos){    if (pos < 2)        return FALSE;/* 1st:gb:a1-f7,big5:a1-f9  2nd:gb:a1-fe,big5:40-7e,a1-fe */#ifndef USE_BIG5    /* FIXME #ifdef GB2312?*/    if ((BYTE)string [pos - 2] > 0xA0 && (BYTE)string [pos - 1] > 0xA0)        return TRUE;#else#if 0    if ((BYTE)string [pos - 2] > 0xA0)    {	if ( ((BYTE)string [pos - 1] >= 0x40 && (BYTE)string[pos - 1] <= 0x7e) ||	     ((BYTE)string [pos - 1] >= 0xa1 && (BYTE)string[pos - 1] <= 0xfe))            return TRUE;    }#else    str2attr(string,len);    if (attr[pos-1]==ATTENG) return FALSE;    else return TRUE;#endif#endif    return FALSE;}static BOOL edtIsACCharFromBegin(const char* string,int len,int pos){	int i;	if(pos == 0)		return TRUE;	if(len == 0)		return FALSE;	for(i=0;i<len;)	{		if( edtIsACCharAtPosition(string,len,i) )			i += 2;		else 			i++;		if(i==pos)			return TRUE;	}	return FALSE;}int GetRETURNPos(char *str){	int i;	for(i=0;i<strlen(str);i++)	{			if(str[i]==10)			return i;	}	return -1;}void MLEditInitBuffer (PMLEDITDATA pMLEditData,char *spcaption){	char *caption=spcaption;     int off1;	int lineNO=0;	PLINEDATA  pLineData;	if (!(pMLEditData->head = malloc (sizeof (LINEDATA)))) {		fprintf (stderr, "EDITLINE: malloc error!\n");		return ;	}	pMLEditData->head->previous = NULL;	pLineData=pMLEditData->head;		while ( (off1 = GetRETURNPos(caption)) != -1)	{		off1 = min(off1, LEN_MLEDIT_BUFFER);		memcpy(pLineData->buffer,caption,off1);		pLineData->buffer[off1] = '\0';		caption+=min(off1,LEN_MLEDIT_BUFFER)+1;		pLineData->lineNO  = lineNO;		pMLEditData->dispPos = 0;		pLineData->dataEnd = strlen(pLineData->buffer); 		pLineData->next    = malloc (sizeof (LINEDATA));		pLineData->next->previous = pLineData; 		pLineData = pLineData->next;		lineNO++;	}		off1 = min(strlen(caption),LEN_MLEDIT_BUFFER);	memcpy(pLineData->buffer,caption,off1);	pLineData->buffer[off1] = '\0';	pLineData->lineNO  = lineNO++;	pMLEditData->dispPos = 0;	pLineData->dataEnd = strlen(pLineData->buffer); 	pLineData->next    = NULL; 	pMLEditData->lines      = lineNO ; }PLINEDATA GetLineData(PMLEDITDATA pMLEditData,int lineNO){	PLINEDATA pLineData=pMLEditData->head;	while(pLineData)	{		if(pLineData->lineNO==lineNO)			return pLineData;		pLineData = pLineData->next;	}	return NULL;}int MLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){       DWORD       dwStyle;	DWORD 		dw;    HDC         hdc;	PLINEDATA  pLineData;	RECT		clientRect;    PMLEDITDATA pMLEditData;    dwStyle     = GetWindowStyle(hWnd);    switch (message)    {        case WM_CREATE:	{            if (!(pMLEditData = malloc (sizeof (MLEDITDATA)))) {                fprintf (stderr, "EDIT: malloc error!\n");                return -1;            }            pMLEditData->totalLen      = LEN_MLEDIT_BUFFER;            pMLEditData->editPos        = 0;            pMLEditData->editLine       = 0;            pMLEditData->caretPos       = 0;	    MLEditInitBuffer(pMLEditData,GetWindowCaption(hWnd));		    GetClientRect(hWnd,&clientRect);            	    pMLEditData->MaxlinesDisp   = (clientRect.bottom-clientRect.top)/GetSysCharHeight(hWnd);	    pMLEditData->linesDisp		= min(pMLEditData->MaxlinesDisp,pMLEditData->lines);	    pMLEditData->StartlineDisp  = 0;	    pMLEditData->EndlineDisp    = pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;            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->hardLimit      = -1;                        /* undo information */            pMLEditData->lastOp         = MEDIT_OP_NONE;            pMLEditData->lastPos        = 0;            pMLEditData->affectedLen    = 0;            pMLEditData->undoBufferLen  = LEN_MLEDIT_UNDOBUFFER;            pMLEditData->undoBuffer [0] = '\0';			SetWindowAdditionalData2(hWnd,(DWORD)pMLEditData);			SetWindowAdditionalData(hWnd,(DWORD)0);            break;	}        case WM_DESTROY:        {		PLINEDATA temp;		pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);	    	DestroyCaret ();		pLineData = pMLEditData->head;			while(pLineData)		{			/*printf("delete lineNO = %d,buffer=%s\n",pLineData->lineNO,pLineData->buffer);*/			temp = pLineData->next;			free(pLineData);			pLineData = temp;		}		            	free(pMLEditData); 	}        break;                case WM_SETFONT:        break;                case WM_GETFONT:        break;#if 0	/* fix: no WM_SETCURSOR */        case WM_SETCURSOR:            if (dwStyle & WS_DISABLED) {                SetCursor (GetSystemCursor (IDC_ARROW));                return 0;            }        break;   	case WM_SIZECHANGED:        {        }        return 0;#endif        case WM_KILLFOCUS:	{	    dw= GetWindowAdditionalData(hWnd);            dw&= ~EST_FOCUSED;	    SetWindowAdditionalData(hWnd,dw);            HideCaret (hWnd);	    DestroyCaret ();            SendMessage (GetParent (hWnd),                          WM_COMMAND,                          (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_KILLFOCUS),                         (LPARAM)hWnd);	}        break;                case WM_SETFOCUS:		{			dw= GetWindowAdditionalData(hWnd);            if (dw & EST_FOCUSED)                return 0;                        dw |= EST_FOCUSED;			SetWindowAdditionalData(hWnd,dw);            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);            /* only implemented for ES_LEFT align format. */            CreateCaret (hWnd, NULL, 1, /*GetSysCharWidth(hWnd)+1,*/		    hWnd->clirect.bottom-hWnd->clirect.top-2);            SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)                     + pMLEditData->leftMargin, pMLEditData->topMargin);	    ShowCaret(hWnd);            SendMessage (GetParent (hWnd),                          WM_COMMAND,                         (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_SETFOCUS),                         (LPARAM) hWnd);		}        break;                case WM_ENABLE:            if ( (!(dwStyle & WS_DISABLED) && !wParam)                    || ((dwStyle & WS_DISABLED) && wParam) ) {                if (wParam)			ExcludeWindowStyle(hWnd,WS_DISABLED);                else			IncludeWindowStyle(hWnd,WS_DISABLED);                InvalidateRect (hWnd, NULL, FALSE);            }        return 0;        case WM_NCPAINT:	{	    RECT rc;#if 0            if (wParam)                hdc = (HDC)wParam;            else                hdc = GetDC (hWnd);#if 0	/* fix: no ClipRectIntersect() */            if (lParam)            ClipRectIntersect (hdc, (RECT*)lParam);#endif#else            hdc = wParam? (HDC)wParam: GetWindowDC (hWnd);	    GetWindowRect(hWnd, &rc);#endif            if (dwStyle & WS_BORDER)	    {#if 0		RECT rc;		GetWindowRect(hWnd,&rc);                Draw3DDownFrame (hdc, 0, 0,                                       rc.right - rc.left - 1,                                       rc.bottom - rc.top - 1,                                      PIXEL_invalid);#else		Draw3dInset(hdc, rc.left, rc.top,			rc.right-rc.left, rc.bottom-rc.top);#endif	    }            if (!wParam) {		ReleaseDC(hWnd,hdc);		}	}        return 0;        case WM_PAINT:        {            int     dispLen,i;            char*   dispBuffer;            RECT    rect,rc;	    PAINTSTRUCT ps;	    HGDIOBJ oldfont=NULL;                        hdc = BeginPaint (hWnd,&ps);            GetClientRect (hWnd, &rect);                if (dwStyle & WS_DISABLED)            {		rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;		FillRect(hdc,&rc,GetStockObject(LTGRAY_BRUSH));                SetBkColor (hdc, LTGRAY/*PIXEL_lightgray*/);            }            else {		rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;		FillRect(hdc,&rc,GetStockObject(WHITE_BRUSH));                SetBkColor (hdc, WHITE/*PIXEL_lightwhite*/);            }            SetTextColor (hdc, BLACK/*PIXEL_black*/);            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);			for(i = pMLEditData->StartlineDisp; i <= pMLEditData->EndlineDisp; i++)			{				pLineData= GetLineData(pMLEditData,i);            	dispLen = edtGetDispLen (hWnd,pLineData);         	    if (dispLen == 0 && pMLEditData->EndlineDisp >= pMLEditData->lines) {                	continue;           		 }#ifdef _DEBUG       	    	if (pMLEditData->dispPos > pLineData->dataEnd)        	        fprintf (stderr, "ASSERT failure: %s.\n", "Edit Paint");#endif                            dispBuffer = alloca (LEN_MLEDIT_BUFFER+1);                if (dwStyle & ES_PASSWORD)                    memset (dispBuffer, '*', pLineData->dataEnd);				    memcpy (dispBuffer,                    	    pLineData->buffer,	/* +pMLEditData->dispPos, */						pLineData->dataEnd);	/* - pMLEditData->dispPos); */               		dispBuffer[pLineData->dataEnd] = '\0';            /* only implemented ES_LEFT align format for single line edit. */                rect.left = pMLEditData->leftMargin;                rect.top = pMLEditData->topMargin ;                rect.right = pMLEditData->rightMargin;                rect.bottom = pMLEditData->bottomMargin;#if 0		printf("lineNO=%d,lines=%d,editLine=%d\n",pLineData->lineNO,pMLEditData->lines,			pMLEditData->editLine);		printf("--dispBuffer=%s--\n",dispBuffer);                ClipRectIntersect (hdc, &rect);	/* fix: no ClipRectIntersect() */#endif#ifdef USE_BIG5	    	    oldfont=SelectObject(hdc,CreateFont(12,			0,0,0,0,0,0,0,0,0,0,0,			FF_DONTCARE|DEFAULT_PITCH,			"HZXFONT"));#endif                TextOut (hdc, 				pMLEditData->leftMargin - pMLEditData->dispPos * GetSysCharWidth(hWnd) ,				GetSysCharHeight(hWnd)*(pLineData->lineNO - pMLEditData->StartlineDisp) 					+ pMLEditData->topMargin,				dispBuffer,-1);			}#ifdef USE_BIG5	        	    DeleteObject(SelectObject(hdc,oldfont));#endif	    EndPaint (hWnd, &ps);        }        break;        case WM_KEYDOWN:        {            BOOL    bChange = FALSE;            int     i;            int     deleted;			PLINEDATA temp = NULL;			char *  tempP = NULL;            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);                    switch (LOWORD (wParam))            {				                case VK_RETURN: 	/* SCANCODE_ENTER: */				{					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);					if (pMLEditData->editPos < pLineData->dataEnd)						tempP = pLineData->buffer + pMLEditData->editPos;				    temp = pLineData->next;					pLineData->next = malloc( sizeof(LINEDATA) );					pLineData->next->previous = pLineData;					pLineData->next->next = temp;					if(temp)					{						temp->previous = pLineData->next;					}					temp = pLineData->next;					temp->lineNO  = pMLEditData->editLine + 1;					if(tempP)					{						memcpy(temp->buffer,tempP,strlen(tempP));						temp->dataEnd = strlen(tempP);					}					else						temp->dataEnd = 0;					temp->buffer[temp->dataEnd] = '\0'; 					pLineData->dataEnd = pMLEditData->editPos;					pLineData->buffer[pLineData->dataEnd]='\0';					temp = temp->next;					while (temp)					{						temp->lineNO++;						temp = temp->next;					}					pMLEditData->editPos = 0;					pMLEditData->caretPos= 0;					pMLEditData->dispPos = 0;

⌨️ 快捷键说明

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