alex108
asked on
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?
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?
P.S: "rgn" should be a global variable in this case, or a class variable, while "oldRgn" could be a local one.
ASKER
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(nTy pe, 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
Take in your own CWnd(CDialog) derived class in OnSize
do something like:
void CMyWnd::OnSize(UINT nType, int cx, int cy)
{
CCustomizedDlg::OnSize(nTy
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
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.
Regards, Madshi.
ASKER
Unfortunately it doesn't.
Regards, Alex
Regards, Alex
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(nTy pe, cx, cy);
SetWindowRgn(CreateEllipti cRgn(0,0,c x, cy+40),TRUE);
}
Try just this:
void CMyWnd::OnSize(UINT nType, int cx, int cy)
{
CCustomizedDlg::OnSize(nTy
SetWindowRgn(CreateEllipti
}
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.
http://msdn.microsoft.com/code/default.asp?url=/msdn-files/026/001/876/NonRect/Source%20Files/MainFrm_cpp.asp
Strange thing.
Regards, Madshi.
>>DOES delete the old region:
I did not in my program, and all worked fine.
I did not in my program, and all worked fine.
>> 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...
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...
ASKER
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.
>>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!
May be problem in other place of your apps.
For detect memory leaks I use TaskInfo2000 from
www.iarsn.com Try it!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Something like this:
[creating]
wnd = CreateWindow(...);
rgn = CreateRectRgn(...);
SetWindowRgn(wnd, rgn, ...);
[changing region]
oldRgn = rgn;
rgn = CreateRectRgn(...);
SetWindowRgn(wnd, rgn, ...);
DeleteObject(oldRgn);
Regards, Madshi.