Delphi: TFindDialog и локализация

При использовании из 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;

Leave a Reply

You must be logged in to post a comment.