При использовании из Delphi диалогов самой MS Windows (TFindDialog, TOpenDialog etc) есть проблема с локализацией приложения – эти диалоги всегда будут отображаться с надписями в рамках локализации самой Windows.
Например, ваше приложение может иметь немецкий интрефейс, а вызываемый диалог будет отображать все еще русские или английские строки. Как-то это неправильно и решил я такое дело поправить.
С наскоку проблему не удалось решить. Т.е. заголовок самого окна изменить не проблема – просто послать сообщение WM_SETTEXT хэндлу диалога с новой строкой в параметре.
А вот найти описания всех контролов-детей не удалось ни в исходниках Delphi, ни в хедерах Visual Studio.
День поисков в Google тоже результатов не принес. Такое впечатление, что кроме меня эта тема никого не волнует.
Пришлось запускать Spy+ из VS и смотреть идентификаторы (ControlID) всех детей-контролов. Далее дело техники – в событии OnShow перебор всех детей, проверка ControlID и посылка сообщения на изменение текста:
procedure TMain.dlgFindShow(Sender: TObject); var s: String; ControlID: Integer; hChildWin: hWND; begin s := 'Поиск'; SendMessage(dlgFind.Handle, WM_SETTEXT, 0, LParam(PChar(s))); hChildWin := GetWindow(dlgFind.Handle, GW_CHILD or GW_HWNDFIRST); while (hChildWin <> 0) do begin ControlID := GetDlgCtrlID(hChildWin); if (ControlID = $FFFF) then begin s := '&Что:'; SendMessage(hChildWin, WM_SETTEXT, 0, LParam(PChar(s))); end else if (ControlID = $0001) then begin s := '&Найти далее'; SendMessage(hChildWin, WM_SETTEXT, 0, LParam(PChar(s))); end else if (ControlID = $0002) then begin s := '&Отмена'; SendMessage(hChildWin, WM_SETTEXT, 0, LParam(PChar(s))); end; hChildWin := GetWindow(hChildWin, GW_HWNDNEXT); end; end;