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

📄 ebmedit.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
	else

		pMLEditData->linesDisp = MIN(lineNO , pMLEditData->MaxlinesDisp);

	pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp -1;

}



PEBLINEDATA GetLineData(PEBMLEDITDATA pMLEditData,int lineNO)

{

	PEBLINEDATA pLineData=pMLEditData->head;

	for (; pLineData; pLineData=pLineData->next)

	{

		if(pLineData->lineNO==lineNO)

			return pLineData;

	}

	return NULL;

}



int GetMaxLen (HWND hWnd, PEBMLEDITDATA pMLEditData)

{

	int i;

	PEBLINEDATA pLineData = pMLEditData->head;

	

	i = 0;

	while (pLineData)

	{

		edtGetLineInfo (hWnd, pLineData);

		if (pMLEditData->sz.cx > i) 

			i = pMLEditData->sz.cx;

		pLineData = pLineData->next;

	}

	return i;

}



// get the valid unit position in the array 

// according to the pos 

// which is relative to the original point of current line (0)  

static int  edtGetNewvPos (HWND hWnd, PEBLINEDATA pLineData , int pos)

{

	int i = 0;

	int dist = MAX_IMPOSSIBLE;

	int newdist = 0;

	

	PEBMLEDITDATA pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

	edtGetLineInfo (hWnd, pLineData);



	if (pos < 0) return -1;

	if (pos > pMLEditData->sz.cx) return -2;

	for (i=0; i<pMLEditData->fit_chars + 1; i++) {

		newdist = pos - pMLEditData->dx_chars[i];

		if (newdist > 0 && newdist < dist)

			dist = newdist;

		else 

		 	return i;

	}

	return 0;

}



static void edtSetScrollInfo (HWND hWnd, PEBMLEDITDATA pMLEditData, BOOL fRedraw)

{

	SCROLLINFO 	si;

	PEBLINEDATA 	pLineData;

	RECT 		rc;

	int 		viLn;



	// Vscroll

	GetClientRect (hWnd, &rc);

	viLn = (rc.bottom - rc.top - pMLEditData->topMargin - pMLEditData->bottomMargin) / pMLEditData->lineHeight;

	

	si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;

	

	if ((GetWindowStyle(hWnd)) & EES_AUTOWRAP) 

		si.nMax = pMLEditData->wraplines - 1;

	else

		si.nMax = pMLEditData->lines - 1;



	si.nMin = 0;

	si.nPage = MIN (pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1, viLn);

	

	si.nPos = pMLEditData->StartlineDisp;

	

	if ((si.nMax < viLn) && (!si.nPos)) {

		si.nMax = 100;

		si.nMin = 0;

		si.nPage = 10;

		si.nPos = 0;

		SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);

//		EnableScrollBar (hWnd, SB_VERT, FALSE);

	} else {

		SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);

//		EnableScrollBar (hWnd, SB_VERT, TRUE);

	}

	

	if ((GetWindowStyle(hWnd)) & EES_AUTOWRAP) 

	{

		EnableScrollBar (hWnd, SB_HORZ, FALSE);

		return;

	}

	// Hscroll

	pLineData = GetLineData(pMLEditData, pMLEditData->editLine);

	si.nMax = GetMaxLen(hWnd, pMLEditData) - 1;

	si.nMin = 0;

	si.nPage = edtGetOutWidth (hWnd);

	edtGetLineInfo (hWnd, pLineData);

	si.nPos = pMLEditData->dispPos;

			

	if (si.nMax < si.nPage && (!si.nPos)) 

	{

		si.nMax = 100;

		si.nMin = 0;

		si.nPage = 10;

		si.nPos = 0;

		SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);

//		EnableScrollBar (hWnd, SB_HORZ, FALSE);

	} 

	else 

	{

		SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);

//		EnableScrollBar (hWnd, SB_HORZ, TRUE);

	}

}



//根据当前行的位置获得其所属的行号

int edtGetLineNums (PEBMLEDITDATA pMLEditData, int curline, int* line, int* wrapLine)

