Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ Пара вопросов

Автор: rzr 25.03.2007 3:21

Люди, подскажите, пожалуйста:
Вот, виновник:


procedure Header;

var

Font:HFont;
Ps:PaintStruct;
Dc:HDc;
R:Rect;

begin

Font:=CreateFont(36,12,
0,0,
710,0,0,0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH or FF_DONTCARE,
'Impact');


Dc:=BeginPaint(Back,@Ps);

R.Left:=10;
R.Top:=96;
R.Right:=100;
R.Bottom:=196;

SelectObject(Dc,Font);

SetBkMode(dc,Transparent);

SetTextColor(Dc,RGB(192,192,192));

DrawText(Dc,'Pascal',-1,@R,DT_SINGLELINE or DT_TOP);

R.Left:=12;
R.Top:=94;
R.Right:=112;
R.Bottom:=194;

SetTextColor(Dc,RGB(0,0,250));

DrawText(Dc,'Pascal',-1,@R,DT_SINGLELINE or DT_TOP);

EndPaint(Back,Ps);

end;




Результат этой процедуры - надпись 'Pascal' с чем-то похожем на тень. Рисуется она у меня нормально, проблема в том, что, если свернуть окно или просто подвигать над ним другое окно какое-нить, то надпись эта проподает и не появляется вплоть до перезапуска приложения.
Что скажете? Как это можно исправить?

А ещё: как на окно поместить рисунок (точнее - иконку)? И что значит первый параметр в LoadIcon() или LoadImage()?

Спасибо за ответы

Автор: volvo 25.03.2007 3:25

Файл полностью присоедини... Важно, как ты обрабатываешь сообщения...

Автор: rzr 25.03.2007 3:38

За сообщения я ещё и не брался: думал пока внешний вид сделать, а что именно за сообщения здесь нужны? (если файл всё ещё нужен - прикреплю)

Автор: volvo 25.03.2007 3:52

Все еще нужен. Прикрепи файл, который можно откомпилировать и запустить.

Вообще-то надо обрабатывать WM_PAINT, оно посылается приложению, когда нужно перерисовать окно. Вот тогда и нужно перерисовывать не только само окно, а и хидер, который ты нарисовал...

Автор: rzr 25.03.2007 4:12

С WM_PAINT разобрался, спасибо за подсказку. А не мог бы ты показать как мне на место idi_application иконку fpc'а кинуть? И ещё: нельзя ли как-нить обойтись без "перекодирования" текста, чтобы русские буквы нормально на окне отображались?


Прикрепленные файлы
Прикрепленный файл  program.pas ( 6.78 килобайт ) Кол-во скачиваний: 477

Автор: rzr 10.04.2007 3:22

Люди, подскажите, пжлст: как выводить русский текст на окно без всяких функций-перекодировок? Или FP не поддерживает Unicode? Может я не те типы использую? Или директиву надо какую-нить?

Автор: volvo 10.04.2007 3:37

Ну, почему сразу "не поддерживает"? Здесь был:
http://www.freepascal.ru/article//freepascal/20051026001249/ ?

Автор: rzr 27.04.2007 3:50


Volvo

Скажи, пожалуйста, правильно ли я понимаю: чтобы нам отобразить русский текст на окне, нужно послать строку unicode (т.е. widestring). То бишь надо обычную строку перевести в widestring.

Такой вот код, например, не работает как хотелось бы:


Title := 'АБВ'; //в var Title: AnsiString;
// WideTitle: WideString;
// WSM: TWideStringManager;

WSM.Ansi2WideMoveProc (@Title,WideTitle,4);

Main := MainFn; //это окно

SendMessage (Main,WM_SETTEXT,0,LParam (WideTitle));




Компилируется нормально,
Выполнение прерывается на Ansi2WideMoveProc: ExitCode = 216

Что я делаю неправильно?


Прикрепленные файлы
Прикрепленный файл  1.pas ( 1.97 килобайт ) Кол-во скачиваний: 414

Автор: Айра 23.10.2007 3:03

Цитата
как выводить русский текст на окно без всяких функций-перекодировок

Та же проблема (кириллица из файла выходит в виде всяких каракуль), только я совсем не поняла, что делать wink.gif
Можете объяснить? rolleyes.gif

Автор: volvo 23.10.2007 3:06

Как выводишь, и в какой кодировке текст в файле? (лучше присоединить сам файл)

Автор: Айра 23.10.2007 3:20

Вот код:

uses crt;
var s: string;
ch: char;
f: text;
begin
assign(f, 'vopros.txt');
{$I-}
reset(f);
{$I+}
if IoResult=0 then
begin
while not eof(f) do
begin
read(f,ch);
write(ch);
if ch='?' then
begin
writeln;
readln(s);
end;
end;
end;
close(f);
end.

Вот сам файл: Прикрепленный файл  vopros.txt ( 50 байт ) Кол-во скачиваний: 778


Автор: volvo 23.10.2007 3:58

Не знаю, что там в Висте творится, но XP SP2 (если установлен русский - как язык для не Unicode-приложений) все прекрасно отображает...

Автор: andriano 2.12.2007 12:31

Кажется проблема с русским языком не совсем верно сформулирована (или я ее не так понял).
Благодаря Микрософт у нас вопроеки ГОСТу появилась новая кодировка символов, а именно - 1251. В DOS и консольных приложениях осталась кодировка, которая предусмотрена ГОСТ как "альтернативная", а у MS имеет номер 866.
Проблема проявляется ТОЛЬКО в том случае, если IDE, в котором ведется разработка и сама разрабатываемая программа используют различные кодировки. Самый простой и очевидный способ преодоления возникающих проблем - писать GUI приложения в GUI среде, а консольные - в консольной.
Альтернативняй вариант решения - использовать консольную среду, которая явно понимает кириллицу или GIU-редактор, позволяющий менять шрифт + русификатор клавиатуры, поддерживающий 866 страницу.
"Простых" способов для преодоления этой специфической проблемы, СГЕНЕРИРОВАННОЙ МИКРОСОФТ ИМЕННО ДЛЯ НАШЕЙ СТРАНЫ, нет.