General Wpy is a document/view model of a GUI. The most important classes are: CWinApp, the application. You must write an application class derived from this class and provide your own InitInstance method. See below. There can be only one instance of the application class. Generally, a wpy program consists of class definitions plus a single line at the end "app=MyApp()" to instantiate the application class instance. CScrollView, a scroll view class. You need to write a view class derived from one of the CView classes. CScrollView is a CView with built in scrolling capabilities. If the view does not require scrolling, the scroll bars disappear, so this class is generally useful. CDocument, a document class. If your program reads and writes documents to disk, you will need to derive a document class from this class. There are many other useful classes such as CDialog, but the above three are central to the document/view model. Although a frame class is required, it is not as important, and does not play a central role. SDI and MDI Models Wpy can create Single Document and Multi Document Interface GUI models. The SDI model means that the application has only one window with a menu on the screen. In the MDI model, there are multiple child windows clipped to fit within a single main window. Each child window can have a menu, but that menu is displayed on the main window when the child window is active. The client area of the main window is not used except as a background for the child windows. Either model may also have an unlimited number of dialog windows. The choice between SDI and MDI is made in the InitInstance method of your application class. The code is mostly boiler plate. To create a SDI application do the following: 1) class MyApp(CWinApp): 2) def InitInstance(self): 3) templ = CSingleDocTemplate(CDocument, CFrameWnd, MyView, MyMenu) 4) templ.wpyText = "Usual Hello World Demo" 5) self.AddDocTemplate(templ) 6) self.FileNew() Line 1 derives a class from CWinApp, and line 2 overrides the InitInstance method. This is required by every wpy app. Line 3 instantiates a "template" instance from an SDI template. The template specifies how to create documents, frames, views and menus for the application. You specify the classes from which these objects will be created. The document and frame classes are wpy classes, and the view class is a user-specified class derived (in this example) from CScrollView. The frame class for the SDI model must be CFrameWnd, or a user class derived from it. Line 4 just specifies a document title. Note that this is an attribute of the template. Line 5 records the template in the application. Line 6 creates a new empty document plus its frame and view. This is the same operation which would occur if the user selected File/New from a main menu. Line 6 is required, otherwise there would be no window to display after InitInstance returns. When "FileNew()" is called, the template will be used to make an instance of the four classes specified, namely CDocumnet, CFrameWnd, MyView and MyMenu. These classes will be linked together, and the window will appear on the screen. Wpy has the concept of a "Main Window". In SDI the main window is the only window. In a MDI model things are a little more complicated. You need different frame classes, and you use a different template. To create a MDI application do the following: 1) class MyApp(CWinApp): 2) def InitInstance(self): 3) templ = CMultiDocTemplate(CDocument, CMDIChildWnd, MyView, ScribFrameMenu) 4) templ.wpyText = "Scribble" 5) self.AddDocTemplate(templ) 6) main_frame = CMDIFrameWnd() 7) main_frame.wpyMenu = ScribMainFrameMenu() 8) main_frame.wpyText = "Main frame title" 9) main_frame.Create() 10) self.FileNew() Lines 1 and 2 drive an application class and override InitInstance as before. Line 3 creates a template but this time it is an MDI template with a different frame type CMDIChildWnd. This template is responsible for creating child windows. Line 5 records the doc template as before. Line 6 makes a main frame window which will act as a container for all the child windows. Many wpy objects require two-step creation, so line 9 actually creates the main window and makes it visible. Line 10 is optional in this case, since there is already a main window. It just creates a single empty child window. The menu in Line 3 is an attribute of the template, and is created for every child window. The menu in line 7 is an attribute of the main window and will only be visible if there are no child windows. Otherwise, the menu shown on the main window will be that of the active child. After InitInstance returns, all further interaction with the system will be in response to events. So you need to be sure you have set up a main window in InitInstance, and that all your derived classes have proper message handlers. If you return zero from InitInstance() the application will exit. When a document is opened, it is possible to specify a file filter as part of the document template. This controls what files will initially be visible in the open file dialog box. The filter is a tuple of two strings. The first is the name of the file type, the second is the extension for files of that type including the ".". For example, templ.wpyFilter = ("Point data files", ".pdf") There is only one CWinApp object in any WPY application, so it is a convenient place to put data attributes and methods which refer to the whole application. The single app instance is available from any instance derived from CObject (almost all WPY instances are derived from CObject) as self.wpyApp. For example, to create a beep sound from a button b1, use "b1.wpyApp.MessageBeep()". Class CWinApp Attributes wpyText, string The name of the application. This is used as a title for AfxMessageBox(), and defaults to "Python". Change in InitInstance() to get a different name. wpyMainTitle, string The base name to use as a frame title for SDI applications. Change it in InitInstance. Class CWinApp Methods AddDocTemplate(self, template) Add a document template to the application. There can be multiple templates representing multiple types of documents. GetActiveFrame(self) Return the active frame (like GetActiveFrameDV()). GetActiveFrameDV(self) Return the active frame, document, view as a tuple. For a MDI app, the returned frame is one of the CMDIChildWnd's if there are any, otherwise the main frame theApp.wpyMainFrame. For an SDI app, it returns theApp.wpyMainFrame. FileOpen(self) Open a document and create its frame and view. This is the default handler for File/Open. If multiple templates are specified, then the first template is used. FileNew(self, templ = None) Create a new empty document and create its frame and view. This is the default handler for File/New. If templ is specified, then that template will be used, and "templ" must be a valid template added to the application with AddDocTemplate(). Otherwise, the system will present a choice list of all the document types which have names "template.wpyFileNewName" specified. If no such names are specified, the first template is used. If there is only one such template, it is used and the dialog box does not appear. WindowNew(self, templ = None) For a MDI application, create another view of the active document. This is the default handler for Window/New. If templ is specified, then that template is used, and "templ" must be a valid template added to the application with AddDocTemplate(). Otherwise, the template of the current document is used. Exit(self, event = None) Exit the application. PumpMessages(self): Process any waiting window system messages. This is used to update the screen during lengthy calculations. MessageBeep(self): Make a beep sound. Methods of templates To open a document without asking the user for a file name, use the template method OpenDocumentFile(). OpenDocumentFile(self, filename) filename The file name to open. Returns the document which was opened.