|
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)
|
|
|
|
|
<br />
<br />
for(int n=0;n!=m_array.GetSize();n++){<br />
if(m_array[n].GetLength()){<br />
if(isdigit(m_array[n].GetAt(0)))<br />
MessageBox(m_array[n]+" wow! is a number");<br />
}<br />
}<br />
|
|
|
|
|
Thanks alot wb
I did this trick by your help :>
<br />
for (i=0; i<TextArray[2].GetLength(); i++ )<br />
{<br />
if ( !(isdigit(TextArray[2].GetAt(i))) )<br />
{<br />
bOk = false;<br />
}<br />
}<br />
|
|
|
|
|
That'll work, assuming you don't have any instances of something like "1ABC" or "ABC1" in the array.
|
|
|
|
|
try :
<br />
if (atoi (m_array[0])==0 && m_array[0]!="0")<br />
else<br />
You can alos go through each and every one of the character in the string and use the IsDigit function
Shay
|
|
|
|
|
Hi,
Is there any sample code in VC++ to zoom the image display.
I use Bitblt() function to display the image in a view.
Regards
Neha
|
|
|
|