Solved

redrawing text and graphics of a window

Posted on 2002-03-17
14
258 Views
Last Modified: 2013-11-20
If I draw some graphics or text in a window using DC classes, I can't be able to regain the content after minmizing and maximizing or if another window overlaps, they are lost.  Pls tell me What I should do to redraw the contents.

Venkataramanan
0
Comment
Question by:venkataramanan
  • 2
  • 2
  • 2
  • +5
14 Comments
 
LVL 2

Accepted Solution

by:
shilpa_Jb earned 25 total points
Comment Utility
Hi,
U should write ur code in the WM_PAINT message i.e override this message in the window class.
In OnPaint() of that window place ur code to draw grahics or to write text.
Hope that helps u.
-Shilpa
0
 
LVL 1

Expert Comment

by:pkreddy
Comment Utility
use Ondraw(CDC *pDC) of your view class to draw inthe client area, this function is called for every WM_PAINT message.
0
 

Author Comment

by:venkataramanan
Comment Utility
i am having a static control in a dialog box and i like have to free hand drawing in that.  I am capturing the mousedown and mousemove events and setting pixels in that static control.  I want that drawing to be persistent.  what i have to do for this
0
 
LVL 44

Expert Comment

by:AndyAinscow
Comment Utility
You need to store the mouse/keyboard actions somehow and then 'replay' this store everytime you need to repaint.  See the Scribble example that comes with VC++, if I remember correctly that does the same as you are doing just in a view.
0
 
LVL 1

Expert Comment

by:Mazen
Comment Utility
Hi Venkataramanan ,
 you can store your drawings in a metafile and then eveytime you refresh(minimze or maximize) you will play back the graphics by calling the method
 PlayMetaFile(myfile)which should be called from the
 OnDraw().
N.B:The metafile can store DC class graphics.
Write a comment for me if you're interested and  want me to give you the whole code.
Good luck
Bye
0
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 3

Expert Comment

by:Crius
Comment Utility
Hi! I recommend you first CreateCompatibleDC() of your screen (GetDC() of your display), then CreateCompatibleBitmap() (And pass in the compatible DC).

Once you have this, all drawing, do it to the Bitmap instead (You can just get the DC of the Bitmap anytime to make changes to it). Then, when you have to display the bitmap on the screen, in the OnDraw(), take your Bitmap DC, the and CDC passed to you in the OnDraw, and do a pDC->BitBlt() passing in the bitmap's DC.

This is the simplest, fastest, and most easily understood method I know of.

Good luck, questions?
0
 

Expert Comment

by:surki
Comment Utility
Dear Mazen,

I will be very much happy if u give me the code.

Thanks in advance.

-Venkataramanan
0
 
LVL 1

Assisted Solution

by:Mazen
Mazen earned 25 total points
Comment Utility
Hi Venkataramanan, ok there goes the code:
first in the Doc.h write in the public area:
CMetaFileDC* pMetaFileDC;
and in the Doc constructor write this:
pMetaFileDC = new CMetaFileDC();
pMetaFileDC->Create();
Now in the methods that are used to draw graphics you should mirror every drawing to the metafile like this, for example if you're drawing ellipse:
pDC->Ellipse(Anchor.x,Anchor.y,DrawTo.x,DrawTo.y);
also write with it:
pDoc->pMetaFileDC->Ellipse(Anchor.x,Anchor.y,DrawTo.x,DrawTo.y);
and so on...
and don't forget to declare the pointer pDoc to Doc using GetDocument() in these methods
Now to play the metafile again at refreshing,add the following code to the OnDraw() method:
{
HMETAFILE MetaFileHandle = pDoc->pMetaFileDC->Close();
// to play a metafile you must close it first
pDC->PlayMetaFile(MetaFileHandle);
CMetaFileDC* replaceMetaFile = new CMetaFileDC();
replaceMetaFile->Create();
replaceMetaFile->PlayMetaFile(MetaFileHandle);
// this is a back up metafile before deletion
DeleteMetaFile(MetaFileHandle);
delete pDoc->pMetaFileDC;
pDoc->pMetaFileDC = replaceMetaFile;
}

I hope this helps you
Best Regards
Mazen
0
 

Expert Comment

by:amarzee
Comment Utility
Try to use the metafile for storing drawing actions and in OnDraw method play that metafile content.
0
 
LVL 44

Expert Comment

by:AndyAinscow
Comment Utility
My comment should have given him all he required.
0
 
LVL 3

Expert Comment

by:Crius
Comment Utility
I think most of ours did, one way or another.

The question is likely abandoned because it got answered satisfactorily. :\
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
Introduction: Dialogs (2) modeless dialog and a worker thread.  Handling data shared between threads.  Recursive functions. Continuing from the tenth article about sudoku.   Last article we worked with a modal dialog to help maintain informat…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now