Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. How set the background of an MDI container window?

How set the background of an MDI container window?

Scheduled Pinned Locked Moved C#
dockertutorialquestion
35 Posts 10 Posters 1 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Dave Kreskowiak

    You could, but it's worthess and will slow down your applications rendering speed. Again, you can't do it as design time. You have to do it at runtime. Again, you have to enumerate through the MdiParent Controls collection. Once you find the MdiClient control, you can set its BackgroundImage property to whatever you want.

    A guide to posting questions on CodeProject[^]
    Dave Kreskowiak

    B Offline
    B Offline
    BillWoodruff
    wrote on last edited by
    #14

    +5 Right on target, Dave, and you reminded me of when ... several years ago ... I did some stuff with MDI (yuck), and I went back today, and took a look at the MdiClient component that is created when you set a Form's IsMdiContainer Property = true. The WinForms designers, probably having a bad hair day, set the Text and Name properties of MdiClient to an empty string, which means you can't do something like this to find it:

    //
    private MdiClient theMDIClientControl;
    //
    // note: don't need to recurse
    Control[] potentialMDIClientControls = this.Controls.Find("MdiClient", false);
    //
    if (potentialMDIClientControls.Length > 0) theMDIClientControl = potentialMDIClientControls[0] as MdiClient;

    So, as you said, you gotta iterate/enumerate over the Controls collection of the Form.

    "Last year I went fishing with Salvador Dali. He was using a dotted line. He caught every other fish." Steven Wright

    D 1 Reply Last reply
    0
    • A Alisaunder

      And yet neither of you are displaying an alternative that is better?

      L Offline
      L Offline
      Luc Pattyn
      wrote on last edited by
      #15

      I'm not in the spoon feeding business, I did provide the two keywords that exist for dealing elegantly with such situations. So if you want to learn something, look them up and read the reference material. :|

      Luc Pattyn [My Articles] Nil Volentibus Arduum

      A 1 Reply Last reply
      0
      • A Alisaunder

        And yet neither of you are displaying an alternative that is better?

        D Offline
        D Offline
        Dave Kreskowiak
        wrote on last edited by
        #16

        Apparently you haven't been reading the posts. You also apparently won't be happy until you see actual code:

        private void MdiClientExample()
        {
        foreach (Control c in this.Controls)
        {
        if (c is MdiClient)
        {
        MdiClient mc = (MdiClient)c;
        ...
        }
        }
        }

        Are you happy now? Oh, and by the way, I don't consider this production quality code either. It's just cleaner than the example Microsoft gave. And if you're going to critisize us, you might want to start by creating your own code samples instead of lifting and posting others as your own work.

        A guide to posting questions on CodeProject[^]
        Dave Kreskowiak

        A B 2 Replies Last reply
        0
        • L Luc Pattyn

          I'm not in the spoon feeding business, I did provide the two keywords that exist for dealing elegantly with such situations. So if you want to learn something, look them up and read the reference material. :|

          Luc Pattyn [My Articles] Nil Volentibus Arduum

          A Offline
          A Offline
          Alisaunder
          wrote on last edited by
          #17

          So sorry you don't feel like trying to answer the ops question with something less cryptic. Seems forums just aren't as helpful as they used to be. Since you feel you are such an expert that you you don't need to provide examples my opinion, for what it's worth is that you are no help at all and shouldn't even be posting.

          D 1 Reply Last reply
          0
          • A Alisaunder

            So sorry you don't feel like trying to answer the ops question with something less cryptic. Seems forums just aren't as helpful as they used to be. Since you feel you are such an expert that you you don't need to provide examples my opinion, for what it's worth is that you are no help at all and shouldn't even be posting.

            D Offline
            D Offline
            Dave Kreskowiak
            wrote on last edited by
            #18

            Yeah, right. A couple of Code Project MVP's aren't very helpful at all. The pile of 5-voted responses to questions just doesn't offer up any evidence at all of us being helpful. I'm not in the spoon-feed business either. There are just WAY too many very basic concept questions being asked that are very easily answered simply by typing the question into Google. I'd rather have someone learn how to do research themselves than just keep asking question after question about very basic topics.

            A guide to posting questions on CodeProject[^]
            Dave Kreskowiak

            A 1 Reply Last reply
            0
            • D Dave Kreskowiak

              Yeah, right. A couple of Code Project MVP's aren't very helpful at all. The pile of 5-voted responses to questions just doesn't offer up any evidence at all of us being helpful. I'm not in the spoon-feed business either. There are just WAY too many very basic concept questions being asked that are very easily answered simply by typing the question into Google. I'd rather have someone learn how to do research themselves than just keep asking question after question about very basic topics.

              A guide to posting questions on CodeProject[^]
              Dave Kreskowiak

              A Offline
              A Offline
              Alisaunder
              wrote on last edited by
              #19

              Actually Most everyone I know searches for the answers before hitting a forum with a question. Personally in my opinion it's more professional to offer assistance with a basic code example in the hopes the op learns something in the process. All anyone is learning from your responses is not to ask you for help.

              P D 2 Replies Last reply
              0
              • B BillWoodruff

                +5 Right on target, Dave, and you reminded me of when ... several years ago ... I did some stuff with MDI (yuck), and I went back today, and took a look at the MdiClient component that is created when you set a Form's IsMdiContainer Property = true. The WinForms designers, probably having a bad hair day, set the Text and Name properties of MdiClient to an empty string, which means you can't do something like this to find it:

                //
                private MdiClient theMDIClientControl;
                //
                // note: don't need to recurse
                Control[] potentialMDIClientControls = this.Controls.Find("MdiClient", false);
                //
                if (potentialMDIClientControls.Length > 0) theMDIClientControl = potentialMDIClientControls[0] as MdiClient;

                So, as you said, you gotta iterate/enumerate over the Controls collection of the Form.

                "Last year I went fishing with Salvador Dali. He was using a dotted line. He caught every other fish." Steven Wright

                D Offline
                D Offline
                Dave Kreskowiak
                wrote on last edited by
                #20

                Very true. I found the lack of a name a little annoying at first, but I now prefer to find it by type. You really can't change the type at all, but the name can be changed breaking existing code.

                A guide to posting questions on CodeProject[^]
                Dave Kreskowiak

                1 Reply Last reply
                0
                • A Alisaunder

                  And yet neither of you are displaying an alternative that is better?

                  B Offline
                  B Offline
                  BillWoodruff
                  wrote on last edited by
                  #21

                  Alisaunder wrote:

                  And yet neither of you are displaying an alternative that is better?

                  I think the absence of code here is not the result of any 'negative intention:' It's just obvious that the best practice here is to enumerate the controls on the Form [1], test each one using the 'Is operator, and, when the MdiClient Control is found, then cast it from Type Control back to its 'native Type, 'MdiClient ... at which point you can have your way with it.

                  //
                  // assume you have loaded a valid image from an embedded resource
                  // into the variable of Type Bitmap named 'mdiBackGround'
                  //
                  private MdiClient theMDIClientControl;
                  //
                  foreach (Control theControl in this.Controls) [2]
                  {
                  if (theControl is MdiClient)
                  {
                  theMDIClientControl = theControl as MdiClient;
                  break;
                  }
                  }

                  if (theMDIClientControl != null) theMDIClientControl.BackgroundImage = mdiBackGround;

                  [1] see my response to Dave K. above[^] confirming why it is absolutely necessary to enumerate the Controls on the Form. [2] Seems a reasonable assumption the MdiClient Control will always be in the top-level Form Control Collection: hence no need for a recursive search

                  "Last year I went fishing with Salvador Dali. He was using a dotted line. He caught every other fish." Steven Wright

                  A 1 Reply Last reply
                  0
                  • D Dave Kreskowiak

                    Apparently you haven't been reading the posts. You also apparently won't be happy until you see actual code:

                    private void MdiClientExample()
                    {
                    foreach (Control c in this.Controls)
                    {
                    if (c is MdiClient)
                    {
                    MdiClient mc = (MdiClient)c;
                    ...
                    }
                    }
                    }

                    Are you happy now? Oh, and by the way, I don't consider this production quality code either. It's just cleaner than the example Microsoft gave. And if you're going to critisize us, you might want to start by creating your own code samples instead of lifting and posting others as your own work.

                    A guide to posting questions on CodeProject[^]
                    Dave Kreskowiak

                    A Offline
                    A Offline
                    Alisaunder
                    wrote on last edited by
                    #22

                    Funny, I have a feeling you weren't taught with original code either. This is another example of someone thinking the op should be equally as skilled as the person responding. If you don't feel like spoon feeding you shouldn't be offering assistance all you do is add to the confusion.

                    D 1 Reply Last reply
                    0
                    • B BillWoodruff

                      Alisaunder wrote:

                      And yet neither of you are displaying an alternative that is better?

                      I think the absence of code here is not the result of any 'negative intention:' It's just obvious that the best practice here is to enumerate the controls on the Form [1], test each one using the 'Is operator, and, when the MdiClient Control is found, then cast it from Type Control back to its 'native Type, 'MdiClient ... at which point you can have your way with it.

                      //
                      // assume you have loaded a valid image from an embedded resource
                      // into the variable of Type Bitmap named 'mdiBackGround'
                      //
                      private MdiClient theMDIClientControl;
                      //
                      foreach (Control theControl in this.Controls) [2]
                      {
                      if (theControl is MdiClient)
                      {
                      theMDIClientControl = theControl as MdiClient;
                      break;
                      }
                      }

                      if (theMDIClientControl != null) theMDIClientControl.BackgroundImage = mdiBackGround;

                      [1] see my response to Dave K. above[^] confirming why it is absolutely necessary to enumerate the Controls on the Form. [2] Seems a reasonable assumption the MdiClient Control will always be in the top-level Form Control Collection: hence no need for a recursive search

                      "Last year I went fishing with Salvador Dali. He was using a dotted line. He caught every other fish." Steven Wright

                      A Offline
                      A Offline
                      Alisaunder
                      wrote on last edited by
                      #23

                      And in some rare cases it may not be in the top-level Form. Also adding Try and catch is error controlling which I don't care who you are is still considered good practice, otherwise you end up with crashing code that nobody can debug. Once you have a complete project you can remove The error handling code to streamline the application. But to say it's not good practice to include it is in my opinion really stupid and asking for trouble.

                      D B R 3 Replies Last reply
                      0
                      • J jojoba20

                        The area of an MDI container window is covered by an MdiClient control; consequently, Form.BackColor and Form.BackgroundImage are ineffective. So How to set the background for this form.

                        P Offline
                        P Offline
                        phil o
                        wrote on last edited by
                        #24

                        I don't see where you problem is : if you cannot see the background of your MDI parent, it is because there is another object above it (its child) which is masking the main form. So, you can change the background color of the main form as you want, your change will be applied but you will not see it as there is still the same child object above it. Why don't you change the background color of the MdiClient control, so ? And, please, reserve the use of 'pre' tag for actual code.

                        No memory stick has been harmed during establishment of this signature.

                        D 1 Reply Last reply
                        0
                        • A Alisaunder

                          Actually Most everyone I know searches for the answers before hitting a forum with a question. Personally in my opinion it's more professional to offer assistance with a basic code example in the hopes the op learns something in the process. All anyone is learning from your responses is not to ask you for help.

                          P Offline
                          P Offline
                          phil o
                          wrote on last edited by
                          #25

                          Actually Most everyone I know searches for the answers before hitting a forum with a question. I don't agree with you : if you see the questions these days it is obvious that more and more people consider this forum as a 'code self-service'. Plenty of questions wouldn't have been told if the OP took time to search for it on CP or on Google first.

                          No memory stick has been harmed during establishment of this signature.

                          1 Reply Last reply
                          0
                          • A Alisaunder

                            Funny, I have a feeling you weren't taught with original code either. This is another example of someone thinking the op should be equally as skilled as the person responding. If you don't feel like spoon feeding you shouldn't be offering assistance all you do is add to the confusion.

                            D Offline
                            D Offline
                            Dave Kreskowiak
                            wrote on last edited by
                            #26

                            Alisaunder wrote:

                            Funny, I have a feeling you weren't taught with original code either.

                            You're right. I'm self-taught over the span over 30+ years. When I was learning most of my stuff, there was no internet, so I was pretty much on my own, reading as much as I could.

                            Alisaunder wrote:

                            This is another example of someone thinking the op should be equally as skilled as the person responding.

                            With coding skills, not at all. But the research skills and the ability to teach yourself something new? Oh, yeah. Those are basic skills you learn in school and apply to the coding job every day. If you want someone to spoon-feed you stuff all the time, you're not going to last very long. And there are a TON of people who come here looking for the spoon. I give enough information to the OP so they can Google the problem themselves. In my humble opinion, new coders today have it much easier than I did learning this stuff.

                            A guide to posting questions on CodeProject[^]
                            Dave Kreskowiak

                            1 Reply Last reply
                            0
                            • A Alisaunder

                              And in some rare cases it may not be in the top-level Form. Also adding Try and catch is error controlling which I don't care who you are is still considered good practice, otherwise you end up with crashing code that nobody can debug. Once you have a complete project you can remove The error handling code to streamline the application. But to say it's not good practice to include it is in my opinion really stupid and asking for trouble.

                              D Offline
                              D Offline
                              Dave Kreskowiak
                              wrote on last edited by
                              #27

                              Alisaunder wrote:

                              Also adding Try and catch is error controlling which I don't care who you are is still considered good practice

                              Only if used appropriately. If this little block is coded up correctly, you won't have a need for a try/catch block at all. If I had to use a try/catch block, it wouldn't be in the manner than you copied from MSDN. It would have been outside the foreach or even in the caller and not this method and still used the if statement to test the control type.

                              A guide to posting questions on CodeProject[^]
                              Dave Kreskowiak

                              1 Reply Last reply
                              0
                              • P phil o

                                I don't see where you problem is : if you cannot see the background of your MDI parent, it is because there is another object above it (its child) which is masking the main form. So, you can change the background color of the main form as you want, your change will be applied but you will not see it as there is still the same child object above it. Why don't you change the background color of the MdiClient control, so ? And, please, reserve the use of 'pre' tag for actual code.

                                No memory stick has been harmed during establishment of this signature.

                                D Offline
                                D Offline
                                Dave Kreskowiak
                                wrote on last edited by
                                #28

                                You normally can't see the background of an MdiParent form. It's being covered byt eh MdiClient control which is Dock = Full over the entire form.

                                A guide to posting questions on CodeProject[^]
                                Dave Kreskowiak

                                1 Reply Last reply
                                0
                                • A Alisaunder

                                  Actually Most everyone I know searches for the answers before hitting a forum with a question. Personally in my opinion it's more professional to offer assistance with a basic code example in the hopes the op learns something in the process. All anyone is learning from your responses is not to ask you for help.

                                  D Offline
                                  D Offline
                                  Dave Kreskowiak
                                  wrote on last edited by
                                  #29

                                  Yeah, and most everyone I know Googles for answers before asking questions too. But, yet, here we are, still looking at piles and piles of questions on very basic concepts. The world doesn't follow in your footsteps either.

                                  A guide to posting questions on CodeProject[^]
                                  Dave Kreskowiak

                                  1 Reply Last reply
                                  0
                                  • J jojoba20

                                    The area of an MDI container window is covered by an MdiClient control; consequently, Form.BackColor and Form.BackgroundImage are ineffective. So How to set the background for this form.

                                    RaviBeeR Offline
                                    RaviBeeR Offline
                                    RaviBee
                                    wrote on last edited by
                                    #30

                                    Does this[^] article help? /ravi

                                    My new year resolution: 2048 x 1536 Home | Articles | My .NET bits | Freeware ravib(at)ravib(dot)com

                                    1 Reply Last reply
                                    0
                                    • A Alisaunder

                                      And in some rare cases it may not be in the top-level Form. Also adding Try and catch is error controlling which I don't care who you are is still considered good practice, otherwise you end up with crashing code that nobody can debug. Once you have a complete project you can remove The error handling code to streamline the application. But to say it's not good practice to include it is in my opinion really stupid and asking for trouble.

                                      B Offline
                                      B Offline
                                      BobJanova
                                      wrote on last edited by
                                      #31

                                      No, you're wrong. Correct exception handling is good practice, yes. Using exceptions where there is a well documented non-exception path is not, because exceptions are expensive and slow. You should use exceptions for exceptional cases, not as part of normal flow control.

                                      1 Reply Last reply
                                      0
                                      • D Dave Kreskowiak

                                        Apparently you haven't been reading the posts. You also apparently won't be happy until you see actual code:

                                        private void MdiClientExample()
                                        {
                                        foreach (Control c in this.Controls)
                                        {
                                        if (c is MdiClient)
                                        {
                                        MdiClient mc = (MdiClient)c;
                                        ...
                                        }
                                        }
                                        }

                                        Are you happy now? Oh, and by the way, I don't consider this production quality code either. It's just cleaner than the example Microsoft gave. And if you're going to critisize us, you might want to start by creating your own code samples instead of lifting and posting others as your own work.

                                        A guide to posting questions on CodeProject[^]
                                        Dave Kreskowiak

                                        B Offline
                                        B Offline
                                        BobJanova
                                        wrote on last edited by
                                        #32

                                        Someone (I think it was here on CP) told me that as is as fast as is, so it's better to do

                                        foreach(Control c in Controls) {
                                        MdiClient mdi = c as MdiClient;
                                        if(mdi != null) { ... }
                                        }

                                        ... because you avoid the cost of the second cast.

                                        D 1 Reply Last reply
                                        0
                                        • B BobJanova

                                          Someone (I think it was here on CP) told me that as is as fast as is, so it's better to do

                                          foreach(Control c in Controls) {
                                          MdiClient mdi = c as MdiClient;
                                          if(mdi != null) { ... }
                                          }

                                          ... because you avoid the cost of the second cast.

                                          D Offline
                                          D Offline
                                          Dave Kreskowiak
                                          wrote on last edited by
                                          #33

                                          There is only one cast being made on each iteration of the loop until the correct control is found. So it really doesn't matter which you use since the only speed difference (and it's a very minor one) would be the expense of the second cast on the inside of the if statement.

                                          A guide to posting questions on CodeProject[^]
                                          Dave Kreskowiak

                                          B 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups