Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Вывести текст


Автор: mspuz 1.2.2007, 17:35
Код

function WindowProc(Hwn, PMsg, Wpr, Lpr: Longint): Longint; stdcall;
var
ps: tagPAINTSTRUCT;
rect: TRect;
MyHDC: HDC;
Str: String;
hfontt: HFONT;
begin
 Result := DefWindowProc(Hwn, PMsg, Wpr, Lpr);
//Çàêðûòèå ôîðìû
 if PMsg = WM_DESTROY then DoExit;
//Çàêðûòèå ôîðìû ïî íàæàòèþ ESC
 if (PMsg = WM_KeyDown)
 and (Wpr = VK_ESCAPE) then DoExit;
//Ïåðåðèñîâêà ôîðìû
 if PMsg = WM_PAINT then
  begin
   Str := 'Ìîé òåêñò' + #0;
   MyHDC := BeginPaint(Hwn, ps);
   {GetClientRect(Hwn, rect);
   DrawText(MyHDC, PAnsiChar(Str), -1, rect,
            DT_SINGLELINE or DT_CENTER or DT_VCENTER);}

   SelectObject(MyHDC, CreateFont(24,16,0,0,400,0,0,0,OEM_CHARSET,
              OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
              DEFAULT_QUALITY,DEFAULT_PITCH or
              FF_SCRIPT,
              PAnsiChar(Str)));
   SetTextColor(MyHDC,$0000FF00);
   SetBkColor(MyHDC,$0000FFFF);
   TextOut(MyHDC, 0, 0, PAnsiChar(Str),SIZEOF(Str));
   SelectObject(MyHDC, hfontt);
   EndPaint(Hwn, ps);
  end;
end;


Вот такой код вывода текста на API форму. Но на форме (белого цвета, стиль - WS_OVERLAPPEDWINDOW) ничего нет. Я использовал DrawText - не получилось, использовал TextOut - тоже самое. Понимаю, что ошибся, но где????

Автор: Snowy 1.2.2007, 18:15
Цитата(mspuz @  1.2.2007,  17:35 Найти цитируемый пост)
SIZEOF(Str)
к строкам не применяется smile
Цитата(mspuz @  1.2.2007,  17:35 Найти цитируемый пост)
PAnsiChar(Str)
И тут ты намудрил в CreateObject 
Код
var
  txt: string;
  dc: HDC;
  ff: HFONT;
  old : HGDIOBJ;
begin
  txt := 'Мама мыла раму';
  dc := GetDC (hwn);
  ff := CreateFont (-20, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
          CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'Courier New');
  old := SelectObject (dc, ff);
  TextOut (dc, 10, 10, txt, Length(txt));
  SelectObject(dc, old);
  DeleteObject (ff);
  ReleaseDC(hwn, dc);
end;

Автор: mspuz 2.2.2007, 12:13
Snowy, 
Большое спасибо (в который раз меня выручаешь). Но насчёт PAnsiChar(Str) я прав - string в этом месте не катит. А BeginPaint и EndPaint не используются??? Просто я решил переделать примерчик из Ассемблера и обнаружил такие же функции в Delphi.
И ещё русский язык не выводится!!! Как нужную кодировку установить???

Автор: Snowy 2.2.2007, 12:26
Цитата(mspuz @  2.2.2007,  12:13 Найти цитируемый пост)
Но насчёт PAnsiChar(Str) я прав - string в этом месте не катит.
Ну да. Я просто запостил и заметил, что txt не объявлена в варах.
Это я уже на скорую руку добил. Там правильно будет txt: PChar;

Цитата(mspuz @  2.2.2007,  12:13 Найти цитируемый пост)
BeginPaint и EndPaint не используются???
Можно, но в этом нет необходимости.

Цитата(mspuz @  2.2.2007,  12:13 Найти цитируемый пост)
И ещё русский язык не выводится!!! Как нужную кодировку установить???
Это у тебя в системе не русский установлен.
Попробуй вместо ансичарсета поставить RUSSIAN_CHARSET.
Или выводить через TextOutW. Второй вариант надёжнее. Но не забуть тогда txt сделать PWideChar;

Автор: mspuz 2.2.2007, 12:33
Snowy, Спасибо получилось!!!!
Но получается, что
MyHDC := GetDC(Hwn);
работает, а 
MyHDC := BeginPaint(Hwn, ps);
не работает, потому что как только я заменил эту строку, то у меня заработал и DrawText и TextOut!!!

Автор: Snowy 2.2.2007, 13:07
Значит BeginPaint у тебя неверно определяет зону рисования.
Скорее всего в ps.rcPaint у тебя (0, 0, 0, 0). И за пределами этого "прямоугольника" оно не рисует.
Да и не нужно это тебе smile
PS 
Код
  SetBkMode(dc, TRANSPARENT);
Сделает твою надпись прозрачной smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)