Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Вывод через TextOut своим шрифтом   Найти похожие ветки 

 
ipnet ©   (2004-03-29 17:26) [0]

Рисую на окне таким образом
var
WinHdc: HDC;
begin
WinHdc:=GetDC(mywnd);
oldFnt := SelectObject(WinHdc, fnt);
SetBkMode(WinHdc, TRANSPARENT);
TextOut(WinHdc,i*30,j*30,ch,1);
SelectObject(WinHdc, oldFnt);
ReleaseDC(mywnd,WinHdc);
---
выше предварительно создан шрифт
lf.lfHeight := -40;
lf.lfHeight := MulDiv(PointSize, GetDeviceCaps(dc, LOGPIXELSY), 72);}
lf.lfWidth := 0;        
lf.lfOrientation := 0;
lf.lfWeight := 400;    
lf.lfItalic := 0;
lf.lfUnderline := 0;
lf.lfStrikeOut := 0;
lf.lfCharSet := RUSSIAN_CHARSET;
fnt := CreateFontIndirect(lf);  //создаем шрифт
--
затем в цикле рисую на форме 15-20 символов (каждый отдельно)
в WM_Paint положил процедуру DrawAll - она их все перерисовывает.
Все бы хорошо, да только после этого добавления тормозить стало.
Допустим перед тем когда должен появится MessageBox, так он секунды три вылазит.
В чем дело ?


 
DVM ©   (2004-03-29 21:04) [1]

Шрифты уничтожаются? Что написано в Result=??? обработчика WM_PAINT?Правильнее не делать GetDC, а использовать BeginPaint, EndPaint


 
ipnet ©   (2004-03-30 04:58) [2]

в wm_Paint просто пишу
  WM_Paint:
  begin
   DrawAll;
  end;

где DrawAll
procedure DrawAll;
var
i,j: byte;
begin
for i:=1 to 4 do
 for j:=1 to 4 do
  DrawIJ(i,j);
end;

DrawIJ описана выше, а вот шрифт я вобще не трогаю, просто в начале его сделал один раз и все.


 
DVM ©   (2004-03-30 18:15) [3]

WM_PAINT:
 begin  
   hdc:=BeginPaint(hwnd, ps);
   ...
   EndPaint(hwnd, &ps);
   result:=0;
 end;


 
Юрий Зотов ©   (2004-03-30 18:20) [4]

И не забудьте убить свой фонт, иначе проблемы обеспечены.


 
ipnet ©   (2004-03-30 20:43) [5]

ну вообщем ничего страшного что я его создаю только один раз в начале программы , главное "убить" его при выходе ?


 
DVM ©   (2004-03-30 22:39) [6]


> главное "убить" его при выходе ?

При выходе его удалит система сама все равно. Хотя надеяться на систему тоже не хорошо.

А тормозило у тебя из-за того что не было result:=0;


 
ipnet ©   (2004-03-31 17:31) [7]

Интерестно получается, Исправил DrawIJ таким образом
procedure DrawIJ(i,j: integer);
var
WinHdc: HDC;
begin
WinHdc:=BeginPaint(mywnd,ps);
oldFnt := SelectObject(WinHdc, fnt);
SetBkMode(WinHdc, TRANSPARENT);
...
TextOut(WinHdc,i*30,j*30,ch,1);
SelectObject(WinHdc, oldFnt);
EndPaint(mywnd,ps);
end;
потом рисую всю сетку
procedure DrawAll;
var
i,j: byte;
begin
for i:=1 to 4 do
 for j:=1 to 4 do
  DrawIJ(i,j);
end;

то выводится только один левый верхний символ,
а если в DrawAll сделать так:
procedure DrawAll;
var
i,j: byte;
begin
WinHdc:=BeginPaint(mywnd,ps);
oldFnt := SelectObject(WinHdc, fnt);
SetBkMode(WinHdc, TRANSPARENT);
for i:=1 to 4 do
 for j:=1 to 4 do
  begin
   ...
   TextOut(WinHdc,i*30,j*30,ch,1);
  end
SelectObject(WinHdc, oldFnt);
EndPaint(mywnd,ps);
end;

то рисуются все 16, в WM_PAINT result:=0; установлен. Не понимаю ...


 
DVM ©   (2004-03-31 20:53) [8]

Ну ты бред написал однако.

BeginPaint и EndPaint вызывать надо ТОЛЬКО ПО ОДНОМУ РАЗУ - в начале и в конце всего рисования.

WM_PAINT:
begin  
  hdc:=BeginPaint(hwnd, ps);
  Создаем свой фонт и прочую лабуду...
  Назначаем фонт контексту
  Тут циклы рисующие сетку
  Обратно назначаем старый фонт
  удаляем свой фонт
  EndPaint(hwnd, &ps);
  result:=0;
end;


 
ipnet ©   (2004-04-02 16:29) [9]

Сделал таким образом
  WM_Paint:
   begin
    WinHdc:=BeginPaint(mywnd,ps);
    DrawAll(WinHdc);
    EndPaint(mywnd,ps);
    result:=0;
   end;
все нормально, но допустим при смене символов (выбор пункта в меню)
поле меняется и его надо перерисовать:
приходится вызывать так:
MakeField;
WinHdc:=GetDC(mywnd);
DrawAll(WinHdc);
ReleaseDC(mywnd,WinHdc);


 
ipnet ©   (2004-04-02 17:05) [10]

и еще, пытаюсь рисовать новое поле, но оно рисуется поверх предущего


MakeField;
//очищаю область
br:=CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
WinHdc:=GetDC(mywnd);
GetWindowRect(mywnd,rt);
Fillrect(WinHdc,rt,br);
ReleaseDC(mywnd,WinHdc);
//пытаюсь рисовать новое поле, но оно рисуется поверх предущего
WinHdc:=GetDC(mywnd);
DrawAll(WinHdc);
ReleaseDC(mywnd,WinHdc);


 
DVM ©   (2004-04-02 19:57) [11]


> все нормально, но допустим при смене символов (выбор пункта
> в меню)
> поле меняется и его надо перерисовать:
> приходится вызывать так:
> MakeField;
> WinHdc:=GetDC(mywnd);
> DrawAll(WinHdc);
> ReleaseDC(mywnd,WinHdc);

Ну ты мастер:) А система сообщений зачем? Вызывай InvalidateRect(), она пошлет WM_PAINT - все что нужно и отрисуется.:)))


> и еще, пытаюсь рисовать новое поле, но оно рисуется поверх
> предущего


GetWindowRect(mywnd,rt); - надо GetClientRect



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
1-1084277837
Sirakuz
2004-05-11 16:17
2004.05.23
Вопросы по основам наследования


1-1084297006
Oleg_
2004-05-11 21:36
2004.05.23
ошибка при открытии файла excel


11-1071780594
Arioch
2003-12-18 23:49
2004.05.23
Какой еще Delphi 8 ?


14-1083361002
Братан
2004-05-01 01:36
2004.05.23
Кто поможет вспомнить игру?


6-1081075606
Wiz@rd
2004-04-04 14:46
2004.05.23
Proxy