Re: How to add a CWnd subclass object to a CDialog?
On Mar 5, 12:07 pm, "Doug Harrison [MVP]" <d...@mvps.org> wrote:
On Wed, 4 Mar 2009 19:42:46 -0800 (PST), fifth <Buddhist.CH...@gmail.com>
wrote:
I have subclassed a CWnd, then I want to add it to a main CDialog.
I coded like this,
BOOL CMainDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_myWnd = new CMyWnd(this);
In MFC-land, the usual way is to make the variable an object instead of a
pointer and to use two-phase initialization to create the HWND part.
return TRUE; // return TRUE unless you set the focus to a con=
trol
}
CMyWnd::CMyWnd(CWnd* pParent)
{
RECT rect;
pParent->GetWindowRect(&rect);
RECT myrect;
myrect.left = rect.left + 5;
myrect.top = rect.top + 5;
myrect.right = rect.right - 5;
myrect.bottom = rect.bottom - 30;
Create(_T("CMyWnd"), _T("MyWnd"), WS_CHILD | WS_VISIBLE |
WS_BORDER, myrect, pParent, IDC_CMyWnd);
}
However, the inner window did't showed up as expected, did I miss sth?
The GetWindowRect function returns screen coordinates, but child window
positions are specified in terms of client coordinates. So replace the
GetWindowRect call with GetClientRect; note also that rect.left and
rect.top are zero by definition for client area coordinates. Finally, the=
re
are probably better ways to determine the offsets than pulling magic
numbers such as 5 and 30 out of a hat. See GetSystemMetrics for a start.
--
Doug Harrison
Visual C++ MVP- Hide quoted text -
- Show quoted text -
cool, it works. It's failed due to wrong location. thanks for pointing
out my false.
And, yeah, magic numbers are not flexible.