|
For a compatible DC, you have to give it a backing buffer - a bitmap object - to paint onto. A newly-created compatible DC has a 1-pixel monochrome bitmap selected into it. Any painting outside this area is simply discarded.
You need to create a new bitmap compatible with the original DC (using CreateCompatibleBitmap ) and select that into memDC using SelectObject before you start painting. If you make it compatible with the memory DC you get a monochrome bitmap, rather than one with the colour depth of the original.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
Superb - worked a treat. Many thanks
*********************************************
The sooner you fall behind, the longer you have to catch up.
|
|
|
|
|
I'm writing an add-in for IE and i would like to know if the document has been loaded entirely or it just resulted in a fragment (it happens oftenly when you hit the Stop button).
Do you know how could i accomplish this? I didn't find anything valuable from IHTMLDocument2 ...
"though nothing
will keep us together
we can beat them
for ever and ever"
rechi
|
|
|
|
|
Hi.
I have a program that reads a database and displays its graphics into a CScrollView Instance. To do that it reads records from the database and creates a small metafile for each of it. Finaly, when all those metafiles are created it replays them over the view and displays those that are part of the visible (on screen) window.
I want to create that view invisible (not on the screen) and using the same functions I would like to create all those metafiles. Then rather than replaying them on the display I would like to save them in the disk as EMF.
So far I manage to create the EMF and to replay over it the metafiles. However, I am always getting a part of my image in the saved file and not the whole image (wich be larger than the screen). I do not display the view on the screen thus the CGetClientBox CGetClipBox functions return a zero size rectangle. I 've tried to use functions to manipulate the window extend and the viewport but I am not sure that I understand them.
Can some explain to me what are window origin/extend versus viewport ones? And how can I affect the size of a disk saved MetaFiles?
Thanks a lot
Dimitris
|
|
|
|
|
As already stated, I have isolated a code generation problem with VC6 that I believe is a bug.
(a) If you have VC6 SP 1..4, please download the project and try it (it's a single-file project)
http://www.cherea.de/ReleaseBuildProblem.zip[^]
Make a debug build, and run it. Same for a Release Build. I expect no response in debug (succeeds), and a message box "Error" in the release build (fail)
If the release build fails, please send me the disassembly (from the release/ folder).
(b) See the next reply for the code in question. Have a look at it, I still hope I've made a mistake on the C++ side. The download mentioned above also contains much more information (detailed description, isassembly, etc.)
Thanks
I never really know a killer from a savior boost your code || Fold With Us! || sighist | doxygen
|
|
|
|
|
#include <comdef.h>
inline GUID GetSomeID()
{
static const GUID someid_ =
{ 0x11112222, 0x3333, 0x4444, { 0x55, 0x55, 0x66, 0x66, 0x77, 0x77, 0x88, 0x88 } };
return someid_;
}
IUnknownPtr GetSomeUnknown()
{
try
{
static IUnknownPtr unk;
struct __declspec(uuid("{CFC399AF-D876-11d0-9C10-00C04FC99C8E}")) idMSXML;
if (unk==NULL)
unk.CreateInstance(__uuidof(idMSXML));
if (unk != NULL)
return unk;
}
catch(...) {}
DebugBreak();
return NULL;
}
struct CPtrWrap : IUnknownPtr
{
CPtrWrap(IUnknownPtr unk) : IUnknownPtr(unk) {}
};
struct CFinalPtr : public CPtrWrap
{
CFinalPtr(CPtrWrap psw) : CPtrWrap(psw) {}
};
static IUnknownPtr GetItem(GUID id, long l0, long l1)
{
return (id == GetSomeID()) ? GetSomeUnknown() : NULL;
}
struct CEnableMe
{
virtual void Enable(BOOL bOn = TRUE) {}
};
struct CMyOneApp
{
int m_mainFrame;
CMyOneApp() : m_mainFrame(1) {}
void UpdateEditDuplicate(CEnableMe * pCmdUI);
};
void CMyOneApp::UpdateEditDuplicate(CEnableMe * pCmdUI)
{
try {
bool enable = false;
{
rand();
GUID ParentID = GetSomeID();
CFinalPtr itParent = GetItem(ParentID, 0, 0);
if (itParent == NULL) _com_issue_error(E_POINTER);
enable = m_mainFrame != NULL;
}
pCmdUI->Enable( enable );
return;
} catch(_com_error ce)
{
OutputDebugString(" *********** FAILED ***********\n");
}
}
int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
CEnableMe cmdUI;
CoInitialize(0);
CMyOneApp app;
app.UpdateEditDuplicate(&cmdUI);
return 0;
CoUninitialize();
}
I never really know a killer from a savior boost your code || Fold With Us! || sighist | doxygen
|
|
|
|
|
It is coming as you expected on my machine. I mean there is a Message Box saying "error" in Releasewithdebug configuration and its ok on debug config.
Now, how do I send u the file
Found on Bash.org
I'm going to become rich and famous after i invent a device that allows you to stab people in the face over the internet
My Articles
|
|
|
|
|
thanks!
no need for the file in this case, but which VC6 Service Pack is installed?
(You can look in the registry HKEY_LOCAL_MACHINE\Software\Microsoft\Visual Studio\6.0\Service Packs\, the "latest" value)
I never really know a killer from a savior boost your code || Fold With Us! || sighist | doxygen
|
|
|
|
|
No Service Pack installed. It is just plain Visual C++ 6.0
Found on Bash.org
I'm going to become rich and famous after i invent a device that allows you to stab people in the face over the internet
My Articles
|
|
|
|
|
|
I get only a warning at the first "Release" build:
--------------------Configuration: RelBugRepro - Win32 Release--------------------
Compiling...
RelBugRepro.cpp
Linking...
LINK : warning LNK4089: all references to "OLEAUT32.dll" discarded by /OPT:REF
RelBugRepro.exe - 0 error(s), 1 warning(s)
When running both builds, the behaviors are the ones you espect.
peterchen wrote:
If you have VC6 SP 1..4,
Ooops! I wasn't careful enough, I use VC6 SP5
Fold With Us!
Sie wollen mein Herz am rechten Fleck
Doch seh ich dann nach unten weg
Da schlägt es links
|
|
|
|
|
Yeah, the release build failed here too. It seems to be a problem with the optimiser reusing registers. The ESI register is being clobbered in the UpdateEditDuplicate() method just before the call to GetItem() (well, it is here, anyway). You can get around the problem by making GetSomeID() non-inlined or passing an address to the GUID rather than returning the structure. Not sure about passing the GUID by address to GetItem(), but that would probably fix it also.
If you send me a reply, I can email you the listing file if you like.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
My dissassembly matched your expected pattern. Although in my case, the register was not cleared to zero, but was set using the high-order dword of the GUID structure returned by GetSomeID() since it was inlined.
Funnily enough, in my case, the extra block was not needed and made no difference; neither did the rand() call - I could remove either one and still have the same error.
It appears here as though the problem is in the initialisation of the itParent object. At warning level 4, the compiler complains about being unable to inline the constructors, and on investigation, there are 8 bytes unaccounted for on the stack at the end of the function call (which would be equal to the two parameters to the two constructors called). I made the parameters to the constructors constant references rather than values, and this fixed the problem, as did making another constructor for CFinalPtr that took an IUnknownPtr argument, so only one constructor was called. I've noticed before that the compiler has trouble with copy constructors that take structures by value.
[edit]Disregard that. Used the wrong file [/edit]
Just noticed something... You're passing a CPtrWrap as an argument to the only CPtrWrap constructor that expects a IUnknownPtr. I'm not sure that's a valid construct, since CPtrWrap is derived from IUnknownPtr, and you're passing it by value, not by reference. If the constructor expected a reference or pointer there wouldn't be a problem. To be honest, I'm surprised the compiler doesn't warn about it. Certainly, if CPtrWrap had any data members of its own or virtual functions that weren't in IUnknownPtr, I'd expect it to totally screw up; basically if the size of two were different. Have a look at this, because I think it may have something to do with the problem.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
well the basic structure is:
struct B : public A
{
B(A a) : A(a) {}
};
struct C : public B
{
C(B b) : B(b) {}
};
(the classes have no additional members)
I use no reference, to allow the classes to re-use half-a-dozen overloaded constructors.
I never really know a killer from a savior boost your code || Fold With Us! || sighist | doxygen
|
|
|
|
|
Could you please check which SP is installed at yours?
Listing file would be interesting only if it passes.
The original code is quite a bit more complex, and while I can work around this in this one place, I have probably thousands of others wit h a similar structure. The version posted is the "most brittle" one - changing a single thing will fix it.
But from the isolation process I have dozens of iterations that show the same bug in more comple code. (that's the frightening part) It seems to be triggered by rgister starvation for local/temp variables, a function with many parameters, and the killer is always moving an assignment (mov REG, esp) to far up.
I never really know a killer from a savior boost your code || Fold With Us! || sighist | doxygen
|
|
|
|
|
peterchen wrote:
Could you please check which SP is installed at yours?
Oh, it's SP5. I thought I only had SP4 I must have installed it without letting myself know
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
I want to modify/customise the icon of EXE files programatically
For this purpose, I made use of LoadResource, FindResource, UpdateResource and other helper functions.
But, could not achieve the desired result!
Has anyone done such work?, do let me know!.
NK
|
|
|
|
|
There's no easy way to do this! I think your best shot it is to surgically change the bytes of data within the EXE. This will be no mean feat, but there's an article recently published that demonstrates how to surgically read the data - http://www.codeproject.com/useritems/GetIconsfromExeorDLLs.asp[^] - you may be able to adapt the teqnique to modify the images.
Joel Holdsworth
"Outlook not so good"
That magic 8-ball knows everything! I'll ask about Exchange Server next
|
|
|
|
|
Thanks for the reply!
Yeah...I went through the article and also the code!
Found some useful utilities(ResourceHacker) as well on the NET. This tool has an option to change the icon. But after changing the icon, it was not reflected on my windows explorer. I had to copy and paste the file to see the new updated icon. Presently, I am using this tool to debug what my program is updating in the resource file. As you rightly put it, its not an easy task!.
|
|
|
|
|
I want to change the title bar color of application,
there is an API "SystemParametersInfo" that can do that, but
It changes the color of title bars of all applications, where as I want to change only the color of my application's titlebar.
I know that painting non-client area we can do it, but there are numerous dialogs in application, painting in each of them is difficult, due to some reasons I avoid this technique.
Is there a more simple solution?
Please Help?
|
|
|
|
|
pc_dev wrote:
I know that painting non-client area we can do it, but there are numerous dialogs in application, painting in each of them is difficult, due to some reasons I avoid this technique.
Is there a more simple solution?
non-client painting is the way to do it. Just create a base class for all your dialog that will take care of that, and just pass a color to each dialog.
On the other hand, maybe skinning can do that, but it is still the same thing, painting the non-client area.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
This article covers that topic
Custom captions[^]
If you vote me down, my score will only get lower
|
|
|
|
|
Hi
When I create an "out-of-the-box" MDI application with the project wizard (using Visual C++ .NET 2003) with a CView as child (so every setting in the wizard is left on default) then the OnMove() function fires only twice - at the start of the application.
<br />
void CTestOnMoveView::OnMove(int x, int y)<br />
{<br />
TRACE("CTestOnMoveView::OnMove (%d/%d)\n", x, y);<br />
CView::OnMove(x, y);<br />
}<br />
...results in...
<br />
CTestOnMoveView::OnMove (0/0)<br />
CTestOnMoveView::OnMove (2/2)<br />
Afterwards OnMove() is never called again, no matter how I move, resize, maximize and minimize the application window and/or the child window. Only if I close the document/childwindow and make a new one ("File"->"New") then OnMove() is called again twice, then no more afterwards.
Sorry, I just don't get it
OnResize() on the other hand works 100% as expected, firing every time the size of the window is someway changed.
Any help welcome,
thanks,
T.T.H. / Matthias
|
|
|
|
|
That is because the View never moves...
The view window is actually a child window of your CChildFrame (from CMDIChildWnd),
and (almost) always sits at (0,0).
When you drag the "View" about, you are actually dragging the frame about. The view
sits still relative to its parent window.
When you resize the "View", you actually resize the frame. The frame resizes the View,
which is why you get WM_SIZE messages!
If you really need to know that you've moved, move your functionality into CChildFrame.
The child frame can be useful, as you can (e.g) toolbars to each frame, instead of
just having the main ones.
Hopefully that made sense!
Iain.
|
|
|
|
|
My question is I have a Dialog Form. If I move the mouse on the form , ToolTipText should appear with a message "mouse is on the move".
The section of the block is given below
void CDialogBackGroundDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);
}
How will code the block for the OnMouseMove with ToolTipText facility?
Can anyone please help me regarding this matter.
Philip
|
|
|
|
|