/*====================================================== * CCT_lib.iwb * Custom Control Tutorial Library Source File * PART 04b * Copyright (c)T.L. McCaughn 2011 * This file may be freely shared *======================================================/ AUTODEFINE "OFF" /* I always use this - personal preference */ $include "windowssdk.inc" /* I always use this - personal preference */ $include "gdiplus.inc" /* Needed in order to use the GDI+ library */ /*----------------SECTION 1----------------------------- This section contains the required global declarations for our library -------------------------------------------------------*/ GLOBAL CreateGageRLM GLOBAL ConfigGageRLM GLOBAL SetGagePanelColorRLM GLOBAL SetGageDialDarkRLM GLOBAL SetGagePos1RLM GLOBAL SetGagePos2RLM /*=============== END OF SECTION 1 =====================*/ /*----------------SECTION 2------------------------------ This section contains declarations needed for our library along with any needed initialization ---------------------------------------------------------*/ ENUM GMsg GAGE_STYLE = 0x401 GAGE_TITLE GAGE_UNITS GAGE_RAWRNG GAGE_DIALRNG GAGE_MULTI GAGE_SETPANEL_COLOR GAGE_DIAL_DARK GAGE_CLKOFFSET GAGE_SETPOS1 GAGE_SETPOS2 ENDENUM const ROUND270B = 1 const ROUND270T = 2 const ROUND270L = 3 const ROUND270R = 4 const ROUND360SGL = 5 const ROUND360DBL = 6 const ROUNDCLOCK12 = 7 const ROUNDCLOCK24 = 8 const ROUND2PENV = 9 const ROUND2PENH = 10 TYPE GAGEPARAMS INT sStyle /*GAGE_STYLE*/ STRING sName /*GAGE_TITLE*/ STRING sMultiUnits /*GAGE_UNITS*/ INT nRangeMinAct /*GAGE_RAWRNG*/ INT nRangeMaxAct /* " */ INT nRangeMinDial /*GAGE_DIALRNG*/ INT nRangeMaxDial /* " */ INT nDialMulti /*GAGE_MULTI*/ UINT nPanelColor /*GAGE_SETPANEL_COLOR*/ UINT nGageColor /*GAGE_DIAL_DARK*/ INT clockoffset /*GAGE_CLKOFFSET*/ INT nPos1 /*GAGE_SETPOS1*/ INT nPos2 /*GAGE_SETPOS2*/ FLOAT nAngleStart FLOAT nAngleEnd ENDTYPE /*=============== END OF SECTION 2 ======================*/ /*----------------SECTION 3------------------------------ This section contains the control's message handler ---------------------------------------------------------*/ SUB MyProc_CC(hWnd:UINT, uMsg:UINT, wParam:UINT, lParam:ANYTYPE),UINT POINTER g_dat /*GAGEPARAMS*/ g_dat = GetWindowLong(hWnd, GWL_USERDATA) SELECT uMsg CASE WM_CREATE g_dat = NEW GAGEPARAMS SetWindowLong(hWnd, GWL_USERDATA, g_dat) 'init g_dat #g_dat.sStyle = 0 #g_dat.sName = "" #g_dat.sMultiUnits = "" #g_dat.nRangeMinAct = 0 #g_dat.nRangeMaxAct = 100 #g_dat.nRangeMinDial = -1 #g_dat.nRangeMaxDial = 14 #g_dat.nDialMulti = 10 int r1,g1,b1 GageunRGBLM(GetSysColor(0), r1, g1, b1) #g_dat.nPanelColor = RGBA(r1,g1,b1,255) #g_dat.nGageColor = RGBA(255,255,255,255) #g_dat.clockoffset = 0 #g_dat.nAngleStart = -230 #g_dat.nAngleEnd = 50 RETURN 0 CASE WM_DESTROY FreeHeap(g_dat) RETURN 0 CASE WM_PAINT RETURN 0 CASE WM_ERASEBKGND RETURN 0 CASE WM_SETFOCUS RETURN 0 CASE WM_KILLFOCUS RETURN 0 CASE GAGE_SETPOS1 SELECT #g_dat.sStyle CASE ROUNDCLOCK12 CASE& ROUNDCLOCK24 DEFAULT #g_dat.nPos1 = wParam ENDSELECT InvalidateRect(hWnd, NULL, FALSE) RETURN 0 CASE GAGE_SETPOS2 SELECT #g_dat.sStyle DEFAULT #g_dat.nPos2 = wParam InvalidateRect(hWnd, NULL, FALSE) ENDSELECT RETURN 0 CASE GAGE_SETPANEL_COLOR #g_dat.nPanelColor = wParam InvalidateRect(hWnd, NULL, FALSE) RETURN 0 CASE GAGE_DIAL_DARK #g_dat.nGageColor = RGB(140,140,140) InvalidateRect(hWnd, NULL, FALSE) RETURN 0 CASE GAGE_TITLE #g_dat.sName=##lParam RETURN 0 CASE GAGE_UNITS #g_dat.sMultiUnits=##lParam RETURN 0 CASE GAGE_MULTI #g_dat.nDialMulti=#lParam RETURN 0 CASE GAGE_RAWRNG #g_dat.nRangeMinAct = wParam #g_dat.nRangeMaxAct = #lParam RETURN 0 CASE GAGE_CLKOFFSET #g_dat.clockoffset=wParam RETURN 0 CASE GAGE_STYLE #g_dat.sStyle = #lParam RETURN 0 CASE GAGE_DIALRNG #g_dat.nRangeMinDial = wParam #g_dat.nRangeMaxDial = #lParam INT rot SELECT #g_dat.sStyle CASE ROUND270B rot=0 CASE ROUND270T rot=180 CASE ROUND270R rot=270 CASE ROUND270L rot=90 ENDSELECT SELECT #g_dat.sStyle CASE ROUND270B CASE& ROUND270R CASE& ROUND270L CASE& ROUND270T IF #g_dat.nRangeMaxDial-#g_dat.nRangeMinDial <1 | #g_dat.nRangeMaxDial-#g_dat.nRangeMinDial >15 #g_dat.nAngleStart = -230+rot #g_dat.nAngleEnd = 50+rot #g_dat.nRangeMinDial = 0 #g_dat.nRangeMaxDial = 0 ENDIF SELECT #g_dat.nRangeMaxDial-#g_dat.nRangeMinDial CASE 1 CASE& 2 CASE& 4 CASE& 5 CASE& 7 CASE& 8 CASE& 10 CASE& 14 '280 #g_dat.nAngleStart = -230+rot #g_dat.nAngleEnd = 50+rot CASE 3 '282 #g_dat.nAngleStart = -231+rot #g_dat.nAngleEnd = 51+rot CASE 6 CASE& 9 CASE& 12 '288 #g_dat.nAngleStart = -234+rot #g_dat.nAngleEnd = 54+rot CASE 11 CASE& 13 '286 #g_dat.nAngleStart = -233+rot #g_dat.nAngleEnd = 53+rot CASE 15 #g_dat.nAngleStart = -225+rot #g_dat.nAngleEnd = 45+rot ENDSELECT CASE ROUND360SGL CASE& ROUND360DBL CASE& ROUNDCLOCK12 CASE& ROUNDCLOCK24 '360 #g_dat.nAngleStart = -90 #g_dat.nAngleEnd = 270 ENDSELECT RETURN 0 ENDSELECT RETURN(DefWindowProc(hWnd, uMsg, wParam, lParam)) ENDsub /*=============== END OF SECTION 3 ======================*/ /*----------------SECTION 4------------------------------- This section contains the routine used to register the control with the OS. ----------------------------------------------------------*/ SUB RegisterGage1ClassLM() STATIC INT classRegistered = 0 IF classRegistered = 0 WNDCLASSEX wc wc.cbSize = len(WNDCLASSEX) wc.style = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW wc.lpfnWndProc = &MyProc_CC wc.cbClsExtra = 0 wc.cbWndExtra = 0 wc.hInstance = _hinstance wc.hIcon = NULL wc.hCursor = LoadCursor(NULL, IDC_ARROW) wc.hbrBackground = GetStockObject(WHITE_BRUSH) wc.lpszMenuName = NULL wc.lpszClassName = "LM_Gage1_Class" wc.hIconSm = NULL classRegistered = RegisterClassEx(wc) ENDIF ENDSUB /*=============== END OF SECTION 4 =======================*/ /*----------------SECTION 5------------------------------- This section contains the command used to create a control. -----------------------------------------------------------*/ SUB CreateGageRLM(win as WINDOW,l as INT,t as INT,d as INT,id as UINT ) RegisterGage1ClassLM() CONTROLEX win,"LM_Gage1_Class","",l,t,d,d,0,0,id RETURN ENDSUB /*=============== END OF SECTION 5 =========================*/ /*----------------SECTION 6--------------------------------- This section contains the control's configuration commands ------------------------------------------------------------*/ SUB ConfigGageRLM(win as WINDOW,_ style as int,_ title as string,_ u as string,_ rawmin as int,_ rawmax as int,_ dialmin as int,_ dialmax as int,_ sf as int,_ id as UINT ) SENDMESSAGE(win, GAGE_STYLE, 0,style, id) STRING ttemp=title SELECT style CASE ROUND270B CASE& ROUND270T CASE& ROUND270R CASE& ROUND270L IF (dialmax-dialmin < 1) | (dialmax-dialmin > 15) dialmin=0:dialmax=1 ttemp="Dial Min/Max Error!" ENDIF ENDSELECT SENDMESSAGE(win, GAGE_TITLE, 0,ttemp, id) SENDMESSAGE(win, GAGE_UNITS, 0,u, id) SELECT style CASE ROUNDCLOCK12 CASE& ROUNDCLOCK24 SENDMESSAGE(win, GAGE_CLKOFFSET, dialmin,0, id) DEFAULT SENDMESSAGE(win, GAGE_RAWRNG, rawmin,rawmax, id) ENDSELECT SELECT style CASE ROUND360SGL CASE& ROUND360DBL CASE& ROUND2PENV CASE& ROUND2PENH dialmin = 0 : dialmax = 10 ENDSELECT SENDMESSAGE(win, GAGE_DIALRNG, dialmin,dialmax, id) SENDMESSAGE(win, GAGE_MULTI, 0,sf, id) GageInvalidateBackground(win, id) RETURN ENDSUB SUB SetGagePanelColorRLM(win as WINDOW,id as UINT,pnlcolor as UINT) SENDMESSAGE(win, GAGE_SETPANEL_COLOR, pnlcolor,0, id) RETURN ENDSUB SUB SetGageDialDarkRLM(win as WINDOW,id as UINT) SENDMESSAGE(win, GAGE_DIAL_DARK, 0,0, id) RETURN ENDSUB /*=============== END OF SECTION 6 =========================*/ /*----------------SECTION 7--------------------------------- This section contains routines for updating the pointer positions of the control ------------------------------------------------------------*/ SUB SetGagePos1RLM(win as WINDOW,id as UINT,pos as INT) SENDMESSAGE(win, GAGE_SETPOS1, pos,0, id) RETURN ENDSUB SUB SetGagePos2RLM(win as WINDOW,id as UINT,pos as INT) SENDMESSAGE(win, GAGE_SETPOS2, pos,0, id) RETURN ENDSUB /*=============== END OF SECTION 7 =========================*/ /*----------------SECTION 8---------------------------------- This section contains routines that support the control's message handler ------------------------------------------------------------*/ SUB GageInvalidateBackground(win as WINDOW, id as UINT) ENDSUB /*=============== END OF SECTION 8 =========================*/ /*----------------SECTION 9--------------------------------- This section contains routine for the control to talk to its parent -------------------------------------------------------------*/ /*=============== END OF SECTION 9 ===========================*/ /*----------------SECTION 10---------------------------------- This section contains any required utility routines --------------------------------------------------------------*/ SUB GageunRGBLM(col as uint, r as int byref, g as int byref, b as int byref) r=col%256 :'Red g=(col%65536)/256 :'Green b=col/65536 :'Blue RETURN ENDSUB /*=============== END OF SECTION 10 ==========================*/