|
Royce Fickling wrote: Now I am trying to get it to work in a modeless dialog
When are you running the code you posted?
m_tnd.hWnd = pParent->GetSafeHwnd()? pParent->GetSafeHwnd() : m_hWnd;
I assume a valid HWND is required, have you checked that you have one?
led mike
|
|
|
|
|
Yes, the dialog's hwnd is valid. I have called the icon create method from OnInitDialog() after the CDialog::OnInitDialog() call. I have also called it from OnShowWindow(), but both fail.
|
|
|
|
|
|
PostMessage puts a message in windows queue and does not wait for it to be processed.
I know that windoze will not keep same message in the queue; however, I cannot make the following work:
PostMessage(NULL,WM_STATUS, 1, 1);
... process something
PostMessage(NULL,WM_UPDATE, 1, 1);
Only the first message gets processed - in my case by
CMainFrame::PreTranslateMessage(MSG* pMsg)
I just want to change status bar text “before and after” lengthy process.
Could anybody explain to me why the second message gets ignored please?
Do I have to use different method to accomplish this?
Thanks for your time
Cheers
Vaclav
|
|
|
|
|
Vaclav_Sal wrote: basic windoze question
Stop blaming Microsoft for your incompetency and read the documentation where you will find the SendMessage() API that blocks.
Hint: The next time you post your garbage "windoze" anti microsoft nonsense and I see it, I will surely flame you into a crispy critter.
led mike
|
|
|
|
|
Amendment One
Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.
|
|
|
|
|
Huh? This is Code Project, not the USA...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: This is Code Project, not the USA...
Great explanation. So you think he understands it now?
led mike
|
|
|
|
|
led mike wrote: So you think he understands it now?
What... You mean the part about American freedom of speech not applying to this Indian Canadian website?
Or the whole "you can't expect any messages to be processed on a thread when there's no code processing messages
on the thread" thing...?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: What... You mean
Take your pick
led mike
|
|
|
|
|
I meant
"no"
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Why are you passing NULL for the window handle? Why not post to the actual window
you want to receive the message?
If you want to handle the message like a thread message then you should do that
appropriately - in your thread class.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks Mike,
the NULL is there because I was frustrated with he whole process and it works if I use only one PostMessage in a function.
I just tryed this code and it also does not process the WM_TEST message - which is still simple AfxMessageBox.
if(PostMessage(NULL,WM_TEST, 1, 1))
{
AfxMessageBox("PostMessage(NULL,WM_TEST, 1, 1) OK");
}
else
{
AfxMessageBox("PostMessage(NULL,WM_TEST, 1, 1) No good Not OK");
}
|
|
|
|
|
Vaclav_Sal wrote: and it works if I use only one PostMessage in a function.
The message queue processing can't execute if your code after PostMessage is doing a long running routine because it's all in one thread. You really need to stop typing code and forum messages and spend more time reading until you understand how things work.
led mike
|
|
|
|
|
Hook Uppppppp! Fishing is GREAT today!
Why don't I ever learn not to nose in your threads...just smack me...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Hook Uppppppp! Fishing is GREAT today!
hehe check this out[^]
urudakis wrote: but all i get is a lot a symbols
ROTFLMAO
here's another[^]. Maybe we should ask Chris to start a CPWTFPOTD forum
Last modified: 14mins after originally posted --
led mike
|
|
|
|
|
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks for reply.
...long running routine because it's all in one thread....
....
AfxGetMainWnd()->PostMessage(WM_TEST, 1, 1);
AfxGetMainWnd()->PostMessage(WM_TEST_1, 1, 1);
return strText;
This short code does not work either.
Only the first message is actually processed.
So what is MS definition of "message queue"?
It looks like there is no queue at all.
I'll check GetQueueStatus to see if it gets me some more info.
PS > should read ->
|
|
|
|
|
It appears you are not properly posting '<' and '>' characters
Vaclav_Sal wrote: So what is MS definition of "message queue"?
They hide that information in the documentation[^]
Vaclav_Sal wrote: AfxGetMainWnd()->PostMessage(WM_TEST, 1, 1);
AfxGetMainWnd()->PostMessage(WM_TEST_1, 1, 1);
What is the values of WM_TEST and WM_TEST_1 and how are you trying to receive them?
led mike
|
|
|
|
|
Both WM_TEST and WM_TEST_1 are WM_USER defined messages.
For now CMainFrame::PreTranslateMessage(MSG* pMsg)
receives the messages and just does status bar text update plus AfxMessageBox for simple trace debugging.
Snippet here:
....
case WM_TEST: // WM_USER+7
{
m_wndStatusBar.SetPaneText (1, "Status : TEST TEST TEST TEST ", TRUE);
AfxMessageBox("TEST Update status ");
break;
}
case WM_TEST_1: // WM_USER+7
{
m_wndStatusBar.SetPaneText (1, "Status : WM_TEST_1 WM_TEST_1 WM_TEST_1 ", TRUE);
AfxMessageBox("WM_TEST_1 Update status ");
break;
}
...
I do not fully understand how to implement the retrun value of PreTranslateMessage.Either way - replacing the case break with return true or false did not make any difference.
I am still looking into GetQueueStatus and see if I can use it in
PreTranslateMessage.
|
|
|
|
|
Vaclav_Sal wrote: For now CMainFrame::PreTranslateMessage(MSG* pMsg)
Well assuming you actually have WM_TEST AND WM_TEST_1 defined with different values rather than the same WM_USER + 7 as commented in your code, if you change AfxMessageBox to TRACE statements you will see you receive both messages. If you give control of the message queue to the message box by popping it up the second one gets eaten before your code starts executing again.
led mike
|
|
|
|
|
As you suggested - removing the message box works as advertised!
Thanks for your help, appeciate it.
Vaclav
|
|
|
|
|
First, you should be using WM_APP, not WM_USER.
Second, are both WM_TEST and WM_TEST_1 equal to WM_USER+7 as indicated by your comments?
Third, why use PreTranslateMessage() to catch the messages? You can't handle the message
in the standard MFC way?
If you must use PreTranslateMessage(), then return non-zero to discontinue any further processing of
the message. Return zero to let the message be dispatched/processed normally.
I did this in my little MFC test app, where the app's main window is a modal dialog...
afx_msg LRESULT OnTest(WPARAM wp, LPARAM lp);
afx_msg LRESULT OnTest1(WPARAM wp, LPARAM lp);
#define WM_TEST (WM_APP+7)
#define WM_TEST_1 (WM_APP+8)
BEGIN_MESSAGE_MAP(CMFCTesterDlg, CMyDialog)
ON_MESSAGE(WM_TEST,&CMFCTesterDlg::OnTest)
ON_MESSAGE(WM_TEST_1,&CMFCTesterDlg::OnTest1)
END_MESSAGE_MAP()
void CMFCTesterDlg::OnOK()
{
AfxGetMainWnd()-> PostMessage(WM_TEST, 1, 1);
AfxGetMainWnd()-> PostMessage(WM_TEST_1, 1, 1);
}
LRESULT CMFCTesterDlg::OnTest(WPARAM wp, LPARAM lp)
{
AfxMessageBox(_T("WM_TEST Update status "));
return 0;
}
LRESULT CMFCTesterDlg::OnTest1(WPARAM wp, LPARAM lp)
{
AfxMessageBox(_T("WM_TEST_1 Update status "));
return 0;
} Both messages are received (interestingly in reverse order they were posted).
What are you doing differently?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
First, you should be using WM_APP, not WM_USER.
Did that with same results.
Second, are both WM_TEST and WM_TEST_1 equal to WM_USER+7 as indicated by your comments?
No they are not same.
Third, why use PreTranslateMessage() to catch the messages? You can't handle the message
in the standard MFC way?
I could.
If you must use PreTranslateMessage(), then return non-zero to discontinue any further processing of
the message. Return zero to let the message be dispatched/processed normally.
Did that with same resluts.
|
|
|
|
|
Fair enough
Interesting that using normal MFC message processing like in my example code works fine -
the message doesn't get eaten, although only one modal message window can appear at a time...
Cheers,
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|