|
I'm very stupid... logical OR is "|".... YES... of course... I know that... And now, It's OK... (stupid error)... I'm sleeping...
Thanks... Thanks... Thanks...
Hello World!!!
from Raphaël
|
|
|
|
|
Hi everyone,
I'm hoping someone can shed some light on the use of inheritance with dialog classes. I'm afraid that my situation is a bit tricky to describe. Please bear with me
I've designed a nice dialog (IDD_CEN_SEL). It will always have the same layout of buttons, edit boxes etc, but I want it to react to the user in various different ways. I thought that a good way to do this would be to use C++ inheritance/polymorphism. I created the dialog and the associated C++ class, CCenSelBase. I mplementd all of the constant functionality in the base class. I then created an inherited class CCenSelMapping : public CCenSelBase. This reacted to the user interface in certain specific ways. I also created a class CCenSelPlane : public CCenSelBase with slightly different functionality. This all worked nicely, and I was happy. Can you feel a 'But' coming...
But, I then created a new class CCenSelOffset : public CCenSelMapping. So I have a class inheriting from a class that inherits from the base class. Here's were it all gets very confusing.
here's some snippets of code:
BOOL DCenSelBase::OnInitDialog()
{
CDialog::OnInitDialog();
...
...
BOOL DCenSelMapper::OnInitDialog()
{
DCenSelBase::OnInitDialog();
InitTabs(m_tab);
...
...
BOOL DCenSelOffset::OnInitDialog()
{
DCenSelMapper::OnInitDialog();
...
...
CCenSelMapping uses DataExchange to get a member variable CTabCtrl m_tab, linked to a tab in the dialog. It initialises the tab within InitDialog().
So the tab initialisation code is called in DCenSelMapping::InitDialog(), via a call to DCenSelOffset::InitDialog(). But in DCenSelMapping::InitDialog() m_tab is not intialised (m_tab::m_Hwnd == NULL).
In the debugger, DCenSelOffset::m_tab.m_hWnd is valid, but DCenSelMapping::m_tab.m_hWnd == NULL.
Does this make any sense to anyone? I have a feeling I've described the problem really badly, so if anyone needs more clarification, please ask away.
Any help would be greatly appreciated,
TIA
Pete
|
|
|
|
|
Hi Pete,
It's hard to know whithout further information, but I got a hunch about what might be going on. Is by chance m_tab declared twice, both in DCenSelMapping and DCenSelOffset ? This could be causing the classes to "look" at different member objects.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Yes, m_tab is declared twice. Or rather, was. I just removed it from DCenSelOffset.
That didn't work
This got me thinking, and I /think/ I've worked out what was happening. m_tab was declared in DCenSelMapping, and included in the AFX_DATA_MAP. So when DCenSelBase::InitDialog() called Dialog::InitDialog(), it was only initialising the variables declared in DCenSelBase's AFX_DATA_MAP, so it didn't initialise the inherited class's AFX_DATA_MAP. So I now have m_tab as a member of CCenSelBase, and have added it to all 3 class's AFX_DATA_MAP. And it works.
Does my explaination seem plausible?
Anyway, to cut a long story short, it now works. Thanks for the help Joaquin.
Pete
|
|
|
|
|
Does my explaination seem plausible?
It does to me I guess you can also keep m_tab in DCenSelMapper and call UpdateData(FALSE) prior to InitTabs() .
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I have stumbled up against a wall with this one and am hoping that someone else has already handled this. I am qualifying code that presently works on WinNT to ensure that it works the same on Win2K. For an owner draw combo box, the following code in the DrawItem method fails on Win2K, but only when the display option for 'transition effects in menus and tooltips' is turned on.
CDC* DeviceContextPointer = CDC::FromHandle(lpDrawItemStruct->hDC);
CWnd* DropDownWindowPointer = DeviceContextPointer->GetWindow();
When the option is turned off, the CWnd pointer has a non null value and points to a real honest to goodness window. When the option is turned on however, the CWnd pointer is NULL and rightly so because with the option turned on, the DrawItem method is invoked without a real honest to goodness window available to draw in. I think that part of the trouble is that the 'architecture' for owner draw stuff has changed and I need to jack around the code to reflect that. Any ideas or comments are appreciated. Thanks.
Chris Meech
|
|
|
|
|
I'm having problems with an array tacking a bunch of sludge on to the end of a array of random characters. It needs to generate an array of 64 random bytes for use inan encryption routine. I'm getting the 64 bytes of information that I want at the front end of the array, BUT..it's also tacking on the contents of the original array that I filled with a sequence from ASCII 32 to ASCII 127 character values. My question is how to get the sludge off the end of the array so it consists of just teh 64 random byte values. Source Code Follows:
srand(GetTickCount());
int nElementCount = 0;
int nElementValue = 32;
char szStringArray[95] = "";
char szRandomBytes[64] = "";
while ( nElementCount <= 94 )
{
szStringArray[nElementCount] = nElementValue;
nElementCount++;
nElementValue++;
}
nElementCount = 0;
while (nElementCount <=63)
{
int nRandomNumber = rand();
while (nRandomNumber >= 95)
{
nRandomNumber = nRandomNumber / 2;
}
szRandomBytes[nElementCount] = szStringArray[nRandomNumber];
nElementCount++;
}
MessageBox(NULL, szRandomBytes, "Random String From Array", MB_OK);
It's good to see kids turning their minds to wholesum activities such as programming, instead of wasting their lives in the hedonistic disciplines of Sex, Drugs, & Rock & Roll... or Sex with Drugs, or Sex with Rocks while Rolling in Drugs, or whatever new-fangled perversions you little monsters have thought up now...
[Shog9 on Kid Programmers]
|
|
|
|
|
Put a terminating character at teh end of your string. The last character in your array should be '\0'. You are trying to display a string in your MessageBox by putting the array of char but are not giving your array of char a termination indicating this is where the string ends.
|
|
|
|
|
char szStringArray[95] = "";
char szRandomBytes[64] = "";
memset(szStringArray,0,95);
memset(szRandomBytes,0,64);
And off u go
Papa
Murex Co.
while (TRUE)
Papa.WillLove ( Bebe ) ;
|
|
|
|
|
i'm converting some of my console apps to Unicode (long story). but, i've noticed that i can't write a Unicode string using cout, i just get a memory address out ("0x00faade2" or whatever).
my question is: is this true on non-US versions of Windows, too? do i have to output only ANSI to the console?
-c
To explain Donald Knuth's relevance to computing is like explaining Paul's relevance to the Catholic Church. He isn't God, he isn't the Son of God, but he was sent by God to explain God to the masses. /. #3848917
|
|
|
|
|
In my experiences, it seems that - with the exception of DBCS languages - if something fails like that on English, it'll fail in other languages, too.
Have you tried using wcout instead of cout ?
Even if you win the rat race, you're still a rat.
|
|
|
|
|
wcout... yeah. there's an idea.
thanks.
-c
To explain Donald Knuth's relevance to computing is like explaining Paul's relevance to the Catholic Church. He isn't God, he isn't the Son of God, but he was sent by God to explain God to the masses. /. #3848917
|
|
|
|
|
You have to use the wide character version (wcout) to print unicode strings. However, I have noticed that internally everything is just converted to ANSI before the buffer is put out (via WriteFile() ) to the console. So if you are using "fancy" charsets this may fail
--
Daniel Lohmann
http://www.losoft.de
|
|
|
|
|
Does anyone know how to get the title bar font for a CFrameWindow?
Thanks,
David.
|
|
|
|
|
|
|
Look into the SystemParametersInfo() API with uiAction set to SPI_GETNONCLIENTMETRICS .
Jeremy Falcon
Imputek
<nobr>"..." - Paul Watson 07-17
|
|
|
|
|
I saw some of the trayclock utility can fix the appearance of systemclock. I suppose they got the HWND and did some thing under it.
I tried and successful added my text in the TrayClock. but the problem is how can I fix the width of trayclock? its width is related with left side iconbar. I want the changing of trayclock can automatically affect on iconbar even TrayNotify(the parent form of trayclock). how to get it?
|
|
|
|
|
I want my app to show up blank if there is no database name in the registry, but popup a CFileDialog OPen. I query the registry in oninitialupdate of the view, and at the very last statement, if there was no dbname in the regsitry I sendmessage to trigger the "Open Database" menu item. When the app runs, (no dbname in regsitry), the first thing that pops up is the OPen dlg, not my blank view!!!! I tried sending the msg in a function calledin oninitial update - same result. How can I get my blank view to show up first, with the CFileDialog Open dlg over it? If I dont send the msg, and exit the oninitial update I get the UI as expected. But then where would I send the message?
I am quite puzzled. Any suggestions?
|
|
|
|
|
ns wrote:
I sendmessage to trigger the "Open Database" menu item
Use PostMessage() instead. This will allow your (empty) view to open properly, after which the "Open Database" command will be executed.
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
That was so cool! SOmeone had told me I needed to go the route of timers and killtimer etc so I was starting to look into that. PostMessage is perfect!
Many many thanks,
ns
|
|
|
|
|
Yooooou're welcome!
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
hi,
Here is my code:
char buffer[10];
strcpy(buffer, "ABCDEFGHIJ");
cout << buffer << endl;
strcpy(buffer, "");
buffer[0] = 'X';
cout << buffer << endl;
And the output would be:
ABCDEFGHIJ
XBCDEFGHIJ <======= should be "X" only...right?
I think I've initialized the buffer, but why i can have this strange result after i put 'X' in the first character of buffer.
Thank you!!!!!
|
|
|
|
|
buffer[0] = 'X'; This sentence owerwrites the previous value of buffer[0] , which was the terminating null character from strcpy(buffer, ""); As you haven't added any additional terminating character, the remains of the first string appears, hence the output. To get the result you're after, write:
buffer[0] = 'X';
buffer[1]=0; Unless you're doing this for fun or learning purposes, it is strongly advisable that you leave this char manipulation stuff in favor of more robust alternatives like std::string .
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
ChiYung wrote:
strcpy(buffer, "");
buffer[0] = 'X';
cout << buffer << endl;
strcpy does not delete or null any of the characters inside of the buffer. Therefore passing in an empty string copies zero (0) characters and leaves the string untouched. If you want the string to be only 'X' you need to do something like:
buffer[0] = 'X';
buffer[1] = '\0';
The second character is the null character (the slash means it is an escape character); which in C means the end of the string. Character strings in C are always string length + 1. Example:
The string literal, "Hello World!", is actually 13 characters long, the 12 visible characters plus 1 for the null.
Hope this helps,
Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|