Tip of the day implementation

Often when we start a Windows application once the application window is displayed a Tip of The Day dialog gets displayed inside the window. If you observe the dialog box in Figure, you can locate a small check box at bottom left corner. When the 'Tip of The Day' dialog appears for the first time the checkbox stands checked. If you want that next time you start the application the dialog should not appear then you can uncheck the check box before dismissing the dialog. But how would the application come to know that second time around it should not display the dialog. This is achieved by storing the status of the check box in what is known as Windows Registry. As said earlier, if the check box is unchecked when the dialog appears for the first time then the dialog would not be displayed when you run the application for the second time. However, if you still wish to pop the dialog you can do so by selecting the 'Tip' menu item.
Reading/Writing from/to Registry
The Windows registry is a hierarchical database that stores application-specific information. Data needed by Windows to properly set its configuration and run applications (and itself) are all stored in this central data storage warehouse. Each node in the Registry tree is called a key; each key contains both child keys (called subkeys) and data entries (called values). A key can have any number of values, and these values can be in any form you specify. Before an application can add data to (or read data from) the registry, it must have a handle to an open key. To open a key and get a handle to the key (HKEY), the handle of a key that's already open must be supplied. Windows defines four standard key handles that are always open: HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT and HKEY_CURRENT_USER. The keys that represent these handles are used as entry points to the registry when creating or opening all other keys. The predefined keys are used to navigate within the registry; applications that use the registry must always work within this hierarchy of predefined keys. The only keys you typically need to be concerned with are the HKEY_CURRENT_USER and HKEY_LOCAL_MACHINE keys because this is where application specific data is written. To write the status of the check box into the registry we must first open a registry key. In our program this has been achieved by the statement,
SetRegistryKey ( "Our Tip Of The Day" ) ;
This call creates the following entry in the Windows' Registry:
HKEY_CURRENT_USER\Software\Our Tip Of The Day\TIPOFTHEDAY
Thus, another branch titled 'Our Tip of The Day' gets created inside the 'HKEY_CURRENT_USER\Software' branch. This branch has one more sub-branch called 'TIPOFTHEDAY', which happens to be the name of our application. Once this branch is created we can add an entry to the registry through a statement like,
WriteProfileInt ( "Config", "SHOWTIP", m_showtip ) ;
Here the value of m_showtip variable is being written against a SHOWTIP value under the 'Config' branch of 'HKEY_CURRE-NT_USER\Software\Our Tip of The Day\TIPOFTHEDAY' key. If we are to read this entry from registry we can do so using the statement,
int showtip = GetProfileInt ( "Config", "SHOWTIP", 1 ) ;
Here the last parameter is the value that would be returned by GetProfileInt( ) if it fails to find a SHOWTIP entry in the registry . The program has three classes, an application class called myapp, a frame window class called myframe and a dialog class called tipdialog. The tipdialog class has been derived from CDialog and is reponsible for management of the tip dialog. This management includes displaying a bulb bitmap, managing the check box, writing the status of the check box into the registry and reading the tip from a file and displaying it in the dialog. When the control reaches IntInstance( ) firstly the registry key is created. Next the frame window is built and using the function GetProfileInt( ) the value against SHOWTIP is read from the registry. If the value turns out to be 1 then the tip dialog is popped up. When the dialog is popped up the 'Show Tips on StartUp' check box should stand checked. To ensure this, the value of the showtip variable is passed to the tip dialog constructor. When the tip dialog is displayed the tipdialog::OnInitDialog( ) function gets called. In this function we have opened the file 'tips.txt' and then called the tipdialog::nexttip( ) function to display the tip in the dialog box.
A Tip About the Tip Dialog
Normally all the controls present in the dialog box are placed there while creating the dialog in the Resource Editor. This also includes a bitmap that you may wish to place in the dialog box. However, in this program we have achieved the same through another technique. We have placed the 'Bulb' bitmap and written the text 'Did you know' in the dialog through tipdialog's OnPaint( ) handler.
Controlling The Control's Color
When we include a control in the dialog box in the Resource Editor, we have no control over the over the color of the control. By default the control is always displayed in gray color. If we are to change the color of the control then we can do so by writing a OnCtlColor( ) handler in the tipdialog class. Note that when the control needs to be painted a WM_CTLCOLOR message is passed to the parent window of the control. In our program since we have created the controls in the tip dialog, when it's time to paint the controls the WM_CTLCOLOR is passed to the tipdialog class. Had the controls been placed in the frame window the WM_CTLCOLOR would have been passed to the frame window class. When the OnCtlColor( ) handler gets called a pointer to the control being painted is passed to it. Using this pointer the id of the control can be obtained by calling CWnd::GetDlgCtrlID( ). In our program we have checked whether this id happens to be the id of the static control into which the tip string is to be displayed. If it is, then we have returned a handle to the stock white brush. This ensures that the static control gets painted in white color. If the id happens to be of some other control in the dialog we simply call the base class implementation of OnCtlColor ( ).
One Last Tip
While reading the tip from the 'tip.txt' file how would one tip get distinguished from another? Simple. While creating the file make sure that in one line there is only one tip. If the length of the tip is more than that of the control in the dialog box which is going to house it, then it is automatically wrapped around to the next line. If in the file if a tip begins with a space, a tab or a semicolon it is treated as a comment and doesn't get displayed in the dialog box.


No comments: