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

Вниз

Помогите с ListView!!!!   Найти похожие ветки 

 
Dimaxx ©   (2003-07-26 23:45) [0]

Братцы!!! Поможите хто может! Нужно получить OwnerDraw-файловую панель как в Windows Commander!!! Пробовал с OnLVCustomDraw, но там еще нужно самому отрисовывать заголовок. Потом при отрисовке элементов (если пользователь меняет размер колонки) тект "мажется". Вобщем, ерунда получается. Помогите!!


 
SPeller ©   (2003-07-27 03:25) [1]

Total Commander использует не ListView, а ListBox. Посмотри класс окна этих панелей - TMyListBox. А отрисовать листбокс с колонками - проще простого. Тем более, что заголовки у него тоже самодельные используются. При таком раскладе всё получается просто, я даже сам делал такой же листбокс. :)


 
SPeller ©   (2003-07-27 03:31) [2]

Вот пример:

function TfrmMain.ListBoxMeasureItem(Sender: PObj; Idx: Integer): Integer;
var TCwnd, LBwnd: Cardinal;
begin
{  LBwnd := FindWindowEx( TCWindow, 0, "TMyListBox", nil );
 if LBwnd <> 0 then
   Result := SendMessage( LBwnd, LB_GETITEMHEIGHT, 0, 0 )
 else}
   Result := 16;
   LBItemHeight := Result;
end;


function TfrmMain.ListBoxDrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
 ItemIdx: Integer; DrawAction: TDrawAction; ItemState: TDrawState): Boolean;

var R: TRect;
   TxtColor, BkColor, BorderColor: Cardinal;
   hBr, oldBr, hPen, oldPen, oldBm, tmBmp, tmDC, fnt, oldfnt: Cardinal;
   lf: tagLOGFONT;
   iName, iType, iSize, tm: string;
   i, SelCount: Cardinal;
   hIcon, IconDC, oldIconObj: Cardinal;
   LeftMargin: Integer;
   IID: Byte; i_Type: TItemType;
