Конференция "KOL" » WM_THEMECHANGED
 
  • Jon © (08.10.07 22:43) [0]
    When a combobox (not simple or read-only) recieves a WM_THEMECHANGED message, all its text becomes selected. If there are many comboboxes on the form, they all are selected which looks messy. Is this a bug?
  • Vladimir Kladov © (09.10.07 16:16) [1]
    1st: with visual_xp_styles? (if Yes, this seems is answer to MTsvDN)
    2nd: what is in VCL (if 1st <> true)?
  • Jon (09.10.07 16:59) [2]
    (1) Same result with and without GRAPHCTL_XPSTYLES defined.

    From kol.pas:

    {$IFDEF GRAPHCTL_XPSTYLES}
    {$I visual_xp_styles.inc}
    {$ENDIF}



    (2) In VCL text remains unselected at theme changed.

    I tested by starting and stopping themes service from command line whie application active.
  • Jon © (13.10.07 02:46) [3]
    For a temporary fix, I use in Form.OnMessage handler:


    function FormMessage(Dummy: Pointer; var Msg: tagMSG; var Rslt: Integer): Boolean;
    var
     Counter: Integer
    begin
     Result := False;
     case Msg.message of
       WM_THEMECHANGED:
       begin
         for Counter := 0 to Form.ChildCount -1 do
           if Form.Children[Counter].SubClassName = 'obj_COMBOBOX' then
           begin
             Form.Children[Counter].SelStart := 0;
             Form.Children[Counter].SelLength := 0;
           end;
       end;
     end;
    end;



    But I believe that there must be a more elegant solution.
  • Vladimir Kladov © (13.10.07 07:20) [4]
    There is another bad thingn with changing theme, but I don't know yet how to fix it: transparency disappears for GRush controls. But I do not think that this is a big problem at all: the MS Inernet Explorer has even more troubles with changng theme. Thing holes of 1 or 2 pixels are appearing sometimes between its panels, buttons are away from toolbars, etc. and only restart of Windows fixes the problem.
  • homm © (13.10.07 08:48) [5]
    Во первых, Владимир, прошу прощения, я Ваше письмо видел, но забыл про него.

    2007 Борланд Студия нагло вылетает с формулировкой Out of memory при смене темы :)

    По моим тестам WM_THEMECHANGED посылает только когда меняется XP Theme. Мне это не подходит. Есть ли сообщение, которое шлется при изминении обычной темы???
  • homm © (13.10.07 09:10) [6]
    Понял, WM_THEMECHANGED шлется по всем окнам в случае смены темы XP, в случае смены обычной темы, шлется только окнам первого уровня.

    Я вот теперь припоминаю, когда разрабатывал граши, просил у Вас, Владимир, какой-то способ доставить это сообщение от формы до родителей, Вы отказали.

    А вообще, майкросовт, хитрые. Когда им что-то нужно, делают все через жопу, отправляют сообщения всем окнам, а когда им не дужно, то только избранным, типо не наше дело, разбирайтесь сами с этим сообщением.
  • Vladimir Kladov © (13.10.07 14:02) [7]
    Да каких-то поблем нет, прицепляется к Appletу еще один динамический обработчик, и дальще лучше уже не рассылкой сообщений, а либо рекурсивным спуском либо, еще лучше, держать список всех контролов, ждущих этого сообщения, и вызывать свой метод.

    Что, кроме тем ХР, есть ещё обычные темы. А они нужны, разве WM_DESKTOPCHANGED или как оно там, не достаточно.
  • Jon © (14.10.07 21:58) [8]
    This is a better solution for comboboxes:

     ComboBox.OnMessage := TOnMessage(MakeMethod(nil,@ComboMessage));



    ...

    function ComboMessage(Dummy: Pointer; var Msg: tagMSG; var Rslt: Integer): Boolean;
    begin
     Result := False;
     case Msg.message of
       WM_THEMECHANGED:
         PostMessage(Msg.hwnd,CB_SETEDITSEL,0,MakeLParam(Word(-1),Word(-1)));
     end;
    end;

Есть новые Нет новых   [134431   +10][b:0][p:0.001]