Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Bitmap в Edit

15K
24 мая 2007 года
Vert
37 / / 18.01.2007
Сделал, что Bitmap отображается в Edit'e (через TСontrolCanvas), но проблема вот в чём, когда создаётся форма, поля пустые, то бишь картинок в полях нет, но после банального помещения курсора в поле картинка появляется и начинает работать так как задумано...
думаю, что это решается через WinAPI, ибо другого варианта не вижу...
делаю через WM_SETFOCUS, но ничего не происходит...
Код:
procedure TForm1.FormPaint;
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 первый день, то бишь чайник, подскажите, кто чего знает, думает?
303
25 мая 2007 года
makbeth
1.0K / / 25.11.2004
Для начала, я бы всетаки посоветовал почитать про оконные сообщения Windows, как они устроены и работают.
Тот код, который ты привел, работать в любом случае не будет, поскольку, во-первых, переменная TheMessage, фактически, содержит мусор из стека и твое условие сравнения не сработает никогда. Во вторых, прорисовку картинки необходимо реализовать не в обработчике OnChange edit'а, а в совсем другом месте. Обычно такие вещи реализуют подменой оконной процедуры контрола, либо наследованием (созданием нового компонента) от TEdit И переопределением метода Paint.
Если не секрет, зачем понадобилось такое извращение? :)
15K
25 мая 2007 года
Vert
37 / / 18.01.2007
Цитата:
Для начала, я бы всетаки посоветовал почитать про оконные сообщения Windows, как они устроены и работают.


читал - каша в голове :(

Цитата:
переменная TheMessage, фактически, содержит мусор из стека


почему мусор из стека? if TheMessage = WM_SETFOCUS then было взято из рабочего примера, но, правда, при работе с кареткой... в данном случае оно не подходит? тогда что использовать, для определения когда нужное окно активное? или не приниципиально, чтобы оно было активным, а просто работать с ним через handle?

15K
25 мая 2007 года
Vert
37 / / 18.01.2007
Цитата:
Обычно такие вещи реализуют подменой оконной процедуры контрола


вроде так сделал, но всё равно не работает...

Код:
function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter; ParamW : WParameter;
            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;
268
25 мая 2007 года
Михаил
587 / / 25.06.2005
Цитата: Vert
вроде так сделал, но всё равно не работает...
Код:
function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter; ParamW : WParameter;
            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. Первое вызывается, когда контрол получает фокус, а второе в обратном случае

4.6K
27 мая 2007 года
Tokolist
268 / / 22.03.2007
2 Vert
Я думаю стоит посмотреть http://sources.codenet.ru/download/1340/pbtnedit.html (да я не скромный :))
Если останутся вопросы - задавай.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог