How do I get the *actual* content height. (Trying to make a footer)


#1

I’m trying to make a window with a fixed header/footer, but the none of the “get content size” functions give me the right numbers. Width is correct per the demo example, but height is off by a bit. I assume there’s a number I should be subtracting but I don’t know what it would be. I also tried zeroing the window padding but that also didn’t work. Here’s my code:

    ImGui::SetNextWindowSize(ImVec2(400,600)); //Arbitrary size
    ImGui::Begin("HeaderFooterWindow",nullptr);
    ImVec2 cr = ImGui::GetWindowContentRegionMax(); //I tried every nearby function too.
    
    ImGui::BeginChild("TopBar", ImVec2(cr.x,100), false, 0);
    ImGui::Text("Header");
    ImGui::EndChild();

    ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); //For visibility
    ImGui::BeginChild("Content", ImVec2(cr.x,cr.y-200), false, 0);
    ImGui::Text("Content");
    ImGui::EndChild();
    ImGui::PopStyleColor();

    ImGui::BeginChild("BottomBar", ImVec2(cr.x,100), false, 0);
    ImGui::Text("Footer");
    ImGui::EndChild();
    ImGui::End();

#2

If you are not sure what a function does, use a ImGui::Text() statement to display its value!

You probably want to use GetContentRegionAvail(), however you can simply use the sizing facility of BeginChild() more simply:

Something like

    ImGui::BeginChild("TopBar", ImVec2(0, 100), false, 0); // Use avail width, use 100 for height
    ImGui::Text("Header");
    ImGui::EndChild();

    ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); //For visibility
    ImGui::BeginChild("Content", ImVec2(0, -(100 + style.ItemSpacing.y)), false, 0); // Leave ~100
    ImGui::Text("Content");
    ImGui::EndChild();
    ImGui::PopStyleColor();

    ImGui::BeginChild("BottomBar", ImVec2(0,0), false, 0); // Use avail width/height
    ImGui::Text("Footer");
    ImGui::EndChild();
    ImGui::End();

You may also look at https://github.com/ocornut/imgui/issues/319
Or simply the docking branch which is heading toward making this easier.


#3

Thanks. It was the item spacing was what was throwing off the calculation. Zeroing the padding didn’t fix it because it’s inside the width/height.

I reread the ImGuiStyle definition and it’s not clear how all the paddings and spacings stack. I looked for the imgui version the CSS Box Model diagram but I couldn’t find one.

The docking/splitter branch looks cool!


#4

I agree it’s not all obvious, but again, the easiest way for anything within ImGui ecosystem is to live interact with this by opening the style editor and tweaking the values.