1

So, I have a CDialog resource that I have had for a long time and I decided to add a statusbar to it. Here is the resource:

Resource

All controls fit nicely in the dialog. Now, at runtime this is what it looks like:

Results

The tutorial I followed was here and for the most part it works. Here is my setup code:

///////////////////////////////
m_StatusBar.Create(this); //We create the status bar

m_StatusBar.SetIndicators(indicators, 2); //Set the number of panes 

CRect rect;
GetClientRect(&rect);
//Size the two panes
m_StatusBar.SetPaneInfo(0, ID_INDICATOR_DATE,
    SBPS_NORMAL, 200);
m_StatusBar.SetPaneInfo(1, ID_INDICATOR_MEETING_TYPE, SBPS_STRETCH, 0);

//This is where we actually draw it on the screen
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,
    ID_INDICATOR_DATE);
GetDynamicLayout()->AddItem(m_StatusBar.GetSafeHwnd(), 
    CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));
///////////////////////////////

I have tried without WindowsBlinds and the issues are still there.

So my issues are:

1/ The controls are overlapping the status bar. How do I accurately set these controls in the resource editor so this issue won't happen? How should it be resolved? Hit n miss?

2/ My dialog supports resizing by using the dynamic layouts and it has the OBM_SIZE in the bottom right:

void CResizingDialog::InitialiseResizeIcon(CBitmap& rBmpResize, CStatic& rLblResize, CWnd* pDialog)
{
    CRect rcIcon, rcClient;

    if (pDialog != nullptr)
    {
        rBmpResize.LoadOEMBitmap(OBM_SIZE);
        rLblResize.Create(nullptr, WS_CHILD | WS_VISIBLE | SS_BITMAP,
            CRect(0, 0, 16, 16), pDialog, IDC_STATIC_RESIZE);
        rLblResize.SetBitmap(rBmpResize);

        pDialog->GetClientRect(rcClient);
        rLblResize.GetClientRect(rcIcon);
        rLblResize.SetWindowPos(&CWnd::wndTop,
            rcClient.right - rcIcon.Width(),
            rcClient.bottom - rcIcon.Height(), 0, 0, SWP_NOSIZE);

        CMFCDynamicLayout *pDynamicLayout = pDialog->GetDynamicLayout();
        if (pDynamicLayout != nullptr)
        {
            CMFCDynamicLayout::MoveSettings moveSettings = CMFCDynamicLayout::MoveHorizontalAndVertical(100, 100);
            CMFCDynamicLayout::SizeSettings sizeSettings = CMFCDynamicLayout::SizeNone();

            pDynamicLayout->AddItem(rLblResize.GetSafeHwnd(), moveSettings, sizeSettings);
        }
    }
}

How do I avoid the issue that you can see there now in the bottom right?

Update

It looked like I should use CreateEx And use this style SBARS_SIZEGRIP. Then stop creating my own resize icon. I assume the two grippers will look the same. So this might be one of the answers.

I tried using the above flag but unfortunately I can't use it:

Gripper in stabusbar

This gripper is not consistent with the other one I am using so I need to keep my original one instead.

Update 2

I now realise that the gripper is always created anyway, so I had two grippers there! I have now derived my own statusbar class and switched off the default gripper:

BOOL CCreateReportStatusBar::PreCreateWindow(CREATESTRUCT& cs)
{
    BOOL bRet = CStatusBar::PreCreateWindow(cs);
    cs.style &= ~SBARS_SIZEGRIP;

    return bRet;
}

So now I only have the one gripper. But my two issues still remain.

Update 3

I stumbled over this. In theory if I override this DrawGripper method I should be able to render my own gripper instead. Doesn't work. The method is never called.

Update 4

I decided not to fight the system. I have let the status bardraw the themes gripper and I have adjusted my resizing dialog class to also draw the themes gripper. So all is good.

Community
  • 1
  • 1
Andrew Truckle
  • 17,769
  • 16
  • 66
  • 164

0 Answers0