📄 tkscale.c
字号:
/* * tkScale.c -- * * This module implements a scale widgets for the Tk toolkit. * A scale displays a slider that can be adjusted to change a * value; it also displays numeric labels and a textual label, * if desired. * * The modifications to use floating-point values are based on * an implementation by Paul Mackerras. The -variable option * is due to Henning Schulzrinne. All of these are used with * permission. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tkScale.c 1.88 97/07/31 09:11:57 */#include "tkPort.h"#include "default.h"#include "tkInt.h"#include "tclMath.h"#include "tkScale.h"static Tk_ConfigSpec configSpecs[] = { {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground", DEF_SCALE_ACTIVE_BG_COLOR, Tk_Offset(TkScale, activeBorder), TK_CONFIG_COLOR_ONLY}, {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground", DEF_SCALE_ACTIVE_BG_MONO, Tk_Offset(TkScale, activeBorder), TK_CONFIG_MONO_ONLY}, {TK_CONFIG_BORDER, "-background", "background", "Background", DEF_SCALE_BG_COLOR, Tk_Offset(TkScale, bgBorder), TK_CONFIG_COLOR_ONLY}, {TK_CONFIG_BORDER, "-background", "background", "Background", DEF_SCALE_BG_MONO, Tk_Offset(TkScale, bgBorder), TK_CONFIG_MONO_ONLY}, {TK_CONFIG_DOUBLE, "-bigincrement", "bigIncrement", "BigIncrement", DEF_SCALE_BIG_INCREMENT, Tk_Offset(TkScale, bigIncrement), 0}, {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL, (char *) NULL, 0, 0}, {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL, (char *) NULL, 0, 0}, {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", DEF_SCALE_BORDER_WIDTH, Tk_Offset(TkScale, borderWidth), 0}, {TK_CONFIG_STRING, "-command", "command", "Command", DEF_SCALE_COMMAND, Tk_Offset(TkScale, command), TK_CONFIG_NULL_OK}, {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor", DEF_SCALE_CURSOR, Tk_Offset(TkScale, cursor), TK_CONFIG_NULL_OK}, {TK_CONFIG_INT, "-digits", "digits", "Digits", DEF_SCALE_DIGITS, Tk_Offset(TkScale, digits), 0}, {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL, (char *) NULL, 0, 0}, {TK_CONFIG_FONT, "-font", "font", "Font", DEF_SCALE_FONT, Tk_Offset(TkScale, tkfont), 0}, {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground", DEF_SCALE_FG_COLOR, Tk_Offset(TkScale, textColorPtr), TK_CONFIG_COLOR_ONLY}, {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground", DEF_SCALE_FG_MONO, Tk_Offset(TkScale, textColorPtr), TK_CONFIG_MONO_ONLY}, {TK_CONFIG_DOUBLE, "-from", "from", "From", DEF_SCALE_FROM, Tk_Offset(TkScale, fromValue), 0}, {TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground", "HighlightBackground", DEF_SCALE_HIGHLIGHT_BG, Tk_Offset(TkScale, highlightBgColorPtr), 0}, {TK_CONFIG_COLOR, "-highlightcolor", "highlightColor", "HighlightColor", DEF_SCALE_HIGHLIGHT, Tk_Offset(TkScale, highlightColorPtr), 0}, {TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness", "HighlightThickness", DEF_SCALE_HIGHLIGHT_WIDTH, Tk_Offset(TkScale, highlightWidth), 0}, {TK_CONFIG_STRING, "-label", "label", "Label", DEF_SCALE_LABEL, Tk_Offset(TkScale, label), TK_CONFIG_NULL_OK}, {TK_CONFIG_PIXELS, "-length", "length", "Length", DEF_SCALE_LENGTH, Tk_Offset(TkScale, length), 0}, {TK_CONFIG_UID, "-orient", "orient", "Orient", DEF_SCALE_ORIENT, Tk_Offset(TkScale, orientUid), 0}, {TK_CONFIG_RELIEF, "-relief", "relief", "Relief", DEF_SCALE_RELIEF, Tk_Offset(TkScale, relief), 0}, {TK_CONFIG_INT, "-repeatdelay", "repeatDelay", "RepeatDelay", DEF_SCALE_REPEAT_DELAY, Tk_Offset(TkScale, repeatDelay), 0}, {TK_CONFIG_INT, "-repeatinterval", "repeatInterval", "RepeatInterval", DEF_SCALE_REPEAT_INTERVAL, Tk_Offset(TkScale, repeatInterval), 0}, {TK_CONFIG_DOUBLE, "-resolution", "resolution", "Resolution", DEF_SCALE_RESOLUTION, Tk_Offset(TkScale, resolution), 0}, {TK_CONFIG_BOOLEAN, "-showvalue", "showValue", "ShowValue", DEF_SCALE_SHOW_VALUE, Tk_Offset(TkScale, showValue), 0}, {TK_CONFIG_PIXELS, "-sliderlength", "sliderLength", "SliderLength", DEF_SCALE_SLIDER_LENGTH, Tk_Offset(TkScale, sliderLength), 0}, {TK_CONFIG_RELIEF, "-sliderrelief", "sliderRelief", "SliderRelief", DEF_SCALE_SLIDER_RELIEF, Tk_Offset(TkScale, sliderRelief), TK_CONFIG_DONT_SET_DEFAULT}, {TK_CONFIG_UID, "-state", "state", "State", DEF_SCALE_STATE, Tk_Offset(TkScale, state), 0}, {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_SCALE_TAKE_FOCUS, Tk_Offset(TkScale, takeFocus), TK_CONFIG_NULL_OK}, {TK_CONFIG_DOUBLE, "-tickinterval", "tickInterval", "TickInterval", DEF_SCALE_TICK_INTERVAL, Tk_Offset(TkScale, tickInterval), 0}, {TK_CONFIG_DOUBLE, "-to", "to", "To", DEF_SCALE_TO, Tk_Offset(TkScale, toValue), 0}, {TK_CONFIG_COLOR, "-troughcolor", "troughColor", "Background", DEF_SCALE_TROUGH_COLOR, Tk_Offset(TkScale, troughColorPtr), TK_CONFIG_COLOR_ONLY}, {TK_CONFIG_COLOR, "-troughcolor", "troughColor", "Background", DEF_SCALE_TROUGH_MONO, Tk_Offset(TkScale, troughColorPtr), TK_CONFIG_MONO_ONLY}, {TK_CONFIG_STRING, "-variable", "variable", "Variable", DEF_SCALE_VARIABLE, Tk_Offset(TkScale, varName), TK_CONFIG_NULL_OK}, {TK_CONFIG_PIXELS, "-width", "width", "Width", DEF_SCALE_WIDTH, Tk_Offset(TkScale, width), 0}, {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, (char *) NULL, 0, 0}};/* * Forward declarations for procedures defined later in this file: */static void ComputeFormat _ANSI_ARGS_((TkScale *scalePtr));static void ComputeScaleGeometry _ANSI_ARGS_((TkScale *scalePtr));static int ConfigureScale _ANSI_ARGS_((Tcl_Interp *interp, TkScale *scalePtr, int argc, char **argv, int flags));static void DestroyScale _ANSI_ARGS_((char *memPtr));static void ScaleCmdDeletedProc _ANSI_ARGS_(( ClientData clientData));static void ScaleEventProc _ANSI_ARGS_((ClientData clientData, XEvent *eventPtr));static char * ScaleVarProc _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, char *name1, char *name2, int flags));static int ScaleWidgetCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, char **argv));static void ScaleWorldChanged _ANSI_ARGS_(( ClientData instanceData));/* * The structure below defines scale class behavior by means of procedures * that can be invoked from generic window code. */static TkClassProcs scaleClass = { NULL, /* createProc. */ ScaleWorldChanged, /* geometryProc. */ NULL /* modalProc. */};/* *-------------------------------------------------------------- * * Tk_ScaleCmd -- * * This procedure is invoked to process the "scale" Tcl * command. See the user documentation for details on what * it does. * * Results: * A standard Tcl result. * * Side effects: * See the user documentation. * *-------------------------------------------------------------- */intTk_ScaleCmd(clientData, interp, argc, argv) ClientData clientData; /* Main window associated with * interpreter. */ Tcl_Interp *interp; /* Current interpreter. */ int argc; /* Number of arguments. */ char **argv; /* Argument strings. */{ Tk_Window tkwin = (Tk_Window) clientData; register TkScale *scalePtr; Tk_Window new; if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " pathName ?options?\"", (char *) NULL); return TCL_ERROR; } new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL); if (new == NULL) { return TCL_ERROR; } scalePtr = TkpCreateScale(new); /* * Initialize fields that won't be initialized by ConfigureScale, * or which ConfigureScale expects to have reasonable values * (e.g. resource pointers). */ scalePtr->tkwin = new; scalePtr->display = Tk_Display(new); scalePtr->interp = interp; scalePtr->widgetCmd = Tcl_CreateCommand(interp, Tk_PathName(scalePtr->tkwin), ScaleWidgetCmd, (ClientData) scalePtr, ScaleCmdDeletedProc); scalePtr->orientUid = NULL; scalePtr->vertical = 0; scalePtr->width = 0; scalePtr->length = 0; scalePtr->value = 0; scalePtr->varName = NULL; scalePtr->fromValue = 0; scalePtr->toValue = 0; scalePtr->tickInterval = 0; scalePtr->resolution = 1; scalePtr->bigIncrement = 0.0; scalePtr->command = NULL; scalePtr->repeatDelay = 0; scalePtr->repeatInterval = 0; scalePtr->label = NULL; scalePtr->labelLength = 0; scalePtr->state = tkNormalUid; scalePtr->borderWidth = 0; scalePtr->bgBorder = NULL; scalePtr->activeBorder = NULL; scalePtr->sliderRelief = TK_RELIEF_RAISED; scalePtr->troughColorPtr = NULL; scalePtr->troughGC = None; scalePtr->copyGC = None; scalePtr->tkfont = NULL; scalePtr->textColorPtr = NULL; scalePtr->textGC = None; scalePtr->relief = TK_RELIEF_FLAT; scalePtr->highlightWidth = 0; scalePtr->highlightBgColorPtr = NULL; scalePtr->highlightColorPtr = NULL; scalePtr->inset = 0; scalePtr->sliderLength = 0; scalePtr->showValue = 0; scalePtr->horizLabelY = 0; scalePtr->horizValueY = 0; scalePtr->horizTroughY = 0; scalePtr->horizTickY = 0; scalePtr->vertTickRightX = 0; scalePtr->vertValueRightX = 0; scalePtr->vertTroughX = 0; scalePtr->vertLabelX = 0; scalePtr->cursor = None; scalePtr->takeFocus = NULL; scalePtr->flags = NEVER_SET; Tk_SetClass(scalePtr->tkwin, "Scale"); TkSetClassProcs(scalePtr->tkwin, &scaleClass, (ClientData) scalePtr); Tk_CreateEventHandler(scalePtr->tkwin, ExposureMask|StructureNotifyMask|FocusChangeMask, ScaleEventProc, (ClientData) scalePtr); if (ConfigureScale(interp, scalePtr, argc-2, argv+2, 0) != TCL_OK) { goto error; } interp->result = Tk_PathName(scalePtr->tkwin); return TCL_OK; error: Tk_DestroyWindow(scalePtr->tkwin); return TCL_ERROR;}/* *-------------------------------------------------------------- * * ScaleWidgetCmd -- * * This procedure is invoked to process the Tcl command * that corresponds to a widget managed by this module. * See the user documentation for details on what it does. * * Results: * A standard Tcl result. * * Side effects: * See the user documentation. * *-------------------------------------------------------------- */static intScaleWidgetCmd(clientData, interp, argc, argv) ClientData clientData; /* Information about scale * widget. */ Tcl_Interp *interp; /* Current interpreter. */ int argc; /* Number of arguments. */ char **argv; /* Argument strings. */{ register TkScale *scalePtr = (TkScale *) clientData; int result = TCL_OK; size_t length; int c; if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " option ?arg arg ...?\"", (char *) NULL); return TCL_ERROR; } Tcl_Preserve((ClientData) scalePtr); c = argv[1][0]; length = strlen(argv[1]); if ((c == 'c') && (strncmp(argv[1], "cget", length) == 0) && (length >= 2)) { if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " cget option\"", (char *) NULL); goto error; } result = Tk_ConfigureValue(interp, scalePtr->tkwin, configSpecs, (char *) scalePtr, argv[2], 0); } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0) && (length >= 3)) { if (argc == 2) { result = Tk_ConfigureInfo(interp, scalePtr->tkwin, configSpecs, (char *) scalePtr, (char *) NULL, 0); } else if (argc == 3) { result = Tk_ConfigureInfo(interp, scalePtr->tkwin, configSpecs, (char *) scalePtr, argv[2], 0); } else { result = ConfigureScale(interp, scalePtr, argc-2, argv+2, TK_CONFIG_ARGV_ONLY); } } else if ((c == 'c') && (strncmp(argv[1], "coords", length) == 0) && (length >= 3)) { int x, y ; double value; if ((argc != 2) && (argc != 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " coords ?value?\"", (char *) NULL); goto error; } if (argc == 3) { if (Tcl_GetDouble(interp, argv[2], &value) != TCL_OK) { goto error; } } else { value = scalePtr->value; } if (scalePtr->vertical) { x = scalePtr->vertTroughX + scalePtr->width/2 + scalePtr->borderWidth; y = TkpValueToPixel(scalePtr, value); } else { x = TkpValueToPixel(scalePtr, value); y = scalePtr->horizTroughY + scalePtr->width/2 + scalePtr->borderWidth; } sprintf(interp->result, "%d %d", x, y); } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) { double value; int x, y; if ((argc != 2) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " get ?x y?\"", (char *) NULL); goto error; } if (argc == 2) { value = scalePtr->value; } else { if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) || (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) { goto error; } value = TkpPixelToValue(scalePtr, x, y); } sprintf(interp->result, scalePtr->format, value); } else if ((c == 'i') && (strncmp(argv[1], "identify", length) == 0)) { int x, y, thing; if (argc != 4) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -