private void ResizeCustomControl(IntPtr hWnd, InteropUtil.RECT rect, params IntPtr[] buttons)
      DialogUtil.Assume(buttons != null && buttons.Length > 0);


      var wndLoc = hWnd.GetWindowPlacement();

      wndLoc.Right = rect.right;
      hWnd.SetWindowPlacement(ref wndLoc);

      foreach (var hBtn in buttons)
        int btnRight, btnWidth;

        m_calcPosMap[hBtn.GetDlgCtrlID()](this, rect.right, out btnRight, out btnWidth);

        PositionButton(hBtn, btnRight, btnWidth);

      //see bug # 844
      //We clip hWnd to only draw in the rectangle around our custom buttons.
      //When we supply a custom dialog template to GetOpenFileName(), it adds 
      //an extra HWND to the open file dialog, and then sticks all the controls 
      //in the dialog //template inside the HWND. It then resizes the control 
      //to stretch from the top of the open file dialog to the bottom of the 
      //window, extending the bottom of the window large enough to include the 
      //additional height of the dialog template. This ends up sticking our custom
      //buttons at the bottom of the window, which is what we want.
      //However, the fact that the parent window extends from the top of the open 
      //file dialog was causing some painting problems on Windows XP SP 3 systems. 
      //Basically, because the window was covering the predefined controls on the 
      //open file dialog, they were not getting painted. This results in a blank 
      //window. I tried setting an extended WS_EX_TRANSPARENT style on the dialog, 
      //but that didn't help.
      //So, to fix the problem I setup a window region for the synthetic HWND. 
      //This clips the drawing of the window to only within the region containing
      //the custom buttons, and thus avoids the problem.
      //I'm not sure why this wasn't an issue on Vista. 
      var hRgn = InteropUtil.CreateRectRgnIndirect(ref rect);
        if (hWnd.SetWindowRgn(hRgn, true) == 0)
          //setting the region failed, so we need to delete the region we created above.

        if (hRgn != IntPtr.Zero)
    private void PositionButton(IntPtr hWnd, int right, int width)
      var id = hWnd.GetDlgCtrlID();


      var buttonLoc = hWnd.GetWindowPlacement();

      buttonLoc.Right = right;
      buttonLoc.Left = buttonLoc.Right - width;
      hWnd.SetWindowPlacement(ref buttonLoc);
      hWnd.InvalidateRect(IntPtr.Zero, true);

    private void InitDialog(IntPtr hWnd)
      m_hWnd = hWnd;

      var hParent = hWnd.GetParent().AssumeNonZero();
      hParent.SetWindowSubclass(m_openFileSubClassDelegate, 0, 0);

      //disable and hide the filter combo box
      var hFilterCombo = hParent.GetDlgItem(InteropUtil.ID_FilterCombo).AssumeNonZero();
      hParent.SendMessage(InteropUtil.CDM_HIDECONTROL, InteropUtil.ID_FilterCombo, 0);
      hParent.SendMessage(InteropUtil.CDM_HIDECONTROL, InteropUtil.ID_FilterLabel, 0);

      //update the file name label
      var hFileNameLabel = hParent.GetDlgItem(InteropUtil.ID_FileNameLabel).AssumeNonZero();

      if (FileNameLabel != "")
        hFileNameLabel.SendMessageString(InteropUtil.WM_SETTEXT, 0, FileNameLabel);

      //find the button controls in the parent
      var hOkButton = hParent.GetDlgItem(InteropUtil.IDOK).AssumeNonZero();
      var hCancelButton = hParent.GetDlgItem(InteropUtil.IDCANCEL).AssumeNonZero();

      //We don't want the accelerator keys for the ok and cancel buttons to work, because
      //they are not shown on the dialog. However, we still want the buttons enabled
      //so that "esc" and "enter" have the behavior they used to. So, we just
      //clear out their text instead.

      //find our button controls
      var hSelectButton = hWnd.GetDlgItem(InteropUtil.ID_SELECT).AssumeNonZero();
      var hCustomCancelButton = hWnd.GetDlgItem(InteropUtil.ID_CUSTOM_CANCEL).AssumeNonZero();

      //copy the font from the parent's buttons

      var cancelLoc = hCancelButton.GetWindowPlacement();

      //hide the ok and cancel buttons
      hParent.SendMessage(InteropUtil.CDM_HIDECONTROL, InteropUtil.IDOK, 0);
      hParent.SendMessage(InteropUtil.CDM_HIDECONTROL, InteropUtil.IDCANCEL, 0);

      //expand the file name combo to take up the space left by the OK and cancel buttons.
      var hFileName = hParent.GetDlgItem(InteropUtil.ID_FileNameCombo).AssumeNonZero();
      var fileNameLoc = hFileName.GetWindowPlacement();
      fileNameLoc.Right = hOkButton.GetWindowPlacement().Right;
      hFileName.SetWindowPlacement(ref fileNameLoc);

      var parentLoc = hParent.GetWindowPlacement();

      //subtract the height of the missing cancel button
      parentLoc.Bottom -= (cancelLoc.Bottom - cancelLoc.Top);
      hParent.SetWindowPlacement(ref parentLoc);

      //move the select and custom cancel buttons to the right hand side of the window:

      var selectLoc = hSelectButton.GetWindowPlacement();
      var customCancelLoc = hCustomCancelButton.GetWindowPlacement();
      m_cancelWidth = customCancelLoc.Right - customCancelLoc.Left;
      m_selectWidth = selectLoc.Right - selectLoc.Left;
      m_buttonGap = customCancelLoc.Left - selectLoc.Right;

      var ctrlLoc = hWnd.GetWindowPlacement();
      ctrlLoc.Right = fileNameLoc.Right;

      //ResizeCustomControl(hWnd, fileNameLoc.Right, hCustomCancelButton, hSelectButton);