boxes.
I'm reasonable familiar with what your code is doing.
Thanks so much for going to the trouble of cutting and pasting that for me.
Much appreciated.
"Giovanni Dicanio" <giovanni.dicanio@invalid.it> ha scritto nel messaggio
news:OCFInchFIHA.2004@TK2MSFTNGP06.phx.gbl...
"Ron Francis" <rfrancis@senet.com.au> ha scritto nel messaggio
news:OwW9pufFIHA.1056@TK2MSFTNGP03.phx.gbl...
But maybe you (or anyone else) can give me a good approach to something
you touched on ...
DlgGroup = GetGroup( editPoly );
DialogBoxParam( ( HINSTANCE ) ghInstance
, MAKEINTRESOURCE( IDD_CHOOSEGROUP )
// DlgGroup is both read and written to.
, ghWnd , ( DLGPROC ) ChooseGroupProc , ( LPARAM ) DlgGroup );
[...]
1. Having a static variable within the procedure to store the lParam at
WM_INITDIALOG:
2. Using a global variable that I don't need to pass in the first place.
Both global and static variables take up memory for the life of the
application so I don't like doing it either way.
You may consider developing object-oriented code, using a Dialog class.
[...]
Or you can build the infrastructure yourself.
As a working code sample, you may find my code here to be interesting:
http://www.geocities.com/giovanni.dicanio/vc/#cppdialog
There is a working C++ project that you can download, showing in code the
ideas I was trying to explain in my previous post.
There is an excerpt here (however, I think that you should consider the
original code, which is also full of comments).
----[ Dialog.h ]-------------------------------------------
<code file="Dialog.h">
class CDialog
{
public:
...
// Shows the dialog-box.
INT_PTR Show( HWND hwndParent = NULL );
...
protected:
// Handle to dialog-box.
// Derived classes can access it
HWND m_hDlg;
// Dialog-box procedure,
// to be overridden by derived classes
virtual INT_PTR Proc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
) = 0;
private:
...
// Global dialog-box procedure.
// It routes messages to the instance-specific
// dialog-box procedure.
static INT_PTR CALLBACK GlobalProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
};
</code>
----[ Dialog.cpp ]-----------------------------------------
<code file="Dialog.cpp">
INT_PTR CDialog::GlobalProc( HWND hwndDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
// Pointer to dialog class instance
CDialog * theDialog = NULL;
//
// When we receive the WM_INITDIALOG message,
// we store "this" class instance pointer into
// dialog-box private slot (DWL_USER), so we can
// retrieve "this" pointer in next calls, and route
// the messages to instance-specific dialog procedure.
//
if ( uMsg == WM_INITDIALOG )
{
//
// lParam contains the "this" instance pointer,
// passed from ::DialogBoxParam.
// Store this pointer into DWL_USER slot,
// for retrieval in future.
//
::SetWindowLong( hwndDlg, DWL_USER, (LONG) lParam );
theDialog = (CDialog *)lParam;
//
// Save dialog-box handle into proper class
// data member
//
_ASSERTE(hwndDlg != NULL);
theDialog->m_hDlg = hwndDlg;
}
else
{
// Retrieve "this" instance pointer from DWL_USER slot
theDialog = (CDialog *) ::GetWindowLong( hwndDlg,
DWL_USER );
}
// Route message to particular dialog-box instance
if ( theDialog != NULL )
{
return theDialog->Proc( hwndDlg, uMsg, wParam, lParam );
}
else
{
// Default Windows message processing
return FALSE;
}
}
INT_PTR CDialog::Show( HWND hwndParent )
{
_ASSERTE( m_hInstance != NULL );
// Run the dialog-box
INT_PTR result = ::DialogBoxParam(
m_hInstance,
MAKEINTRESOURCE( m_templateID ),
hwndParent,
CDialog::GlobalProc,
(LPARAM) this
);
return result;
}
</code>
You can derive your class from CDialog, and add data members to store your
dialog state information. You must override the Proc() virtual method in
your derived class, and handle messages there (see the CTestDialog in
sample code).
This is how the code looks like in WinMain:
<code>
// Testing dialog-box
CTestDialog dlg( hInstance );
// Set string to be shown to the user
dlg.SetUserString( _T("<< enter text>>") );
// Run the dialog-box.
// (The user can modify the above string.)
dlg.Show();
// Retrieve and show user's string, if user pressed OK button
if ( dlg.UserOK() )
{
::MessageBox( HWND_DESKTOP, dlg.GetUserString(),
_T("User entered:"), MB_OK );
}
</code>
Giovanni