SetWindowRgn

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?
alex108Asked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
moduloConnect With a Mentor Commented:
PAQed, with points refunded (100)

modulo
Community Support Moderator
0
 
MadshiCommented:
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
 
MadshiCommented:
P.S: "rgn" should be a global variable in this case, or a class variable, while "oldRgn" could be a local one.
0
Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

 
alex108Author Commented:
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
 
MadshiCommented:
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
 
alex108Author Commented:
Unfortunately it doesn't.
Regards, Alex
0
 
NickRepinCommented:
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
 
MadshiCommented:
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
 
NickRepinCommented:
>>DOES delete the old region:

I did not in my program, and all worked fine.
0
 
MadshiCommented:
>> 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
 
alex108Author Commented:
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
 
AlexVirochovskyCommented:
>>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
All Courses

From novice to tech pro — start learning today.