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

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

перерисовка надписи [D7]


Dmitriy ©   (2010-08-20 10:15:00) 

Здравствуйте!
Задался вопросом разместить на форме Label средствами WinAPI. Но в WinAPI я еще новичек и поэтому прошу у вас совета. Как лучше поступить, какими методами воспользоваться? Мне нужно, чтобу можно было задать цвет, фон, прозрачность, и была возможность перерисовки.
После поисков в сети наше в принципе то,что мне нужно - функции задания цвета текста, прозрачности фона, шрифта:

SetBkMode(DC, TRANSPARENT);
SetTextColor(DC, RGB(255, 0, 0));
CreateSolidBrush(DC);
SelectObject(DC, Font);

Но вот проблема с перерисовкой не могу понять как перерисовать, чтобы надпись не наслаивалась на предыдущую.
Нашел, что можно использовать BeginPaint. Перерисовка получается только без использования прозрачности, т.е. SetBkMode(DC, TRANSPARENT);
Как применить прозрачность при перерисовке?


DVM   (2010-08-20 16:28:00) [1]


> то надписи накладываются друг на друга

покажи скриншот, мне непонятно, что у тебя не так.


DVM   (2010-08-20 16:26:00) [2]

у меня ничего не накладывается, серых прямоугольников (я правильно понял, они тебя смущают) у меня нет.

DrawText(DC, PChar(S), Length(S), rc, 0);

rc.Left := rc.Left + 20;
rc.Top := rc.Top + 5;

DrawText(DC, PChar(S), Length(S), rc, 0);

выводит 2 надписи, одна поверх другой.


Dmitriy   (2010-08-20 15:58:00) [3]

Не получается :(
Если фон прозрачный, то надписи накладываются друг на друга, а если если убрать SetBkMode(DC, TRANSPARENT), то все нормально перерисовывается, но с серым фоном...


DVM   (2010-08-20 14:41:00) [4]

Главное подчищай за собой ресурсы, иначе выделение и не освобождение ресурса в WM_PAINT очень быстро приведет к их исчерпанию.


DVM   (2010-08-20 14:39:00) [5]


....

   WM_PAINT:
     begin
       Result := OnPaint(Wnd, Msg, wParam, lParam);
     end;

....

function OnPaint(Wnd: HWND; Msg: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
 rc: TRect;
 Font, OldFont: HFONT;
 S: string;
 DC: HDC;
 PaintStruct: TPaintStruct;
begin
 Font := CreateFont(12, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET,
           OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH,
           'MS Sans Serif');
 S := 'bla-bla-bla';
 GetClientRect(Wnd, rc);

 DC := BeginPaint(Wnd, PaintStruct);
 OldFont := SelectObject(DC, Font);

 SetBkMode(DC, TRANSPARENT);
 SetTextColor(DC, RGB(255, 0, 0));

 DrawText(DC, PChar(S), Length(S), rc, 0);

 SelectObject(DC, OldFont);
 DeleteObject(Font);

 EndPaint(Wnd, PaintStruct);
 Result := 1;
end;



Само собой необязательно каждый раз создавать и уничтожать Font, достаточно это сделать 1 раз при старте программы.


Dmitriy   (2010-08-20 14:16:00) [6]

Убрать? А как тогда сделать, чтобы был нужный шрифт?


DVM   (2010-08-20 13:37:00) [7]


> SelectObject(DC, Font);
> CreateSolidBrush(DC);

убери, тут все равно утечка ресурсов GDI


DVM   (2010-08-20 13:35:00) [8]


> PaintStruct.hdc := DC;
> PaintStruct.rcPaint.TopLeft.X := 40;
> PaintStruct.rcPaint.TopLeft.Y := 40;
> PaintStruct.rcPaint.BottomRight.X := 250;
> PaintStruct.rcPaint.BottomRight.Y := 80;
> PaintStruct.fErase := true;

убери


Dmitriy   (2010-08-20 13:00:00) [9]

PaintStruct.hdc := DC;
PaintStruct.rcPaint.TopLeft.X := 40;
PaintStruct.rcPaint.TopLeft.Y := 40;
PaintStruct.rcPaint.BottomRight.X := 250;
PaintStruct.rcPaint.BottomRight.Y := 80;
PaintStruct.fErase := true;

DC := BeginPaint(hwnd, PaintStruct);
SetBkMode(DC, TRANSPARENT);
SetTextColor(DC, RGB(255, 0, 0));
SelectObject(DC, Font);
CreateSolidBrush(DC);
DrawText(DC, PChar(Text), Length(Text), Rect, DT_LEFT);
EndPaint(hwnd, PaintStruct);


DVM   (2010-08-20 12:48:00) [10]


> Dmitriy   (20.08.10 12:43) [2]

Приведи сюда весь обработчик WM_PAINT


Dmitriy   (2010-08-20 12:43:00) [11]


> Все в твоих силах, в обработчике WM_PAINT все отрисуешь
> как хочешь.

Может быть, но пока не получается :(


> DC ты где берешь? И как?


DC := BeginPaint(hwnd, PaintStruct);


DVM   (2010-08-20 12:10:00) [12]


> Задался вопросом разместить на форме Label средствами WinAPI

В WinAPI нет Label. Чтобы сделать где либо надпись на окне, ее там надо нарисовать в обработчике WM_PAINT.


> Мне нужно, чтобу можно было задать цвет, фон, прозрачность,
>  и была возможность перерисовки.

Все в твоих силах, в обработчике WM_PAINT все отрисуешь как хочешь.


> Перерисовка получается только без использования прозрачности,
>  т.е. SetBkMode(DC, TRANSPARENT);

DC ты где берешь? И как?


Наверх

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