The registry is a huge database that holds all
necessary the information that the operating system needs to function and
communicate with anything that resides in the computer. It is organized as a
tree view and functions like Windows Explorer. Although it is highly used
by applications installed in the computer, you can use it to store
information related to your application and retrieve that information when
necessary.
Most of the information in the registration is
organized like a dictionary, as a combination of keys and values. In this
exercise, we will create an application with a form that the user can move
while using the application. When the user closes the application, we will
save the location of the form in the registry. The next time the user
opens the application, we will retrieve the previous location and apply it
to the form.
|
Practical Learning: Creating the Application |
|
- Start Microsoft Visual C++ or Visual Studio
- Create a Dialog-Based application named Remember1
- Delete the OK button and the TODO line
- Change the Caption of the Cancel button to Close
- Change the dialog's Border property to Resizing
- Generate the WM_DESTROY message of the dialog box
- Implement its OnDestroy event as follows:
void CRemember1Dlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
CRect rctPosition;
HKEY hk;
DWORD dwDisp;
TCHAR dwData[40];
// Retrieve the position and size of the dialog box
GetWindowRect(&rctPosition);
// Check the HKEY_CURRENT_USER key and look
// for the RemDlgPos node under
// If you don't find it, then create it
RegCreateKeyEx(HKEY_CURRENT_USER,
"RemDlgPos",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hk,
&dwDisp);
// Retrieve the value of the x coordinate of the dialog box...
sprintf(dwData, "%d", rctPosition.left);
// ... and store it in a key named Left
RegSetValueEx(hk,
"Left",
0,
REG_DWORD,
(PBYTE)&dwData,
sizeof(PDWORD));
// Retrieve the value of the y coordinate of the dialog box...
sprintf(dwData, "%d", rctPosition.top);
// ... and store it in a key named Top
RegSetValueEx(hk,
"Top",
0,
REG_DWORD,
(PBYTE)&dwData,
sizeof(PDWORD));
// Retrieve the width of the dialog box...
sprintf(dwData, "%d", rctPosition.Width());
// ... and store it in a key named Width
RegSetValueEx(hk,
"Width",
0,
REG_DWORD,
(PBYTE)&dwData,
sizeof(PDWORD));
// Retrieve the height of the dialog box...
sprintf(dwData, "%d", rctPosition.Height());
// ... and store it in a key named Height
RegSetValueEx(hk,
"Height",
0,
REG_DWORD,
(PBYTE)&dwData,
sizeof(PDWORD));
// We have finished with the registry,
// so liberate the resources we were using
RegCloseKey(hk);
}
|
- Generate the WM_CREATE message of the dialog box
- Implement its OnCreate event as follows:
int CRemember1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
// This variable will allow us to keep track of the KEY
HKEY hk;
// This variable will be used to hold the type of value
DWORD dwType;
// This variable will represent the size of the value
DWORD dwLength;
// These variables represent the position
// and the size of the dialol box
TCHAR strValueLeft[20], strValueTop[20],
strValueWidth[20], strValueHeight[20];
// Check the HKEY_CURRENT_USER node and look for
// the RemDlgPos node under it
// If it exists, open it
RegOpenKeyEx(HKEY_CURRENT_USER,
"RemDlgPos",
0,
KEY_QUERY_VALUE,
&hk);
// Retrieve the value of the Left key
RegQueryValueEx(hk,
"Left",
NULL,
NULL,
(LPBYTE)strValueLeft,
&dwLength);
// Retrieve the value of the Top key
RegQueryValueEx(hk,
"Top",
NULL,
&dwType,
(LPBYTE)strValueTop,
&dwLength);
// Retrieve the value of the Width key
RegQueryValueEx(hk,
"Width",
NULL,
&dwType,
(LPBYTE)strValueWidth,
&dwLength);
// Retrieve the value of the Height key
RegQueryValueEx(hk,
"Height",
NULL,
&dwType,
(LPBYTE)strValueHeight,
&dwLength);
// We have finished reading the registry,
// so free the resources we were using
RegCloseKey(hk);
// Use the values retrieved from the retrieve to place the dialog box
// where it was the previous time
this->SetWindowPos(&wndTop, atoi(strValueLeft), atoi(strValueTop),
atoi(strValueWidth), atoi(strValueHeight), SWP_SHOWWINDOW);
return 0;
}
|
- Execute the application
- Resize the move the dialog box around
- Close the dialog box
- Execute the application again and notice that it remembers where the
dialog box was last positioned
- Open the registry and examine the HKEY_CURRENT_USER node. Notice that it
has a new node named RegDlgPos
- Close the registry
|
|