|
1/ You should use CPaintDC because CCLientDC is for getting a DC outside CPaintDC. I know you should never call CPaintDC outside OnPaint, but I admit you'll have to look elsewhere for a definitive answer as to why the reverse is true.
2/ Correct. Also true for bitmaps, but if you only select one bitmap into a DC, you'll never notice.
3/ Also correct.
4&5/ No. They are classes and have destructors. The CDC destructor cannot destory a pen it does not have, but if the DC is deleted in it's originla state, the destructors will do the rest.
6/ The GDI stuff is a thin wrapper on Win32 functions, and so it has not changed much. Although try writing this stuff in Win32 where you DO have to delete everything and it gets a bit harder.
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
You must use CPaintDC in OnPaint because CPaintDC calls BeginPaint() and EndPaint() to validate the window regions when a WM_PAINT message is sent.
Look up CPaintDC and read the documentation.
When you select a pen or brush into the DC but do not unselect it (by selecting the original resource), then when the CPen or CBrush goes out of scope, the destructor attempts to delete the brush or pen, but cannot because it's selected in the DC. That means the delete fails and the resource is never deleted.
You don't have to explicitly delete the brushes or pens, since this is done automatically by the destructor of the CPen or CBrush object, so long as the brush or pen is not currently selected in a DC.
|
|
|
|
|
The advice you were given re: leaks is spot on, but to stop flickering, you need to double buffer. This means create a new bitmap and DC, draw into it and then copy the whole lot onto your dialog in one Blt at the end. Also, don't call CPaintDC until you're about to do the Blt and you won't need to undermine OnEraseBackground, which can have some nasty side effects. What will happen is this:
CDC myDC;
// Create DC, select bitmap and draw what you want on your dialog
CPaintDC dc(this);
// Background has been erased if necessary
// Now BitBlt from your other DC, so that the effect is immediate and you get no flicker
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
OKI
For now I selected the CRgn as my object of desire because
1 - I want to paint a Piano-Keyboard onto the screen in my Dialog
2 - When comparing OnLButtonDown(nFlags, point) with PtInRegion(point)
I can easily find and repaint single keys.
3 - Regions don't flicker - not in BLUE, not in BLACK not in any color
Is there any disadvantage of using Regions ?
Thanks for your help
Manfred
---
Programming is knowing...
|
|
|
|
|
I've never used regions, but in reading about them, I'm not sure that this is what they are for. However, as I say, I am hardly qualified to comment as I have not used them.
IF they work, then great, unless someone else can shed more light on any disadvantages, but certainly I'd suggest the double buffering method is the way one usually eliminates flicker, and a method you will end up with as the only viable alternative at some stage if your drawing to the screen becomes progressively more complex. I am assuming you're not building a region off screen and then drawing it in one go - if you are, then you've done what I suggested in any case.
Good luck with it.
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
Quick answer...
I've defined every key of my piano-keyboard as a region. That means 88 keys(regions).
52 white keys and 36 black keys.
- CRgn-Array as a Member of my Dialog
CRgn KeyRegion[88];
- In the constructor of my dialog I create them all
KeyRegion[KeyNumber].CreateRectRgn();
- so I guess the array gets automatically deleted when destroying the dialog
- should not be leaking...
- In my function OnPaintKeyboard() I paint all my 88 keys
CClientDC dc(this);
CBrush BlackBrush;
BlackBrush.CreateSolidBrush(RGB(0,0,0));
CBrush WhiteBrush;
WhiteBrush.CreateSolidBrush(RGB(255,255,255));
- With...
dc.PaintRgn(&KeyRegion[KeyNumber]);
- I can paint my region in the color of the previous selected Brush-Object e.g.
dc.SelectObject(&BlackBrush);
That looks good to me... - And to you ???
I have a second function OnPaintKey() that paints a single key only - not the whole keyboard.
1 - One Question is wherefrom should I call my OnPaintKeyboard() function so that the whole
keyboard gets painted when the dialog gets visible on screen?
2 - Second Question is wherefrom should I call my OnPaintKeyboard() function so that the whole
keyboard gets correctly redrawn when necessary?(Overlaping windows or Moving and removing out
of the visible screen...)
3 - Third Question: Where can I use my OnPaintKey() function (for a single key!!!) so that not
every key has to be redrawn when only the color of one key changes ?
Manfred
---
Programming is knowing...
|
|
|
|
|
IN terms of initial drawing, you can use ONInitDialog, but the whole system revolves around OnPaint, so that's really where you should do all your drawing. Invalidate() will cause OnPaint to be called, and it is called when the window is shown. INvalidateRect() allows you to get only a portion of the screen redrawn - it also calls OnPaint. If the bool passed to either is true then OnEraseBackground is called first.
So you should call from OnPaint and force single key redraw by invalidating a region instead of the dialog.
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
I'm working on a program that will not have a help file, instead help brings up the pdf manual, and I want to stop VC++ from compiling a help file and/or complaining because compiling it fails every time. I'm sure I can figure out the latter ( I have in similar circumstances ) but I'd prefer the former, where it's no longer part of the project. I have already removed everything under 'help files' from the project in the file view.
Thanks.
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
ummmm
i dont get any help files aor whatever in my projects
---
"every year we invent better idiot proof systems and every year they invent better idiots"
|
|
|
|
|
Sounds great - what's the secret ?
Actually I edited everything out of the help file and I appear to be on top of the problem, although it still tries to compile help every time.
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
uhhhhh
sounds really dumb but ... when you start a new project you don't enable the help option
---
"every year we invent better idiot proof systems and every year they invent better idiots"
|
|
|
|
|
Open the .dsp file in notepad or Msdev in text mode.
Delete all the help related text. Reload the project.
Works for me.
Stephen Kellett
|
|
|
|
|
I think there'll be an .hpj in the Source file folder that can be got rid of. (It lives in the help dir, but shows up under source files).
BTW most help compile probs stem from a bit of hard coding in this help proj file - at the end, there's a MAP section that usually has to be adjusted when you move the proj to a new machine:
[MAP]
#include <C:\Program Files\Microsoft Visual Studio\VC98\MFC\include\afxhelp.hm>
#include <helptest.hm>
Cheers
T
|
|
|
|
|
I have come across what is, I think, a bug with Visual C++ running under Windows NT4.
Compiler : Visual C++ 6.0 SP5.
Operating System : Windows NT4 Service Pack 6a.
My code has the following structure:
#include statements
using namespace std;
int main()
{
A lot of computations, input & output operations using streams..............
CString file = "c:\\results.txt";
int history = 20;
const int calcPeriodHalfhours = 6;
ofstream outFile1;
outFile1.open(file);
for (calcPeriod = 1; calcPeriod < calcPeriodHalfhours + 1; calcPeriod++)
{
outFile1 << history + calcPeriod; // this is the line that causes the grief.
outFile1 << endl;
}
outFile1.close();
outFile1.clear();
return 0;
}
If I run the Debug Version of this code, everything is works, and the program exits normally.
Under the Release Version (compiled with /O2 /Ob0), the code runs to the end, producing the correct output, but then comes up with
the Application Error "The instruction at "0x00418698" referenced memory at "0x0000000b". The memory could not be "read". This is an unhandled
Access Violation. Memory is not released to the operating system.
If I disable the optimisations (/Od), the code runs fine.
If I change the line:
outFile1 << history + calcPeriod; // this is the line that causes the grief.
to
outFile1 << history; // this is the line that causes the grief.
or to
outFile1 << calcPeriod; // this is the line that causes the grief.
the code runs fine as Release Version (compiled with /O2 /Ob0).
If I declare the "ofstream outFile1" in the global space instead of in the function space, the code runs fine as Release Version (compiled with /O2 /Ob0).
If I run the original code as Release Version (compiled with /O2 /Ob0) under Windows 2000 SP1, the code runs fine.
Has anyone come across somethding like this problem before?
Please let me know.
Thank-you
Doug Murray
Doug
|
|
|
|
|
Your EXE's base address is 0x00400000, so something in the EXE is likely dereferencing a null pointer (since the error is coming from an attempted read of address 0xB). Step into the operator<< call and see what happens.
--Mike--
http://home.inreach.com/mdunn/
The preferred snack of 4 out of 5 Lounge readers.
|
|
|
|
|
I've got a dialog based MFC application I've been working on. It's an MFC app that uses an ATL COM component. The main dialog gathers a decent amount of data for display through the COM object.
Anyway, depending on whether certain data was available for display I either populated (at the time) a Microsoft FlexGrid control or put up a static box that basically said there was no data to view. The way I did this to begin with was by creating both the flexgrid control and static box exactly the same size and shape and overlapping them in the dialog editor and using controling variables to Hide/Show each depending on whether there was data available. This seemed to work fine at first. However, I started having problem with Visual C++ doing compiles and working with SourceSafe. Eventually it got so bad I determined that SourceSafe must have nuked a file. The biggest problem appeared to be with resources so I went to my project directory and took a look at my resource file... and then took a second look. It was 68 MB! I opened and closed it a couple more times and it ballooned to 276 MB!
Something had gone squirrely with DevStudio or something. I actually had to recreate the project resource file from scratch. I don't know exactly how, but adding in that main dialog simply caused the problem to happen again so I imported all the other bitmaps, icons, dialogs, toolbars, etc and redid the main dialog from scratch. Now my resource file is a nice 22KB. Weird. I tracked through Sourcesafe and watched the file size practically double between each checkin and checkout after adding the static box I described earlier on top of the existing grid control.
Any ideas what could have happened there? Visual Studio 6.0, SP5.
Matt Philmon
|
|
|
|
|
No precise answer, but here we fight a running battle with Sourcesafe ( across multiple service packs ) as far as resources are concerned. Things lost, things doubled up, ID's conflicting, we run a post build step now that tells us conflicting ID's so we can go in and fix them.
Christian
The content of this post is not necessarily the opinion of my yadda yadda yadda.
To understand recursion, we must first understand recursion.
|
|
|
|
|
Me too ran into problems some time back with the source safe... particularly with resource files. It was too bad that we had to do the updations manually during checking in because it simply wouldnt update itself from the local . Also, it did screwed some part of the resource from nowhere...
Kannan
|
|
|
|
|
What is the easiest way to read and to write Variables to an ACCESS database??
|
|
|
|
|
Try to use OLE DB provider with ADO connection - it`s simpliest, but not fastest
...
|
|
|
|
|
Hello, the codegurus around the world.;)
The easiest way to work Access is to use Access Basic.
However, we can't create the stand alone execute file.
So, the next way is to use Visual Basic with ADO since we can create exe files.
If you don't like Visual Basic like me, now try to use Visual C++.
ADO expands the approach since we can use the same code to Oracle and SQL server.
However, we can't get the benefit of Access database.
So, sometimes we had better use CDaoDatabase, CDaoRecordSet, and the other useful classes
to deal with the benefit of Access database.
If you have a time, try to create the application by the above methods.
So, you can understand which way is best for your requirement.
Last, Access Database can't deal with concurrent access from the users. (not thread safe)
So, we had better use SQL server or Oracle when the many users access the database at the same time like the web based database.
Have a nice day!
-Masaaki Onishi-
|
|
|
|
|
Hello,
I tried to run one of my programs on a computer however I got the following error message:
Error Starting Program
The WINSCHEDULER.EXE file is
linked to missing export SHELL32.DLL:SHGetSpecialFolderPathA.
The computer has Windows 95 (4.00.950 b) and Internet Explorer 5.5 (5.50.4134.0600)
Is there anybody who knows or guesses the source of the error?
Thank you for any helps in advance.
Regards.
Mustafa Demirhan
|
|
|
|
|
I think you've got a SHELL32.DLL version earlier than 4.71.
Internet Explorer 5.5 doesn't update the SHELL32.DLL. It's updated only on Windows 95 or NT4 when you you install Internet Explorer 4 with the integrated shell option (aka desktop update).
A clean way of fixing it is to un-install IE 5.5, install IE 4.01 with desktop update and then re-install IE 5.5.
-------------------------
Benoit Devigne
http://www.bdevigne.com
contact@bdevigne.com
|
|
|
|
|
Thank you very much!
Mustafa Demirhan
|
|
|
|
|
WhenI declare variables for my Edit box and for my spin :
CSpinButtonCtrl m_Spin;
CEdit m_Edit1;
My program work ok, but when I quit the program I always get a message like:
>>
MYPROGRAM a causé une défaillance de page dans
le module KERNEL32.DLL à 0167:bff76840.
Registres :
EAX=005501d0 CS=0167 EIP=bff76840 EFLGS=00010246
EBX=005501d0 SS=016f ESP=00550000 EBP=00550014
ECX=00550098 DS=016f ESI=8196c340 FS=5eef
EDX=bff76855 ES=016f EDI=005500c0 GS=0000
Octets à CS : EIP :
ff 75 0c ff 75 08 ff 55 18 83 c4 10 64 8f 05 00
>>
How can use a Edit box with a spin without having that error????
|
|
|
|