|
coor when i have one i get told to write it down and get back to bed
|
|
|
|
|
Why not define ahead of time a range of ID's that are to be used for this dynamic menu generation and then use the message handler ON_COMMAND_RANGE( id1, id2, memberFxn )
You can define a range such as 100 - 200, which can correspond with the items in the database. When adding the menu items use this range value + WM_USER as below:
#define LOWER_RANGE WM_USER + ID_BASE_SHORT_REF_COMMAND
#define UPPER_RANGE WM_USER + ID_BASE_SHORT_REF_COMMAND + 100 // Replace 100 with a valid range value
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND_RANGE(LOWER_RANGE, UPPER_RANGE, OnCustomCommand)
END_MESSAGE_MAP()
void CMainFrame::OnCustomCommand(UINT nID)
{
switch(nID)
{
case LOWER_RANGE:
// ... do something
break;
case LOWER_RANGE + 1:
// ... do something
break;
} // End Switch()
}
Not sure how you will relate what exactly these ID's correspond to in the database. You will have to figure this out.
|
|
|
|
|
Bill S wrote:
Why not define ahead of time a range of ID's that are to be used for this dynamic menu generation and then use the message handler ON_COMMAND_RANGE( id1, id2, memberFxn )
because if i want say 200, then i hafta go into the resrouce.h and #define 200(or whatever)
by hand...is there an easier way?
Bryce
|
|
|
|
|
bryce wrote:
because if i want say 200, then i hafta go into the resrouce.h and #define 200(or whatever)
Why do you have to define these in resource.h?
You can simply add another include file to the project that contains special defines, constants, etc. like "MyToolDefs.h" and add them there. Just add this new Project include file to the file list for the cpp file that needs it. In reality you don't even have to use defines or constants unless you want to make it easier to change the values in only a single place down the road.
Best Regards,
|
|
|
|
|
I want to programatically generate GUID and want to store it as a key in std::map. Plz tell me the way to programatically generate GUID and storing it in appropriate datatype/s
|
|
|
|
|
// Generate a unique GUID
GUID Guid;
HRESULT hr = ::CoCreateGuid(&Guid);
ATLASSERT(SUCCEEDED(hr));
specify the type of element in the container as GUID.
Best Regards
|
|
|
|
|
Hi there,
I created DLLs in the past from my C-code, now I want to do that also with C++ code?
Is this possible and do I feel much difference? Thanks for help and... perhaps with a link pointing me into the right direction (tutorial). Thanks!
|
|
|
|
|
you can only export a class from a DLL if you make an MFC (or "extension") DLL. and, then you can only use the DLL version of MFC in the project.
-c
WWJD? JWRTFM. found on /.
|
|
|
|
|
thx. Am I bound to use MFC... or can I also make my own classes (it's a network class here) a DLL?
|
|
|
|
|
Chris Losinger wrote:
you can only export a class from a DLL if you make an MFC (or "extension") DLL.
That is not true. Create a new Win32 DLL project in VC++ and select the option to export some symbols, a plain C++ class will be exported.
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!
|
|
|
|
|
???
i've been wrong on this point for years.
is it that you can only export MFC object from an MFC DLL?
-c
Conservative:
One who admires radicals centuries after they're dead.
-- Leo C. Rosten
|
|
|
|
|
Chris Losinger wrote:
is it that you can only export MFC object from an MFC DLL?
Think that is correct, because you need to have the CWinApp object to work with. However, a MFC extension DLL is a special type of DLL that uses the MFC applications CWinApp object instead of creating its own.
Then there is a regular DLL that can export functions and C++ objects.
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!
|
|
|
|
|
create a win32 DLL project in VC++, and select the option that "exports some symbols". That should get you started. Here is the syntax to export a class:
class __declspec(dllexport) CClass {
public:
CClass(void);
};
The problem with exporting C++ classes is when you decide to expand the class for version 2.0 of your software. If you have different versions of a DLL with different class specifications in each DLL, then your programs may not work properly unless they have the properly matching DLL versions. This is the problem that COM attempts to solve.
If you are creating a program that may have different versions, then you may want to consider using COM instead of exporting classes from a DLL. This is just a suggestion.
If you have any more questions feel free to ask.
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!
|
|
|
|
|
kilowatt wrote:
If you are creating a program that may have different versions, then you may want to consider using COM instead of exporting classes from a DLL. This is just a suggestion.
If you have any more questions feel free to ask.
thanks, I think I'm ready to start.
Currently I do not plan to use different versions of a class.
Another thing I might implement is checking for "plugin" DLLs (all in same format, but with different functionality, normal C is fine here). For example a file provider1.dll, provider2.dll, etc... if they exist I would like to use them? Winamp uses this kind of DLL "plugins", but I don't know how it works.
|
|
|
|
|
Is there a way to programatically cancel/close a menu that was displayed using TrackPopupMenu?
I am displaying a menu using TrackPopupMenu. When that menu is rt-clicked, I handle the WM_MENURBUTTONUP message and create a new popup context menu by calling TrackPopupMenu with the TPM_RECURSE flag set. I would like all the menus to close when a selection is made from the context menu, but have not found a way to do so. Currently only the context menu is closed, not the original menu. Any ideas on how to force it to close as well?
Thanks,
Greg
|
|
|
|
|
I believe sending a WM_CANCELMODE to the parent window of the menus will do the trick.
--Mike--
Just released - RightClick-Encrypt v1.3 - Adds fast & easy file encryption to Explorer
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
|
I have a blob that i retreived in a char* buffer, and it has access header stuff for 78 starting bytes. I want to remove these. whats the simplest way of doing this. I know the total length. i tried:
but it crashes at the memcpy. The pBuf I got from doing :
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
Its the first 78 bytes of pBuf I want to get rid of.
Thanks,
ns
|
|
|
|
|
memmove ( pBuf, pBuf+78, DataLength-78 ); You need to use memmove() because the source and dest ranges overlap.
--Mike--
Just released - RightClick-Encrypt v1.3 - Adds fast & easy file encryption to Explorer
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Gosh! That was like magic!! I couldnt believe it when I used your memmove and my images showed up!!!!I cant thank you enough!!!!!
ns
|
|
|
|
|
I don't think you even need to do that. If you have a char * called szRodney and you want to skip the first four characters, then
char * szEy = szRodney+4;
should do it, just don't forget to delte szRodney and NOT szEy.
Christian
We're just observing the seasonal migration from VB to VC. Most of these birds will be killed by predators or will die of hunger. Only the best will survive - Tomasz Sowinski 29-07-2002 ( on the number of newbie posters in the VC forum )
Cats, and most other animals apart from mad cows can write fully functional vb code. - Simon Walton - 6-Aug-2002
|
|
|
|
|
One way to do it is:
int bytestoskip = 78;<br />
void *pBuf;<br />
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);<br />
char *szStr = (char *)pBuf + bytestoskip;
Drinking In The Sun
Forgot Password?
|
|
|
|
|
Great! But a nagging question. I'm new to pointers. Now ,I thought that when you declare something as char* you have to do a new to allocate memory before you can use it. Yet in the SafeArrayAccessData and also your *szStr, all we have is the pointer declaration, but no memory allocated for its contents. Sorry if this is an obvious question.
Thanks for the nifty suggestion.
ns
|
|
|
|
|
A SafeArray has the data allocated somewhere in its internal buffer. When you call SafeArrayAccess Data, the interal buffer is locked and a pointer to it is returned to you. This means that you do not have to copy the data, but you'll have to keep the safearray locked. Remember to call SafeArrayUnaccessData when you're done with the pointer!
James
Drinking In The Sun
Forgot Password?
|
|
|
|
|