Keep a CView from invalidating the clientspace on WM_SIZE

Posted on 1998-12-16
Medium Priority
Last Modified: 2013-11-20
How do I keep my CView-derived class from invalidating the entire client space during WM_SIZE(OnSize)?  I have already tried defining a class without CS_HREDRAW and CS_VREDRAW by adding the following line in PreCreateWindow:


Question by:JeffBeardsley
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Expert Comment

ID: 1326270
Assuming you have a class derived from CView, simply override the OnSize function, and do whatever you like.

Author Comment

ID: 1326271
The problem is, by the time OnSize() is invoked, the framework has already invalidated the window (querying the update rectangle at this point yields the same results as querying the client rectangle).

I WANT only those areas of the window that have been exposed by the size event to be marked invalid.

Expert Comment

ID: 1326272
This works for me:

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
   static CString sClass = AfxRegisterWndClass(0);

   cs.lpszClass = sClass;
   return CView::PreCreateWindow(cs);

Learn how to optimize MySQL for your business need

With the increasing importance of apps & networks in both business & personal interconnections, perfor. has become one of the key metrics of successful communication. This ebook is a hands-on business-case-driven guide to understanding MySQL query parameter tuning & database perf

LVL 31

Expert Comment

ID: 1326273
Find out whether any parent of the view's window has class-styles CS_HREDRAW | CS_VREDRAW (e.g. with Spy++). If so, you can also reset the styles using something like this after creating the window (where pWnd is the window) :

 GetClassLong( pWnd->m_hWnd, GCL_STYLE ) & ~( CS_HREDRAW | CS_VREDRAW )

hope that helps,


Author Comment

ID: 1326274
The original response answered the wrong question.  The best input actually came in the form of comments from piano_boxer and zoppo.

Author Comment

ID: 1326275
Adjusted points to 100

Expert Comment

ID: 1326276
did you check if the invalidated area is already defined in OnSizing??
maybe you can change it there

Accepted Solution

koskia earned 300 total points
ID: 1326277
you can make another cool thing.
use a boolean variable to check if the window was resized
in the OnSize function set the boolean to true
in the overrrided of OnPaint() check if the redraw becomes from resizing the window, and act diferrently on both occasions (you decide which area to redraw and why).
you can actually do nothing, set the flag back to false, and
Invalidate the window with the rectangle you calculate,
ofcourse there won't be a loop because the boolean value will change.

class CMyView : public CView {
    BOOL m_bFromSize;
    CRect m_rPrevSize;

void CMyView::OnSize(...)
    m_bFromSize = TRUE;

void CMyView::OnPaint(...)
    if (m_bFromSize)
       //calculate Invalidation Rectangles
       // usually 2 edges
       m_bFromSize = FALSE;



Author Comment

ID: 1326278
I can see that that will work -- I had actually considered such a solution, but had assumed there would be a standard/accepted method of dealing with the problem.

Expert Comment

ID: 1326279
I don't think there is a standard method of dealing with such a thing, anyway the aboved answer works, and the overhead seems very little
(unless you're dealing with realtime and animation, which every milli counts)

Featured Post

Survive A High-Traffic Event with Percona

Your application or website rely on your database to deliver information about products and services to your customers. You can’t afford to have your database lose performance, lose availability or become unresponsive – even for just a few minutes.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Ownerdraw of the grid button.  A singleton class implentation and usage. Continuing from the fifth article about sudoku.   Open the project in visual studio. Go to the class view – CGridButton should be visible as a class.  R…
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.
Please read the paragraph below before following the instructions in the video — there are important caveats in the paragraph that I did not mention in the video. If your PaperPort 12 or PaperPort 14 is failing to start, or crashing, or hanging, …
Suggested Courses

649 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