Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Несколько вопросов про ListBox   Найти похожие ветки 

 
Boris Mouradov   (2004-01-22 15:37) [0]

Привет!

Не могу совладать с TKOLListBox (v1.89), помогите, пожалуйста.

1) Как узнать, над какой строкой сейчас мышиный курсор? LVItemAtPos не работает. Аналогично, как узнать прямоугольник для отрисовки той или иной строки?

2) Как узнать какая по номеру строка сейчас изображена первой?

3) Как узнать/задать высоту строки, если указано OwnerDrawFixed?

4) Задал OwnerDrawFixed, описал OnDrawItem. Всё рисуется, но появляется такой момент:
У меня всего 10 строк. Влезает на экране 9 с половиной. Видно всё нормально. Но когда я прокручиваю на одну вниз, я вижу нижние 9 (как и должно быть), и должен ещё увидеть ниже пустую половинку, как бы 11-й элемент. Вместо этого там ещё остался нарисован 10-й. (теперь 10-й виден дважды). Подскажите, как с этим бороться.

Спасибо,

 Борис


 
Vladimir Kladov   (2004-01-22 17:42) [1]

1) не надо путать. LVxxxx методы - для ListView, а не для ListBox


 
Boris Mouradov   (2004-01-30 03:47) [2]

Разобрался с 1-3. Может, кому пригодится:

1)
 function ItemAtPos(lb: PControl; Pos: TPoint; Existing: Boolean): Integer;
 var
   Count: Integer;
   ItemRect: TRect;
 begin
   if PointInRect(Pos, lb.ClientRect) then begin
     Result := SendMessage(lb.Handle, LB_GETTOPINDEX, 0, 0);
     Count := lb.Count;
     while Result < Count do begin
       WndFunc(lb.Handle, LB_GETITEMRECT, Result, Longint(@ItemRect));
       if PointInRect(Pos, ItemRect) then
         Exit;
       Inc(Result);
     end;
     if not Existing then
       Exit;
   end;
   Result := -1;
 end;

2) Result := SendMessage(lb.Handle, LB_GETTOPINDEX, 0, 0);

3)
WndFunc(lb.Handle, LB_SETITEMHEIGHT, 0, 15);
WndFunc(lb.Handle, LB_GETITEMHEIGHT, 0, 0);


 
SPeller ©   (2004-01-30 06:16) [3]

4) - нужно очищать фон. Обрабатывай OnEraseBkgnd.


 
Ajax ©   (2004-01-31 08:00) [4]

>Boris Mouradov
Приведи пожалуйста код, которым рисуешь.


 
bMouradov   (2004-02-01 02:11) [5]

Если все упростить, то вот так:

function TMainForm.lbItemsDrawItem(Sender: PObj; DC: HDC;
 const Rect: TRect; ItemIdx: Integer; DrawAction: TDrawAction;
 ItemState: TDrawState): Boolean;
var R: TRect;
begin
 Result := True;

 lbItems.Canvas.FillRect(Rect);

 R := Rect;
 R.Left := 10;
 lbItems.Canvas.TextOut(R.Left, R.Top, Strs[ItemIdx]);
end;

Кстати, EraseBkgnd не помогло. Точнее, пустое пространство она отрисовывает, но вот когда я нажимаю на скроллбаре стрелочку вниз, - не желает. В результате (пока) обхожусь вот так:

//OnMessage
function TMainForm.lbItemsMessage(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
 Result := False;
 if Msg.message = WM_VSCROLL then
   lbItems.Invalidate;
end;

Но это же не совсем правильно.

Борис


 
bMouradov   (2004-02-01 10:17) [6]

Только что обнаружил тот же эффект при прокручивании колесиком мыши - EraseBkgnd в этом случае тоже не вызывается.


 
Ajax ©   (2004-02-02 07:50) [7]

Попробуй рисовать без использования lbItems.Canvas. У меня для ComboBox нормально работает.

var Brush:HBrush;
   Pen:HPen;
   Font:HFont;
begin
if (odsSelected in ItemState) then
 begin
   brush:=CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
   SetBkColor(dc,GetSysColor(COLOR_HIGHLIGHT));
   SetTextColor(dc,GetSysColor(COLOR_HIGHLIGHTTEXT));
 end
   else
 begin
   brush:=CreateSolidBrush(GetSysColor(COLOR_WINDOW));
   SetBkColor(dc,GetSysColor(COLOR_WINDOW));
   SetTextColor(dc,combComand.Font.Color);
 end;

SelectObject(dc, Brush);

pen:=CreatePen(PS_NULL,0,0);
SelectObject(dc, pen);

Font:=CreateFont(combcomand.font.FontHeight,0,0,0,FW_NORMAL,cardinal(false),cardinal(false),cardinal(false),
                DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
                DEFAULT_QUALITY,DEFAULT_PITCH,"MS Sans Serif");
SelectObject(dc,font);

Rectangle(dc,Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);

TextOut(dc,Rect.Left+3,Rect.Top,pchar(combComand.Items[ItemIdx]),length(combComand.Items[ItemIdx]));
DeleteObject(brush);
DeleteObject(pen);
DeleteObject(font);
Result:=true;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.034 c
3-1085720574
Salik
2004-05-28 09:02
2004.06.20
Поле типа счетчик


3-1085658748
LUK
2004-05-27 15:52
2004.06.20
Запрос из двух БД


3-1085646446
AlexXn
2004-05-27 12:27
2004.06.20
BDE


1-1086675034
Yurec66
2004-06-08 10:10
2004.06.20
Затирание экрана движущимся объектом


14-1086074727
AlexeyITN
2004-06-01 11:25
2004.06.20
Сколько стоит лицензированный Delphi 4-5 ?