Форум: "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;
где DrawAllprocedure 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.032 c