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

Вниз

перерисовка надписи   Найти похожие ветки 

 
Dmitriy   (2010-08-20 10:15) [0]

Здравствуйте!
Задался вопросом разместить на форме 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 12:10) [1]


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

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


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

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


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

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


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


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

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


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


DC := BeginPaint(hwnd, PaintStruct);


 
DVM ©   (2010-08-20 12:48) [3]


> Dmitriy   (20.08.10 12:43) [2]

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


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

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 13:35) [5]


> 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;

убери


 
DVM ©   (2010-08-20 13:37) [6]


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

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


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

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


 
DVM ©   (2010-08-20 14:39) [8]


....

   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 раз при старте программы.


 
DVM ©   (2010-08-20 14:41) [9]

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


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

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


 
DVM ©   (2010-08-20 16:26) [11]

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

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 надписи, одна поверх другой.


 
DVM ©   (2010-08-20 16:28) [12]


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

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



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

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

Наверх





Память: 0.47 MB
Время: 0.002 c
11-1265470866
Lirrk
2010-02-06 18:41
2017.03.26
Проблема со шрифтами


2-1437985170
Gray-Gray
2015-07-27 11:19
2017.03.26
Ошибки проекта Delphi XE8, creatin VCL Forms Application


15-1458782603
Kilkennycat
2016-03-24 04:23
2017.03.26
Защита прав потребителя


15-1459185260
d2pak
2016-03-28 20:14
2017.03.26
Организация буфера видео потока


4-1282048057
mc.fly
2010-08-17 16:27
2017.03.26
Как создать буффер-изображение в памяти? Без VCL.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский