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

📄 ebmedit.c

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

		else

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

		

	    if ((dwStyle & EES_STYLESMASK) == EES_BASELINE) 

		{

	    //    SetPenColor (hdc, PIXEL_black);

	    	SetPenColor (hdc, pMLEditData->textcolor);

	        for (i = 0; i < pMLEditData->MaxlinesDisp; i++)

	        {

	            DrawHDotLine (hdc, pMLEditData->leftMargin, 

	                    pMLEditData->topMargin + pMLEditData->lineHeight * (i + 1) - 1,

	                    RECTW (rcTemp) - pMLEditData->leftMargin - pMLEditData->rightMargin);

	        }

	    }

    }

    if (fGetDC)

        ReleaseDC (hdc);

}

#endif



static int EBMLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

{   

    DWORD       dwStyle;

    HDC         hdc;

	PEBLINEDATA  	pLineData;

    PEBMLEDITDATA pMLEditData = NULL;

    dwStyle     = GetWindowStyle(hWnd);



    switch (message)

    {

        case MSG_CREATE:

		{

            if (!(pMLEditData = calloc (1, sizeof (EBMLEDITDATA)))) 

                return -1;		

			pMLEditData->lineInterval = 5;//默认

            pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;//add by tjb ,行间距离太短

			

            if ((dwStyle & EES_STYLESMASK) == EES_BASELINE) 

                pMLEditData->lineHeight += 2;

                

//          if (!CreateCaret (hWnd, NULL, 1, pMLEditData->lineHeight))

//			if (!CreateCaret (hWnd, NULL, 1, GetWindowFont(hWnd)->size))

			if (!CreateCaret (hWnd, NULL, 5, 36)) 	//创建时尽量大一些,不然在更改了字体后光标的高度调整不过来

			{

                free (pMLEditData);

                return -1;

            }



			//add by tjb 2005-7-14

			ChangeCaretSize(hWnd, 1, GetWindowFont(hWnd)->size); 

			//end add

			

            pMLEditData->status         = 0;

            pMLEditData->curtotalLen    = 0;

            pMLEditData->totalLimit		= 100*LEN_MLEDIT_BUFFER;

			pMLEditData->lineLimit		= LEN_MLEDIT_BUFFER;

            pMLEditData->editLine       = 0;

			pMLEditData->veditPos 		= 0;

			pMLEditData->dispPos 		= 0;

			pMLEditData->vdispPos		= 0;



			pMLEditData->MaxlinesDisp 	= 0;

			pMLEditData->linesDisp		= 0;

			pMLEditData->StartlineDisp  = 0;

			pMLEditData->EndlineDisp    = 0;

			

			MLEditInitBuffer (hWnd, pMLEditData, GetWindowCaption(hWnd), dwStyle);	



            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->pos_chars = (int*)calloc(LEN_MLEDIT_BUFFER, sizeof(int));

			pMLEditData->dx_chars = (int*)calloc(LEN_MLEDIT_BUFFER, sizeof(int));



			pMLEditData->fit_chars = 0;

			pMLEditData->realdispPos = 0;

			pMLEditData->realStartLine = 0;

			pMLEditData->realEndLine = 0;

			pMLEditData->diff = FALSE;

			pMLEditData->bSCROLL = FALSE;



			pMLEditData->wraplines = 0;

			

			pMLEditData->data = GetWindowAdditionalData(hWnd);//背景图句柄或文件名

			pMLEditData->textcolor = PIXEL_black;

			

			SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData);

			break;

		}

        case MSG_DESTROY:

        {

			pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

		    DestroyCaret (hWnd);

			MLEditEmptyBuffer(pMLEditData);

			free (pMLEditData->pos_chars);

			free (pMLEditData->dx_chars);

			pMLEditData->pos_chars = NULL;

			pMLEditData->dx_chars = NULL;

            free(pMLEditData); 

		}

        break;

        case EEM_SETMARGINS:

		{

			pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

			

			pMLEditData->leftMargin     = wParam;

			pMLEditData->rightMargin    = wParam;

            pMLEditData->topMargin      = lParam;

            pMLEditData->bottomMargin   = lParam;



			InvalidateRect(hWnd, NULL, TRUE);

			

			break;

        }

        case MSG_SIZECHANGED:

		{

			RECT* clientRect = (RECT*)lParam;

			pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

			

			pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;

			if ((dwStyle & EES_STYLESMASK) == EES_BASELINE) 

                pMLEditData->lineHeight += 2;	

			

			pMLEditData->MaxlinesDisp   = (RECTHP(clientRect) - pMLEditData->topMargin

										- pMLEditData->bottomMargin)/ pMLEditData->lineHeight;

			if (pMLEditData->MaxlinesDisp < 0)

				pMLEditData->MaxlinesDisp = 0;

			if (dwStyle & EES_AUTOWRAP && pMLEditData->head)

			{

		   		PEBLINEDATA  pLineData = pMLEditData->head;

				pMLEditData->wraplines = 0;

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

				{

			        calcLineInfo (hWnd, pMLEditData, pLineData);

					pMLEditData->wraplines += pLineData->nwrapline;

				}

			}

			if (dwStyle & EES_AUTOWRAP)

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

			else

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

			pMLEditData->StartlineDisp  = 0;

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

            pMLEditData->editLine       = 0;

			pMLEditData->dispPos        = 0;

			

			edtSetScrollInfo (hWnd, pMLEditData, TRUE);

			InvalidateRect(hWnd, NULL, TRUE);

		}

        break;

		

		case EEM_SETINTERVAL://设置行间距

		{

			RECT	rc;

			

			pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);



			pMLEditData->lineInterval = (int)lParam;

			pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;



			if ((dwStyle & EES_STYLESMASK) == EES_BASELINE) 

                pMLEditData->lineHeight += 2;

			GetWindowRect(hWnd, &rc);



			pMLEditData->MaxlinesDisp =	(RECTH(rc) - pMLEditData->topMargin

				- pMLEditData->bottomMargin) / pMLEditData->lineHeight;

			InvalidateRect(hWnd, NULL, TRUE);

			break;

		}

		

        case MSG_FONTCHANGED:

        {

			RECT rc;

			PEBLINEDATA pline;

			

			GetWindowRect(hWnd, &rc);

			pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

            pMLEditData->vdispPos = 0;

            pMLEditData->veditPos = 0;

			

			pMLEditData->lineHeight = GetWindowFont(hWnd)->size + pMLEditData->lineInterval;

			if (dwStyle & EES_BASELINE)

                pMLEditData->lineHeight += 2;	

			

			pMLEditData->MaxlinesDisp   = (RECTH(rc) - pMLEditData->topMargin

										- pMLEditData->bottomMargin)/ pMLEditData->lineHeight;

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



			ChangeCaretSize(hWnd, 1, GetWindowFont(hWnd)->size); 	

            edtSetCaretPos (hWnd, FALSE);

            edtSetScrollInfo (hWnd, pMLEditData, TRUE);

			

			//add by tjb 2005-7-14

			pline = pMLEditData->head;

			while(pline)

			{

				calcLineInfo(hWnd, pMLEditData, pline);

				pline = pline->next;

			}

            InvalidateRect (hWnd, NULL, TRUE);

			

			//end add

            return 0;

        }

      

        case MSG_SETCURSOR:

            if (dwStyle & WS_DISABLED) 

			{

                SetCursor (GetSystemCursor (IDC_ARROW));

                return 0;

            }

        break;



        case MSG_KILLFOCUS:

		{

			pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2 (hWnd);

            pMLEditData->status &= ~EEST_FOCUSED;

            HideCaret (hWnd);

			NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_KILLFOCUS);

		}

        break;

        

        case MSG_SETFOCUS:

		{

			pMLEditData = (PEBMLEDITDATA) GetWindowAdditionalData2 (hWnd);

            if (pMLEditData->status & EEST_FOCUSED)

                return 0;

            

            pMLEditData->status |= EEST_FOCUSED;



            // only implemented for ES_LEFT align format.

			edtSetCaretPos (hWnd, TRUE);

			

			//add by tjb 2005-6-27

			if (! (GetWindowStyle(hWnd)&WS_DISABLED))//当控键无效时,不显示光标

				ShowCaret (hWnd);

			//add end

			

            ActiveCaret (hWnd);

			NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_SETFOCUS);

		}

        break;

        

        case MSG_ENABLE:

            if ( (!(dwStyle & WS_DISABLED) && !wParam) || ((dwStyle & WS_DISABLED) && wParam) ) 

            {

                if (wParam)

					ExcludeWindowStyle(hWnd,WS_DISABLED);

                else

					IncludeWindowStyle(hWnd,WS_DISABLED);



                InvalidateRect (hWnd, NULL, TRUE);

            }

        return 0;



        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_PAINT:

        {

            int     i;

            char*   dispBuffer;

            RECT    rect;

			PLOGFONT pfont = GetWindowFont(hWnd);

			

            pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

			

            hdc = BeginPaint (hWnd);

			if (pfont)

				SelectFont (hdc, pfont);

            GetClientRect (hWnd, &rect);

			

    		if(dwStyle & EES_BKIMAGEMASK)

			{

				BITMAP 	bmp;



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

				

			    if(pMLEditData && pMLEditData->data)

			    {

			        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;

			        }

			    }

				

				SetBkMode(hdc, BM_TRANSPARENT);

				

			}

			else

			{

	            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)

			    {

			    	SetBkMode(hdc, BM_TRANSPARENT);

					FillBox(hdc, 0, 0, RECTW(rect), RECTH(rect));

			    }

				else

					FillBox(hdc, rect.left, rect.top, RECTW(rect), RECTH(rect));

			}



			

            SetTextColor (hdc, pMLEditData->textcolor);



            rect.left 	+= pMLEditData->leftMargin;

            rect.top 	+= pMLEditData->topMargin ;

            rect.right 	-= pMLEditData->rightMargin;

            rect.bottom -= pMLEditData->bottomMargin;

            ClipRectIntersect (hdc, &rect);

			for (i = pMLEditData->StartlineDisp; i <= pMLEditData->EndlineDisp; i++) 

			{

				int y, line=i, wrapline=0;

				

				if (dwStyle & EES_AUTOWRAP)

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

								

				pLineData= GetLineData(pMLEditData, line);

				if (!pLineData)

					continue;

            	edtGetLineInfo (hWnd, pLineData);

				

				if (dwStyle & EES_AUTOWRAP) 

				{

         	    	if (pMLEditData->fit_chars == 0 && 

						pMLEditData->EndlineDisp >= pMLEditData->wraplines) 

					{//FIXME

                		continue;

           		 	}

				}

				else

				{

	         	    if (pMLEditData->fit_chars == 0 && 

						pMLEditData->EndlineDisp >= pMLEditData->lines) 

					{//FIXME

                		continue;

           		 	}

				}

                dispBuffer = alloca (LEN_MLEDIT_BUFFER+1);



                //if (dwStyle & EES_AUTOWRAP)	edit by tjb 2004-4-6

                if (dwStyle & EES_PASSWORD)

                    memset (dispBuffer, pMLEditData->passwdChar, pLineData->dataEnd);

				else

					memcpy (dispBuffer, pLineData->buffer, pLineData->dataEnd);

               	dispBuffer[pLineData->dataEnd] = '\0';



				y = pMLEditData->lineHeight * (i - pMLEditData->StartlineDisp)

								+ pMLEditData->topMargin;

⌨️ 快捷键说明

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