Top Document: comp.windows.x.intrinsics Frequently Asked Questions (FAQ) Previous Document: 27. What is and how can I implement drag and drop? Next Document: 29.!How can I identify the children of a manager widget? See reader questions & answers on this topic! - Help others by sharing your knowledge ---------------------------------------------------------------------- (Courtesy of lanzo@tekelec.com (Mark Lanzo), 7 Sep 1993) You can not add a regular C++ member function as a callback to a widget, because the callback function won't be invoked with the hidden object pointer "this" which all regular C++ member functions require. However, there is a way to get around this limitation: "static" member functions. A static member function is a function to which the usual scoping and access rules apply, but which is not in fact actually associated with a specific instance of an object, and it is NOT called using the special member function calling syntax. In particular, there is no "this" pointer supplied to the function. This means that a "static" member function is really a lot like a "friend" function except that its name is within the scope of the class (in other words, the name is prefixed with the class name). To demonstrate this, let's create a trivial class "Icon" which includes a "button" widget, and a member function "select_CB" which is installed as the "XmNselectCallback" on the button. The class declaration would then look something like this: class Icon { private: Widget button; static void select_CB(Widget, XtPointer, XtPointer); public: Icon(Widget parent); // Constructor }; For the example above, I can declare the constructor and callback functions like this: Icon::Icon (Widget parent) { button = XtVaCreateWidget ("icon_button", xmPushButtonWidgetClass, parent, NULL); // Depending on your compiler, you may be able to specify // "&Icon::select_CB" simply as "select_CB" in the // following statement: XtAddCallback (button, XmNselectCallback, &Icon::select_CB, (XtPointer) this); } void Icon::select_CB (Widget w, XtPointer userData, XtPointer callData) { Icon * icon = (Icon *) userData; // Instead of "this" // do whatever you want to do when the icon is selected ... } There are two things to note here: *) If you want the static member function to work on a specific object, you must supply the object pointer (such as by "userData" in the example). Just like a non-member function. *) Although the function is declared as "static" inside the class definition, you do NOT include the "static" keyword when you actually define the function. User Contributions:Top Document: comp.windows.x.intrinsics Frequently Asked Questions (FAQ) Previous Document: 27. What is and how can I implement drag and drop? Next Document: 29.!How can I identify the children of a manager widget? Single Page [ Usenet FAQs | Web FAQs | Documents | RFC Index ] Send corrections/additions to the FAQ Maintainer: ware@cis.ohio-state.edu
Last Update March 27 2014 @ 02:11 PM
|
Comment about this article, ask questions, or add new information about this topic: