
- •The ministry of education and science of ukraine kharkiv national university of radio electronics
- •1. The Basics of Microsoft Foundation Classes
- •Mfc general information
- •A Framework of mfc-program
- •Creating the Application Class
- •Creating the Frame-Window Class
- •Declaring a Message Map and instantiation of application object global instance
- •Defining a Message Map
- •Messages and their processing in mfc-programs
- •Writing Message Map Functions
- •Message boxes and menus in mfc-programs
- •2. Dialog windows
- •2.1 Modal and modeless dialog windows
- •2.2 The control elements of dialog window
- •CListBox::AddString (lpctstr lpszItem ); // Call this member function to add a string (lpszItem) to a list box;
- •3. Additional control elements in mfc-programs. Working with icons, cursors, raster images
- •3.1 Additional control elements
- •Radio buttons
- •Afx_msg void cWnd::OnVScroll( uint nSbCode, uint nPos, cScrollBar* pScrollBar ); afx_msg void cWnd::OnHScroll( uint nSbCode, uint nPos, cScrollBar* pScrollBar );
- •Afx_msg void OnVScroll( uint nSbCode, uint nPos, cScrollBar* pScrollBar );
- •Working with icons, cursors, raster images
- •The icons and cursor registration
- •Icon and cursor loading
- •4. The elements of text processing in mfc
- •The redrawing problem decision
- •5. The Elements of working with graphics
- •5.1 The graphics functions.
- •Working with brushes
- •5.2 The mapping modes and output regions
- •6. Common control elements
- •Windows Common Controls
- •6.2 The toolbar using
- •On resizing, the message wm_size is sent and the standard handler OnSize() is called.
- •The working with Spins
- •The working with slider
- •To set the range (minimum and maximum positions) for the slider in a slider control use the following function:
- •The working with progress bar
- •The tree control using in mfc programs
- •Adding elements to the tree
- •The status bars usage
- •Bool cStatusBarCtrl::SetParts( int nParts, int* pWidths );
- •Tab controls using in mfc-programs
- •Int cTabCtrl::GetCurSel(); To Selects a tab in a tab control use SetCurSel() function:
- •Int cTabCtrl::SetCurSel( int nItem );
- •The property sheets and wizards
- •7. Thread multitasking and it’s implementation in mfc
- •7.1 The basic features of multitasking
- •7.2 The Synchronization
- •7.3 The working with semaphore
- •7. 4 The working with event object
- •8. The concept of Document view
- •8.1 Introduction to document conception
- •The control of documents storing
- •8.2 The dynamic creation of objects
- •The application framework creation
- •The main window and application classes creation
- •Listing 8.1 The example of main window class in Document / View concept
- •Listing 8.2 The example of document class in Document / View concept
- •8.3 The document framework creation
- •8.4 The initiation of application
- •8.5 The standard id’s, used in Document / View concept
- •9. The special types of menu and their implementation in mfc
- •9.1 The description of special menu styles
- •The mechanism to make changes in menus
- •9.2 The dynamic and floating menus implementation
- •CMenu::CreatePopupMenu
- •The example programs to work with dynamic menus
- •10. The system of help
- •10.1 The basic information on help structures
- •The call of help
- •The file of help
- •The Help file creating
- •The example of rtf file
- •10.2 The Help system including to the mfc-program
- •Parameters:
- •Return Values: If the function succeeds, the return value is nonzero. If the function fails, the return value is zero.
- •10.3 The handlers of help messages
- •The processing of help calls
- •Wm_commandhelp message processing
- •10.4 Wm_contextmenu message processing
- •11. Manipulating Device-Independent Bitmaps
- •11.1 The types of bitmap
- •11.2 The structures included to bitmap
- •Introducing the cDib Class
- •11.3 Programming the cDib Class
- •Loading a dib into Memory
- •Other cDib Member Functions
- •Creating ShowDib program
- •Modifying ShowDib's Resources
- •Adding Code to ShowDib
- •Examining the OnFileOpen() Function
- •Examining the OnDraw() Function
- •12. The elements of Database Programming
- •12.1 Understanding Database Concepts
- •Accessing a Database
- •12.2 Mfc odbc Classes
- •Registering the Database
- •Creating the Basic Employee Application
- •Creating the Database Display
- •Adding and Deleting Records
- •12.4 Sorting and Filtering
- •12.5 Odbc versus dao
- •13. Remote Automation
- •13.1 The introduction to Remote Automation
- •13.2 The Remote Automation Connection Manager and user components
- •13.3 Automation
- •Automation Clients
- •13.4 ActiveX
- •ActiveX Document Servers
- •ActiveX Document Containers
- •ActiveX Document Views
- •13.5 ActiveX Documents
- •ActiveX Controls
- •Interaction Between Controls with Windows and ActiveX Control Containers
- •13.6 Optimization of ActiveX Controls
- •13.7 Automation Servers
- •13.8 Connection Points
- •14. Microsoft DirectX and the main items of its using
- •14.2 The Component Object Model
- •IUnknown Interface
- •DirectX com Interfaces
- •DirectDraw Architecture
- •Other DirectDraw Features
- •Width and Pitch
- •14.5 Support for 3d Surfaces in DirectX
- •14.6 Direct3d Integration with DirectDraw
- •Direct3d Device Interface
- •Direct3d Texture Interface
- •The Basics of DirectDraw
- •Step 6: Writing to the Surface.The first half of the wm_timer message in ddex1 is devoted to writing to the back buffer, as shown in the following example:
- •Loading Bitmaps on the Back Buffer
- •Step 1: Creating the Palette. The ddex2 sample first loads the palette into a structure by using the following code:
- •Step 4: Flipping the Surfaces. Flipping surfaces in the ddex2 sample is essentially the same process as that in the first example. Blitting from an Off-Screen Surface
- •Step 1: Creating the Off-Screen Surfaces. The following code is added to the doInit function in ddex3 to create the two off-screen buffers:
- •Color Keys and Bitmap Animation
- •Dynamically Modifying Palettes
- •Optimizations and Customizations
- •Blitting with Color Fill
- •Determining the Capabilities of the Display Hardware
- •Storing Bitmaps in Display Memory
- •Triple Buffering
- •15. General information on OpenGl
- •15.1 Common information
- •Primitives and Commands
- •OpenGl Graphic Control
- •Execution Model
- •15.2 Basic OpenGl Operation
- •OpenGl Correctness Tips
- •15.3 OpenGl example program
- •Ph.D. Assosiate prof. Tsimbal Alexander m. System software, summary of lectures.
2. Dialog windows
2.1 Modal and modeless dialog windows
In the dialog windows users have more possibilities to interact with applications. That interaction between dialog window and user is provided by special control elements.
Control elements: button, control button – check box, selector button – radio button, list – list box, edit control – edit box, combined list – combo box, scrolling trace – scroll bar, static element.
In MFC all control elements are described in classes, inherited from CWnd. Therefore, every element has own access to same functions, as any other type of window. These are such classes: CButton – provides buttons, check boxes, radio buttons, CListBox – list boxes, CEdit – edit boxes, CComboBox - combo boxes, CScrollBox – scroll bars, Cstatic -static elements.
Generally, dialog windows are divided into to class – modal and modeless. The feature of such division is very simple: in modal windows there is an expectation for user activity, before program can continue it’s working.
The modeless dialog window isn’t interrupts the user working.
Mainly, the dialog windows are created by resource editor usage. In that manner, user can manually locate the position of control elements as to his wish. But there is also an special scenario language for that elements.
The dialog windows are defined by CDialog class(his parent class is CWnd). All windows are instances of CDialog or other classes, usually originated from CDialog.
CDialog::CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
CDialog::CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
CDialog::CDialog( );
Here, lpszTemplateName Contains a null-terminated string that is the name of dialog-box template resource.
nIDTemplate Contains the ID number of a dialog-box template resource.
pParentWnd Points to the parent or owner window object (of type CWnd) to which the dialog object belongs. If it is NULL, the dialog object's parent window is set to the main application window.
To construct a resource-based modal dialog box, call either public form of the constructor. One form of the constructor provides access to the dialog resource by template name. The other constructor provides access by template ID number, usually with an IDD_ prefix (for example, IDD_DIALOG1).
To construct a modal dialog box from a template in memory, first invoke the parameters, protected constructor and then call InitModalIndirect.
After you construct a modal dialog box with one of the above methods, call DoModal.
To construct a modeless dialog box, use the protected form of the CDialog constructor. The constructor is protected because you must derive your own dialog-box class to implement a modeless dialog box. Construction of a modeless dialog box is a two-step process. First call the constructor; then call the Create member function to create a resource-based dialog box, or call CreateIndirect to create the dialog box from a template in memory.
Message processing for dialog windows
We said,that CDialog is originated from CWnd, so every dialog window is usual window with corresponding properties. So dialog window has the same mechanism to react on messages. We should add, that messages processing is oriented not to the main window, so every dialog window should have its own message map and own handlers.
Generally, every element in the dialog window has own identifier. If element is activated by user, the message WM_COMMAND will be send to the dialog window. To process the message, we need to assign macro command ON_COMMAND().
The most of control elements are generating special identifier, therefore there will be selected a handler.
On modal dialog window closing, there are sent messages IDCANCEL, IDOK. For that messages, MFC assumes inbuilt handlers OnCancel and OnOK, which are not included to the messages map, while user can redefine them himself.
CDialog::OnCancel(); CDialog::OnOK();
Call this member function to terminate a modal dialog box. This member function returns nResult as the return value of DoModal. You must use the EndDialog function to complete processing whenever a modal dialog box is created.
Other mechanism exists for modeless dialog windows. If you implement the OK button in a modeless dialog box, you must override the OnOK member function and call DestroyWindow from within it. Don't call the base-class member function, because it calls EndDialog, which makes the dialog box invisible but does not destroy it.
For a modeless dialog box, you must provide your own public constructor in your dialog class. To create a modeless dialog box, call your public constructor and then call the dialog object's Create member function to load the dialog resource. You can call Create either during or after the constructor call. If the dialog resource has the property WS_VISIBLE, the dialog box appears immediately. If not, you must call its ShowWindow member function.
Modeless dialog boxes are normally created and owned by a parent view or frame window — the application's main frame window or a document frame window. The default OnClose handler calls DestroyWindow, which destroys the dialog-box window. If the dialog box stands alone, with no pointers to it or other special ownership semantics, you should override PostNcDestroy to destroy the C++ dialog object. You should also override OnCancel and call DestroyWindow from within it. If not, the owner of the dialog box should destroy the C++ object when it is no longer necessary.
If we have special class for modeless windows CModeLess and its object in class CMainWin – ml, the creation of modeless window can be produced in following way:
void CMainWin::OnUnModal()
{int a1=ml.Create(IDD_DIALOG2,this); // Create() function usage with identifier IDD_DIALOG2
if(a1)MessageBox("Modeless dialog is successful");
else MessageBox("Modeless dialog is unsuccessful");
ml.ShowWindow(SW_SHOWNORMAL);
}
void CModeLess::OnCancel()
{DestroyWindow();} // closing of modeless window by DestroyWindow function.
The example of program with dialog window
Below you can see an example of dialog window creation.
That example shows dialog window with two buttons: Red and Green.
The view of dialog window is created by Resource Editor. Every resource has own identifier. That identifier is a reference to resource object, here it’s a dialog window.
First of all, we need to create a class of our dialog window, inherited from CDialog. That listing will be positioned into the header file (*.h).
Listing 2.1 The example of dialog class
class CSampleDialog : public CDialog
{public:
CSampleDialog(UINT id, CWnd *Owner): CDialog(id, Owner);
// it’s an argument passing from constructor CSampleDialog to CDialog
afx_msg void OnRed(); // first handler in dialog window
afx_msg void OnGreen(); // second handler in dialog window
DECLARE_MESSAGE_MAP()
};
So we have constructor of dialog window (which has reference to the parent class), handlers declaration and the declaration of messages map.
BEGIN_MESSAGE_MAP(CSampleDialog, CDialog)
ON_COMMAND(IDD_RED, OnDialog)
ON_COMMAND(IDD_GREEN, OnGreent)
END_MESSAGE_MAP()
Certainly, our dialog should be called from some element of basic window (described by CMainWin class), so let’s make special item to call that dialog with identifier.
Listing 2.1 The example of main window class
class CMainWin : public CFrameWnd
{public:
CMainWin();
afx_msg void OnExit(); // first handler in dialog window
afx_msg void OnDialog(); // second handler in dialog window
DECLARE_MESSAGE_MAP() };
The constructor for main window is in Listing 2.3:
Listing 2.3 Constructor for main window of the program.
CMainWin::CMainWin()
{Create(NULL, ”Demonstrate Dialog Boxes”, WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1));
}
One of two menu items is a dialog calling. That menu item should be linked to the handler to call the dialog window. It’s done in the message map:
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
ON_COMMAND(IDM_DIALOG, OnDialog)
ON_COMMAND(IDM_EXIT, OnExit)
END_MESSAGE_MAP()
Now, we only need to write the handlers:
Listing 2.4 Main window messages handlers.
afx_msg void CMainWin::OnDialog()
{CSampleDialog diagOb(IDD_DIALOG1,this);
// the creation of dialog window object by CSampleDialog constructor usage;
diagOb.DoModal();} // dialog window activation;
afx_msg void CMainWin::OnExit()
{int response;
response=MessageBox(“Quit the program?”,”Exit”,MB_YESNO);
if(response==IDYES) SendMessage(WM_CLOSE);}
The handlers of dialog window message map have very simple form:
afx_msg void CSampleDialog::OnRed(){MessageBox(“Red”,”Color Selected”);}
afx_msg void CSampleDialog::OnGreen(){MessageBox(“Green”,”Color Selected”);}
The dialog window initialization
Sometimes, the variables and control elements are initialized before dialog window opening (before that window become visible on the screen). For that, Windows automatically sends WM_INITDIALOG message. On such message reception, MFC call function OnInitDialog() – the standard CDialog handler of such prototype:
BOOL CDialog::OnInitDialog();
So, as this handler is standard, it isn’t need to include it to the message map. But before you should call function CDialog::OnInitDialog();
Some later, we’ll consider some features of Dialog window initialization for real control elements usage.