Несколько добавок к стандартному дизайну: Дай контролы статусбару и индикатор раскладки клавиатуры своей программе!

© 2002 Сергей Секела

Не знаю кому-как, а мне было очень интересно, как же это во многих программах в StatusBar’ах ставят кнопки, или какие нибудь иконки.

Долго я лазил по интернету, качалу кучу компонент, но когда я ставил на форму такую панельку, кроме нее в довесок шла огромная библиотека, которая солидно накидала “лишних килограмм” моей программе. Потом я нашел в какой то литературе, как сделать StatusBar, к которому можна цеплять контролы. После этого я не использую огромных компнент для того, чтобы сделать в своей программе statusbar чуточку круче. Оказывается что если создать свой статусбар на основе стандартного и поменять его конструктор Create, то получится как раз то, что мне нужно:

unit MStatusBar;

interface

uses ComCtrls, Classes, Controls;

{$ObjExportAll On}

type
  TMyStatusBar = class(TStatusBar)
  public
    constructor Create(AOwner: TComponent); override;
  end;

procedure Register;

implementation

uses Consts;

constructor TMyStatusBar.Create( AOwner : TComponent );
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csAcceptsControls];
end;

procedure Register;
begin
  RegisterComponents('Win32', [TMyStatusBar]);
end;
end.

Если вот такой юнит проинсталлировать как компоненту, то потом его можна использовать в своих программах ;)

Вы спросите к чему это я клоню?

А идея этой статьи – создание своего индикатора клавиатуры, который будет сидеть именно в таком статус баре.

Долго я копал по разным конференциям и FAQ’ах.. но все таки нашел как это делается, теперь всегда это использую для наглядности и эргономики в программах. Значит чтобы получить текущую раскладку клавиатуры нужно использовать функцию GetKeyboardLayoutName, за реакцию на изменение раскладки клавиатуры отвечает Windows Message - WM_INPUTLANGCHANGEREQUEST и WM_INPUTLANGCHANGE. Они активируются при запросе на изменение раскладки и изменении раскладки соответственно. Но на практике оказалось, что активируются эти сообщения перед изменением текущей рассскладки, от этого и будем копать: Я избавился от такого очень просто: поставил на форму таймер, и через 10 миллисекунд спрашиваю у системмы текущую раскладку. Кстати чтобы знать активные в системме локалы можна порыться в реестре (так как это делал я).

Для иконки я использовал TanimatedImage из поставки RXLib, потому что и в него наиболее просто засунуть несколько пиктограм да и получить их тоже не сложно ;).

ИТАК:

При создании формы

procedure TForm1.FormCreate(Sender: TObject);
begin
  application.OnMessage:=LangChange;
end;

Процедура, которая ловит изменение и запускает таймер

procedure Tform1.LangChange(var m:TMsg;var Handled: Boolean);
begin
  if (m.message=WM_INPUTLANGCHANGEREQUEST) or
     (m.message=WM_INPUTLANGCHANGE)
    then
      Begin
        langtimer.enabled:=true;
      end;
end;

Собственно сам таймер:

procedure TForm1.LangTimerTimer(Sender: TObject);
var   szBuf : array[0..KL_NAMELENGTH] of Char;
begin
  GetKeyboardLayoutName( @(szBuf[0]) );
  if string(szbuf)='00000409' then begin
    flag.Glyphnum:=2;
    flag.Hint:='Язык: Английский';
  end
  else
  if string(szbuf)='00000419' then Begin
    flag.Glyphnum:=1;
    flag.Hint:='Язык: Русский';
  end
  else
  if string(szbuf)='00000422' then Begin
    flag.Glyphnum:=0;
    flag.Hint:='Язык: Украинский';
  end
  else
  Begin
    flag.Glyphnum:=3;
    flag.Hint:='Неизвестный язык :(';
  end;
  langtimer.Enabled:=false;
end;

Вот вроде все на счет индикатора, но когда есть индикатор, то хочется еще самому програмно переключать раскладки клавиатуры, а это делается очень просто: за это отвечает функция LoadKeyboardLayout . Её и будем использовать:

Procedure ChangeLanguage(Language:String);
var
  LangName : array[0..KL_NAMELENGTH] of Char;
begin
  StrCopy(LangName,pchar(Language));
  LoadKeyboardLayout(LangName,KLF_ACTIVATE);
end;

P.S. Маленький список языковых раскладок:

Ukrainian00000422
Russian00000419
English00000409
German00000407
Spanish00000403
polish00000415
Romainan00000418
French0000040C

Для индикатора исполюзуется RXLib 2.75
Желающие могут скачать исходные тексты примера (7.48K)

Все пожелание можете писать на DrWeb@torba.com.

Copyright© 2002 Сергей Секела  Специально для Delphi Plus

2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература