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