Конференция "KOL" » WM_ERASEBKGND и WM_CTLCOLORSTATIC [Delphi, Windows]
 
  • awkward (23.11.10 15:03) [0]
    Помогите, плиз! Я не спец в "рисованиях" вообще, но пока приходится извращаться... Мне нужен трекбар с фоновым цветом, как у панели-владельца.
    Через AttachProc я прицепляю к панели процедуру, где, по примеру WinAPIшных программ пишу:

    function RadioFrameProc( Sender: PControl; var Msg: TMsg; var Rslt:Integer ): boolean;
    var
     rc:TRECT;
    begin
     result:=false;
     rslt:=0;

     case Msg.message of

       WM_ERASEBKGND: begin
         GetClientRect(msg.hwnd,rc);
         FillRect(msg.wParam,rc,hbr);
         result:=true;
         Rslt:=1;
       end;

       WM_CTLCOLORSTATIC: begin
         SetBkColor(msg.wParam, frm_bkg);
         Rslt:=hbr;
       end;
     end;
    end;


    Обработчик WM_ERASEBKGND персонально для трекбара реализован аналогично.
    Допускаю, что я не прав.
    Но устанавливая result в true, я получаю полностью закрашенный фон безо всяких следов трекбара или иконки на нем. Устанавливая в false - получаю стандартные цвета.
    Подскажите, КАК ПРАВИЛЬНО мне сделать обработчик, чтоб и фон панели был закрашен моим цветом, и полоска трекбара была на фоне того же цвета (вообще - прозрачном, получается). Использовать переопределения объекта, чтоб прицеплять к нему OnEraseBkgnd не хотелось бы.... да и не факт, что поможет.
  • thaddy © (23.11.10 15:22) [1]
    Maybe this will help. It is old but it still works under all delphi versions:
    http://www.thaddy.co.uk/democtrl.zip

    email me if you have questions. (Russian language is accepted, but answer in English)
  • awkward (23.11.10 15:28) [2]
    Sorry, thaddy, but i want to use native windows trackbar. Will experiment more....
  • Thaddy © (23.11.10 15:31) [3]
    That will be very difficult (like with normal Tbutton = NO color options) because Windows doesn't support it directly!! Unless you use OwnerDraw, in which case you can use my code as example, or similar.
  • awkward (23.11.10 15:39) [4]
    it possible to do on pure windows API, so - i will experiment later. main problem - if i use WM_ERASEBKGND in program (on KOL objects) - they don't paints after it.
    this code works nice (WinAPI, no KOL objects)

    function SliderWndProc(Dialog:HWnd; hMessage,wParam,lParam:DWord):integer; stdcall;
    begin
     if hMessage=WM_ERASEBKGND then
       result:=1
     else
       result:=CallWindowProc(OldSliderWndProc, Dialog, hMessage, wParam, lParam);
    end;

    function RadioFrameProc(Dialog:HWnd; hMessage,wParam,lParam:DWord):integer; stdcall;
    begin
     result:=0;
     case hMessage of
       WM_ERASEBKGND: begin
         GetClientRect(Dialog,rc);
         FillRect(wParam,rc,hbr);
         result:=1;
       end;

       WM_CTLCOLORSTATIC: begin
         if lParam=hVolFrmCtrl then
         begin
           SetBkColor(wParam, frm_bkg);
           result:=hbr;
         end;
       end;
     end;
    end;


    and i can't understand, how to adopt it to my KOL objects.
  • thaddy © (23.11.10 15:47) [5]
    Can you send me the full project by email? I will have a look. (Doing nothing until January 2 2011)
  • awkward (23.11.10 15:49) [6]
    this project - plugin for Miranda IM. if you don't use it - not sure what you can check it fast ^_^. i didn't changed that project to separate program. but i can send sources
  • awkward © (30.11.10 11:30) [7]
    Народ, я серьезно...
    Пожалуйста, дайте мне образец реально работающего кода, где обрабатывается WM_ERASEBKGND  в  прицепленном обработчике либо через OnEraseBkGnd и при этом остается рабочей стандартная прорисовка контрола и его дочерних элементов (т.е. без собственного обработчика OnPaint или WM_PAINT)
 
Конференция "KOL" » WM_ERASEBKGND и WM_CTLCOLORSTATIC [Delphi, Windows]
Есть новые Нет новых   [120345   +8][b:0][p:0.001]