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

📄 xmcombo.c

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 C
📖 第 1 页 / 共 5 页
字号:
                          ColorResources[i].Resource, Color, NULL);	    XtVaSetValues(w->combobox.LabelCtrl, 	                  ColorResources[i].Resource, Color, NULL);	    XtVaSetValues(w->combobox.ArrowCtrl, 	                  ColorResources[i].Resource, Color, NULL);	    if ( ColorResources[i].Flag & BACKGROUND )		XtVaSetValues(ScrollBar, XmNtroughColor, Color, NULL);	}	return 1;} /* UpdateColors *//* -------------------------------------------------------------------- * Liste aller vorgespiegelten Resourcen, die automatisch verarbeitet * werden koennen, ohne weiter darueber nachdenken zu muessen... */typedef enum  { EDITCTRL, LISTCTRL, LABELCTRL } CHILDCTRL;typedef enum { RO, RW, RWS, RWL, RWI, RWIGNORE } aUniqueName;typedef struct {    String                    rsc;    CHILDCTRL                 ctrl;/*    enum { RO, RW, RWS, RWL, RWI, RWIGNORE } dir; */    aUniqueName dir;    /* nur lesen, lesen&schreiben, lesen&schreiben spezial,       lesen&schreiben label, lesen&schreiben items */} MIRROR;/* Alle mit !!! gekennzeichneten Eintraege werden auf die richtigen * Namen des entsprechenden Widgets umgesetzt. */static MIRROR MirroredResources[] = {    { XmNitems,			    LISTCTRL,  RWI }, /* Urgs! */    { XmNitemCount,		    LISTCTRL,  RWIGNORE  }, /* dto.  */    { XmNlistMarginHeight,	    LISTCTRL,  RW  },     { XmNlistMarginWidth,	    LISTCTRL,  RW  },     { XmNlistSpacing,		    LISTCTRL,  RW  },     { XmNstringDirection,	    LISTCTRL,  RO  }, /* Naja? */    { XmNtopItemPosition,	    LISTCTRL,  RO  },         { XmNblinkRate,		    EDITCTRL,  RW  },     { XmNcolumns,		    EDITCTRL,  RW  },     { XmNcursorPosition,	    EDITCTRL,  RW  },     { XmNcursorPositionVisible,	    EDITCTRL,  RW  },     { XmNmarginHeight,		    EDITCTRL,  RW  },     { XmNmarginWidth,		    EDITCTRL,  RW  },     { XmNmaxLength,		    EDITCTRL,  RW  },     { XmNselectThreshold,	    EDITCTRL,  RW  },     { XmNvalue,			    EDITCTRL,  RWS },         { XmNalignment,		    LABELCTRL, RW  },     { XmNmnemonic,		    LABELCTRL, RW  },     { XmNmnemonicCharSet,	    LABELCTRL, RW  },     { XmNlabelPixmap,		    LABELCTRL, RW  },     { XmNlabelInsensitivePixmap,    LABELCTRL, RW  },     { XmNlabelString,		    LABELCTRL, RW  },     { XmNlabelType,		    LABELCTRL, RW  },     { XmNlabelMarginBottom,	    LABELCTRL, RWL }, /* !!! */    { XmNlabelMarginHeight,	    LABELCTRL, RWL }, /* !!! */    { XmNlabelMarginLeft,	    LABELCTRL, RWL }, /* !!! */    { XmNlabelMarginRight,	    LABELCTRL, RWL }, /* !!! */    { XmNlabelMarginTop,	    LABELCTRL, RWL }, /* !!! */    { XmNlabelMarginWidth,	    LABELCTRL, RWL }, /* !!! */    { XmNlabelFontList,             LABELCTRL, RWL }, /* !!! */};typedef struct {    char *from, *to;} TRANSFORMATION;static TRANSFORMATION Transformations[] = {    { XmNlabelMarginBottom, XmNmarginBottom },     { XmNlabelMarginHeight, XmNmarginHeight },     { XmNlabelMarginLeft,   XmNmarginLeft   },     { XmNlabelMarginRight,  XmNmarginRight  },     { XmNlabelMarginTop,    XmNmarginTop    },     { XmNlabelMarginWidth,  XmNmarginWidth  },     { XmNlabelFontList,     XmNfontList     },};/* -------------------------------------------------------------------- * Sobald irgendeine Resource veraendert wird, erfolgt der Aufruf * hierin als Benachrichtigung, einmal nach dem rechten zu sehen. * Parameter: *   current	    Kopie der Widget-Instanz, bevor irgendwelche *		    Resourcen veraendert oder set_values()-Methoden *		    aufgerufen wurden. *   req	    Kopie der Widget-Instanz, aber bereits mit den *		    durch XtSetValues veraenderten Werten *   new	    aktuellster Zustand der Widget-Instanz mit *		    veraenderten Werten (entweder durch XtSetValues *		    oder set_values()-Methoden der Superklasse) *   args	    Argumentenliste beim Aufruf von XtSetValues() *   NumArgs	    Anzahl der Argumente in der Liste * Ergebnis: *   True, falls Widget neu gezeichnet werden soll. */static Boolean SetValues(XmComboBoxWidget current, XmComboBoxWidget req,                          XmComboBoxWidget newW, 	                 ArgList args, Cardinal *NumArgs){    Boolean Update = False;    int i, j, MirrorSize = XtNumber(MirroredResources);    int k, TransformationSize = XtNumber(Transformations);    Arg arg;    int Flags;    /*  * Alle Resourcen, die nicht mehr nach dem Erstellen der Widget-Instanz * veraendert werden koennen. */    newW->combobox.Editable        = current->combobox.Editable;    newW->combobox.ListCtrl        = current->combobox.ListCtrl;    newW->combobox.EditCtrl        = current->combobox.EditCtrl;    newW->combobox.LabelCtrl       = current->combobox.LabelCtrl;    newW->combobox.SelectionPolicy = current->combobox.SelectionPolicy;    newW->combobox.ListSizePolicy  = current->combobox.ListSizePolicy;    newW->combobox.StaticList      = current->combobox.StaticList;    /*  * Kontrolliere nun alle Resourcen, die sich veraendert haben koennten * und gebe die neuen Einstellungen entsprechend weiter... * * Hat sich der Sensitive-Zustand veraendert? Dann muessen wir hier dafuer * sorgen, dass alle Kinder ebenfalls den neuen Zustand annehmen. */    if ( current->core.sensitive != newW->core.sensitive ) {        XtSetSensitive(newW->combobox.ListCtrl, newW->core.sensitive);        XtSetSensitive(newW->combobox.EditCtrl, newW->core.sensitive);        XtSetSensitive(newW->combobox.ArrowCtrl, newW->core.sensitive);        XtSetSensitive(newW->combobox.ListCtrl, newW->core.sensitive);        if ( !newW->core.sensitive )            ShowHideDropDownList(newW, NULL, False);    }/*  * Die ScrollBarPolicy kann nur dann geaendert werden, wenn das Listenfeld * dauerhaft dargestellt wird. */    if ( newW->combobox.ScrollBarDisplayPolicy != 	 current->combobox.ScrollBarDisplayPolicy ) {        if ( newW->combobox.StaticList )            XtVaSetValues(newW->combobox.ListCtrl,                          XmNscrollBarDisplayPolicy, newW->combobox.ScrollBarDisplayPolicy,                          NULL);        else            XtWarning("XmComboBox: ScrollBarDisplayPolicy can not be changed when StaticList == False.");    }/* Anzahl der in der Liste gleichzeitig darstellbaren Eintraege */    if ( current->combobox.VisibleItemCount !=            newW->combobox.VisibleItemCount ) {	XtVaSetValues(newW->combobox.ListCtrl, 	              XmNvisibleItemCount, newW->combobox.VisibleItemCount, 		      NULL);	Update = True;    }    if ( current->combobox.AutomaticSelection != 	 newW->combobox.AutomaticSelection ) {	XtVaSetValues(newW->combobox.ListCtrl, 	              XmNautomaticSelection, newW->combobox.AutomaticSelection, 		      NULL);    }/*  * benutzter Font: hier erhalten Liste und Eingabefeld jeweils die * gleiche Fontliste, wohingegen das Label getrennt behandelt wird. * Das macht auch Sinn, denn Liste und Eingabefeld beinhalten gleich- * artigen Text, so dass hier auch tunlichst der gleiche Font zu * benutzen ist. */    if ( current->combobox.Font != newW->combobox.Font ) {	XtVaSetValues(newW->combobox.ListCtrl, 	              XmNfontList, newW->combobox.Font, NULL);	XtVaSetValues(newW->combobox.EditCtrl, 	              XmNfontList, newW->combobox.Font, NULL);    	Update = True;    }        Flags = 0;    if ( newW->manager.top_shadow_color !=          current->manager.top_shadow_color    ) Flags |= TOPSHADOWCOLOR;    if ( newW->manager.bottom_shadow_color !=          current->manager.bottom_shadow_color ) Flags |= BOTTOMSHADOWCOLOR;    if ( newW->manager.foreground !=          current->manager.foreground          ) Flags |= FOREGROUND;    if ( newW->core.background_pixel !=          current->core.background_pixel       ) Flags |= BACKGROUND;    if ( Flags ) { UpdateColors(newW, Flags); Update = True; }            if ( newW->combobox.ArrowCursor != current->combobox.ArrowCursor ) {	if ( newW->combobox.ListVisible )	    XDefineCursor(XtDisplay(newW->combobox.PopupShell), 			    XtWindow(newW->combobox.PopupShell), 			    newW->combobox.ArrowCursor);    }/* Hier werden die vorgespiegelten Resourcen verwaltet, die in * Wirklichkeit zu einem unserer Kinder gehoeren. */     for ( i = 0; i < *NumArgs; i++ ) {/* Ist es eine vorgespiegelte Resource ? Wenn ja, dann leite die * Anfrage an das entsprechende Kind-Widget weiter. */	for ( j = 0; j < MirrorSize; j++ ) {	    if ( (strcmp(args[i].name, MirroredResources[j].rsc) == 0) ) {		switch ( MirroredResources[j].dir ) {		case RW:   /* schreibender Zugriff erlaubt */		    XtSetValues(MirroredResources[j].ctrl == LISTCTRL ?			          newW->combobox.ListCtrl :  				(MirroredResources[j].ctrl == EDITCTRL ?				  newW->combobox.EditCtrl :				  newW->combobox.LabelCtrl), 			&(args[i]), 1);		    break;		case RWS:  /* schreibender Zugriff unter Kontrolle */		    if ( strcmp(args[i].name, XmNvalue) == 0 ) {			if ( newW->combobox.Editable )			    XtSetValues(newW->combobox.EditCtrl, 			                &(args[i]), 1);		    }		    break;		case RWL: /* Transformation in andere Resource beim		             Label-Widget */		    for ( k = 0; k < TransformationSize; k++ )			if ( strcmp(args[i].name, Transformations[k].from) == 0 ) {			    arg.value = args[i].value;			    arg.name = Transformations[k].to;			    XtSetValues(newW->combobox.LabelCtrl, 			                &arg, 1);			    break;			}		    break;		case RWIGNORE: /* Zugriff auf XmNitemCount */		               /* Wird von XmNitems erledigt! */		    break;		case RWI: /* Zugriff auf XmNitems */		    for ( k = 0; k < *NumArgs; k++ )			if ( strcmp(args[k].name, XmNitemCount) == 0 ) {			    Arg MyArgs[2];			    			    MyArgs[0].name  = XmNitems;			    MyArgs[0].value = args[i].value;			    MyArgs[1].name  = XmNitemCount;			    MyArgs[1].value = args[k].value;			    XtSetValues(newW->combobox.ListCtrl,			                args, 2);			    /*XtVaSetValues(newW->combobox.ListCtrl, 			                  XmNitems,     args[i].value, 					  XmNitemCount, args[k].value, 					  NULL);*/			    break;			}		    break;		case RO:		    break;		} /* case write mode */		goto ScanForNextResource;	    } /* if entry found */	} /* for every mirrored entry */        ScanForNextResource: ;    } /* for every Arg */        if ( (newW->combobox.SquareArrow != current->combobox.SquareArrow) ||         (newW->combobox.ArrowSpacingOn != current->combobox.ArrowSpacingOn) ) {        Update = False;        DoLayout(newW);    }        return Update;} /* SetValues *//* -------------------------------------------------------------------- * Werden irgendwelche Resourcen abgefragt, so muessen wir hier erst * noch vor der Rueckkehr zum Frager klaeren, ob davon eine Resource * betroffen ist, die nur vorgespiegelt ist, da sie eigentlich einem * der Widgets gehoert, die von uns hier verwaltet werden, um daraus * eine ordentliche Combo-Box zu machen. * Parameter: *   w		    Widget-Instanz *   args	    Abgefragte Resourcen *   NumArgs	    Anzahl der abgefragten Resourcen */static void GetValuesAlmost(XmComboBoxWidget w, ArgList args,                             Cardinal *NumArgs){    int i, j, MirrorSize = XtNumber(MirroredResources);    int k, TransformationSize = XtNumber(Transformations);    Arg arg;        for ( i = 0; i < *NumArgs; i++ ) {/* Ist es eine vorgespiegelte Resource ? Wenn ja, dann leite die * Anfrage an das entsprechende Kind-Widget weiter. */	for ( j = 0; j < MirrorSize; j++ ) {	    if ( strcmp(args[i].name, MirroredResources[j].rsc) == 0 ) {		switch ( MirroredResources[j].dir ) {		case RO:		case RW:		case RWS:		case RWI:		    XtGetValues(MirroredResources[j].ctrl == LISTCTRL ?			          w->combobox.ListCtrl : 				MirroredResources[j].ctrl == EDITCTRL ?				  w->combobox.EditCtrl :				  w->combobox.LabelCtrl, 			&(args[i]), 1);		    break;		case RWL: /* Umzuleitende Resource bei Label-Widget */		    for ( k = 0; k < TransformationSize; k++ )			if ( strcmp(args[i].name, Transformations[k].from) == 0 ) {			    arg.value = args[i].value;			    arg.name = Transformations[k].to;			    XtGetValues(w->combobox.LabelCtrl, 			                (ArgList) &arg, 1);			    break;			}		    break;        case RWIGNORE:            ;		} /* case read mode */	    } /* if entry found */	} /* for every mirrored entry */    } /* for every Arg */} /* GetValuesAlmost *//* --------------------------------------------------------------------

⌨️ 快捷键说明

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