-
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?
-
1st: with visual_xp_styles? (if Yes, this seems is answer to MTsvDN) 2nd: what is in VCL (if 1st <> true)?
-
(1) Same result with and without GRAPHCTL_XPSTYLES defined. From kol.pas:
(2) In VCL text remains unselected at theme changed. I tested by starting and stopping themes service from command line whie application active.
-
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.
-
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.
-
Во первых, Владимир, прошу прощения, я Ваше письмо видел, но забыл про него.
2007 Борланд Студия нагло вылетает с формулировкой Out of memory при смене темы :)
По моим тестам WM_THEMECHANGED посылает только когда меняется XP Theme. Мне это не подходит. Есть ли сообщение, которое шлется при изминении обычной темы???
-
Понял, WM_THEMECHANGED шлется по всем окнам в случае смены темы XP, в случае смены обычной темы, шлется только окнам первого уровня.
Я вот теперь припоминаю, когда разрабатывал граши, просил у Вас, Владимир, какой-то способ доставить это сообщение от формы до родителей, Вы отказали.
А вообще, майкросовт, хитрые. Когда им что-то нужно, делают все через жопу, отправляют сообщения всем окнам, а когда им не дужно, то только избранным, типо не наше дело, разбирайтесь сами с этим сообщением.
-
Да каких-то поблем нет, прицепляется к Appletу еще один динамический обработчик, и дальще лучше уже не рассылкой сообщений, а либо рекурсивным спуском либо, еще лучше, держать список всех контролов, ждущих этого сообщения, и вызывать свой метод.
Что, кроме тем ХР, есть ещё обычные темы. А они нужны, разве WM_DESKTOPCHANGED или как оно там, не достаточно.
-
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;
|