|
I have a dynamic submenu being created under a toplevel menu. THese submenus have no ID since I dont know how many there are. So to write handlers for these when clicked, it seems , can be achieved by capturing WM_MENUCOMMAND. BUt I havent figured out how to do this. If it were a resource with ID_MENU_A, then I could of course write the COMMAND handler for it> But I am rather lost in utilizing WM_MENUCOMMAND:
How to trrap it?
What all needs to be added to the code to get this to work?
THanks,
Appreciate your help,
ns
|
|
|
|
|
You may perhaps not know a specific value, but perhaps can you know the range of the IDs.
ON_COMMAND_RANGE(ID_MENU_START, ID_MENU_END, OnMenuRange)<br />
ON_UPDATE_COMMAND_UI_RANGE(ID_MENU_START, ID_MENU_END, OnUpdateMenuRange)
HTH,
Angels banished from heaven have no choice but to become demons
Cowboy Bebop
|
|
|
|
|
The menu keeps getting redone all the time. Lets say I have a maximum of 200 items I could possibly want. Then
if I put ID_MENU_START = 5000, and ID_MENU_END = ID_MENU_START + 200
(BTW how does one decide what number to assign to ID_MENU_START?)
Then if at a certain time I have only 50 menu items and I click one, then will the function OnMenuRange run without crashing?
i.e since the remaining 150 dont exist is that a problem?
The other question is: what if I needed a different handler to run for each menu item? ? I have no IDs
Appreciate your help,
ns
|
|
|
|
|
ns wrote:
BTW how does one decide what number to assign to ID_MENU_START?
Take a look in your apps resource.h file and assign it there. Also make sure that none of the id's in the range are being used for anything else.
ns wrote:
Then if at a certain time I have only 50 menu items and I click one, then will the function OnMenuRange run without crashing?
This should be fine. The OnUpdateUI and OnCommand handlers only get called if the menu item actually exists. You can also tell for which item it is for by the parameter that is passed to the function. Just make sure you get the function prototypes right, as they are not done by class-wizard and have to be done manually.
ns wrote:
what if I needed a different handler to run for each menu item? ? I have no IDs
Farm the OnRanegCommand() id out to the correct function in this handler by looking at the command id passed to you.
Roger Allen
Sonork 100.10016
This is a multiple choice question, choose wisely
Why did the hedgehog cross the road?
A: To show he had guts?
B: To see his flat mate?
|
|
|
|
|
Thanks !!
Troubling point: . Very luckily I found the prototype for the ON_COMMAND_RANGE handler in one of my books. I looked on the web , and found one place that showed me too. But MSDN didnt have a prototype under the index word ON_COMMAND_RANGE. Most of my books didnt have the prototype either.
Your respoinse was very informative and answered my questions very well. Thank you again.
Appreciate your help,
ns
|
|
|
|
|
This article[^] should help you
K.
Angels banished from heaven have no choice but to become demons
Cowboy Bebop
|
|
|
|
|
Thats a terrific link!!! MAny thanks for your input!
Appreciate your help,
ns
|
|
|
|
|
I "upgraded" to VS.net and I'm having trouble doing things that used to be simple...(I know, I'm old etc etc) I have to add a combobox to a property page in an existing modless dialog application ( built using Visual Studio & VC++ 6.0 )but my frustration level is about to blow! Do I need to go back to my old VS to get this done? What happened to my friend the Class Wizard??? Is there someplace that I can walk through the process of adding a dropdownlist with two items to my existing code?
Frustrated & cold ( it's 14 below today );P
The world is run by those who show up...and they usually have nothing else to do!
|
|
|
|
|
Hello,
Just wondering if its possible to put a simple timer in a console app? Would I have to create a invisible window to do this?
Any ideas?
Rob
|
|
|
|
|
In order to use WM_TIMER in a console app, you would need to create a hidden window and run a message loop. In other words, it wouldn't really be a console app; it would be a Windows application, whose main window was hidden.
A simpler solution that can be used in a console application is to use a thread that blocks on an event. The event is used to signal the thread to exit. When you block on the event (see WaitForSingleObject ), specify a timeout period. The wait function returns what caused the wait to expire. In this case, the timeout is what you're interested in.
Here's an example:
static CEvent ThreadTerminate;
...
<this is the main line code>
...
UINT ThreadFunction(LPVOID parameter)
{
CSyncObject *wait_list[] = { &ThreadTerminate };
for ( ; ; ) {
CMultiLock wait(wait_list,countof(wait_list));
DWORD wait_object = wait.Lock(1000,FALSE);
if (wait_object == WAIT_OBJECT_0) {
break;
}
else if (wait_object == WAIT_TIMEOUT) {
}
}
return 0;
}
Software Zen: delete this;
|
|
|
|
|
Do you know what header I need to include in my stdafx to use the countof?
|
|
|
|
|
Oops. That's one of my own. It's defined like this:
#define countof(array) (sizeof(array) / sizeof((array)[0])) It simply returns the number of elements in a fixed size array at compile time.
Software Zen: delete this;
|
|
|
|
|
cool, Thanks for all your help!
Rob
|
|
|
|
|
I am using your code like this... (Everything works perfect) but the problem is that I show a memory leak:
Detected memory leaks!
Dumping objects ->
thrdcore.cpp(166) : {55} client block at 0x00315208, subtype 0, 112 bytes long.
a CWinThread object at $00315208, 112 bytes long
Object dump complete.
AfxBeginThread(ThreadFunction, theApp);
UINT ThreadFunction(LPVOID lParam)
{
CSyncObject* wait_list[] = { &ThreadTerminate };
for(;;)
{
CMultiLock wait(wait_list, countof(wait_list));
DWORD wait_object = wait.Lock(30000, FALSE);
if( wait_object == WAIT_OBJECT_0)
break;
else if(wait_object == WAIT_TIMEOUT)
{
printf("HTTP Service Timed Out..\n");
ExitProcess(0);
}
}
return 0;
}
Am I missing something..
|
|
|
|
|
The leak is caused by the thread not being terminated. When you use AfxBeginThread , a CWinThread object is created. If you terminate the thread, the object deletes itself when the thread exits. Therefore, in your main program, before you exit, you need to terminate the thread and wait for it to exit:
HANDLE ThreadHandle = NULL;
CWinThread *thread = AfxBeginThread(ThreadFunction,parameter);
if (thread != NULL) {
ThreadHandle = thread->m_hThread;
}
<br>
...
<br>
<br>
if (ThreadHandle != NULL) {
ThreadTerminate.SetEvent();
::WaitForSingleObject(ThreadHandle);
}
Software Zen: delete this;
|
|
|
|
|
Is there any sample code available that will allow me to kill any connections to a particular share on my computer? I'd like to be able to kill all the connections to my source safe share and lock the database before an analyzer. Thanks.
Ron Ward
|
|
|
|
|
It looks like NetShareDel is the API function you need.
Software Zen: delete this;
|
|
|
|
|
Hello,
I'm working with visual c++ and i want to capture a screen and save it to .bmp.
I don't know how to do this, if someone know it.
thx
|
|
|
|
|
The easiest way is probably to use ::GetDesktopWindow() to get a handle to the window, then use something like CxImage[^] found here on code project to help you save it.
If you are interested in learning how to code the HBITMAP and HDC portion yourself to save the bitmap, I would still download cxImage and look at how this class does it.
Good Luck
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
CxImage is to hard for me !
i think there is a fuction to do that... so i search with GetDesktopWindow() and try to found something.
thx a lot
|
|
|
|
|
There is an sample in MSDN that may help you. Search for WINCAP.C
Gary Kirkham
A working Program is one that has only unobserved bugs
I thought I wanted a career, turns out I just wanted paychecks
|
|
|
|
|
|
If you want to do it by hand (the other responses didn't address this), press the Print Screen key. This saves a copy of the entire screen to the clipboard. If you press Alt-Print Screen, that saves a copy of the active window to the clipboard. In either case, you can open the Paint application (usually Start, Programs, Accessories, Paint) and select Paste. Then save the bitmap.
Software Zen: delete this;
|
|
|
|
|
thx you for the reponse but i want to do this in c++.
|
|
|
|
|
Hi,
I'm preparing a device driver for signature & submission.
ChckINF gives an error E22.1.1310 ("Class measurement {...guid..}} is not recognized") (not exact wording)
(Basically we're declaring a custom class for the device, as it doesn#t fit any of the predefined ones)
Is this an "acceptable failure"? I can't find any information on this one.
Also, on one test system, ChkINF complains about incompatibilities in other INF files. What about that?
Peter Puzzled
Changing requirements are the crux of software development - you start with a sex drugs and rock'n'roll design, and end up with an aids crack and techno implementation [sighist] [Agile Programming] [doxygen]
|
|
|
|