Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2011, 10:07   #1
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию Вывести на канву раскладку клавиатуры

Здравствуйте, возникла какая-то глупая ошибка..
Не могу вьехать, вобщем, мне нужно на картинку шаблон, выводить название текущей раскладки клавиатуры.
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
   AklName: array [0..255] of Char;
   tmp:string;
begin
   GetLocaleInfo( LoWord(GetKeyboardLayout(0)),
   LOCALE_SABBREVLANGNAME,AklName,SizeOf(AklName));
   tmp:=LowerCase(string(AklName));
   tmp:=Copy(tmp, 0, 3);
   form1.Canvas.Font.style:=[fsBold];;
   form1.Canvas.TextOut(15, 3, tmp);
   caption:=tmp;
end;
Англ. показывается нормально, а русский нет, какой-то лишний символ в конце..

Мб это из-за несоответствия типов, char, string, вобщем прошу помощи.

P.S - подскажите, как можно рисовать текст через TextOut не только на битмап, но и к примеру на jpeg?
Moonquake
phphel вне форума Ответить с цитированием
Старый 06.04.2011, 10:39   #2
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Код:
function AbbrByLocale(LocID: LCID): String;
var
  Size, Res: Integer;
  Buf: PChar;

begin
  Size := GetLocaleInfoA(LocID, LOCALE_SABBREVLANGNAME, nil, 0);
  GetMem(Buf, Size);
  try
    Res := GetLocaleInfoA(LocID, LOCALE_SABBREVLANGNAME, Buf, Size);
    if Res = Size then
      Result := Copy(String(Buf), 1, 3) 
    else
      Result := 'ERROR';
  finally
    FreeMem(Buf, Size);
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   form1.Canvas.Font.style:=[fsBold];;
   form1.Canvas.TextOut(15, 3, WideLowerCase(AbbrByLocale(LoWord(GetKeyboardLayout(0)))));
   caption:=LowerCase(AbbrByLocale(LoWord(GetKeyboardLayout(0))));
end;
Аналогчино...
Moonquake
phphel вне форума Ответить с цитированием
Старый 06.04.2011, 10:48   #3
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Kороче получилось через paintbox, но почему я не вьеду, может кто-то обьяснит?)
Английский то нормально рисуется..
Moonquake
phphel вне форума Ответить с цитированием
Старый 06.04.2011, 11:04   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

дык, остаются следы от старой надписи (шрифт не моноширный - ширина буковок разная,
разная, соответственно, и длина надписи получается..

попробуйте очищать место перед выводом...
Код:
begin
   form1.Canvas.Font.style:=[fsBold];

   // удалим сначала старую надпись
   form1.Canvas.Brush.Style := bsSolid;
   form1.Canvas.Pen.Color := form1.Canvas.Brush.Color;
   form1.Canvas.Rectangle(15,3,
       15+form1.Canvas.TextWidth('ENU'),3+form1.Canvas.TextHeight('ENU'));

   form1.Canvas.TextOut(15, 3, WideLowerCase(AbbrByLocale(LoWord(GetKeyboardLayout(0)))));
   caption:=LowerCase(AbbrByLocale(LoWord(GetKeyboardLayout(0))));
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.04.2011, 11:23   #5
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Serge_Bliznykov, разобрался, благодарю.

А со вторым вопросом не поможете?
Moonquake
phphel вне форума Ответить с цитированием
Старый 06.04.2011, 11:42   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сразу на жпег рисовать нельзя.
сначало грузите через JPEGImage потом переводите в битмап, его изменяете и через JPEGImage сохраняете обратно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.04.2011, 12:14   #7
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Ну такой способ я знаю)
Думал, что можно более красиво, ладно, еще раз спасибо.
Тема не актуальна.
Moonquake
phphel вне форума Ответить с цитированием
Старый 06.04.2011, 13:02   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

JPEG в первую очередь способ хранения данных, а не для отображения на экране.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывести нажатую клавишу при каждом сканировании клавиатуры Dzef Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 01.03.2011 17:22
Переключить раскладку клавиатуры. SKYLINEGTR Помощь студентам 2 02.02.2011 00:50
Для десяти выстрелов, координаты которых задаются с клавиатуры вывести текстовые сообщения о попадении в Masiasia Помощь студентам 0 24.11.2009 20:23
Передать Канву Pedro Работа с сетью в Delphi 7 28.04.2008 17:38