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

📄 ebtrackbar.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (dwStyle & ETBS_VERTICAL) {

			TickStart = y + LfRtBlankWidth; 

			TickGap = (h - (LfRtBlankWidth<<1)) / (float)(max - min) * TickFreq;

			TickEnd = y + h - LfRtBlankWidth;

			for (Tick = TickStart; Tick < TickEnd; Tick += TickGap) { 

				MoveTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap, (int) Tick);

				LineTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap + TickLength, (int) Tick);

	    		}

			MoveTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap, TickEnd);

			LineTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap + TickLength, TickEnd);

		} else {

		    	TickStart = x + LfRtBlankWidth; 

			TickGap = (w - (LfRtBlankWidth<<1)) / (float)(max - min) * TickFreq;

			TickEnd = x + w - LfRtBlankWidth;

			for (Tick = TickStart; Tick < TickEnd; Tick += TickGap) { 

				MoveTo (hdc, (int)Tick, y + (h>>1) + (sliderh>>1) + TickSliderGap);

				LineTo (hdc, (int)Tick, y + (h>>1) + (sliderh>>1) + TickSliderGap + TickLength);

			}

		MoveTo (hdc, TickEnd, y + (h>>1) + (sliderh>>1) + TickSliderGap);

		LineTo (hdc, TickEnd, y + (h>>1) + (sliderh>>1) + TickSliderGap + TickLength);

		}

	}



//画出焦点框;	draw the focus frame.

	if (pData->state & ETBS_FOCUS) {

		SetPenColor (hdc, PIXEL_lightwhite);

		FocusRect (hdc, x + 1, y + 1, x + w - 1, y + h - 1);

    }

}



static void EBTrackBarNormalizeParams (const HWND pCtrl, 

                EBTRACKBARDATA* pData, BOOL fNotify)

{

	int id = GetDlgCtrlID (pCtrl); 

	

	if (pData->nPos >= pData->nMax) {

		if (fNotify) {

			NotifyParent ((HWND)pCtrl, id, ETBN_CHANGE);

			NotifyParent ((HWND)pCtrl, id, ETBN_REACHMAX);

		}

		pData->nPos = pData->nMax;

		return;

	}

	if (pData->nPos <= pData->nMin) {

		if (fNotify) {

			NotifyParent ((HWND)pCtrl, id, ETBN_CHANGE);

			NotifyParent ((HWND)pCtrl, id, ETBN_REACHMIN);

		}

	        pData->nPos = pData->nMin;

		return;

	}

	if (pData->nPos < pData->nMax && pData->nPos > pData->nMin) {

		if (fNotify)

			NotifyParent ((HWND)pCtrl, id, ETBN_CHANGE);

		return;

	}

}



static int EBTrackBarCtrlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)

