Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно мне пример привести, как на окошке api текст написать? [D7, WinXP]


Страницы:   1 2

Иван2 ©   (2004-12-09 18:39:00) 

Сколько не смотрю примеров winapi, как окошко создать - все есть, а как на нем выводить текст - нету.


Иван2   (2004-12-10 17:41:00) [1]

Понял, спасибо большое!


DVM   (2004-12-10 17:38:00) [2]


> А чем рисовать в память?

Тем же чем и на окно. Надо создать контекст устройства в памяти, совместимый с контекстом окна (CreateCompatibleDC). Далее создать битмап подходящих размеров (CreateCompatibleBitmap) и выбрать его в контекст в памяти (SelectObject). Потом рисуем на этот контест все что захотим и потом с него копируем на контекст окна (BitBlt). Не забываем уничтожать созданные объекты и освобождать DC.

Кстати в твоем случае лучше поступить так:
Стереть старое изображение заполнив его прямоугольник нужным цветом (FillRect), а потом отрисовать непосредственно новую картинку. Это не в WM_PAINT, а просто в отдельной процедуре, которую вызвать там когда надо.


Иван2   (2004-12-10 17:30:00) [3]

DVM ©  :
Ну, часто. В смысле, в приведенном мной тесте часто. То есть на получении сообщения с новым текстом рисовать в память, а на WM_Paint копировать из памяти? А чем рисовать в память?


DVM   (2004-12-10 17:19:00) [4]


> Только не понимаю, почему она какими-то полосками мерцает...

Часто обновляешь надпись? Часы небось какие-нибудь?
Чтобы не мерцало, надо сначала рисовать в память, а затем на DC окна с пом BitBlt() копировать из памяти изображение.


Иван2   (2004-12-10 17:15:00) [5]

DVM © :

Спасибо! Перерисовывается! Только не понимаю, почему она какими-то полосками мерцает...


DVM   (2004-12-10 17:01:00) [6]


> Иван2   (10.12.04 16:56) [20]

InvalidateRect()


Иван2   (2004-12-10 16:56:00) [7]

Это все умно и красиво, но как мне добиться того, чтобы текст в окне перерисовывался после получения нового текста? Он перерисовывается только когда я перехожу между программами, и никакие UpdateWindow, RedrawWindow не помоют.


Fay   (2004-12-10 13:34:00) [8]

2 GuAV ©   (10.12.04 12:02) [18]
IMHO лучше всегда присать try..finally когда он нужен. Чтобы думать 8)


GuAV   (2004-12-10 12:02:00) [9]

IMHO Лучше привыкать всегда писать try..finally в таких случаях, не думая нужен или нет, чем не написать когда он нужен.


Игорь Шевченко   (2004-12-10 11:58:00) [10]

DVM ©   (10.12.04 11:42) [16]

Как это не порождают ? А Access Violation ? :))

Дурная привычка идет происходит от чтения VCL:


   MemBmp := SelectObject(MaskDC, MemBmp);
   try
     MaskBlt(DstDC, DstX, DstY, DstW, DstH, SrcDC, SrcX, SrcY, MemBmp, MaskX,
       MaskY, MakeRop4(ROP_DstCopy, SrcCopy));
   finally
     MemBmp := SelectObject(MaskDC, MemBmp);
     DeleteObject(MemBmp);
   end;


С уважением,


DVM   (2004-12-10 11:42:00) [11]


> Игорь Шевченко ©   (09.12.04 19:10) [2]


> try
>        TextOut(DC, 0, 0, 'Hello, Windows!', 15);
..............
>        DrawEdge (DC, R, EDGE_ETCHED, BF_RECT);
>  finally
>        EndPaint (Window, ps);
>  end;

Вот уже неоднократно вижу у многих, что в try...finally...except помещаются вызовы функций API, которые не возбуждают исключений ИМХО никогда. Вопрос ЗАЧЕМ???


GuAV   (2004-12-10 00:33:00) [12]

Игорь Шевченко ©   (10.12.04 0:15) [14]
Кстати, MSDN тоже не всегда является истиной в последней инстанции.


Знаю. Кое что даже я находил :) исправили :)


Игорь Шевченко   (2004-12-10 00:15:00) [13]

GuAV ©   (09.12.04 23:59) [13]

Тоже неплохо, хотя и для совсем пуристов :)
Кстати, MSDN тоже не всегда является истиной в последней инстанции.

С уважением,


GuAV   (2004-12-09 23:59:00) [14]

Игорь Шевченко ©   (09.12.04 23:30) [12]
кстати, отличающийся от приведенного в MSDN,


Да, я не заментил, что в MSDN while (GetMessage( lpMsg, hWnd,0, 0)).

Мой вариант был такой:

function CheckGetMessage(Value: BOOL): BOOL;
begin
 if ord(Value) = -1 then
   Result := False  // или RaiseLastOSError;
 else
   Result := Value;
end;
...
while CheckGetMessage(GetMessage(Msg, 0, 0, 0)) do


Игорь Шевченко   (2004-12-09 23:30:00) [15]

GuAV ©   (09.12.04 22:44) [11]

Тут ведь какой момент: Функция объявлена так, что возвратить что-либо кроме true или false она не может.

GetMessage возвращает -1 только в случае некорректного hWnd (в Win2k - так).

Я полагаю, что в большинстве случаев код


while GetMessage(lpMsg, 0, 0, 0) do ...


кстати, отличающийся от приведенного в MSDN, если посмотреть внимательно, вполне безопасен, и поэтому переобъявлять функцию GetMessage или сравнивать ее значение с BOOL(1) является излишним.

С уважением,


GuAV   (2004-12-09 22:44:00) [16]

Игорь Шевченко ©   (09.12.04 22:12) [9]
For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer.


Здесь мне не нравится "For example". Наводит на мысль что возможны другие варианты :)


GuAV   (2004-12-09 22:29:00) [17]

Игорь Шевченко ©   (09.12.04 22:12) [9]
Я что-то делаю не так ? :)


Есть такие подозрения :)

чуть ниже процитированного Вами написано:

Warning  
Because the return value can be nonzero, zero, or -1, avoid code like this:

while (GetMessage( lpMsg, hWnd, 0, 0)) ...
The possibility of a -1 return value means that such code can lead to fatal application errors.


Игорь Шевченко   (2004-12-09 22:12:00) [18]

GuAV ©   (09.12.04 20:45) [8]

function GetMessage(var lpMsg: TMsg; hWnd: HWND;
 wMsgFilterMin, wMsgFilterMax: UINT): BOOL; stdcall;

If there is an error, the return value is -1. For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer.

Я что-то делаю не так ? :)


GuAV   (2004-12-09 20:45:00) [19]

Игорь Шевченко ©   (09.12.04 19:10) [2]
while GetMessage(MyMsg, 0, 0, 0) do


А в справке/MSDN про GetMessage написано что так нельзя..


clickmaker   (2004-12-09 20:25:00) [20]


> [6] Иван2   (09.12.04 20:04)
>  с RedrawWindow не разобрался

разберись


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо