Re: EnumChildWindows
Hi Giovanni Dicanio
I am looking over the code that you sent here and I am trying to figure out
how I can change it to meet my needs. Sorry about the time laps but I am
trying to figure it out too. Here is my code and let me know where I am going
wrong or how I can adapt it to your code if you could
<code>
// Declaration
static bool CALLBACK MyWndEnumProc(HWND hWnd, LPARAM lParam);
// The function
bool CALLBACK CMainFrame::MyWndEnumProc(HWND hWnd, LPARAM ppWndLPARAM)
{
CWnd* pWndChild = CWnd::FromHandlePermanent(hWnd);
CWnd** ppWndTemp = (CWnd**)ppWndLPARAM;
if( pWndChild && pWndChild->IsKindOf(RUNTIME_CLASS(CView)) )
{
//any view that is found will work:
*ppWndTemp = pWndChild; //pass ptr to found CView back to calling function
return FALSE; //stop enumeration
}
else
{
*ppWndTemp = NULL;
return TRUE; //continue enumeration
}
}
// The call
CWnd* pWnd;
::EnumChildWindows(m_hWnd, pMyWndEnumProc, (LPARAM)&(pWnd));
<end code>
This initializes the pointer pWnd so later in the code, tests can be done.
I am a little confused with the code that you left me at trying to
initialize the pointer pWnd. If you could enlighten me I would greatly
appreciate it. I am still reading "Beginning MFC Programming" by Ivor Horton.
This here is a little bit of a leep for me.
--
Just Al
"Giovanni Dicanio" wrote:
"David Lowndes" <DavidL@example.invalid> ha scritto nel messaggio
news:4ovoh3pd3cn00sn0e1n1v1mvgdktkmbemv@4ax.com...
bool CMainFrame::MyWndEnumProc(HWND hWnd, LPARAM ppWndLPARAM)
Non-static class member methods have an invisible "this" parameter -
so your function won't match the expected callback definition.
Either make your callback method static, or a non-class function.
I would go for the class static method, because I prefer not having global
functions (or at least having as few as possible globals :)
To the OP I would suggest doing something like this:
- create an enumerator class, whose purpose is to do the enumeration
- this class exposes a static method, to which the caller passes a pointer
to an enumerator class instance ("this")
- the static method uses the "this" pointer passed as LPARAM to forward the
call to instance-specific enumerator method
In code:
<code>
// Enumerator class for
// ::EnumChildWindows enumeration
class ChildWindowsEnumerator
{
public:
// Init
ChildWindowsEnumerator();
...
...
//
// The "global" (static) enumerator method,
// to be passed to Win32 API ::EnumChildWindows.
// Pass <i>this</i> pointer as lParam.
//
// This static method forwards the control to the
// instance-specific method, using the <i>this</i> pointer.
//
static BOOL CALLBACK EnumProc(
HWND hwnd,
LPARAM lParam /* this */
);
private:
// The instance-specific enumerator method
// (called by EnumProc)
BOOL Enumerate( HWND hwnd );
};
BOOL CALLBACK
ChildWindowsEnumerator::EnumProc(
HWND hwnd,
LPARAM lParam
)
{
ASSERT( lParam != NULL );
// Forward call to instance-specific enumerator method
return ((ChildWindowsEnumerator *)lParam)->Enumerate( hwnd );
}
BOOL
ChildWindowsEnumerator::Enumerate(
HWND hwnd
)
{
... Do your enumeration here
...
}
</code>
To be used like so:
<code>
// Instance of enumerator class
ChildWindowsEnumerator enumerator;
// Enumerate using the enumerator object
::EnumChildWindows(
hwndParent,
// Static enumeration method
ChildWindowsEnumerator::EnumProc, // maybe wants the &(...) ...
// Enumerator class instance
(LPARAM) &enumerator
);
</code>
Giovanni