|
Huh? Where does it say that?
From ms-help://MS.MSDNQTR.2002JUL.1033/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/registerwindowmessage.htm
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF.
But I must say that not all of the documentation states it explicitly as here. Anyway, I'm off to read the WM_USER article now
|
|
|
|
|
You are right - it says explicitly 'only for inter application communication'.
But I can assure you that RWMs work even within an application
Maybe RegisterWindowMessage() has a large overhead or uses limited resources?
--
"My opinions may have changed, but not the fact that I am right."
Found in the sig of Herbert Kaminski
|
|
|
|
|
I thought that MSDN was basically outdated on this, and that there was no reason not to use RWM's. In fact, they are the only way to guarantee a unique id.
-Alex
|
|
|
|
|
RegisterWindowMessage(...)
Should save your life
Roger Allen
Sonork 100.10016
In case you're worried about what's going to become of the younger generation, it's going to grow up and start worrying about the younger generation. - Roger Allen, but not me!
|
|
|
|
|
Read Joseph Newcomer's article, Message Management[^], here on CP concerning this topic. It has a section on generating unique message id's that is very useful.
Roger Stewart
"I Owe, I Owe, it's off to work I go..."
|
|
|
|
|
If I do the following I get "equal" in MFC:
CString c1 = "abc";
CString c2 = "def";
CString c3 = "abcdef";
CString c4 = c1+c2;
if(c4 == c3)AfxMessageBox("equal");
But my Java book says that in java this is not equal. So shall I assume its because strings have different rules in these two cases?
When you say 'the references to the strings are being compared, not the strings themselves", what is meant by the word "reference' . Does it mean the address?
Thanks,
Appreciate your help,
ns
|
|
|
|
|
Yes, it sort of means the address. It means that it check if the two strings are the same strings in memory, in other words, if they are in the same physical memory locations. While the CString == operator is overloaded to compare the actual string contents.
|
|
|
|
|
Ah! Thanks. So CString has more functionality in that it does what one actually needs it to . I wonder what you use == in java for. To check memory locations for whatever reason I suppose. How woukd we do that in MFC if we needed to?
Appreciate your help,
ns
|
|
|
|
|
Well it's true that most of the time you want to compare string values, but it's just to keep everything consistent. When you compare 2 char*'s in C, you compare the addresses there, too:
char* str1 = "Hello";
char* str2 = "Hello";
if(str1 == str2) printf("This line won't be printed\n");
if(!strcmp(str1, str2)) printf("This line will be printed\n");
And in mfc you can just check the addresses of the cstring:
&cstring1 == &cstring2, or I think you can cast them to LPCSTR's, and then you will get a pointer to the internal CString buffer. All of this fully untested ofcourse
|
|
|
|
|
I see that you're confusing some basic principles of memory allocation in C++ vs. Java. In C++ objects (such as CString) can be allocated on the stack or on the heap.
CString s1 = "abc";
CString s2 = "def";
CString* ps1 = new CString("abc");
CString* ps2 = new CString("def");
When you allocate an object on the stack, the variable that you get represents the actual memory block that it takes to hold it. So s1 is the block of memory that holds "abc" and all the members of the object. And &s1 is the address of that block of memory. When you say (s1 == s2), you're comparing the blocks of memory themselves. When you say (&s1 == &s2) you're comparing the address of the blocks of memory.
When you allocate on the heap, the new operator gives you back the address of the block of bytes where the object is allocated -- basically the equivalent of &s1 . When you say (ps1 == ps2), you're comparing the address of the blocks of memory. When you say (*ps1 == *ps2) you're comparing the blocks of memory themselves.
In Java, there's the String object which you can create like this:
String rs1 = "abc";
String rs2 = new String("def");
Either way you do it, you always end up with the equivalent of ps1 and ps2 -- in other words, rs1 basically hold the address of the block of bytes where the actual String is allocated. In Java rs1 and rs2 are called references. In C++, ps1 and ps2 are pointers. So, like in C++, if you say (rs1 == rs2), you're comparing the address of the blocks of memory, not their content. To compare their content you can use the equals method of the String class.
I hope this shed some light on the issue.
Regards,
Alvaro
Well done is better than well said. -- Benjamin Franklin
(I actually prefer medium-well.)
|
|
|
|
|
Hello,
I just can't find how to access my current Doc or View class from my Dialog. I have a simple document application, and my dialog is a toolbar (http://www.codeproject.com/miscctrl/rollupctrl.asp). If I click on a button of my toolbar, it executes :
void CFooDlg::OnButtonMyAction()
So I want here to access my current document, update it, and then update the view.
It looks like a very basic question, but I can't figure out how to do that.
Thank you for your help,
loic
|
|
|
|
|
If your dialog is a toolbar, wht you shoukld do is handle the action (button pressed, or other) on your doc class. You can use the class wizard for that, or you can do it by hand and add an entry on the DOC message map to catch the action.
Good luck.
Hernan
|
|
|
|
|
thx, I will do that through the associate view, so I can easily manage the redraw of the data.
loic
|
|
|
|
|
Easier and better if you do that in the document and then call
UpdateAllViews(NULL);
|
|
|
|
|
Thank you! With all the possibilities, creating a well organised structure for a windows program is not so easy, especially when wanting to do it as modular as possible.
loic
|
|
|
|
|
Hi all,
I created a window( I didn't call the ShowWindow(), so it is unseen) and create a child window: a system tray icon and a popup menu attached to this icon. I want to disable some menu item of that popup menu.
I called the enable() method of that CMENU object, but no result. The return value are correct.
What can I do?
Need your help.
Luara
|
|
|
|
|
EIther you need to map the equivalent ON_COMMAND_UI handlers which when not present cause MFC code to enable a menu item by default if it has a handler or map the WM_INITMENUPOPUP message and enable/disable the items there.
Roger Allen
Sonork 100.10016
In case you're worried about what's going to become of the younger generation, it's going to grow up and start worrying about the younger generation. - Roger Allen, but not me!
|
|
|
|
|
I need to validate the user input for a textbox for a National Insurance Number format i.e. AANNNNNNA. A = alpha and N = numeric
Can anyone suggest a neat way to do this?
|
|
|
|
|
Yes, use regular expressions. You can use RegEx++ from the boost library (www.boost.org). http://www.javaworld.com/javaworld/jw-07-2001/jw-0713-regex.html is the first result of http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=regular+expression+social+security+number&btnG=Google+Search,
but there are plenty more, so have a look around.
|
|
|
|
|
You should not have to compile or link in a whole library to validate the input of one text box.
Look for help topics in MSDN about custom DDV() routines.
Roger Stewart
"I Owe, I Owe, it's off to work I go..."
|
|
|
|
|
Can anyone suggest a neat way to do this?
He asked for a neat way. Not an efficient way.
I'm a regular expressions junkie, though. I think it should be part of the C++ language specificatin myself, but that's just me. I accept the overhead of that library because of what it gives you. Again, that's just me.
-Matt
p.s. Here's an article on using Regex++ in your app http://www.codeproject.com/string/Regex__.asp
------------------------------------------
The 3 great virtues of a programmer:
Laziness, Impatience, and Hubris.
--Larry Wall
|
|
|
|
|
What is a "neat" solution? There is only elegant solution. In MFC, I recommend overriding the on-change event handlers and can the edit text for the desirable input.
Kuphryn
|
|
|
|
|
I'm assuming you have an modal dialog for entering a number of values.
First you need to decide when the validation should be performed. Directly when the user is inputing the value into the editbox or when he are done with the input and accepts (presses OK or Enter).
The latter one is easier, in OnOK() call a function which validates the entered value and if it returns true everything is ok and you can close the dialog else you need to pput up some error and let the user try again.
Validating during input is a bit trickier, but if you use a masked edit control it's not that hard. Microsoft has one, Insert ActiveX control - Microsoft Masked Edit Control (msmask32.ocx). I use one from Dundas, which they gave away for free a long time ago! It's a very small part of there Toolbox. You will find several attempts here on CodeProject also... http://www.codeproject.com/editctrl/#Masked%20and%20Validating%20controls[^]
Hope this will help you!
Mike Eriksson
Sonork 100.21825
|
|
|
|
|
Hi
I added the OnPaint() function to my CDialog-based app via the class-wizard. But for some reason it does not get called, why?
As far as I can see classwizard set up everyhting correctly:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
ON_WM_ERASEBKGND()
ON_WM_PAINT()
void CMyDlg::OnPaint()
{
CPaintDC dc(this);
}
What's going wrong?
thanks in advance,
Greg
modified 12-Sep-18 21:01pm.
|
|
|
|
|
It all looks good to me.
did you include the obvious -- #include <afxwin.h> ?
That would be my only two cents
Jeff Patterson
Programmers speak in Code.
www.anti-dmca.org
|
|
|
|