Non-rectangular client area
-
Hi, Is it possible to make the client area of a window as non-rectangular? If yes how? Thanks in advance.
- NS -
Yes, i have a word document where it is explained how to make a round window, the most important problem... It is on spanish. But if you want I can send you it, and take a look in the code that is being explained (altough you can not understand the explanations) if rounded is possible, I guess polygonal will be possible too.
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you ;)
-
Yes, i have a word document where it is explained how to make a round window, the most important problem... It is on spanish. But if you want I can send you it, and take a look in the code that is being explained (altough you can not understand the explanations) if rounded is possible, I guess polygonal will be possible too.
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you ;)
-
Hi, Is it possible to make the client area of a window as non-rectangular? If yes how? Thanks in advance.
- NS -
You can create a region using a bitmap. Here is one example :http://www.codeproject.com/dialog/cdialogsk.asp[^] Eli
-
You can create a region using a bitmap. Here is one example :http://www.codeproject.com/dialog/cdialogsk.asp[^] Eli
-
Thank you for the replay. But are you sure that it says about creating the client area as round? Or simply the window? Anyway I dont know Spanish :( But if you kindly send it I may try by using any translators :)
- NS -
Now that you say it... it is a round window (I read it too quick). So it problably won't be usefull at all. :^) But... it is a bit difficult to see the concept, if the window is not round... why to stablish a round client area? and an innocent try... have you thought about masking the squared client area with a user defined region and avoiding all what is outside the limits of the region?
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you ;)
-
Now that you say it... it is a round window (I read it too quick). So it problably won't be usefull at all. :^) But... it is a bit difficult to see the concept, if the window is not round... why to stablish a round client area? and an innocent try... have you thought about masking the squared client area with a user defined region and avoiding all what is outside the limits of the region?
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you ;)
Let me say an example. Suppose my window has a round shape. And it has child controls. And my requirement is that, the border should be of a few pixels. So the childs should be clipped by the round client border if it is placed beyond the client. If only rectangular shape is possible for client, you can imagine what will be the problem. There will be non uniform border thickness, right?
- NS -
-
Hi, Is it possible to make the client area of a window as non-rectangular? If yes how? Thanks in advance.
- NS -
The client area of a window is kind of an abstract concept. The WM_NCHITTEST message is used by the system to determine points in or outside of the client area. You can handle this message and adjust the return value appropriately. For drawing, you'll need to use clipping regions if necessary. Mark
Mark Salsbery Microsoft MVP - Visual C++ :java:
-
The client area of a window is kind of an abstract concept. The WM_NCHITTEST message is used by the system to determine points in or outside of the client area. You can handle this message and adjust the return value appropriately. For drawing, you'll need to use clipping regions if necessary. Mark
Mark Salsbery Microsoft MVP - Visual C++ :java:
-
Let me say an example. Suppose my window has a round shape. And it has child controls. And my requirement is that, the border should be of a few pixels. So the childs should be clipped by the round client border if it is placed beyond the client. If only rectangular shape is possible for client, you can imagine what will be the problem. There will be non uniform border thickness, right?
- NS -
Send me a pm to have your email and I will send you the document anyways, there may be some code that gives you an idea.
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you ;)
-
Hi, Is it possible to make the client area of a window as non-rectangular? If yes how? Thanks in advance.
- NS -
See here.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
See here.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
Hi, Is it possible to make the client area of a window as non-rectangular? If yes how? Thanks in advance.
- NS -
Yes, I just did it. The concept is fairly easy to implement if you are managing your own custom container control ( which I'm fairly certain is what you are doing based on the thread ). To implement this; however, you need to use only custom child controls or child controls that have OnPaint() overridden so that you can interject a clipping region prior to the child control being rendered. 1. In your custom container control, in the OnPaint() event, calculate the desired client area GraphicsPath. Save that path as a public member for later use by chlid controls, let's name it 'ClientAreaPath' for fun. 2. For any control that can be added to your custom container, define the control as a custom control, or at least inherit and override the OnPaint() event. 3. In your child controls, in the OnPaint() override, determine if the control is a child of your custom container and, if so, then transform and apply the ClientAreaPath that was calculated and saved in step #1 above. Viola - non-rectangular clipping :-) Here's a rough c# outline of the child control OnPaint() operations. public override void OnPaint( PaintEventArgs e ) { // determine if this control is parented and if the parent can supply a ClientAreaPath try { // attempt to cast, will cause exception if nothing else MyCustomContainer parentContainer = ( MyCustomContainer )Parent; // get a copy of the custom client path GraphicsPath p = new GraphicsPath(parentContainer.ChildPath.PathPoints, parentContainer.ChildPath.PathTypes); // transfrom the path to be relative to the client (critical step here) // all paths are "zero-relative" so the client needs to see this path expressed // not as zero-relative, but client-location relative instead Matrix translateMatrix = new Matrix(); translateMatrix.Translate(-(Location.X), -(Location.Y)); p.Transform(translateMatrix); // now apply a nice clipping region to the control's graphics object so that //
-
Yes, I just did it. The concept is fairly easy to implement if you are managing your own custom container control ( which I'm fairly certain is what you are doing based on the thread ). To implement this; however, you need to use only custom child controls or child controls that have OnPaint() overridden so that you can interject a clipping region prior to the child control being rendered. 1. In your custom container control, in the OnPaint() event, calculate the desired client area GraphicsPath. Save that path as a public member for later use by chlid controls, let's name it 'ClientAreaPath' for fun. 2. For any control that can be added to your custom container, define the control as a custom control, or at least inherit and override the OnPaint() event. 3. In your child controls, in the OnPaint() override, determine if the control is a child of your custom container and, if so, then transform and apply the ClientAreaPath that was calculated and saved in step #1 above. Viola - non-rectangular clipping :-) Here's a rough c# outline of the child control OnPaint() operations. public override void OnPaint( PaintEventArgs e ) { // determine if this control is parented and if the parent can supply a ClientAreaPath try { // attempt to cast, will cause exception if nothing else MyCustomContainer parentContainer = ( MyCustomContainer )Parent; // get a copy of the custom client path GraphicsPath p = new GraphicsPath(parentContainer.ChildPath.PathPoints, parentContainer.ChildPath.PathTypes); // transfrom the path to be relative to the client (critical step here) // all paths are "zero-relative" so the client needs to see this path expressed // not as zero-relative, but client-location relative instead Matrix translateMatrix = new Matrix(); translateMatrix.Translate(-(Location.X), -(Location.Y)); p.Transform(translateMatrix); // now apply a nice clipping region to the control's graphics object so that //