-
Здравствуйте! Задался вопросом разместить на форме Label средствами WinAPI. Но в WinAPI я еще новичек и поэтому прошу у вас совета. Как лучше поступить, какими методами воспользоваться? Мне нужно, чтобу можно было задать цвет, фон, прозрачность, и была возможность перерисовки. После поисков в сети наше в принципе то,что мне нужно - функции задания цвета текста, прозрачности фона, шрифта:
SetBkMode(DC, TRANSPARENT);
SetTextColor(DC, RGB(255, 0, 0));
CreateSolidBrush(DC);
SelectObject(DC, Font);
Но вот проблема с перерисовкой не могу понять как перерисовать, чтобы надпись не наслаивалась на предыдущую. Нашел, что можно использовать BeginPaint. Перерисовка получается только без использования прозрачности, т.е. SetBkMode(DC, TRANSPARENT); Как применить прозрачность при перерисовке?
-
> Задался вопросом разместить на форме Label средствами WinAPI
В WinAPI нет Label. Чтобы сделать где либо надпись на окне, ее там надо нарисовать в обработчике WM_PAINT.
> Мне нужно, чтобу можно было задать цвет, фон, прозрачность, > и была возможность перерисовки.
Все в твоих силах, в обработчике WM_PAINT все отрисуешь как хочешь.
> Перерисовка получается только без использования прозрачности, > т.е. SetBkMode(DC, TRANSPARENT);
DC ты где берешь? И как?
-
> Все в твоих силах, в обработчике WM_PAINT все отрисуешь > как хочешь.
Может быть, но пока не получается :(
> DC ты где берешь? И как?
DC := BeginPaint(hwnd, PaintStruct);
-
> Dmitriy (20.08.10 12:43) [2]
Приведи сюда весь обработчик WM_PAINT
-
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);
-
> 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;
убери
-
> SelectObject(DC, Font); > CreateSolidBrush(DC);
убери, тут все равно утечка ресурсов GDI
-
Убрать? А как тогда сделать, чтобы был нужный шрифт?
-
....
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 раз при старте программы.
-
Главное подчищай за собой ресурсы, иначе выделение и не освобождение ресурса в WM_PAINT очень быстро приведет к их исчерпанию.
-
Не получается :( Если фон прозрачный, то надписи накладываются друг на друга, а если если убрать SetBkMode(DC, TRANSPARENT), то все нормально перерисовывается, но с серым фоном...
-
у меня ничего не накладывается, серых прямоугольников (я правильно понял, они тебя смущают) у меня нет.
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 надписи, одна поверх другой.
-
> то надписи накладываются друг на друга
покажи скриншот, мне непонятно, что у тебя не так.
|