Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 731

/ вопрос решён /

Здравствуйте, уважаемые эксперты!

Делаю компонент, наследник от TCustomControl, ведущий себя как PopupMenu, но с вертикальным скроллбаром, если элементов больше чем определенное число. В семерке всё нормально отображается, а в XP почему-то не прорисовываются у скроллбара стрелки вверх-вниз. Если по ним кликнуть мышкой, то они отрисовываются, но при следующем показе меню опять пропадают.

В приложении весь код, который относится к скроллбару и обработке прокрутки. В чем может быть дело, может кто-нить уже сталкивался с таким поведением? В аттаче лежит небольшой пример, на котором этот глюк проявляется. Если надо - могу скрины привести, как выглядит на XP.

Спасибо.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. <code>
  2. procedure TScrollPopupMenu.ShowScroll(Value: Boolean);
  3. begin
  4. if Value <> FScrollVisible then
  5. begin
  6. FScrollVisible := Value;
  7. FScrollOffset := 0;
  8. if not FLockRecreateWnd then
  9. begin
  10. RecreateWnd;
  11. FLockRecreateWnd := True;
  12. end;
  13. end;
  14. if Value then
  15. begin
  16. SetWindowLong(Handle, GWL_STYLE,
  17. GetWindowLong(Handle, GWL_STYLE) or WS_VSCROLL);
  18. UpdateScrollPos;
  19. end
  20. else
  21. SetWindowLong(Handle, GWL_STYLE,
  22. GetWindowLong(Handle, GWL_STYLE) and not WS_VSCROLL);
  23. end;
  24. procedure TScrollPopupMenu.UpdateScrollPos;
  25. var
  26. ScrollInfo : TScrollInfo;
  27. MaxOffset: Integer;
  28. begin
  29. MaxOffset := -1 * (FTotalHeight - ClientHeight);
  30. if FScrollOffset < MaxOffset then
  31. FScrollOffset := MaxOffset;
  32. if FScrollOffset > 0 then
  33. FScrollOffset := 0;
  34. ScrollInfo.cbSize := SizeOf(TScrollInfo);
  35. ScrollInfo.fMask := SIF_ALL or SIF_DISABLENOSCROLL or SIF_POS;
  36. ScrollInfo.nMin := 0;
  37. ScrollInfo.nPos := -FScrollOffset;
  38. ScrollInfo.nPage := ClientHeight;
  39. ScrollInfo.nMax := FTotalHeight;
  40. SetScrollInfo(Handle, SB_VERT, ScrollInfo, True);
  41. end;
  42. procedure TScrollPopupMenu.WMVScroll(var Msg: TWMVScroll);
  43. begin
  44. case Msg.ScrollCode of
  45. SB_LINEUP: Inc(FScrollOffset, FMenuItemHeight);
  46. SB_LINEDOWN: Dec(FScrollOffset, FMenuItemHeight);
  47. SB_PAGEUP: Inc(FScrollOffset, ClientWidth);
  48. SB_PAGEDOWN: Dec(FScrollOffset, ClientWidth);
  49. SB_THUMBPOSITION, SB_THUMBTRACK: FScrollOffset := Msg.Pos * -1;
  50. end;
  51. UpdateScrollPos;
  52. Repaint;
  53. end;
  54. </code>


Lumen Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Lumen (статус: Посетитель)
Вопрос отправлен: 10 ноября 2011, 23:27
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 13 ноября 2011, 02:30; участников в обсуждении: 1.
Lumen

Lumen (статус: Посетитель), 12 ноября 2011, 10:19 [#1]:

Выглядит это как-то так:
Такое ощущение, будто сообщение отрисовки не приходит вовремя, может можно как-то самому перерисовать их?
http://dl.dropbox.com/u/31216763/Scroll.PNG
ЗЫ: а картинку можно как-нить к сообщению прикрепить?
Lumen

Lumen (статус: Посетитель), 13 ноября 2011, 02:30 [#2]:

Решено.
Косяк был в обработчике WM_NCPAINT меню. Исправил следующим образом:
procedure TSubPopupMenu.WMNCPaint(var Message: TMessage);
var
  ADrawRect: TRect;
  DC: HDC;
  Details: TThemedElementDetails;
begin
  inherited;
  if not ThemeServices.ThemesEnabled then Exit;
  with Self do
  begin
    GetWindowRect(Handle, ADrawRect);
    OffsetRect(ADrawRect, -ADrawRect.Left, -ADrawRect.Top);
    DC := GetWindowDC(Handle);
    try
      with ADrawRect do
        ExcludeClipRect(DC, Left + 1, Top + 1, Right - 1, Bottom - 1);
      Details := ThemeServices.GetElementDetails(teEditTextNormal);
      ThemeServices.DrawElement(DC, Details, ADrawRect);
    finally
      ReleaseDC(Handle, DC);
    end;
  end;
end;

13 ноября 2011, 02:32: Статус вопроса изменён на решённый (изменил автор вопроса — Lumen)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.03 сек.