{

    	PEBTRACKBARDATA pData =(PEBTRACKBARDATA)GetWindowAdditionalData2 (hwnd);

    	int id = GetDlgCtrlID (hwnd);    

    	DWORD dwStyle = GetWindowStyle (hwnd);

    	

	switch (message)

	{

		case MSG_CREATE:

		{

			if (!(pData = malloc (sizeof (EBTRACKBARDATA)))) {

				fprintf(stderr, "Create trackbar control failure!\n");

				return -1;

			}

			pData->state = 0;

			pData->nMax = 10;

			pData->nMin = 0;

			pData->nPos = 3;

			pData->nLineSize = 1;

			pData->nPageSize = 5;

			pData->nTbBorder = 2;

			pData->nSliderImage = 0;

			strncpy (pData->sStartTip, "Start", TipLen - 1);

			pData->sStartTip[TipLen - 1] = '\0';

			strncpy (pData->sEndTip, "End", TipLen - 1);

			pData->sEndTip[TipLen - 1] = '\0';

			pData->nTickFreq = 1;

			pData->nFgndColor = PIXEL_black;

			pData->nImage = GetWindowAdditionalData (hwnd);

			if(pData->nImage)

			{

				switch(dwStyle & ETBS_IDTNTYPE)

				{

				case ETBS_IDTNBITMAP:

				{

					pData->nSliderImage = (DWORD)(((PBITMAP*)(pData->nImage))[0]);

                        	}

				break;

				case ETBS_IDTNBMPFILE:

				{

					

			   		PBITMAP pbmp;

			   		char bmpfile[MAX_PATH+1]; 

	            	   		char * pbmpfile;

	            	   		pbmpfile = &bmpfile[0];

	            	   

	            	   		if(pbmp = malloc (sizeof (BITMAP)))

	            	   		{	            	    

	            	   			memset(pbmp,0,sizeof(BITMAP));

            		   			PrefixFileName((const char *)(pData->nImage),"pt",pbmpfile,MAX_PATH);

  		   	   			if(!LoadBitmap( HDC_SCREEN, pbmp, pbmpfile))

			   			{

			   				pData->nSliderImage = (DWORD)pbmp;

			        		}

			        		else

			        		{

			        			free((void *)(pbmp));	

			        		}

			        	}

			   	}

				}

			}

			

			SetWindowAdditionalData2 (hwnd, (DWORD)pData);

		}

		break;

    

		case MSG_DESTROY:

		{

			if(pData)

				free((void *)(pData));

		}

		break;



		case MSG_NCPAINT:

		return 0;

       

		case MSG_GETDLGCODE:

			return DLGC_STATIC;



		case MSG_GETTEXTLENGTH:

		case MSG_GETTEXT:

		case MSG_SETTEXT:

			return -1;

		case ETBM_SETFGNDCOLOR:

		{

		}

		break;

		case ETBM_GETFGNDCOLOR:

		{

		}

		break;

		case ETBM_SETTBBORDER:

		{

		}

		break;

		case ETBM_GETTBBORDER:

		{

		}

		break;

		case MSG_PAINT:

		{

			RECT rcClient;

			HDC hdc, mem_dc;

			GetClientRect (hwnd, &rcClient);



			hdc = BeginPaint (hwnd);

			mem_dc = CreateCompatibleDC (hdc);

			EBTrackBarOnDraw (hwnd, mem_dc, (EBTRACKBARDATA *)pData, dwStyle);

			BitBlt (mem_dc, 0, 0, rcClient.right, rcClient.bottom, hdc, 0, 0, 0);

			DeleteCompatibleDC (mem_dc);

			EndPaint (hwnd, hdc);

		}

		break;



		case ETBM_SETRANGE:

			pData->nMin = MIN (wParam, lParam);

			pData->nMax = MAX (wParam, lParam);

			if (pData->nPos > pData->nMax)

				pData->nPos = pData->nMax;

			if (pData->nPos < pData->nMin)

				pData->nPos = pData->nMin;

			

			SendMessage (hwnd, ETBM_SETPOS, pData->nPos, 0);

		break;

        

		case ETBM_GETMIN:

			return pData->nMin;

	 

		case ETBM_GETMAX:	

			return pData->nMax;

	

		case ETBM_SETMIN:

			if (wParam > pData->nMax)

				pData->nMin = pData->nMax;

			pData->nMin = wParam;

			if (pData->nPos < pData->nMin)

				pData->nPos = pData->nMin;

			SendMessage (hwnd, ETBM_SETPOS, pData->nPos, 0);

		break;

	

		case ETBM_SETMAX:

			if (wParam < pData->nMin)

				pData->nMax = pData->nMin;

			pData->nMax = wParam;

			if (pData->nPos > pData->nMax)

				pData->nPos = pData->nMax;

			SendMessage (hwnd, ETBM_SETPOS, pData->nPos, 0);

		break;

		

		case ETBM_SETLINESIZE:

			pData->nLineSize = wParam;

		break;



		case ETBM_GETLINESIZE:

			return pData->nLineSize;

	    

		case ETBM_SETPAGESIZE:

			pData->nPageSize = wParam;

		break;

	    

		case ETBM_GETPAGESIZE:

			return pData->nPageSize;

	

		case ETBM_SETPOS:

			if (pData->nPos == wParam) 

				break;

			pData->nPos = wParam;

			EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

			InvalidateRect (hwnd, NULL, FALSE);

		break;

        

		case ETBM_GETPOS:

			return pData->nPos;

		break;

	    

		case ETBM_SETTICKFREQ:

			if (wParam > (pData->nMax - pData->nMin))

				break;

			pData->nTickFreq = wParam;

			InvalidateRect (hwnd, NULL, FALSE);

		break;



		case ETBM_GETTICKFREQ:

			return pData->nTickFreq;

		break;

	

		case ETBM_SETSTARTTIP:

			if ( wParam != 0 ) 

				strncpy(pData->sStartTip, (char *) wParam, TipLen - 1);

			InvalidateRect (hwnd, NULL, FALSE);

		break;



		case ETBM_SETENDTIP:

			if ( lParam != 0 ) 

				strncpy (pData->sEndTip, (char *) wParam, TipLen - 1);

			InvalidateRect (hwnd, NULL, FALSE);

		break;



		case ETBM_GETTIP:

			if ( wParam != 0)

				strcpy ((char *) wParam, pData->sStartTip);

			if ( lParam != 0)

				strcpy ((char *) lParam, pData->sEndTip);

		break;

		

		case MSG_SETFOCUS:

			if (pData->state & ETBS_FOCUS)

				break;

			pData->state |= ETBS_FOCUS;

			

			InvalidateRect (hwnd, NULL, FALSE);

		break;

	

		case MSG_KILLFOCUS:

			pData->state &= ~ETBS_FOCUS;

			InvalidateRect (hwnd, NULL, FALSE);

		break;

	

		case MSG_KEYDOWN:

			switch (LOWORD (wParam)) {

				case SCANCODE_CURSORBLOCKUP:

				case SCANCODE_CURSORBLOCKRIGHT:

					pData->nPos += pData->nLineSize;

					EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

					InvalidateRect (hwnd, NULL, FALSE);

				break;



				case SCANCODE_CURSORBLOCKDOWN:

				case SCANCODE_CURSORBLOCKLEFT:

					pData->nPos -= pData->nLineSize;

					EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

					InvalidateRect (hwnd, NULL, FALSE);

				break;

			

				case SCANCODE_PAGEDOWN:

					pData->nPos -= pData->nPageSize;

					EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

					InvalidateRect (hwnd, NULL, FALSE);

				break;

			

				case SCANCODE_PAGEUP:

					pData->nPos += pData->nPageSize;

					EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

					InvalidateRect (hwnd, NULL, FALSE);

				break;

			

				case SCANCODE_HOME:

					pData->nPos = pData->nMin;

					EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

					InvalidateRect (hwnd, NULL, FALSE);

				break;

			

				case SCANCODE_END:

					pData->nPos = pData->nMax;

					EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

					InvalidateRect (hwnd, NULL, FALSE);

				break;

			

				default:

				return 0;

			}

		break;



		case MSG_LBUTTONDOWN:

		{

			RECT    rcClient;

			int     x, y, w, h;

			int     len, pos, max, min;	

			int     mouseX, mouseY;	

			GetClientRect (hwnd, &rcClient);

			

			pData->state |= ETBS_MOUSEDOWN;

			pData->state &= ~ETBS_DRAGGED;

			

			x = rcClient.left;

			y = rcClient.top;

			w = RECTW (rcClient);

			h = RECTH (rcClient);

			mouseX = LOSWORD(lParam);

			mouseY = HISWORD(lParam);

		

			if (GetCapture() != hwnd)

				SetCapture (hwnd);

		

			if (dwStyle & ETBS_VERTICAL) {

				len = RECTH (rcClient) - (LfRtBlankWidth<<1);

				if (mouseX < x + UpDnBlankWidth || mouseX > x + w - UpDnBlankWidth)

					break;

				if ( mouseY > rcClient.bottom - LfRtBlankWidth )

					pos = 0;

				else if (mouseX < rcClient.top + LfRtBlankWidth )

					pos = len;

				else

					pos = y + h - LfRtBlankWidth - mouseY;	

			} else {

				len = RECTW (rcClient) - (LfRtBlankWidth<<1);

				if (mouseY < y+UpDnBlankWidth || mouseY > y+h-UpDnBlankWidth)

					break;

				if ( mouseX > rcClient.right - LfRtBlankWidth )

					pos = len ;

				else if (mouseX < rcClient.left + LfRtBlankWidth )

					pos = 0;

				else

					pos = mouseX - x - LfRtBlankWidth ;	

			}

			max = pData->nMax;

			min = pData->nMin;

			pData->nPos = (int)((max - min) * pos / (float)len + 0.5) + min;

			

			EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);

			InvalidateRect (hwnd, NULL, FALSE);

		}

		break;

				

		case MSG_MOUSEMOVE:

		{

			int mouseX = LOSWORD(lParam);

			int mouseY = HISWORD(lParam);

			if (pData->state & ETBS_MOUSEDOWN)

				pData->state |= ETBS_DRAGGED;

				

			ScreenToClient (hwnd, &mouseX, &mouseY);

			if (dwStyle & ETBS_VERTICAL) 

				pData->mousepos = mouseY;

			else

				pData->mousepos = mouseX;

				

			InvalidateRect (hwnd, NULL, FALSE);

		}

		break;



		case MSG_LBUTTONUP:

			pData->state &= ~ETBS_MOUSEDOWN;

			pData->state  &= ~ETBS_DRAGGED;

			if (GetCapture() == hwnd)

				ReleaseCapture ();

				

			EBTrackBarNormalizeParams (hwnd, pData, dwStyle &ETBS_NOTIFY);

			InvalidateRect (hwnd, NULL, FALSE);

		break;

	

		case MSG_FONTCHANGED:

			InvalidateRect (hwnd, NULL, FALSE);

            		return 0;

		default:

	        break;	

	}

    

	return DefaultControlProc (hwnd, message, wParam, lParam);

}





⌨️ 快捷键说明

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