Главная страница
    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.007 c
15-1459320686
DayGaykin
2016-03-30 09:51
2017.03.26
WaitableTimer vs Sleep


2-1437193956
xayam
2015-07-18 07:32
2017.03.26
Delphi XE8 + Android


4-1282284939
Dmitriy
2010-08-20 10:15
2017.03.26
перерисовка надписи


2-1396021466
DQ
2014-03-28 19:44
2017.03.26
Использование типов данных "Перечисление" и "Множество"


4-1282063966
kolj
2010-08-17 20:52
2017.03.26
Как закрить все екземпляры программы на терминальном сервере.





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