Bitmap в Edit
думаю, что это решается через WinAPI, ибо другого варианта не вижу...
делаю через WM_SETFOCUS, но ничего не происходит...
var TheMessage : WParameter;
begin
if TheMessage = WM_SETFOCUS then
begin
WindowHandle := FindWindow ('TForm1', 'Form1');
If WindowHandle <> 0 then
begin
Edit1Change(Edit1);
Edit1Change(Edit2);
Edit1Change(Edit3);
end;
end;
end;
FormPaint, тк оно при создании формы обрабатывается последним. Через FormCreate тоже пробовал - не помогает.
Edit1Change - процедура, в которой рисуется битмап в едит'е
я в WinAPI первый день, то бишь чайник, подскажите, кто чего знает, думает?
Тот код, который ты привел, работать в любом случае не будет, поскольку, во-первых, переменная TheMessage, фактически, содержит мусор из стека и твое условие сравнения не сработает никогда. Во вторых, прорисовку картинки необходимо реализовать не в обработчике OnChange edit'а, а в совсем другом месте. Обычно такие вещи реализуют подменой оконной процедуры контрола, либо наследованием (созданием нового компонента) от TEdit И переопределением метода Paint.
Если не секрет, зачем понадобилось такое извращение? :)
читал - каша в голове :(
почему мусор из стека? if TheMessage = WM_SETFOCUS then было взято из рабочего примера, но, правда, при работе с кареткой... в данном случае оно не подходит? тогда что использовать, для определения когда нужное окно активное? или не приниципиально, чтобы оно было активным, а просто работать с ним через handle?
вроде так сделал, но всё равно не работает...
ParamL : LParameter) : LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
var
cc: TControlCanvas;
b: TBitmap;
begin
NewWindowProc := CallWindowProc(Form1.OldEditsWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
if TheMessage = WM_SETFOCUS then
begin
cc:=TControlCanvas.Create;
cc.Control:= Form1.Edit1;
b:=TBitmap.Create;
b.LoadFromFile('C:\b.bmp');
cc.Draw(100,3,b);
Form1.Edit1.Show;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
cc: TControlCanvas;
b: TBitmap;
begin
cc:=TControlCanvas.Create;
cc.Control:=Form1.Edit1;
b:=TBitmap.Create;
b.LoadFromFile('C:\b.bmp');
cc.Draw(100,1,b);
OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC,
LongInt(@NewWindowProc)));
end;
ParamL : LParameter) : LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
var
cc: TControlCanvas;
b: TBitmap;
begin
NewWindowProc := CallWindowProc(Form1.OldEditsWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
if TheMessage = WM_SETFOCUS then
begin
cc:=TControlCanvas.Create;
cc.Control:= Form1.Edit1;
b:=TBitmap.Create;
b.LoadFromFile('C:\b.bmp');
cc.Draw(100,3,b);
Form1.Edit1.Show;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
cc: TControlCanvas;
b: TBitmap;
begin
cc:=TControlCanvas.Create;
cc.Control:=Form1.Edit1;
b:=TBitmap.Create;
b.LoadFromFile('C:\b.bmp');
cc.Draw(100,1,b);
OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC,
LongInt(@NewWindowProc)));
end;
зачем же так сложно? :) ведь не зря же создавалась VCL, она вас избавит от переопределения оконных процедур. Почти все события имею свои методы диспетчеризации, их и нужно переопределять. А переопределять оконную процедуру - только в крайних случаях. TWinControl.DoEnter TWinControl.DoExit. Первое вызывается, когда контрол получает фокус, а второе в обратном случае
Я думаю стоит посмотреть http://sources.codenet.ru/download/1340/pbtnedit.html (да я не скромный :))
Если останутся вопросы - задавай.