0D0A
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору 0D0A Пофиксил. Проблема появляется только тогда, когда ListView это единственный контрол с TabStop=True на главной форме. Например, если положить на форму кнопку, то рамка фокуса уже не рисуется. Похоже проблема с кривой обработкой WM_CHANGEUISTATE в VCL. Глубоко не копал, помог код в OnCreate формы: SendMessage(WindowHandle, WM_CHANGEUISTATE, MakeLong(UIS_INITIALIZE, UISF_HIDEFOCUS), 0); Помогает до первого нажатия TAB. Edit: действительно, похоже кривизна в VCL, тут: Код: procedure TWinControl.UpdateUIState(CharCode: Word); var Form: TCustomForm; begin Form := GetParentForm(Self); if Assigned(Form) then case CharCode of VK_LEFT..VK_DOWN, VK_TAB: Form.Perform(WM_CHANGEUISTATE, MakeLong(UIS_CLEAR, UISF_HIDEFOCUS), 0); VK_MENU: Form.Perform(WM_CHANGEUISTATE, MakeLong(UIS_CLEAR, UISF_HIDEACCEL), 0); end; end; | Оно при каждом нажатии клавиш перемещения фокуса включает рамку. И как обычно метод не виртуальный. Edit2: решение: Код: procedure TMainForm.FormCreate(Sender: TObject); begin SendMessage(WindowHandle, WM_CHANGEUISTATE, MakeLong(UIS_INITIALIZE, UISF_HIDEFOCUS), 0); end; procedure TMainForm.WMChangeUIState(var message: TMessage); // message WM_CHANGEUISTATE; const ShowFocusRect = UIS_CLEAR or UISF_HIDEFOCUS shl 16; begin if (message.WParam <> ShowFocusRect) then inherited; end; | Препятствует всем поползновениям VCL включить рамку фокуса в стандартных конторолах. | Всего записей: 158 | Зарегистр. 21-09-2009 | Отправлено: 10:29 16-03-2012 | Исправлено: 0D0A, 12:19 16-03-2012 |
|