Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

Несколько вопросов про 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 вся ветка

Форум: "KOL";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.028 c
9-1077296031
Electon
2004-02-20 19:53
2004.06.20
как грабить DirectX?


1-1086174531
Ш-К
2004-06-02 15:08
2004.06.20
Клонировать форму


1-1086448251
Kostya
2004-06-05 19:10
2004.06.20
Progress Bar


4-1084459297
Игорь Н.
2004-05-13 18:41
2004.06.20
Как вызвать окно внимание (attention)?


1-1086297558
Deep_NEW
2004-06-04 01:19
2004.06.20
Про RichEdit.....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский