|
Hello, Nuno!
See: http://home.socal.rr.com/samhobbs/VC/Collections.html
That might help you. The importnat hting is that instead of:
CMap myWorld;
you probably need something like:
CMap <dword, dword,="" cmyobject,="" cmyobject&=""> myWorld;
Does that look like what you want?
I prefer to use typedefs, so I would do that this way:
typedef CMap <dword, dword,="" cmyobject,="" cmyobject&=""> CMyObjectMap;
CMyObjectMap m_MyObjectMap;
Yes, I think that you are correct that default hash keys are four bytes, because someone in the CodeGuru forum said that, but when I asked him where in the documentation it says that he said he did not want to answer my question because I had given him a negative rating for saying that he was not spamming CodeGuru with a message about the CodeProject web site.
|
|
|
|
|
Hey! I know I did the first reply correctly; it must have gotten messed up by this CodeProject thingee. I sure miss the CodeGuru's preview feature. I took advantage of it often.
I will do my post again and this time I will be sure to copy the password number for fixing this one.
Ok, I got the same result this time that I got the first time. The problem seems to be the brackets used as delimiters for STL. So in the code below use a less-than-symbol ("<") instead of "{" and use a greater-than-symbol (">") instead of "}". This CodeProject forum software seems to exclude text between the "angle" brackets.
So what I meant to say is that instead of:
CMap myWorld;
you probably need something like:
CMap {DWORD, DWORD, CMyObject, CMyObject&} myWorld;
Does that look like what you want?
I prefer to use typedefs, so I would do that this way:
typedef CMap {DWORD, DWORD, CMyObject, CMyObject&} CMyObjectMap;
CMyObjectMap myWorld;
|
|
|
|
|
Eheheh, i couldn't avoid laughing
It's weird indeed, since it's a programmers forum.
Anyway, i think you missed my point (probably as a consequence). My problem is that i need CMap capabilities but with a KEY larger than sizeof(DWORD).
I'm actually digging your suggestion and MSDN CTypedPtrMap. My first choice was that last, but once again, MSDN makes it sound something it seems it's not. I really couldn't think of any application that would need to get a pointer based on a string or something like that, but PERHAPS it would fit my case.
Is there any way to transform 3 UINT in a CString object so that memory is correctly aligned without using string-formatting and string-parsing routines? I'm trying to ask if is there a way to accomplish something like this:
char buffer[sizeof(UINT)*3];
memcpy(buffer,&m_uintarray,sizeof(UINT)*3);
?
Once again, Sam, thank you very much!
|
|
|
|
|
If you do not have to remove items from this list too frequently, then you could use an AVL tree or a binary tree or a ternary search tree.
These types of items do not have a limit on the key length.
You might find some examples of these tree types on CodeProject or on CodeGuru.
I recall seeing an AVL example on CodeGuru before.
|
|
|
|
|
Yes, I missed your point. I got confused by the part that says "UINT types for CPonto members x,y,z could be of type BYTE, so it would fit in 3 of the 4 byte of DWORD". So I am still a little confused, but I guess the important thing is that you want to be able to use CMap with a key that is more than 4 bytes in size.
I did some more searching and found MS KB article Q158541 ("PRB: C2440 Error When Using CMap and User Defined Key Type"). I think that is relevant.
See: http://support.microsoft.com/support/kb/articles/q158/5/41.asp for the online copy of the article.
|
|
|
|
|
Hi again Sam,
MS KB suggests exactly what i said i could do if i declared CPonto members as BYTE's, and that i already did.
After digging some more, i guess one possible solution would be using a CString as the key and use CMapStringToPtr, something like that:
CString key;
CPonto point(1,2,3);
key.Format("%d%d%d",CPonto.x,CPonto.y,CPonto.z);
// now call CMapStringToPtr.SetAt()
Anyway, thank you all who tried to help.
|
|
|
|
|
Hello,
I´d like to use a Toolbar in my MFC Program which is the same as the INternet Explorer/ VC++6.0 use. Where can I find Information? The normal Menus via the API (CreateManu etc.) are only flat, but I want this cool bevel effect.
Sebastian
|
|
|
|
|
Sebastian,
There is a demo project on this site and on codeguru. Your looking for 'hot tool bar'. I think the article was written by Kirk Stowell, if I remember correctly.
Email me if you can't find it.
Sincerely,
Erich J. Ruth
|
|
|
|
|
How do I print a dialog box?
|
|
|
|
|
Best thing to do is a screen grab.
void CMachine::PrintWindow()
{
// show options
CMyPrintDialog PrintDlg(
FALSE,
PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION |
PD_DISABLEPRINTTOFILE,
this);
int Response = 0;
Response = PrintDlg.DoModal();
if (Response == IDOK)
{
// get printer dc
HDC hPrinterDC =(HDC) 0;
hPrinterDC = PrintDlg.m_pd.hDC;
ASSERT(hPrinterDC != NULL);
CDC PrinterDC;
BOOL IsAttached = FALSE;
IsAttached = PrinterDC.Attach(hPrinterDC);
ASSERT(IsAttached);
// Set landscape
LPDEVMODE pDevMode = PrintDlg.GetDevMode();
pDevMode->dmFields |= DM_ORIENTATION;
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
PrinterDC.ResetDC(pDevMode);
// attempt to set abort procedure
int SetAbortProcStatus = 0;
// SetAbortProcStatus = PrinterDC.SetAbortProc( &AbortProc );
// attempt to start print job
DOCINFO DocInfo;
DocInfo.cbSize = sizeof(DOCINFO);
DocInfo.lpszOutput = NULL;
DocInfo.lpszDocName = "PDMW Windows Screen Print";
int StartDocStatus = 0;
StartDocStatus = PrinterDC.StartDoc(&DocInfo);
// if abort procedure set and print job started
if (SetAbortProcStatus >= 0 && StartDocStatus >= 0)
{
// start page
VERIFY(PrinterDC.StartPage() > 0);
// get the screen dc
HDC hScreenDC =(HDC) 0;
hScreenDC = ::GetDC(NULL);// CDC
ASSERT(hScreenDC != NULL);
CDC ScreenDC;
VERIFY(ScreenDC.Attach(hScreenDC));
// create screen device dependent (dd) bitmap
CRect tmp;
GetWindowRect(tmp);
// ClientToScreen(tmp);
// tmp.top -= ::GetSystemMetrics(SM_CYCAPTION);
int ScreenWidth = tmp.Width();// - ::GetSystemMetrics(SM_CXEDGE) * 4;// 0;
// ScreenWidth = ScreenDC.GetDeviceCaps( HORZRES );
int ScreenHeight = tmp.Height();// + ::GetSystemMetrics(SM_CYCAPTION);// - ::GetSystemMetrics(SM_CYEDGE) * 4;
//- ::GetSystemMetrics(SM_CYCAPTION);// 0;
// ScreenHeight = ScreenDC.GetDeviceCaps( VERTRES );
CBitmap ScreenBitmap;
VERIFY(ScreenBitmap.CreateCompatibleBitmap(
&ScreenDC,
ScreenWidth,
ScreenHeight
));
// copy image to screen dd bitmap
CDC MemDC;
VERIFY(MemDC.CreateCompatibleDC(&ScreenDC));
CBitmap* pOldBitmap = NULL;
pOldBitmap = MemDC.SelectObject(&ScreenBitmap);
ASSERT(pOldBitmap != NULL);
VERIFY(MemDC.BitBlt(
0,
0,
ScreenWidth,
ScreenHeight,
&ScreenDC,
tmp.left,
tmp.top,
SRCCOPY
));
// create device independent (di) bitmap
const int BitCount = 24;
long ImageSize = 0;
ImageSize =((((ScreenWidth * BitCount) + 31) & ~31) >> 3)
* ScreenHeight;
BYTE* pBitmapBits = NULL;
pBitmapBits = new BYTE[ImageSize];
ASSERT(pBitmapBits != NULL);
// copy image from screen dd bitmap to di bitmap
BITMAPINFO BitmapInfo;
BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfo.bmiHeader.biWidth = ScreenWidth;
BitmapInfo.bmiHeader.biHeight = ScreenHeight;
BitmapInfo.bmiHeader.biPlanes = 1;
BitmapInfo.bmiHeader.biBitCount = BitCount;
BitmapInfo.bmiHeader.biCompression = BI_RGB;
BitmapInfo.bmiHeader.biSizeImage = ImageSize;
BitmapInfo.bmiHeader.biXPelsPerMeter = 0;
BitmapInfo.bmiHeader.biYPelsPerMeter = 0;
BitmapInfo.bmiHeader.biClrUsed = 0;
BitmapInfo.bmiHeader.biClrImportant = 0;
memset(&BitmapInfo.bmiColors[0], 0, sizeof(RGBQUAD));
VERIFY(GetDIBits(
ScreenDC.m_hDC,
(HBITMAP) ScreenBitmap,
0,
ScreenHeight,
(LPVOID) pBitmapBits,
&BitmapInfo,
DIB_RGB_COLORS
));
VERIFY(ScreenBitmap.DeleteObject());
VERIFY(MemDC.DeleteDC());
ScreenDC.Detach();
// if bitmap selection succeeded
if (pOldBitmap != NULL)
{
// copy di bitmap to printer
int PrinterWidth = 0;
PrinterWidth = PrinterDC.GetDeviceCaps(HORZRES);
int PrinterHeight = 0;
PrinterHeight = PrinterDC.GetDeviceCaps(VERTRES);
if (PrintDlg.m_bCheckFullPage)
{
VERIFY(StretchDIBits(
PrinterDC.m_hDC,
0,
0,
PrinterWidth,
PrinterHeight,
0,
0,
ScreenWidth,
ScreenHeight,
(LPVOID) pBitmapBits,
&BitmapInfo,
DIB_RGB_COLORS,
SRCCOPY
) != GDI_ERROR);
}
else
{
CString strFactor;
int dFactor;
// PrintDlg.m_EditMagnifyCtrl.GetWindowText(strFactor);
strFactor = PrintDlg.GetFactorText();
if (strFactor.IsEmpty())
dFactor = 1;
else
{
dFactor = atoi(strFactor);
if (dFactor < 1)
dFactor = 1;
}
VERIFY(StretchDIBits(
PrinterDC.m_hDC,
(PrinterWidth - ScreenWidth * dFactor) / 2,
(PrinterHeight - ScreenHeight * dFactor) / 2,
ScreenWidth * dFactor,
ScreenHeight * dFactor,
0,
0,
ScreenWidth,
ScreenHeight,
(LPVOID) pBitmapBits,
&BitmapInfo,
DIB_RGB_COLORS,
SRCCOPY
) != GDI_ERROR);
}
// finish the print job
VERIFY(PrinterDC.EndPage() >= 0);
VERIFY(PrinterDC.EndDoc() >= 0);
}
// else could not select bitmap
else
{
// abort job
VERIFY(PrinterDC.AbortDoc() >= 0);
AfxMessageBox("Could Not Print--Memory Error Possible.");
}
// clean up
delete pBitmapBits;
}
// else job cannot be started
else
{
// attempt to abort job
PrinterDC.AbortDoc();
AfxMessageBox("Cannot Start Print Job.");
}
// clean up
PrinterDC.Detach();
VERIFY(DeleteDC(hPrinterDC));
}
}
BOOL CALLBACK CMachine::AbortProc(HDC hdc, int iCode)
{
MSG msg;
while (!bUserAbort && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (!hDlgPrint || !::IsDialogMessage(hDlgPrint, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
if (iCode > 0)
bUserAbort = 1;
return !bUserAbort;
}
|
|
|
|
|
I have implemented an interface using ATL(in-proc server). In one of the interface methods, I display a modal dialog. The dialog is written in MFC. When this interface method and hence when the dialog class' DoModal() is called, there is a line of code in MFC libraries, that calls AfxGetInstanceHandle(). The function AfxGetInstanceHandle() ASSERTs if a variable by name afxCurrentInstanceHandle is not NULL. Unfortunately this variable is NULL. AfxGetInstanceHandle() is supposed to return the handle of the EXE. Am I doing things right?
|
|
|
|
|
At the beginning of the method, put this line:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
to have MFC init its state information for your DLL. You need to do this in every exported function that can be called from outside the DLL.
|
|
|
|
|
I added this line as the first statement of the exported function (in my case an interface method). Unfortunately, I get a linker error that _DllMain@12 is already defined. DllMain is automatically generated for me when I added this ATL object to the project and is where I load the resource DLL for this component. But the linker includes mfcs42ud.lib as well where there is a second definition of DllMain. Moreover I guess that AFX_MANAGE_STATE is for REGULAR DLLs only. What do I do now?
|
|
|
|
|
|
How would I get an event for a key-stroke like ALT+SHIFT+CTRL+L even while the capture isn't on my program? Many programs (such as ICQ) do things like this.
|
|
|
|
|
Look up the RegisterHotKey() API.
|
|
|
|
|
I have a program which will generate Images of different objects on the screen.If you choose a menu item (RSC,Folder for example) you are promted to enter a few parametrs related to the object.(Length,Width,Depth and flute)
Since all of the objects need the same info I want to use one single dialog.However Each object manipulates the info in different ways..With a single dialog and hence a single
"Render" button how can I determine Which object the dialog was called for in my OnRender Function...Is what Im trying to do possible???It has to be this is C++ ).
Any suggestions or hints would be greatly appreciated...
Thanks for the time
J.Prisco
|
|
|
|
|
Make a base class for all the objects.
Put a member variable in it to represent the current ype.
Make an enumeration for all your types.
Derive all your 'object' classes from this base type.
Use the value of the 'type' data item to let your OnRender code know what was selected.
The diaog can also use that 'type' variable to know what controls to display to user, or else how to limit the data ranges where user might be entering numbers.
You could do the saem thing with C structures, always make the first element of the object structures this type.
Then if you have a pointer to some of this memory, you can cast the pointer to this 'type' variable and access the data structure's object type.
|
|
|
|
|
Although this sounds good Im still not to clear on how this is done..Thanks for the hint Ill investigate it further..
|
|
|
|
|
I assume that you have one menu item for each object that you want to display. I also assume that each kind of display object is being abstracted as a class and all these classes have a common base class. In the menu handler for each of these menu items, you would probably instantiate an object of the dialog class and call its DoModal(). You can pass a 'C++ object' of the appropriate object to be displayed to the dialog's constructor. In the dialog's OnRender() method, you can call the Render() method of these objects, provided the Render() method of the base class is virtual.
|
|
|
|
|
Well I made my initial post when I first discovered the problem .At my fist observation it really seemed to be quite a problem..After a little though I figured a way to do what I needed but in fact What I was planning wasnt even necisarry at all.Once I began coding the app I found the problem was no problem at all...For each menu item handler
I use DoModal and upon its return I assign the corresponding objects variables...Although a little inneficient it works just fine..
Thanks for the help I really appreciate all the help I can get and Ill probably need more help with this app which is probably a little too ambitious for me at this point.
|
|
|
|
|
Hi,
I have been trying to set the fontsize and fontface of a label control. Does anyone know how to do this in ATL? I am usnig the stock property "FONT", but I just can't get it to work. I have just about all the other properties doing what I want them to do, but font is really giving me a hard time.
Thanks
|
|
|
|
|
Hi,
There is a very nice step-by-step instructions in the MSDN article "FILE: Using Fonts in ATL Controls with NiceText.exe" Article ID: Q166472. I've used it about a year ago and it worked fine.
Regards,
Alex Gorev,
Dundas Software.
|
|
|
|
|
I am doing some stand-alone apps for handheld scanners. I need to know just exactly what different options the New Project wizard performs.
Does someone know of a document that precisely describes each option and what it produces? (Win32 App, MFC Wizard App, etc.) The help does little or nothing for me here!
I have always used a standard windows MFC app and haven't explored all of the different options.
David Leikis
Thiokol Propulsion systems
|
|
|
|
|
|