Хочу сделать пару editbox`ов, однострочный с градиентом в фоне, (типа как на ag) и многострочный, в фоне которого хочу поместить логотип. Посмотрел в MSDN, вроде owner-drawn edit-ов не бывает. Сабкласс на WM_ERASEBACKGROUND (Хм. Откуда я это взял? ) тоже не работает. Какие могут быть ещё варианты?
Пишу на VC7, под Win32.
Вот такой должен быть edit:
А если попробовать WM_CTLCOLOREDIT/WM_CTLCOLORDLG + возвращать brush, созданную из соотв. битмапа ?.
Простейший пример. Берем битмап , на его основе создаем brush, и отдаем brush edit control'у.
procedure TMainWindow.FormCreate(Sender: TObject);
begin
BaseBitmap := ImgBitmap.Picture.Bitmap.Handle;
BitmapBrush := CreatePatternBrush( BaseBitmap );
OldWndProc := MainWindow.WindowProc;
MainWindow.WindowProc := SubclassProc;
end;
procedure TMainWindow.FormDestroy(Sender: TObject);
begin
MainWindow.WindowProc := OldWndProc;
DeleteObject( BitmapBrush );
end;
procedure TMainWindow.SubclassProc(var Msg: TMessage);
begin
case Msg.Msg of
WM_CTLCOLOREDIT : begin
if (THandle(Msg.lParam) = EdDemo.Handle) then begin
SetBkMode( HDC(Msg.wParam), TRANSPARENT );
Msg.Result := BitmapBrush;
Exit;
end;
end;
end;
OldWndProc( Msg );
end;
На приведенном Вами рисунке нет градиента. Если воспользоваться subclass'ингом и обработкой WM_CTLCOLOREDIT, то можно почти добиться необходимого результата.
Почти, потому что мне не удалось полностью подавить мерцание при скроллинге. Это работает и с многострочным edit'ом, в отличии от варианта, приведенного выше.
Полный список вопросов и ответов можно посмотреть
здесь.