Solved

SetWindowRgn

Posted on 2001-09-12
14
972 Views
Last Modified: 2013-12-03
Hi, experts.
   I have a problrm with setWindowRgn. I continuously resize my window and every time I set a new region for my window. Everything works fine, but after some time I start experiencing something like "internal windows resource leaks" - when I drag the window it is being dragged slower and slower, and not only that it affects all other non-rectangular windows, like I tried to run Winamp or Odigo they were also slow, but as soon as I closed my application, Winamp and Odigo... started moving fastly without any delay while gragging, seems like when I close my appl. resources are cleaned up, but how can I do it at arun time?
0
Comment
Question by:alex108
  • 5
  • 3
  • 2
  • +2
14 Comments
 
LVL 20

Expert Comment

by:Madshi
Comment Utility
After you've set the new region, you have to delete the old one with "DeleteObject".

Something like this:

[creating]
wnd = CreateWindow(...);
rgn = CreateRectRgn(...);
SetWindowRgn(wnd, rgn, ...);

[changing region]
oldRgn = rgn;
rgn = CreateRectRgn(...);
SetWindowRgn(wnd, rgn, ...);
DeleteObject(oldRgn);

Regards, Madshi.
0
 
LVL 20

Expert Comment

by:Madshi
Comment Utility
P.S: "rgn" should be a global variable in this case, or a class variable, while "oldRgn" could be a local one.
0
 

Author Comment

by:alex108
Comment Utility
I tried that and so many other things - it doesn,t solve the problem.
Take in your own CWnd(CDialog) derived class in OnSize
do something like:

void CMyWnd::OnSize(UINT nType, int cx, int cy)
{
     CCustomizedDlg::OnSize(nType, cx, cy);
     HRGN oldRgn = m_hRgn;
     m_hRgn = CreateEllipticRgn(0,0,cx, cy+40);
     //SetWindowRgn(NULL,FALSE);
     SetWindowRgn(hRgn,TRUE);
     DeleteObject(oldRgn);
}

and then try to drag the window after resizing for a while
0
 
LVL 20

Expert Comment

by:Madshi
Comment Utility
Just one more try, before I invest the time to test it myself: Could you please call SetWindowRgn with "FALSE". Just to make sure, that that won't fix the problem... If it does not, I will try this whole thing myself.

Regards, Madshi.
0
 

Author Comment

by:alex108
Comment Utility
Unfortunately it doesn't.
Regards, Alex
0
 
LVL 15

Expert Comment

by:NickRepin
Comment Utility
SDK says: "After a successful call to SetWindowRgn, the system owns the region specified by the region handle hRgn. The system does not make a copy of the region. Thus, you should not make any further function calls with this region handle. In particular, do not close this region handle".

Try just this:

void CMyWnd::OnSize(UINT nType, int cx, int cy)
{
    CCustomizedDlg::OnSize(nType, cx, cy);
    SetWindowRgn(CreateEllipticRgn(0,0,cx, cy+40),TRUE);
}
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 20

Expert Comment

by:Madshi
Comment Utility
Yes, according to the documentation Nick seems to be right. However, the only full example I found on www.Microsoft.com DOES delete the old region:

http://msdn.microsoft.com/code/default.asp?url=/msdn-files/026/001/876/NonRect/Source%20Files/MainFrm_cpp.asp

Strange thing.

Regards, Madshi.
0
 
LVL 15

Expert Comment

by:NickRepin
Comment Utility
>>DOES delete the old region:

I did not in my program, and all worked fine.
0
 
LVL 20

Expert Comment

by:Madshi
Comment Utility
>> I did not in my program, and all worked fine.

Yeah, but that's no proof. As it is with memory/resource leaks: All seems to work fine until you've consumed all available resources (at least in win9x).

But as I said in my previous comment: I guess that you're right and that Windows actually does delete the old region itself. I just found it a bit strange, that the only full example contradicts the documentation...
0
 

Author Comment

by:alex108
Comment Utility
Sorry, but it's not gonna solve the problem, whether you delete old region or not. Interesting enough, if you set rectangular regions you don't feel resoource leaks, only non-rectangular is a problem.
0
 
LVL 14

Expert Comment

by:AlexVirochovsky
Comment Utility
>>you don't feel resoource leaks
May be problem in other place of your apps.
For detect memory leaks I use TaskInfo2000 from
www.iarsn.com  Try it!
0
 

Accepted Solution

by:
modulo earned 0 total points
Comment Utility
PAQed, with points refunded (100)

modulo
Community Support Moderator
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

In this article, I will show how to use the Ribbon IDs Tool Window to assign the built-in Office icons to a ribbon button.  This tool will help us to find the OfficeImageId that corresponds to our desired built-in Office icon. The tool is part of…
zlib is a free compression library (a DLL) on which the popular gzip utility is built.  In this article, we'll see how to use the zlib functions to compress and decompress data in memory; that is, without needing to use a temporary file.  We'll be c…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…

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