{

   	PEBLINEDATA  	pLineData = pMLEditData->head;

	int startline = 0;



	if (!curline)

	{

		*line = 0;

		*wrapLine = 0;

		return 0;

	}



	for (; pLineData; pLineData=pLineData->next)

	{

		if (startline+pLineData->nwrapline-1 >= curline)

		{

			*line = pLineData->lineNO;

			*wrapLine = curline - startline;

			return 0;

		}

		startline +=pLineData->nwrapline;

	}

	return -1;

}



// to set the Caret to a valid pos

BOOL edtGetCaretValid (HWND hWnd, int lineNO, int olddispPos, int newOff/*of caret*/)

{

	int line, wrapline;

	int dist = MAX_IMPOSSIBLE;

	int i, newdist = 0;

	PEBLINEDATA temp;

	PEBMLEDITDATA pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

		

	if (GetWindowStyle(hWnd) & EES_AUTOWRAP)

	{

		edtGetLineNums (pMLEditData, lineNO, &line, &wrapline);

		temp = GetLineData (pMLEditData, line);

		edtGetLineInfo (hWnd, temp);



		if( newOff >= pMLEditData->dx_chars[temp->wrapStartPos[wrapline+1]]

							- pMLEditData->dx_chars[temp->wrapStartPos[wrapline]])

		{

			if (wrapline < temp->nwrapline-1)

				pMLEditData->veditPos = temp->wrapStartPos[wrapline+1]-1;

			else

				pMLEditData->veditPos = temp->wrapStartPos[wrapline+1];

		}

		else

		{

			newOff += pMLEditData->dx_chars[temp->wrapStartPos[wrapline]];

			for (i=temp->wrapStartPos[wrapline]; i<temp->wrapStartPos[wrapline+1]+1; i++) 

			{

				newdist = newOff - pMLEditData->dx_chars[i];

				if (newdist > 0 && newdist < dist)

					dist = newdist;

				else 

				{ 

		 	 		pMLEditData->veditPos =i;

					return FALSE;

				}

			}

		}

	}

	else 

	{		

		temp = GetLineData (pMLEditData, lineNO);

		edtGetLineInfo (hWnd, temp);



		if( olddispPos > pMLEditData->sz.cx ) 

		{

			pMLEditData->veditPos = pMLEditData->fit_chars;

    	   	pMLEditData->vdispPos = edtGetStartDispPosAtEnd (hWnd, temp);

			return TRUE;

		}else 

		{

			pMLEditData->veditPos = edtGetNewvPos (hWnd, temp, newOff);

			if (pMLEditData->veditPos == -2)

				pMLEditData->veditPos = pMLEditData->fit_chars;

			pMLEditData->vdispPos = edtGetNewvPos (hWnd, temp, olddispPos);

			if (olddispPos != pMLEditData->dx_chars[pMLEditData->vdispPos])

				return TRUE;

		}

	}

	return FALSE;

}



//edit by tjb 2005-7-5

//修改原因: 当翻页后,光标消失了

/******************************************************

*

*参数:showflags 是否显示光标

*

******************************************************/

void edtSetCaretPos (HWND hWnd, BOOL showflags)