begin
 Result := True;
 R := Rect;
 tmDC := CreateCompatibleDC( DC );
 tmBmp := CreateCompatibleBitmap( DC, R.Right - R.Left, R.Bottom - R.Top );
 oldBM := SelectObject( tmDC, tmBmp );
 iName := CurList.Items[ ItemIdx ];
 if iName = "" then iName := "(Default)";
 iType := ItemType2String[ CurList.Data[ ItemIdx ] ];
 i_Type := CurList.Data[ ItemIdx ];
 if ( i_Type = itString ) or ( i_Type = itDWord ) or ( i_Type = itBinary ) then begin
   Reg.RootKey := CurList.Root;
   Reg.OpenKey( DelFirstFolder( CurList.Path ), False );
   iSize := Int2Str( Reg.GetDataSize( CurList.Items[ ItemIdx ] ) );
   Reg.CloseKey;
 end;

 BkColor := BackColor;
 BorderColor := BkColor;
 TxtColor := ForeColor;

 if {odsFocused}odsSelected in ItemState then begin
     BorderColor := CursorColor;
     if InverseCursor then begin
         BkColor := CursorColor;
         TxtColor := CursorText;
     end else begin
           BkColor := BackColor;
           txtColor := ForeColor;
     end;
{  end else begin
     if odsSelected in ItemState then
         TxtColor := MarkColor;}
 end;

 FillChar( lf, SizeOf( lf ), 0 );
 lf.lfHeight := FontSize;
 lf.lfWeight := FontWeight;
 lf.lfCharSet := DEFAULT_CHARSET;
 Move( FontName[ 1 ], lf.lfFaceName, Length( FontName ) );
 fnt := CreateFontIndirect( lf );
 oldFnt := SelectObject( tmDC, fnt );

 hBr := CreateSolidBrush( BkColor );
 oldBr := SelectObject( tmDC, hBr );

 hPen := CreatePen( PS_SOLID, 1, BorderColor );
 oldPen := SelectObject( tmDC, hPen );

 SetTextColor( tmDC, TxtColor );
 SetBkColor( tmDC, BkColor );

 Rectangle( tmDC, 0, 0, R.Right - R.Left, R.Bottom - R.Top );
 LeftMargin := 16;
 R.Right := R.Right - R.Left;
 R.Bottom := R.Bottom - R.Top;
 R.Top := 0;
 R.Left := 3 + LeftMargin;
 DrawText( tmDC, PChar( iName ), Length( iName ), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE );
 if ( i_Type = itString ) or ( i_Type = itDWord ) or ( i_Type = itBinary ) then begin
   R.Left := FirstTab;
   DrawText( tmDC, PChar( iType ), Length( iType ), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE );
   R.Right := ThirdTab;
   DrawText( tmDC, PChar( iSize ), Length( iSize ), R, DT_RIGHT or DT_VCENTER or DT_SINGLELINE );
 end else begin
   R.Left := SecondTab;
   DrawText( tmDC, PChar( iType ), Length( iType ), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE );
 end;
 IID := 0;
 case i_Type of
   itFolder, itHKCU, itHKCR, itHKLM, itHKDD, itHKPD, itHKCC, itHKU: IID := I_FOLDER;
   itDWord, itString, itBinary: IID := I_PARAM;
   itBack: IID := I_UP;
 end;
 hIcon := LoadIconFromTC( {ItemIdx + 1}IID );
 if hIcon <> 0 then DrawIconEx( tmDC, 0, 0, hIcon, 16, 16, 0, 0, DI_NORMAL );

 BitBlt( DC, Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, tmDC, 0, 0, SRCCOPY );

 SelectObject( tmDC, oldBm );
 SelectObject( tmDC, oldFnt );
 SelectObject( tmDC, oldPen );
 SelectObject( tmDC, oldBr );
 DeleteDC( tmDC );
{  DeleteDC( IconDC );}
//  DeleteObject( hIcon );
 DeleteObject( tmBmp );
 DeleteObject( fnt );
 DeleteObject( hPen );
 DeleteObject( hBr );

 ListBox.ItemData[ ItemIdx ] := PInteger( @ItemState )^;
end;


Возможно, кривовато, но отрисовывало хорошо.


 
Dimaxx ©   (2003-07-28 01:14) [3]

Огромное спасибо, SPeller! Буду мучить код. Кстати, у версии TotalCommander 5.5 уже класс TMyPanel, а не TMyListBox.


 
SPeller ©   (2003-07-28 12:14) [4]

Это где? Я плагин этот под 5.5 писал! Это надписи разные, или ещё чего-нить там - ради бога, пускай TMyPanel, а вот список файлов - TMyListBox, и таким и останется.


 
Dimaxx ©   (2003-07-28 23:21) [5]

Не, я ничего против не имею, просто он обозвал, наверное, этот класс TMyPanel. ;-)


 
mdw ©   (2003-07-29 11:01) [6]

Короче, там есть и TMyListBox - это список к файлов, это то о чем и речь идет. И есть TMyPanel - их там до фига.


 
Dimaxx ©   (2003-07-30 23:35) [7]

Вроде не тупой, а не понимаю до конца. Прошу разъяснить описания состояний TDrawState. Хотя бы кратко - что для чего возникает.



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

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

Наверх





Память: 0.47 MB
Время: 0.039 c
14-1079149696
LiLa Ananda
2004-03-13 06:48
2004.04.11
Откровенные шуточки о Знаках Зодиака...


3-1079504194
kor@l
2004-03-17 09:16
2004.04.11
DBGridEh


14-1081916514
LaidBack
2004-04-14 08:21
2004.04.11
Помогите опознать исполнителя песни:


14-1079517038
YurikGl
2004-03-17 12:50
2004.04.11
АнтиСпам


3-1081493092
kalishenko
2004-04-09 10:44
2004.04.11
Lookup-поле в DBGridEh





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский