|
Not sure about that. In this case you'll have to manage ON_COMMAND handler and no more ON_MESSAGE !!
But you can use PostMessage(WMU_FUN_MESSAGE,0,0) if you want!
|
|
|
|
|
cedric moonen wrote:
But you can use PostMessage(WMU_FUN_MESSAGE,0,0) if you want!
his message handler isn't in the same window, he has to use
::PostMessage(m_hWnd_of_CReceive, WMU_FUN_MESSAGE,0,0);
When he's checked ASSERT(::IsWindow(::FromHandle(m_hWnd_of_CReceive)));
|
|
|
|
|
Joel Lipschultz wrote:
Unfortunately, it doesnt work that way. My program crashes when it gets to the PostMessage command, displaying a "Debug Assertion Failed!" dialog box. Because of this, my MessageBox is never displayed.
Any insight you can give would be most appreciated.
You have given no information about the assertion (i.e., file, line). Have you stepped into the PostMessage() function to see what is happening?
|
|
|
|
|
I stepped into the PostMessage() function, and it crashes in the afxwin2.inl file on line 41:
{ASSERT(::IsWindow(m_hWnd)); return PostMessage(m_hWnd, message, WPARAM, LPARAM);}
Joel L.
|
|
|
|
|
Which means the window you are trying to post the message to is invalid.
|
|
|
|
|
OK... here's where the MFC abstraction fails
Win32::PostMessage puts a message for a HWND ("Windows Window") into the message queue.
MFC::CWnd::PostMessage does that for the HWND wrapped by CWnd instance.
In the constructor of CSendClass, the HWND is not yet created - hence you get an ASSERT in the PostMessage call.
1st question: Are you sure you need PostMessage?
2nd question: Why two classes (send ¨ receive), why postmessage, what exactly are you trying to do?
"Der Geist des Kriegers ist erwacht / Ich hab die Macht" StS
sighist | Agile Programming | doxygen
|
|
|
|
|
In answer to your first question, I want to eventually be able to pass user-defined messages between UI threads. I need to use PostMessage(), as (I think) SendMessage could result in deadlock.
In answer to your second question, I thought it would be easier to figure out how to pass a user-defined message between two regular classes. Once I have that mastered, I was going to try the same procedure with UI threads (i.e. each thread is a separate class).
Joel L.
|
|
|
|
|
Joel Lipschultz wrote:
Now that all the Message Handler stuff resides in CReceiveClass, I add the following line to the constructor of CSendClass: "PostMessage(WMU_FUN_MSG, 0, 0);"
::PostMessage((CReceiveClass*)->m_hWnd, WMU_FUN_MSG, 0, 0);
The way you have it, you're sending the message to "this"
|
|
|
|
|
I tried adding the line you suggested, and it gave me the following syntax error:
error C2059: syntax error : "->"
Is there another way that I can get a handle to my CReceiveClass?
Joel L.
|
|
|
|
|
I didn't mean for you to literally add that line, that was just a template like example where you're supposed to replace the CReceive* with the actual pointer to the other window.
That or you can just pass the handle directly in the constructor of the send window
in header
public:
CSend(CWnd* pParent = NULL, HWND h_recievewnd = NULL); // standard constructor
in implementation
CSend::CSend(CWnd* pParent, HWND h_recievewnd)
{
ASSERT(h_recievewnd);
ASSERT(::IsWindow(::FromHandle(h_recievewnd)));
::PostMessage(h_recievewnd, WMU_FUN_MSG, 0, 0);
}
Of course you should make sure and Create CReceive first to get the handle to pass to the constructor of CSend
|
|
|
|
|
Joel Lipschultz wrote:
I start a new MFC app and created 2 classes via classwizard, say CSendClass and CReceiveClass (both derived from generic Cwnd). To create the user-defined message stuff, I:
Joel Lipschultz wrote:
I add the following line to the constructor of CSendClass:
Further more you should do ::FromHandle on your CReceive HWND and then ::IsWindow() to make sure the window has been created and the Message Proc has been started. If ::IsWindow is NULL you can not send messages.
You definately should put that elsewhere than the constructor of the other CWnd if they are created "at the same time"
|
|
|
|
|
First of all, thanks for your help. I stepped into the PostMessage function and the Program crashes on the following line, in afxwin2.inl, line 41: (basically what you suspected)
{ASSERT(::IsWindow(m_hWnd)); return PostMessage(m_hWnd, message, WPARAM, LPARAM);}
Given that the program fails when IsWindow returns false -- what would you recommend doing? You mention putting the PostMessage() call in somewhere other than the constructor, but I don't know where else to put it. I tried the Destructor, and it gives the same result.
I am just starting to learn MFC, so please be as descriptive as possible. I appreciate it.
Joel L.
|
|
|
|
|
I did as you suggested, and now the program doesn't go into the if statement (i.e. receiveClass->handle equals NULL).
Joel L.
|
|
|
|
|
WiB forgot these all important steps
CWin->CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam = NULL);
CWin->ShowWindow(SW_SHOW);
CWin->UpdateWindow();
|
|
|
|
|
additionally, I recommend you read "programming windows with mfc" - Jeff Procise
|
|
|
|
|
Thank you all, my program works just fine now. I appreciate the help.
Joel L.
|
|
|
|
|
Ok, I set up the project the way you and WiB suggested. Unfortunately, I am having trouble provided parameters for the CreateEx function. I tried doing:
CWin->CreateEx(CReceiveClass, NULL, WS_OVERLAPPEDWINDOW, CRect(50,50, 100, 100),NULL, NULL, NULL);
but haven't had any luck. Can you please provide some parameters for the CreateEx function so my program will draw a basic frame?
Joel L.
|
|
|
|
|
Are you actuall Creating windows for your two classes: CSendClass and CReceiveClass? My guess is not. That would explain why IsWindow() is failing and you are getting the ASSERTs. Instantiating a CWnd derived object does not Create a window.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
How can I connect to a remote database with my ID and Password using VC6 but without a Server Terminal App?
Is this possible?
Thank you very much!
FoolBear
|
|
|
|
|
If you mean in code then it depends what kind of database. If it is for example SQL Server - use ADO[^] to do it.
If not in code than I don't know what you mean
Philip Patrick
Web-site: www.stpworks.com
"Two beer or not two beer?" Shakesbeer
|
|
|
|
|
OK,just bellow:
I used SQL Server 2000 created a data source.Then I put it on to my homepage.Although The server support SQL Server DataBase,but it is impossible for him to run a srever App for my Client App.So I must used my ID and Password connect to it directly from my Client App.Also I want it to work very smoothly no matter where my Client App runs.
FoolBear
|
|
|
|
|
FAADI wrote:
What should I do
Detect what exactly is going wrong: Does it receive WM_CLOSE, is there a return value designating failure, are your splitter classes handling shutdown OK?
Please post all relevant error messages.
My opinions may have changed, but not the fact that I am right.
|
|
|
|
|
Hi
I've made a CStringArray m_array.
It contains about 20text items and 1 text item who is really a integer.
m_array[0] = "TEXT";
m_array[1]="123";
Any easy way to detect when we are dealing with a whole number field?
Greetings
Jens
|
|
|
|
|
for(int i = 0; i < m_array.size()-1; i++)<br />
{<br />
if(m_array[i] == "123")<br />
{<br />
[...do this...]<br />
}<br />
}
thats one way.
*.*
cin >> knowledge;
|
|
|
|
|
No sorry. It is a number, but not always "123".
YOu can't know it in advance.
(sorry if i made question not clear enough)
|
|
|
|