{

	int line = 0, wrapline = 0;

	PEBMLEDITDATA pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

	PEBLINEDATA temp;



	if (GetWindowStyle(hWnd) & EES_AUTOWRAP)

	{

		edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);

		temp = GetLineData (pMLEditData, line);

		edtGetLineInfo (hWnd, temp);

    	SetCaretPos (hWnd, 

				pMLEditData->dx_chars[pMLEditData->veditPos] 

					- pMLEditData->dx_chars[temp->wrapStartPos[wrapline]]

                    + pMLEditData->leftMargin, 

				(pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight

	                + pMLEditData->topMargin);

		

	}

	else

	{

		temp = GetLineData (pMLEditData, pMLEditData->editLine);

		edtGetLineInfo (hWnd, temp);

    	SetCaretPos (hWnd, 

				pMLEditData->dx_chars[pMLEditData->veditPos] 

					- pMLEditData->dx_chars[pMLEditData->vdispPos]

                    + pMLEditData->leftMargin, 

				(pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight

	                + pMLEditData->topMargin);

	}

	#if 1//add by tjb 2005-6-27

	if (showflags)//当控键无效时,不显示光标 edit by tjb 2005/5/10

		ShowCaret (hWnd);

	#endif

	

}





void edtPosProc (HWND hWnd)

{

	int line, wrapline;

	PEBMLEDITDATA pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

	PEBLINEDATA pLineData;



	if (pMLEditData->diff) 

	{		

		pMLEditData->editLine = pMLEditData->realeditLine;

		pMLEditData->vdispPos = pMLEditData->realdispPos;

		pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];

		pMLEditData->StartlineDisp = pMLEditData->realStartLine;

		pMLEditData->EndlineDisp   = pMLEditData->realEndLine;

		pMLEditData->diff = FALSE;

		

		if (GetWindowStyle(hWnd) & EES_AUTOWRAP)

		{

			edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);

			pLineData = GetLineData(pMLEditData, line);

		}

		else

			pLineData= GetLineData(pMLEditData, pMLEditData->editLine);

       	edtGetLineInfo (hWnd, pLineData);



        ActiveCaret (hWnd);

		pMLEditData->bSCROLL = TRUE;

	}

	else

		pMLEditData->bSCROLL = FALSE;

}



/* add end*/

/**********************************************************************

*功能:在多页时计算当前显示的页面的位置

*返回:百分比

***********************************************************************/

int CountPos(HWND hWnd)

{

	int pos;

	DWORD dwStyle=GetWindowStyle(hWnd);

	PEBMLEDITDATA pMLEditData=(PEBMLEDITDATA)GetWindowAdditionalData2(hWnd);



	if (dwStyle & EES_AUTOWRAP)

	{

		if (pMLEditData->StartlineDisp >= (pMLEditData->wraplines - pMLEditData->MaxlinesDisp))

			pos = 100;

		else

			pos=(100*pMLEditData->StartlineDisp)/(pMLEditData->wraplines - pMLEditData->MaxlinesDisp);

	}

	else

	{

		if (pMLEditData->StartlineDisp >= (pMLEditData->lines - pMLEditData->MaxlinesDisp))

			pos = 100;

		else

			pos=(100*pMLEditData->StartlineDisp)/(pMLEditData->lines - pMLEditData->MaxlinesDisp);

	

	}

	return pos;

}



/**********************************************************************

*功能:通知父窗口显示改变了,根据pos来同步滚动条

***********************************************************************/

void NotifyParentPos(HWND hWnd)

{

	int id = GetDlgCtrlID(hWnd);

	int pos= CountPos(hWnd);

	SendNotifyMessage(GetParent(hWnd),MSG_COMMAND,(WPARAM)MAKELONG(id,EEN_VSCROLL),(LPARAM)pos);

}



#if 0

static void edtOnEraseBackground (HWND hWnd, DWORD dwStyle, HDC hdc, const RECT* pClipRect)

{

    int i;

    RECT rcTemp;

    BOOL fGetDC = FALSE;

    PEBMLEDITDATA pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);



    if (hdc == 0) 

	{

        hdc = GetClientDC (hWnd);

        fGetDC = TRUE;

    }



    GetClientRect (hWnd, &rcTemp);



    if (pClipRect)

        ClipRectIntersect (hdc, pClipRect);

	

	if(dwStyle & EES_BKIMAGEMASK)

    {

    	BITMAP bmp;

        memset(&bmp,0,sizeof(BITMAP));

        if(pMLEditData && pMLEditData->data)

        {

            if (pClipRect)

	    	ClipRectIntersect (hdc, pClipRect);

            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;

            }

        }

    }

    else

    {

	    if (dwStyle & WS_DISABLED) 

	        SetBrushColor (hdc, PIXEL_lightgray);

	    else 

		{

	        SetBrushColor (hdc, GetWindowBkColor(hWnd));

			SetBkColor(hdc, GetWindowBkColor(hWnd));

	    }



		if (dwStyle & EES_BKTRANSPARENT)

		{

			SetBkMode(hdc, BM_TRANSPARENT);

//			FillBox (hdc, rcTemp.left, rcTemp.top, RECTW (rcTemp), RECTH (rcTemp));

⌨️ 快捷键说明

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