Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.019 c
14-1086092997
Vit@ly
2004-06-01 16:29
2004.06.20
Задака - подкинул на mcsa в курилку, до сих пор решают


6-1083301516
SDF
2004-04-30 09:05
2004.06.20
Подавление сообщений


1-1086697377
Neo09
2004-06-08 16:22
2004.06.20
Как узнать на сколько процентов скопирован файл?


14-1086099699
YurikGL
2004-06-01 18:21
2004.06.20
Где бы про делфи почитать


4-1081149920
API User
2004-04-05 11:25
2004.06.20
Манифест в Windows XP




   Наверх