| 
| 
 | Вопрос # 5 731/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!
 Делаю компонент, наследник от TCustomControl, ведущий себя как PopupMenu, но с вертикальным скроллбаром, если элементов больше чем определенное число. В семерке всё нормально отображается, а в XP почему-то не прорисовываются у скроллбара стрелки вверх-вниз. Если по ним кликнуть мышкой, то они отрисовываются, но при следующем показе меню опять пропадают.
 
 В приложении весь код, который относится к скроллбару и обработке прокрутки. В чем может быть дело, может кто-нить уже сталкивался с таким поведением? В аттаче лежит небольшой пример, на котором этот глюк проявляется. Если надо - могу скрины привести, как выглядит на XP.
 
 Спасибо.
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) Приложение:Переключить в обычный режим <code>procedure TScrollPopupMenu.ShowScroll(Value: Boolean);begin  if Value <> FScrollVisible then  begin    FScrollVisible := Value;    FScrollOffset := 0;    if not FLockRecreateWnd then    begin      RecreateWnd;      FLockRecreateWnd := True;    end;  end;  if Value then  begin    SetWindowLong(Handle, GWL_STYLE,      GetWindowLong(Handle, GWL_STYLE) or WS_VSCROLL);    UpdateScrollPos;  end  else    SetWindowLong(Handle, GWL_STYLE,      GetWindowLong(Handle, GWL_STYLE) and not WS_VSCROLL);end;procedure TScrollPopupMenu.UpdateScrollPos;var  ScrollInfo : TScrollInfo;  MaxOffset: Integer;begin  MaxOffset := -1 * (FTotalHeight - ClientHeight);  if FScrollOffset < MaxOffset then    FScrollOffset := MaxOffset;  if FScrollOffset > 0 then    FScrollOffset := 0;  ScrollInfo.cbSize := SizeOf(TScrollInfo);  ScrollInfo.fMask := SIF_ALL or SIF_DISABLENOSCROLL or SIF_POS;  ScrollInfo.nMin := 0;  ScrollInfo.nPos := -FScrollOffset;  ScrollInfo.nPage := ClientHeight;  ScrollInfo.nMax := FTotalHeight;  SetScrollInfo(Handle, SB_VERT, ScrollInfo, True);end;procedure TScrollPopupMenu.WMVScroll(var Msg: TWMVScroll);begin  case Msg.ScrollCode of    SB_LINEUP: Inc(FScrollOffset, FMenuItemHeight);    SB_LINEDOWN: Dec(FScrollOffset, FMenuItemHeight);    SB_PAGEUP: Inc(FScrollOffset, ClientWidth);    SB_PAGEDOWN: Dec(FScrollOffset, ClientWidth);    SB_THUMBPOSITION, SB_THUMBTRACK: FScrollOffset := Msg.Pos * -1;  end;  UpdateScrollPos;  Repaint;end;</code>
|  |   Вопрос задал: Lumen (статус: Посетитель)Вопрос отправлен: 10 ноября 2011, 23:27
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 13 ноября 2011, 02:30; участников в обсуждении: 1. 
|   | Lumen (статус: Посетитель), 12 ноября 2011, 10:19 [#1]:Выглядит это как-то так: Такое ощущение, будто сообщение отрисовки не приходит вовремя, может можно как-то самому перерисовать их?
 http://dl.dropbox.com/u/31216763/Scroll.PNG
 ЗЫ: а картинку можно как-нить к сообщению прикрепить?
 |  
|   | 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |