private void ResizeCustomControl(IntPtr hWnd, InteropUtil.RECT rect, params IntPtr[] buttons) { DialogUtil.Assume(buttons != null && buttons.Length > 0); hWnd.AssumeNonZero(); 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); try { if (hWnd.SetWindowRgn(hRgn, true) == 0) { //setting the region failed, so we need to delete the region we created above. hRgn.DeleteObject(); } } catch { if (hRgn != IntPtr.Zero) { hRgn.DeleteObject(); } } }
private void ResizeCustomControl(IntPtr hWnd) { if (hWnd == m_hWnd) { var hSelectButton = hWnd.AssumeNonZero().GetDlgItem(InteropUtil.ID_SELECT).AssumeNonZero(); var hOkButton = hWnd.AssumeNonZero().GetDlgItem(InteropUtil.ID_CUSTOM_CANCEL).AssumeNonZero(); var hParent = hWnd.GetParent().AssumeNonZero(); var fileName = hParent.GetDlgItem(InteropUtil.ID_FileNameCombo).AssumeNonZero(); /*var right = fileName.GetWindowPlacement().Right; * var top = hSelectButton.GetWindowPlacement().Top;*/ var rect = new InteropUtil.RECT(); var selectRect = hSelectButton.GetWindowPlacement(); rect.top = selectRect.Top; rect.bottom = selectRect.Bottom; rect.right = fileName.GetWindowPlacement().Right; rect.left = rect.right - (m_cancelWidth + m_buttonGap + m_selectWidth); ResizeCustomControl(hWnd, rect, hOkButton, hSelectButton); } }
private void ResizeCustomControl(IntPtr hWnd) { if (hWnd == m_hWnd) { var hSelectButton = hWnd.AssumeNonZero().GetDlgItem(InteropUtil.ID_SELECT).AssumeNonZero(); var hOkButton = hWnd.AssumeNonZero().GetDlgItem(InteropUtil.ID_CUSTOM_CANCEL).AssumeNonZero(); var hParent = hWnd.GetParent().AssumeNonZero(); var fileName = hParent.GetDlgItem(InteropUtil.ID_FileNameCombo).AssumeNonZero(); /*var right = fileName.GetWindowPlacement().Right; var top = hSelectButton.GetWindowPlacement().Top;*/ var rect = new InteropUtil.RECT(); var selectRect = hSelectButton.GetWindowPlacement(); rect.top = selectRect.Top; rect.bottom = selectRect.Bottom; rect.right = fileName.GetWindowPlacement().Right; rect.left = rect.right - (m_cancelWidth + m_buttonGap + m_selectWidth); ResizeCustomControl(hWnd, rect, hOkButton, hSelectButton); } }