How to get the parent structure as Spy++ gives it?
up vote
2
down vote
favorite
In our code, a C++ class that is derived from CMDIChildWnd
is instantiated and its Create()
function is called, which is actually CMDIChildWnd::Create()
. The 5th parameter pParentWnd
is being set to a CMDIFrameWnd
object. This in turn (within the MFC code) sets up a CREATESTRUCT
object, sets it's hwndParent
to that parameter and then calls PreCreateWindow()
with that object passed as one of the parameters.
However, when going up the parent window list using CWnd::GetParent()
(original) GetAncestor(hwnd, GA_PARENT)
(just a try, since the original didn't work and this code is 20+ years old) and even GetWindow(hwnd, GW_OWNER)
just to see if it was setting the window's owner for some reason. In each case, I do not see the handle which is associated with the CMDIFrameWnd
object. Instead, the parent shown is the desktop, and owner is NULL.
Using Spy++, it shows what I was expecting. How would I get the layout given by Spy++ programmatically?
windows winapi mfc
|
show 1 more comment
up vote
2
down vote
favorite
In our code, a C++ class that is derived from CMDIChildWnd
is instantiated and its Create()
function is called, which is actually CMDIChildWnd::Create()
. The 5th parameter pParentWnd
is being set to a CMDIFrameWnd
object. This in turn (within the MFC code) sets up a CREATESTRUCT
object, sets it's hwndParent
to that parameter and then calls PreCreateWindow()
with that object passed as one of the parameters.
However, when going up the parent window list using CWnd::GetParent()
(original) GetAncestor(hwnd, GA_PARENT)
(just a try, since the original didn't work and this code is 20+ years old) and even GetWindow(hwnd, GW_OWNER)
just to see if it was setting the window's owner for some reason. In each case, I do not see the handle which is associated with the CMDIFrameWnd
object. Instead, the parent shown is the desktop, and owner is NULL.
Using Spy++, it shows what I was expecting. How would I get the layout given by Spy++ programmatically?
windows winapi mfc
1
AfxGetMainWnd()
should return the main frame window.CMDIChildWnd
is usually passed toCMultiDocTemplate
, I am not familiar with the usage you are describing.
– Barmak Shemirani
Nov 12 at 7:44
Use Spy++ to see the true window hierarchy. That will reflect the relationship without any code in between, that may or may not do something to be helpful.
– IInspectable
Nov 12 at 10:11
@IInspectable, I have used spy++, and it shows what I want to see, but how do I get that answer in code?
– Adrian
Nov 12 at 15:03
@BarmakShemirani, I'm not looking for the rootCMDIFrameWnd
. I'm looking for the one that is the parent to a particularCMDIChildWnd
. We have someCMDIFrameWnd
which are parented to otherCMDIFrameWnd
windows.
– Adrian
Nov 12 at 16:07
MDI is odd, it comes with its own API. See if Multiple Document Interface has the answers you are looking for.
– IInspectable
Nov 12 at 16:20
|
show 1 more comment
up vote
2
down vote
favorite
up vote
2
down vote
favorite
In our code, a C++ class that is derived from CMDIChildWnd
is instantiated and its Create()
function is called, which is actually CMDIChildWnd::Create()
. The 5th parameter pParentWnd
is being set to a CMDIFrameWnd
object. This in turn (within the MFC code) sets up a CREATESTRUCT
object, sets it's hwndParent
to that parameter and then calls PreCreateWindow()
with that object passed as one of the parameters.
However, when going up the parent window list using CWnd::GetParent()
(original) GetAncestor(hwnd, GA_PARENT)
(just a try, since the original didn't work and this code is 20+ years old) and even GetWindow(hwnd, GW_OWNER)
just to see if it was setting the window's owner for some reason. In each case, I do not see the handle which is associated with the CMDIFrameWnd
object. Instead, the parent shown is the desktop, and owner is NULL.
Using Spy++, it shows what I was expecting. How would I get the layout given by Spy++ programmatically?
windows winapi mfc
In our code, a C++ class that is derived from CMDIChildWnd
is instantiated and its Create()
function is called, which is actually CMDIChildWnd::Create()
. The 5th parameter pParentWnd
is being set to a CMDIFrameWnd
object. This in turn (within the MFC code) sets up a CREATESTRUCT
object, sets it's hwndParent
to that parameter and then calls PreCreateWindow()
with that object passed as one of the parameters.
However, when going up the parent window list using CWnd::GetParent()
(original) GetAncestor(hwnd, GA_PARENT)
(just a try, since the original didn't work and this code is 20+ years old) and even GetWindow(hwnd, GW_OWNER)
just to see if it was setting the window's owner for some reason. In each case, I do not see the handle which is associated with the CMDIFrameWnd
object. Instead, the parent shown is the desktop, and owner is NULL.
Using Spy++, it shows what I was expecting. How would I get the layout given by Spy++ programmatically?
windows winapi mfc
windows winapi mfc
edited Nov 12 at 21:58
asked Nov 12 at 5:10
Adrian
3,89922057
3,89922057
1
AfxGetMainWnd()
should return the main frame window.CMDIChildWnd
is usually passed toCMultiDocTemplate
, I am not familiar with the usage you are describing.
– Barmak Shemirani
Nov 12 at 7:44
Use Spy++ to see the true window hierarchy. That will reflect the relationship without any code in between, that may or may not do something to be helpful.
– IInspectable
Nov 12 at 10:11
@IInspectable, I have used spy++, and it shows what I want to see, but how do I get that answer in code?
– Adrian
Nov 12 at 15:03
@BarmakShemirani, I'm not looking for the rootCMDIFrameWnd
. I'm looking for the one that is the parent to a particularCMDIChildWnd
. We have someCMDIFrameWnd
which are parented to otherCMDIFrameWnd
windows.
– Adrian
Nov 12 at 16:07
MDI is odd, it comes with its own API. See if Multiple Document Interface has the answers you are looking for.
– IInspectable
Nov 12 at 16:20
|
show 1 more comment
1
AfxGetMainWnd()
should return the main frame window.CMDIChildWnd
is usually passed toCMultiDocTemplate
, I am not familiar with the usage you are describing.
– Barmak Shemirani
Nov 12 at 7:44
Use Spy++ to see the true window hierarchy. That will reflect the relationship without any code in between, that may or may not do something to be helpful.
– IInspectable
Nov 12 at 10:11
@IInspectable, I have used spy++, and it shows what I want to see, but how do I get that answer in code?
– Adrian
Nov 12 at 15:03
@BarmakShemirani, I'm not looking for the rootCMDIFrameWnd
. I'm looking for the one that is the parent to a particularCMDIChildWnd
. We have someCMDIFrameWnd
which are parented to otherCMDIFrameWnd
windows.
– Adrian
Nov 12 at 16:07
MDI is odd, it comes with its own API. See if Multiple Document Interface has the answers you are looking for.
– IInspectable
Nov 12 at 16:20
1
1
AfxGetMainWnd()
should return the main frame window. CMDIChildWnd
is usually passed to CMultiDocTemplate
, I am not familiar with the usage you are describing.– Barmak Shemirani
Nov 12 at 7:44
AfxGetMainWnd()
should return the main frame window. CMDIChildWnd
is usually passed to CMultiDocTemplate
, I am not familiar with the usage you are describing.– Barmak Shemirani
Nov 12 at 7:44
Use Spy++ to see the true window hierarchy. That will reflect the relationship without any code in between, that may or may not do something to be helpful.
– IInspectable
Nov 12 at 10:11
Use Spy++ to see the true window hierarchy. That will reflect the relationship without any code in between, that may or may not do something to be helpful.
– IInspectable
Nov 12 at 10:11
@IInspectable, I have used spy++, and it shows what I want to see, but how do I get that answer in code?
– Adrian
Nov 12 at 15:03
@IInspectable, I have used spy++, and it shows what I want to see, but how do I get that answer in code?
– Adrian
Nov 12 at 15:03
@BarmakShemirani, I'm not looking for the root
CMDIFrameWnd
. I'm looking for the one that is the parent to a particular CMDIChildWnd
. We have some CMDIFrameWnd
which are parented to other CMDIFrameWnd
windows.– Adrian
Nov 12 at 16:07
@BarmakShemirani, I'm not looking for the root
CMDIFrameWnd
. I'm looking for the one that is the parent to a particular CMDIChildWnd
. We have some CMDIFrameWnd
which are parented to other CMDIFrameWnd
windows.– Adrian
Nov 12 at 16:07
MDI is odd, it comes with its own API. See if Multiple Document Interface has the answers you are looking for.
– IInspectable
Nov 12 at 16:20
MDI is odd, it comes with its own API. See if Multiple Document Interface has the answers you are looking for.
– IInspectable
Nov 12 at 16:20
|
show 1 more comment
1 Answer
1
active
oldest
votes
up vote
0
down vote
In MDI interface CMDIChildWnd
is usually passed to CMultiDocTemplate
, then we create a new window through CDocManager::OnFileNew
, that in turn calls CFrameWnd::LoadFrame
which passes NULL
for child window's parent (at least in VS 2017)
We usually don't call mdi_child->Create
directly, unless we initialize everything else manually. Perhaps you mean the base class CMDIChildWnd::Create
is called, or you are able to override it.
In child window,
::GetAncestor(m_hWnd, GA_ROOT)
or ::GetAncestor(m_hWnd, GA_ROOTOWNER)
Should return a reference to the main frame, otherwise use AfxGetMainWnd()
Unfortunately, I didn't write this code. It is 5+ years old and I've been here only 3.mdi_child->Create()
was called by our code. We are not loading a new file. We're generating a frame to be used by a Chromium CEF window. What sort of things would be initialized manually?
– Adrian
Nov 12 at 22:08
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53256240%2fhow-to-get-the-parent-structure-as-spy-gives-it%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
In MDI interface CMDIChildWnd
is usually passed to CMultiDocTemplate
, then we create a new window through CDocManager::OnFileNew
, that in turn calls CFrameWnd::LoadFrame
which passes NULL
for child window's parent (at least in VS 2017)
We usually don't call mdi_child->Create
directly, unless we initialize everything else manually. Perhaps you mean the base class CMDIChildWnd::Create
is called, or you are able to override it.
In child window,
::GetAncestor(m_hWnd, GA_ROOT)
or ::GetAncestor(m_hWnd, GA_ROOTOWNER)
Should return a reference to the main frame, otherwise use AfxGetMainWnd()
Unfortunately, I didn't write this code. It is 5+ years old and I've been here only 3.mdi_child->Create()
was called by our code. We are not loading a new file. We're generating a frame to be used by a Chromium CEF window. What sort of things would be initialized manually?
– Adrian
Nov 12 at 22:08
add a comment |
up vote
0
down vote
In MDI interface CMDIChildWnd
is usually passed to CMultiDocTemplate
, then we create a new window through CDocManager::OnFileNew
, that in turn calls CFrameWnd::LoadFrame
which passes NULL
for child window's parent (at least in VS 2017)
We usually don't call mdi_child->Create
directly, unless we initialize everything else manually. Perhaps you mean the base class CMDIChildWnd::Create
is called, or you are able to override it.
In child window,
::GetAncestor(m_hWnd, GA_ROOT)
or ::GetAncestor(m_hWnd, GA_ROOTOWNER)
Should return a reference to the main frame, otherwise use AfxGetMainWnd()
Unfortunately, I didn't write this code. It is 5+ years old and I've been here only 3.mdi_child->Create()
was called by our code. We are not loading a new file. We're generating a frame to be used by a Chromium CEF window. What sort of things would be initialized manually?
– Adrian
Nov 12 at 22:08
add a comment |
up vote
0
down vote
up vote
0
down vote
In MDI interface CMDIChildWnd
is usually passed to CMultiDocTemplate
, then we create a new window through CDocManager::OnFileNew
, that in turn calls CFrameWnd::LoadFrame
which passes NULL
for child window's parent (at least in VS 2017)
We usually don't call mdi_child->Create
directly, unless we initialize everything else manually. Perhaps you mean the base class CMDIChildWnd::Create
is called, or you are able to override it.
In child window,
::GetAncestor(m_hWnd, GA_ROOT)
or ::GetAncestor(m_hWnd, GA_ROOTOWNER)
Should return a reference to the main frame, otherwise use AfxGetMainWnd()
In MDI interface CMDIChildWnd
is usually passed to CMultiDocTemplate
, then we create a new window through CDocManager::OnFileNew
, that in turn calls CFrameWnd::LoadFrame
which passes NULL
for child window's parent (at least in VS 2017)
We usually don't call mdi_child->Create
directly, unless we initialize everything else manually. Perhaps you mean the base class CMDIChildWnd::Create
is called, or you are able to override it.
In child window,
::GetAncestor(m_hWnd, GA_ROOT)
or ::GetAncestor(m_hWnd, GA_ROOTOWNER)
Should return a reference to the main frame, otherwise use AfxGetMainWnd()
answered Nov 12 at 21:58
Barmak Shemirani
20.7k42045
20.7k42045
Unfortunately, I didn't write this code. It is 5+ years old and I've been here only 3.mdi_child->Create()
was called by our code. We are not loading a new file. We're generating a frame to be used by a Chromium CEF window. What sort of things would be initialized manually?
– Adrian
Nov 12 at 22:08
add a comment |
Unfortunately, I didn't write this code. It is 5+ years old and I've been here only 3.mdi_child->Create()
was called by our code. We are not loading a new file. We're generating a frame to be used by a Chromium CEF window. What sort of things would be initialized manually?
– Adrian
Nov 12 at 22:08
Unfortunately, I didn't write this code. It is 5+ years old and I've been here only 3.
mdi_child->Create()
was called by our code. We are not loading a new file. We're generating a frame to be used by a Chromium CEF window. What sort of things would be initialized manually?– Adrian
Nov 12 at 22:08
Unfortunately, I didn't write this code. It is 5+ years old and I've been here only 3.
mdi_child->Create()
was called by our code. We are not loading a new file. We're generating a frame to be used by a Chromium CEF window. What sort of things would be initialized manually?– Adrian
Nov 12 at 22:08
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53256240%2fhow-to-get-the-parent-structure-as-spy-gives-it%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
AfxGetMainWnd()
should return the main frame window.CMDIChildWnd
is usually passed toCMultiDocTemplate
, I am not familiar with the usage you are describing.– Barmak Shemirani
Nov 12 at 7:44
Use Spy++ to see the true window hierarchy. That will reflect the relationship without any code in between, that may or may not do something to be helpful.
– IInspectable
Nov 12 at 10:11
@IInspectable, I have used spy++, and it shows what I want to see, but how do I get that answer in code?
– Adrian
Nov 12 at 15:03
@BarmakShemirani, I'm not looking for the root
CMDIFrameWnd
. I'm looking for the one that is the parent to a particularCMDIChildWnd
. We have someCMDIFrameWnd
which are parented to otherCMDIFrameWnd
windows.– Adrian
Nov 12 at 16:07
MDI is odd, it comes with its own API. See if Multiple Document Interface has the answers you are looking for.
– IInspectable
Nov 12 at 16:20