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

📄 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 + -