|
Hi,
I am using Stingray Objective Grid ver 7.0 for implementing Grid features in my VC++ application. I am using CGXSpinEdit class for implementing spin control feature in the Grid. The problem is that the spin buttons of a spin control cell are visible only if that cell is the current cell (Cell that has the focus). The moment the focus moves from the spin control cell, the spin buttons disappear and re-appear when focus is brought back to the cell. Is there any way in which the spin buttons can be made always visible??
Thanks,
Unni
|
|
|
|
|
I want to intercept the OnKeyDown event. But I can't get the nChar converted to a String like: "R", or something else. Does anyone now how to handle this?
Thanks in advance.
CString Dutch = "Double Dutch";
CString C = Dutch;
|
|
|
|
|
CString str;
str.Format("%c", nChar);
Phew that was exhausting...
|
|
|
|
|
I have created a Wizard inside a dialog WS_CHILD | WS_VISIBLE | WS_TABSTOP,
and what I've found is that I cant access the other controls placed inside the dialog and outside the wizard.
Could you tell me how to avoid this?
Thank you in advance.
|
|
|
|
|
Actually, in the parent dialog you should know as little as possible from the child dialogs. In the same way, in the child dialogs, you should know as little as possible from your parent dialog, except the fact that it is a CWnd-derived class.
When you need to have access on the controls on the parent-dialog, you are not developing object-oriented.. which is your own choice ofcourse
Maybe a better (read: more OO) way is to define a custom message (Let's say WM_DO_SUMPIN), send a message to your parent, and let him(/her?) do whatever is necessary.
#define WM_DO_SUMPIN WM_USER + 15 // Just some value
GetParent()->SendMessage(WM_DO_SUMPIN, wParam, lParam);
(In the parent's class: )
ON_MESSAGE(WM_DO_SUMPIN, SomeFunction);
void CParentClass::SomeFunction(WPARAM wParam, LPARAM lParam)
{
// We should do sumpin' here..
}
.. or do some good thinking why you actually want to do something with that control.
--
Alex Marbus
|
|
|
|
|
I have used the Spy++ and get a numerical id (the 78) and I want to know wich message is it, could you explain me how to do it?
Thank you very much.
|
|
|
|
|
Look in the Windows.h file,
78 = 0x004E which happens to be WM_NOTIFY.
|
|
|
|
|
I'm a novice, but I've taken a look at this file and I can't see nothing related to WM_NOTIFY, could you give me more info please?
thank you in advance.
|
|
|
|
|
Sorry I misinformed you WINUSER.H, my apologies.
Norm
|
|
|
|
|
Thank you very much! you has helped me a lot, this is very important in order to be more productive...
|
|
|
|
|
If you don't know exactly where to look, you could also type the name in the VC editor, in this case WM_NOTIFY, rightclick on it, and select "Go to definition of..".
You'll see where it's defined, and the actual value of it.
--
Alex Marbus
|
|
|
|
|
You can also look it up in VC if you're debugging. In the Watch window, enter "78,wm" (or whatever number) and VC will display the corresponding WM_* symbol.
--Mike--
http://home.inreach.com/mdunn/
Is history an illusion caused by the passage of time, or is time an illusion caused by the passage of history?
|
|
|
|
|
I am working on a game, and I want it to have network play capabilities,
LAN preferrably and without the MFC. It's a very small game, so it shouldn't be to advanced to implement. Does anybody have any idea how I can do this? I have never done a network game before.
Thanks in advance.
Erik
|
|
|
|
|
Good book to start with is the "Winsock 2.0 Programming" by Lewis Napper - Highly Recommended.
If there are more than 2 players, I would recommend client-server. Where the clients connect to a running server app. You could use Winsock API direct or use the MFC wrapper classes (CAsyncSocket & CSocket).
Another strategy would to use DCOM and connection points, here you could start with Professional ATL Programming by Richard Grimes - Good book.
If could be even possible with SOAP, I don't have even knowledge to advise you on this one.
Look around on this site in the Internet Section also look in www.codeguru.com.
Good Luck
|
|
|
|
|
Hi all,
I am writing an MFC app for my friend who finds it hard to open the CD ROM drive by pressing the buttons on the CD-DRIVE.
He has 3 drives, and I want individual ones to open by pressing the button Open.
Can I do this?
How?
Thanks
Ashman
PS: Please be detailed, Im rather dumb =)
|
|
|
|
|
You need to use the media control interface (MCI).
You can send strings or commands to the MCI to get things done.
Set CDAudio Door Open
Set CDAudio Door Close
I don't know how to address more than one CD this way.
Its different using the command API rather than the string API.
see also Microsoft knowledge base article: Q109371
Stephen
|
|
|
|
|
-Enter and ESC keys close the dialog how i can stop it .
-How i can load accelerator from resource to MFC\DIALOG
i use loadaccelerator function but it didn't work.
thank you ...
|
|
|
|
|
The best way is to try a keyboard Hook. That we you are totally in control of what's hapenning.
|
|
|
|
|
You stop it by overriding OnOK and OnCancel. You can make the buttons still work by checking the keystate with GetKeyState(VK_RETURN) (or VK_ESCAPE) and returning if they are down. Then your button works, but the key does not.
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
Hi,
I have structure that looks similar to this:
struct MyInfo
{
CString m_str1;
CString m_str2;
COleDateTime m_dtm1;
CString m_str3;
MyInfo(const CString& str1, const CString& str2, const COleDateTime& dtm1, const CString& str3) :
m_str1(str1), m_str2(str2), m_dtm1(dtm1), m_str3(str3)
{ }
bool operator<(const MyInfo& info)
{
return (m_str1 < info.m_str1 ||
m_str2 < info.m_str2 ||
m_dtm1 < info.m_dtm1 ||
m_str3 < info.m_str3);
}
};
I have a map of MyInfo to CString values, like this:
std::map< MyInfo, CString > mapInfo;
I insert/update elements into the map using operator[], like this:
void accumulate(const CString& str1, const CString& str2, const COleDateTime& dtm1, const CString& str3, const CString& strValue)
{
mapInfo[MyInfo(str1, str2, dtm1, str3)] += strValue;
}
Notice that strValue is appended to whatever is already there.
Then later I iterate through every element in the map, but the problem is that I'm getting duplicate entries in the map (for the same MyInfo object). Why?
Thanks,
Alvaro
|
|
|
|
|
...i just tried your code (with slight modifcations to make it compile) and it worked fine, no duplicate entries.
i even did two identical "accumulate" calls in a row, to try to duplicate keys. when i dumped the map, though, the keys were unique.
-c
|
|
|
|
|
I really appreciate you looking into this problem for me Chris! Unfortunately I wasn't expecting to receive a "could not reproduce it" response otherwise I would have taken greater care to avoid it.
Here's how I was able to reproduce this problem. I took my sample code into a new MFC dialog based application I called "Doodle". I added a button to it and then a handler which I called OnButtonTryMap. Then inside I called the (global) accumulate function 100 times to insert/update the same MyInfo objects to the map each time. Here's how it looked:
#pragma warning (disable:4786) // disables: identifier was truncated to '255' characters in the debug information
#include <map>
struct MyInfo
{
CString m_str1;
CString m_str2;
COleDateTime m_dtm1;
CString m_str3;
MyInfo(const CString& str1, const CString& str2, const COleDateTime& dtm1, const CString& str3) :
m_str1(str1), m_str2(str2), m_dtm1(dtm1), m_str3(str3)
{ }
bool operator<(const MyInfo& info) const
{
return (m_str1 < info.m_str1 ||
m_str2 < info.m_str2 ||
m_dtm1 < info.m_dtm1 ||
m_str3 < info.m_str3);
}
};
std::map< MyInfo, CString > g_mapInfo;
const COleDateTime g_dtmCurrent = COleDateTime::GetCurrentTime();
void accumulate(const CString& str1, const CString& str2, const COleDateTime& dtm1, const CString& str3, const CString& strValue)
{
g_mapInfo[MyInfo(str1, str2, dtm1, str3)] += strValue;
}
void CDoodleDlg::OnButtonTryMap()
{
CString str1, str2, str3;
COleDateTime dtm = g_dtmCurrent;
for (int iItem = 0; iItem < 100; iItem++)
{
str1.Format("str1 = %d", iItem);
str2.Format("str2 = %d", iItem + 1);
str3.Format("str3 = %d", iItem + 2);
dtm += 1;
accumulate(str1, str2, dtm, str3, str1);
}
CString strMessage;
strMessage.Format("There are %d items in the map.", g_mapInfo.size());
AfxMessageBox(strMessage);
}
Try this and see if you get the same results. The first time I press the button I get "100 items" in the message. The second time, I get 118! The third time I get 142, then 154, and so on. If I've done this correctly, I should always see 100 items, shouldn't I?
Thanks for your help,
Alvaro
|
|
|
|
|
You hit the nail on the head! It's the ambiguous comparison that's causing the problem. How could I have been so blind? I changed the less-than operator to this and now it works as expected:
bool operator<(const MyInfo& info) const
{
return ((m_str1 < info.m_str1) ||
(m_str1 == info.m_str1 && m_str2 < info.m_str2) ||
(m_str1 == info.m_str1 && m_str2 == info.m_str2 && m_dtm1 < info.m_dtm1) ||
(m_str1 == info.m_str1 && m_str2 == info.m_str2 && m_dtm1 == info.m_dtm1 && m_str3 < info.m_str3));
}
Thanks for your help!
Alvaro
|
|
|
|
|
the problem is in your operator < function.
if MyInfo a = {"E", "A", xxx, xxx} MyInfo b = {"A", "E", xxx, xxx}
a will always be less than b; and b will always be less than a. but std::map requires that the comparison is strict. a < b or b < a, not both.
there's a good chance the ambiguous comparison is screwing with the map's tree.
-c
|
|
|
|
|
Chris,
In this example you're right because str1 is different for every element in the map. But what if str1 where not always different? If str1 were sometimes the same value as in previous elements then the solution you propose would not work. In other words, if in the for loop you put:
str1 = "a";
instead of
str1.Format("str1 = %d", iItem);
then we would still have 100 unique items but your solution would yield only 1. So the problem does not appear to be in the less-than operator. It's something else which too me smells like a bug in the std::map code.
Anyone have a clue?
Thanks,
Alvaro
|
|
|
|
|