Fix Open dialog with "Save" label for OK button
Now Open dialog shows Open label on the button instead of Save. Don't change any button labels. Instead, get the leftmost button when overriding the window procedure. Fix #9966, close #9973pull/10017/head
parent
ea8c9779c2
commit
aa17a4bc7a
|
@ -50,7 +50,6 @@ namespace // anonymous
|
|||
|
||||
static const int IDC_FILE_CUSTOM_CHECKBOX = 4;
|
||||
static const int IDC_FILE_TYPE_CHECKBOX = IDC_FILE_CUSTOM_CHECKBOX + 1;
|
||||
static const TCHAR TEMP_OK_BUTTON_LABEL[] = _T("Save");
|
||||
|
||||
// Returns a first extension from the extension specification string.
|
||||
// Multiple extensions are separated with ';'.
|
||||
|
@ -372,9 +371,10 @@ private:
|
|||
if (SUCCEEDED(hr) && hwndDlg)
|
||||
{
|
||||
EnumChildWindows(hwndDlg, &EnumChildProc, 0);
|
||||
if (_staticThis->_hwndButton)
|
||||
_staticThis->_okButtonProc = (WNDPROC)SetWindowLongPtr(_staticThis->_hwndButton, GWLP_WNDPROC, (LPARAM)&OkButtonWndProc);
|
||||
}
|
||||
}
|
||||
_dialog->SetOkButtonLabel(nullptr); // Reset label to default.
|
||||
}
|
||||
|
||||
bool shouldInitControls() const
|
||||
|
@ -458,6 +458,7 @@ private:
|
|||
{
|
||||
const int bufferLen = MAX_PATH;
|
||||
static TCHAR buffer[bufferLen];
|
||||
|
||||
if (GetClassName(hwnd, buffer, bufferLen) != 0)
|
||||
{
|
||||
if (lstrcmpi(buffer, _T("ComboBox")) == 0)
|
||||
|
@ -473,24 +474,37 @@ private:
|
|||
}
|
||||
else if (lstrcmpi(buffer, _T("Button")) == 0)
|
||||
{
|
||||
// Find the OK button.
|
||||
// Label could be "Open" or "Save".
|
||||
// Label could be localized (that's why can't search by window text).
|
||||
// Dialog could have other buttons ("Cancel", "Help", etc).
|
||||
// Don't rely on the order of the EnumChildWindows() traversal since it could be changed.
|
||||
LONG style = GetWindowLong(hwnd, GWL_STYLE);
|
||||
if (style & (WS_CHILDWINDOW | WS_VISIBLE | WS_GROUP))
|
||||
if (IsWindowEnabled(hwnd) && (style & (WS_CHILDWINDOW | WS_GROUP)))
|
||||
{
|
||||
DWORD type = style & 0xF;
|
||||
DWORD appearance = style & 0xF0;
|
||||
if ((type == BS_PUSHBUTTON || type == BS_DEFPUSHBUTTON) && (appearance == BS_TEXT))
|
||||
{
|
||||
if (GetWindowText(hwnd, buffer, bufferLen) > 0 &&
|
||||
wcsstr(buffer, TEMP_OK_BUTTON_LABEL) != nullptr)
|
||||
// Get the leftmost button.
|
||||
if (_staticThis->_hwndButton)
|
||||
{
|
||||
_staticThis->_okButtonProc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LPARAM)&OkButtonWndProc);
|
||||
RECT rc1 = {};
|
||||
RECT rc2 = {};
|
||||
if (GetWindowRect(hwnd, &rc1) && GetWindowRect(_staticThis->_hwndButton, &rc2))
|
||||
{
|
||||
if (rc1.left < rc2.left)
|
||||
_staticThis->_hwndButton = hwnd;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_staticThis->_hwndButton = hwnd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (_staticThis->_okButtonProc && _staticThis->_fileNameProc)
|
||||
return FALSE; // Found all children, stop enumeration.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -557,6 +571,7 @@ private:
|
|||
const std::vector<Filter> _filterSpec;
|
||||
generic_string _lastUsedFolder;
|
||||
HWND _hwndNameEdit = nullptr;
|
||||
HWND _hwndButton = nullptr;
|
||||
WNDPROC _okButtonProc = nullptr;
|
||||
WNDPROC _fileNameProc = nullptr;
|
||||
UINT _currentType = 0; // File type currenly selected in dialog.
|
||||
|
@ -592,10 +607,6 @@ public:
|
|||
IID_PPV_ARGS(&_dialog));
|
||||
_customize = _dialog;
|
||||
|
||||
// Set label so that OK button can be differentiated during initialization.
|
||||
// It will be reset back to default later on.
|
||||
_dialog->SetOkButtonLabel(TEMP_OK_BUTTON_LABEL);
|
||||
|
||||
// Init the event handler.
|
||||
// Pass the initially selected file type.
|
||||
if (SUCCEEDED(hr))
|
||||
|
|
Loading…
Reference in New Issue