Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

Вывод через 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
3-1083148163
gu_est
2004-04-28 14:29
2004.05.23
номер колонки в DBGridEh


3-1082701593
Andrey_Zh
2004-04-23 10:26
2004.05.23
Базы данных


1-1083760199
Goida
2004-05-05 16:29
2004.05.23
Когда в Delphi появится....


4-1080633000
Владимир Бирюков
2004-03-30 11:50
2004.05.23
Атрибут "Поверх всех" и всплывающее окно принтера


1-1083763502
denis_group
2004-05-05 17:25
2004.05.23
CheckBox ы в StringGrid .





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский