|
Hi. I have noticed something interesting: in an MDI app, I handled ON_WM_SHOWWINDOW() in CChildFrame , just like this:
void CChildFrame::OnShowWindow(BOOL bShow, UINT nStatus)
{
CMDIChildWnd::OnShowWindow(bShow, nStatus);
TRACE("%d\n", bShow);
}
and whenever I create a new childframe (several times), I see the TRACE, so, this message are handled.
But, if I maximize the child frame, the next childframes opened are not handle this message at all ... why ? Strange ... once I maximize the childframe, whenever I create the new childframes, this message are not handled (I mean, I don't see any TRACE) ! If I restore the child frame, next child open are handle this message ... why ?
Thank for any explanation, words, everything !
But,
|
|
|
|
|
|
Thank you ... I wonder how to know for sure when a childframe have been created ... I will do some tests.
|
|
|
|
|
Same way as your last question handle the WM_CREATE message of the child window (or WM_MDICREATE of the parent MDICLIENT) and you know when it's created.
It's a basic thing if you want to know absolutely about something (without delay) then insert code in that handler instead of trying to determine it from a parent or associated window where the message chain gets involved. It's easier and safer than the alternatives.
The other key things with MDI's is children will by default be handled by DefMDIChildProc and be inside an MDIClient window (which is like an invisible window that sits inside an normal window) for them to operate correctly. So basically your app window contains an MDICLient, and the MDICLient contains the MDI children. So be careful the children are not actually children of the APP window as such. If you try to insert an MDIChild directly into a normal window it won't operate correctly they must be in an invisible MDIClient window pane.
In vino veritas
modified 30-Dec-16 4:54am.
|
|
|
|
|
Kindly thank you for your information. Actually I want to setup the window placement which have been saved in CChildFrame::OnDestroy() :
void CChildFrame::OnDestroy()
{
CMDIChildWnd::OnDestroy();
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
if(wp.showCmd == SW_SHOWMINIMIZED)
wp.showCmd = SW_SHOWMAXIMIZED;
AfxGetApp()->WriteProfileBinary(_T("Settings"), _T("WindowPlacementChild"), (LPBYTE)&wp, sizeof(wp));
}
and previously I setup the window placement on first CChildFrame::OnShowWindow call:
void CChildFrame::OnShowWindow(BOOL bShow, UINT nStatus)
{
CMDIChildWnd::OnShowWindow(bShow, nStatus);
if(bShow && ! IsWindowVisible() && m_bOnce)
{
m_bOnce = FALSE;
UINT nBytes = 0;
WINDOWPLACEMENT* lwp;
if(AfxGetApp()->GetProfileBinary(_T("Settings"), _T("WindowPlacementChild"), (LPBYTE*)&lwp, &nBytes))
SetWindowPlacement(lwp);
delete []lwp;
}
}
but I discovered that this handler are not called when the previous child frame open are maximized ... where should be the proper place to set the child frame placement on opening ?
modified 30-Dec-16 6:32am.
|
|
|
|
|
"Same way as your last question handle the WM_CREATE message of the child window (or WM_MDICREATE of the parent MDICLIENT) and you know when it's created"
You mean on creation of child frame ?
|
|
|
|
|
I don't think that WM_CREATE is the right place to set child frame placement:
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
UINT nBytes = 0;
WINDOWPLACEMENT* lwp;
if(AfxGetApp()->GetProfileBinary(_T("Settings"), _T("WindowPlacementChild"), (LPBYTE*)&lwp, &nBytes))
SetWindowPlacement(lwp);
delete []lwp;
return 0;
}
Once as I put here this code, I have not child frame system menu anymore.
|
|
|
|
|
You are returning zero and exiting ... try breaking and dropping thru to the default handler. I warned you about needing the default handler
MFC is always funky with its wrapper around the raw API so it's probably return one or some strange value to continue thru to the default handler.
If all you are trying to do is reset the window placement use WM_WINDOWPOSCHANGED it is always called from WM_CREATE anyhow.
I have did a sample with a different OPENGL in each MDICHILD here and the handler is in the text discussion even
Native Win32 API OpenGL Tutorial - Part 2[^]
You can ignore the OpenGL itself but the MDI does everything you wanted, it resize, minimizes, maximizes. tiles, cascade etc and you can see the messages I handled.
In vino veritas
modified 30-Dec-16 9:30am.
|
|
|
|
|
I guess I have found the right place to restore the child frame window placement:
void CChildFrame::ActivateFrame(int nCmdShow)
{
CMDIChildWnd::ActivateFrame(nCmdShow);
if(! m_bOnce)
return;
m_bOnce = FALSE;
UINT nBytes = 0;
WINDOWPLACEMENT* lwp;
if(AfxGetApp()->GetProfileBinary(_T("Settings"), _T("WindowPlacementChild"), (LPBYTE*)&lwp, &nBytes))
SetWindowPlacement(lwp);
delete []lwp;
}
|
|
|
|
|
That should only work for the focused child window. Unless MFC overrides windows and activates each window in Z order.
Windows normally when it brings up a group of children will only activate them along the focus chain in non MFC. Its very specific on the API.
WM_ACTIVATE message (Windows)[^]
Sent to both the window being activated and the window being deactivated. If the windows use the same input queue, the message is sent synchronously, first to the window procedure of the top-level window being deactivated, then to the window procedure of the top-level window being activated.
By default each window will call down to it's parent to make sure it is activated in a direct line along the focus chain. You can basically follow the activation chain upwards from the application window and arrive at the focus window which is how keyboard messages etc find there way to the right window. So at no stage should two MDI children be active and the active one generally paints it's frame a different colour and brings itself to top (that is the default behviour). The only other child window that would get a normal windows API message is the one losing the focus chain. However if you had 3 children there would always be one window that would never get an activation message no matter what you did as it will neither be gaining or losing activation/focus chain.
I would not expect that behaviour on MFC unless it does it's own thing and does a lot of repainting that is totally not done on actual windows API. Given the weird nature of that call with nCmdShow that is possible, all be it a bit naft and horrible hack.
The WM_WINDOWPOSCHANGED I gave you does go to each and every child which is also why they tell you that you probably want to override it
WM_WINDOWPOSCHANGED message (Windows)[^]
By default, the DefWindowProc function sends the WM_SIZE and WM_MOVE messages to the window. The WM_SIZE and WM_MOVE messages are not sent if an application handles the WM_WINDOWPOSCHANGED message without calling DefWindowProc. It is more efficient to perform any move or size change processing during the WM_WINDOWPOSCHANGED message without calling DefWindowProc.
In vino veritas
modified 30-Dec-16 10:01am.
|
|
|
|
|
Thank you for explanation. I have noticed something weird also: I open two child frames. Both of them are maximized. I have following code:
void CChildFrame::OnDestroy()
{
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
TRACE("Window state: %d\n", wp.showCmd);
CMDIChildWnd::OnDestroy();
}
I repeat: both of child frames are maximized. I close one of them: the result of TRACE are
Window state: 1
which mean SW_SHOWNORMAL, not maximized.
Then, I close the next child frame opened, the result is:
Window state: 3
which mean that is SW_MAXIMIZED .... although all child frame opened were maximized, the only last one tell me that was maximized ... rest of them tell me that was SSHOWNORMAL ? Why ?
|
|
|
|
|
When you close one child, the focus first shifts to the next child window. So at that point the window is not technically maximized, in that maximized is more than about size it is about focus as well. Think about the pesky icons placed in the parent frame that is the window that is maximized.
So technically you can't have two child windows WM_MAXIMIZED you can have two of them maximum size but that isn't the same thing
In vino veritas
|
|
|
|
|
Very good explanation, thank you !
|
|
|
|
|
c++, how to make an array program one dimension from( 1 to 7 numbers)that the user insert these numbers in terminal that finally display sum,average,GPA,grade,min and max. please help me
|
|
|
|
|
No, sorry, we don't do people's homework here. This is very basic stuff, and any C/C++ reference should be able to help you. If you try things, and get stuck on a particular issue, then come back and ask.
Cheers,
Mick
------------------------------------------------
It doesn't matter how often or hard you fall on your arse, eventually you'll roll over and land on your feet.
|
|
|
|
|
We do not do your HomeWork.
HomeWork is not set to test your skills at begging other people to do your work, it is set to make you think and to help your teacher to check your understanding of the courses you have taken and also the problems you have at applying them.
Any failure of you will help your teacher spot your weaknesses and set remedial actions.
So, give it a try, reread your lessons and start working. If you are stuck on a specific problem, show your code and explain this exact problem, we might help.
As programmer, your job is to create algorithms that solve specific problems and you can't rely on someone else to eternally do it for you, so there is a time where you will have to learn how to. And the sooner, the better.
When you just ask for the solution, it is like trying to learn to drive a car by having someone else training.
Creating an algorithm is basically finding the maths and make necessary adaptation to fit your actual problem.
Alma28 wrote: c++, how to make an array program one dimension from( 1 to 7 numbers)that the user insert these numbers in terminal that finally display sum,average,GPA,grade,min and max. please help me
Your problems are problems only to very beginners and the solution is in the very first steps of learning the language.
If you want to learn C/C++ :
Here is links to references books on C and C++ by the authors of the languages. Note than C is the ancestor of C++, so knowing C is always useful with C++.
The C Programming Language - Wikipedia, the free encyclopedia[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf[^]
C++ Programing Language[^]
Patrice
“Everything should be made as simple as possible, but no simpler.” Albert Einstein
|
|
|
|
|
Good Morning Sir,
I referred this tutorial, Embedding Python program in a C/C++ code[^]
I have followed up the tutorial and successfully embedded Python in my code.
PyRun_SimpleString("print('Hello World from Embedded Python!!!')");
is used to execute a single line of Python code but how do I run a multiple lines of code in Python. I also tried running a Python from a file but the file also needed to be there for running the executable. I dont want a file along with my executable, I searched in the google sir but I find no results.
I am confused here, I dont know what to do
Thank you sir for your time
|
|
|
|
|
Ask this question right under that post and author will tell you how. There is a forum provided for questions about methodology of the article, or similar aspects etc.
That is, so that if someone else happens to have a similar problem, they can know how to solve this.
The sh*t I complain about
It's like there ain't a cloud in the sky and it's raining out - Eminem
~! Firewall !~
|
|
|
|
|
Thank you sir I have posted the question below the article
|
|
|
|
|
Hi,I had a question about class and object memory, any hints are welcome.
1) Is the class occupies some memory? as I understand it, class is just a data type as int, long ,double.
2) Is the member function in the Object's memory ? I mean, in the sizeof(object).
3) The derived class object inherited from base class, the base class has member functions, then is the member function memory layout be inherited to the derived class object?
Thanks
|
|
|
|
|
- No a class is like a template or blueprint, and just contains the definitions used by the compiler to generate the code that construct objects.
- No, member functions exist in a separate part of the application's address space, they are not part of the object.
- No, all member functions will be present in memory and invoked as required by the running application.
For more details consult your reference guide or the documentation on MSDN.
|
|
|
|
|
Thanks.
Then in the inheritance operation, for example:
class A {
public:
void funct() { cout << "a" << endl; }
}
};
Class B:protected A {
private:
void funct() { cout << "b" << endl; }
};
int main()
{
B c;
b.funct();
;
return 0;
}
B's funct() can hide A's funct(), if I comment funct()in Class B, b.funct() will call funct() in class A.
Seems like b inherited the function in class A.
Since member function only has one copy in memory, then how can B inherit the member function from A?
|
|
|
|
|
Like I said before, both functions will be in memory, so either or both of them can be called. Overriding and hiding affects how the compiler will invoke the functions, it does not affect how the code exists in memory.
|
|
|
|
|
Thank you for your reply.
I am a little confused about the inheritance, member function inheritance.
So the member function of one class, only has one copy in the memory map, then if class B's base class is class A,
the inheritance mechanism makes the B's object has member variables of class A.
and B's object inherited the member functions of class A,while B's object don't have those functions, B's object just know how to invoke those functions, right?
And the member function inheritance follow same inheritance rule as member variables, for example, private inheritance will make all member functions inherited from base class A, turn to private in class B.
class A {
public: void f1(){}
protected: int f2() {}
private: char f3() {}
};
class B:private A {
// B inherit f1(), f2(), f3(), and access for all 3 functions will be private.
};
Thanks
}
|
|
|
|
|
You have the general idea. All methods of all classes will be available in memory. The actual method being called at any time is controlled according to the inheritance rules; see Inheritance (C++)[^].
|
|
|
|
|