powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Никто не знает примера как в .Net на чистом API Treeview сделать?
20 сообщений из 20, страница 1 из 1
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277541
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чет не могу в гугле найти ничего потребного.
Treeview то создал, а с TVITEM, TVINSERTSTRUCT, TVM_INSERTITEM пока плаваю,
TVM_INSERTITEM возвращает нуль, ни одного итема пока добавить не сумел.
(на VB6 тоже этого никогда не делал)

Я понимаю что жесть,
но у меня не получается применить TVS_EX_RICHTOOLTIP стиль к .Net-Treeview, а очень хочется .

Код: vbnet
1.
2.
3.
    Dim tExStyle As Integer = SendMessage(TreeView1.Handle, TVM_GETEXTENDEDSTYLE, 0, 0)
    tExStyle = tExStyle Or TVS_EX_RICHTOOLTIP
    Call SendMessage(TreeView1.Handle, TVM_SETEXTENDEDSTYLE, 0, tExStyle)


Смысл этого стиля: тултип содержит картинку итема, при этом четко накладывается на итем (на текст с картинкой).
Можно посмотреть в дереве проводника Windows как это выглядит (на 10-ке, 8-ке, 7-ке), выглядит неплохо.

Я все перепробовал, если делать это в VB6 - получается, если делать это с "чужим" TreeView из .Net -получается.
С .Net treeview -никак.
Коды .Net treeview пытался смотреть, походу там свой сабклассинг, ловится TTN_SHOW и стандартное поведение переопределено.
Даже простые текстовые тултипы не накладываются четко на текст, а смещены чуть влево-вверх налезая на картинку, похоже hard-coded.
И через эту дрянь не перепрыгнуть, т.е. свой класс Inhereted Treeview то создать можно, но либо отменять MyBase.WndProc (тогда ничего не работает), либо не отменять, но он же тогда выкидывает в WndProc Net-Treeview , перескочить через которую нельзя - со всеми вытекающими.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277551
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Забил бы ты уже на win api и смотрел в сторону wpf.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277578
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

не мешайте кактус кушать
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277590
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо давать ответов не по теме вопроса.
Мне нужен пример (в смысле кусок кода который бы работал) создания API-Treeview в .Net
Конкретно интересует добавление итемов (можно без картинок), чтоб работал.
Дальше я разберусь.
По словам pinvoke .Net C# TVITEM TVINSERTSTRUCT TVM_INSERTITEM
я ничего потребного не нашел.
(CreateWindowEx понятно сделал)
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277625
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, Using Tree-View Controls не помогло? Там и примеры на плюсах есть...
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277642
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Не надо давать ответов не по теме вопроса.
Мне нужен пример (в смысле кусок кода который бы работал) создания API-Treeview в .Net
Конкретно интересует добавление итемов (можно без картинок), чтоб работал.
Дальше я разберусь.
По словам pinvoke .Net C# TVITEM TVINSERTSTRUCT TVM_INSERTITEM
я ничего потребного не нашел.
(CreateWindowEx понятно сделал)
Выкладывай код, которым все это пытаешься делать.

<ванга mode on>
скорее всего определения структур не правильные
<ванга mode off>
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277657
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

Да именно по этому учебнику и делал

С вот этим
How to Add Tree-View Items
вконец запутался

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
  Public Const TV_FIRST = &H1100
  Public Const TVM_INSERTITEMW = (TV_FIRST + 50)
  Public Const TVM_INSERTITEM = TVM_INSERTITEMW


  <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
  Public Structure TVITEM
    Dim mask As UInteger
    Dim hItem As IntPtr
    Dim state As UInteger
    Dim stateMask As UInteger
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_PATH)> Dim pszText As String
    Dim cchTextMax As Integer
    Dim iImage As Integer
    Dim iSelectedImage As Integer
    Dim cChildren As Integer
    Dim lParam As IntPtr
  End Structure

  <StructLayout(LayoutKind.Sequential)>
  Public Structure TVINSERTSTRUCT
    Dim hParent As IntPtr
    Dim hInsertAfter As IntPtr
    Dim item As TVITEM
  End Structure

  Public Const TVI_FIRST = &HFFFF0001
  Public Const TVI_ROOT = &HFFFF0000

  ' TVITEM mask flags.
  Public Const TVIF_TEXT = &H1
  Public Const TVIF_IMAGE = &H2
  Public Const TVIF_PARAM = &H4
  Public Const TVIF_STATE = &H8
  Public Const TVIF_SELECTEDIMAGE = &H20
  Public Const TVIF_CHILDREN = &H40

  Public Declare Unicode Function SendMessage_TVINSERTSTRUCT Lib "user32" Alias "SendMessageW" _
   (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As TVINSERTSTRUCT) As IntPtr

  Public Function TreeView_AddItem(ByVal hwndTV As IntPtr, ByVal hParent As IntPtr, ByVal hInsertAfter As IntPtr, _
   ByVal key As String, ByVal text As String, ByVal image As Integer, ByVal selectedImage As Integer) As Integer
    Dim tvi As New TVITEM
    With tvi
      .mask = TVIF_TEXT Or TVIF_IMAGE Or TVIF_SELECTEDIMAGE
      .pszText = text
      .cchTextMax = Strings.Len(text) 'MAX_PATH
      .iImage = image
      .iSelectedImage = selectedImage
    End With
    Dim tvins As New TVINSERTSTRUCT
    With tvins
      .hParent = hParent
      .hInsertAfter = hInsertAfter
      .item = tvi
    End With
    Dim hprev As IntPtr = SendMessage_TVINSERTSTRUCT(hwndTV, TVM_INSERTITEM, 0, tvins)
    MsgBox(hprev.ToString)
    Return hprev
  End Function

    TreeView_AddItem(hwndTV, IntPtr.Zero, IntPtr.Zero, "Test Item", "Test Item", 0, 0)



TVM_INSERTITEM возвращает нуль и ничего не добавляет

Пробовал в hInsertAfter засовывать TVI_FIRST или TVI_ROOT вместо нуля, не помогает.
И вот где я напортачил ХЗ, есть идеи?
Т.е. задача добавить хоть один какой-нибудь итем для начала, пусть без текста, без картинки.
Не добавляется зараза.
Был бы пример, от него бы сплясал как нибудь.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277676
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

привет, выложил только что.

Проблема у меня на самом деле только с категорическим нежеланием .Net контрола принимать на вход TVS_EX_RICHTOOLTIP который мне очень хочется, см. первый пост.
Причем категорически не применяется именно к .Net контролу (и лезть в Override WinProc безполезно, потому что у него своя которую не обойти).
Если например применить этот стиль к Treeview из htmlhelp (если помнишь мои картинки), то без проблем.
И в VB6 с его контролом тоже без проблем.

Просто счас сделал высокие Treeview (24px как в Win10) + Or TVS_FULLROWSELECT Or TVS_TRACKSELECT
+SetWindowTheme(TreeView1.Handle, "explorer", vbNullString)
И оно как бы симпатично весьма,
но стандартные тултипы обычной высоты, да еще съехавшие вверх-влево на пару пикселей от ориг. текста (спасибо .нету) смотрятся не ахти.
Забил бы, но ты ж меня знаешь.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277940
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Antonariy,

привет, выложил только что.я имел ввиду тестовый проект. где CreateWindowEx уже работает.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39277949
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в VB6 все получилось.
Даже тупо с pszText As String в TVITEM и без задания cchTextMax.
Итем в стиле 90-х так сказать нарисовался и текст отобразил (как и ожидалось).
Пойду что ли "с маршалами, пэтээрами и юникодами" повоюю.
Давно не разминался наверное.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _
 ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const TV_FIRST = &H1100
Public Const TVM_INSERTITEMA = (TV_FIRST + 0)
Public Const TVM_INSERTITEM = TVM_INSERTITEMA

' TVITEM mask flags.
Public Const TVIF_TEXT = &H1
Public Const TVIF_IMAGE = &H2
Public Const TVIF_STATE = &H8
Public Const TVIF_SELECTEDIMAGE = &H20
Public Const TVIF_CHILDREN = &H40

Public Type TVITEM
  mask As Long
  hItem As Long
  state As Long
  stateMask As Long
  pszText As String 'Long    ' if a string, must be pre-allocated when struct is filled!
  cchTextMax As Long
  iImage As Long
  iSelectedImage As Long
  cChildren As Long
  lParam As Long
End Type

Public Type TVINSERTSTRUCT
    hParent As Long
    hInsertAfter As Long
    Item As TVITEM
End Type

  Public Function TreeView_AddItem(ByVal hwndTV As Long, ByVal hParent As Long, ByVal hInsertAfter As Long, _
   ByVal key As String, ByVal text As String, ByVal image As Long, ByVal selectedImage As Long) As Long
    Dim tvi As TVITEM
    With tvi
      .mask = TVIF_TEXT Or TVIF_IMAGE Or TVIF_SELECTEDIMAGE
'      .pszText = StrPtr(String$(MAX_PATH, 0))
'      Call lstrcpyA(ByVal .pszText, ByVal text)
      .pszText = text
      '.cchTextMax =  ' MAX_PATH
      .iImage = image
      .iSelectedImage = selectedImage
    End With
    Dim tvins As TVINSERTSTRUCT
    With tvins
      .hParent = hParent
      .hInsertAfter = hInsertAfter
      .Item = tvi
    End With
    Dim hprev As Long
    hprev = SendMessage(hwndTV, TVM_INSERTITEM, 0, tvins)
    MsgBox (hprev)
    TreeView_AddItem = hprev
  End Function


Dim hwndTV As Long

Private Sub Form_Load()
    hwndTV = CreateATreeView(Me.Picture1.hwnd)
     TreeView_AddItem hwndTV, 0, 0, "Мой текст As string без юникода", "Мой текст As string без юникода", 0, 0
End Sub
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39278009
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Короче я лоханулся. У меня было так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  Dim hwndTV As IntPtr

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
   CreateATreeView(Me.Panel1.Handle)
    InitTreeView()
  End Sub

  Private Sub InitTreeView()
...
    'привязываем ImageList к Treeview1
    Call TreeView_SetImageList(hwndTV, m_hImlTV, TVSIL_NORMAL)
    TreeView_AddItem(hwndTV, IntPtr.Zero, IntPtr.Zero, "Test Item", "Test Item", 0, 0)
  End Sub



Вместо
Код: vbnet
1.
hwndTV = CreateATreeView(Me.Panel1.Handle)



Я забыл присвоить результат CreateATreeView в переменную hwndTV


AntonariyДмитрий77Antonariy,

привет, выложил только что.я имел ввиду тестовый проект. где CreateWindowEx уже работает.

Смысла выкладывать так понимаю нет.
Ничего кроме MSDN-рутины (которой надеюсь будет не очень много) на этом пути вряд ли ожидается.


Могу другой проект выложить: с .Net-treeview подогнанным под стиль проводника(как на картинке выше),
но при этом с нерешенным вопросом про тултипы как я хочу.
Вот мне кажется, что именно с .Net контролом вопрос не решается никак.
Или каких приемов не знаю.
Может глянешь?

Мне честно не очень хочется API Treeview делать, я и в VB6 их никогда не делал. Хотя они у меня статические и не шибко здоровые. 10-20 итемов на API можно просто запомнить в переменных и не извращаться реализацией key/name.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39278072
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Могу другой проект выложить: с .Net-treeview подогнанным под стиль проводника(как на картинке выше),
но при этом с нерешенным вопросом про тултипы как я хочу.
Вот мне кажется, что именно с .Net контролом вопрос не решается никак.
Или каких приемов не знаю.
Может глянешь?ты уже далеко по этому пути ушел, вряд ли я что-то новое обнаружу.

могу предложить отключить тривьюшный тултип и прикрутить винформовский.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39278126
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyмогу предложить отключить тривьюшный тултип и прикрутить винформовский.
Ну а толку.
свойство ShowNodeToolTips - это Or TVS_INFOTIP -это нафиг не надо, об этом речи не идет.


Отключить стандартный тултип TTN_SHOW(расширением к которому является TVS_EX_RICHTOOLTIP) можно:
Or TVS_NOTOOLTIPS, но тогда ничего и не будет.

А ситуация такая (может чего не понимаю, поэтому проу глянуть):
Стандартный Treeview генерирует WM_NOTIFY+TTN_SHOW
Смотрим сюда:
http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TreeView.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
protected override void WndProc(ref Message m) {
...
						case NativeMethods.TTN_SHOW:
                            if (WmShowToolTip(ref m))
                            {
                                m.Result = (IntPtr)1;
                                return;  
                            }
                            else
                            {
                                base.WndProc(ref m);
                                break;
                            }



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
private unsafe bool WmShowToolTip(ref Message m)
        {
            NativeMethods.NMHDR* nmhdr = (NativeMethods.NMHDR*)m.LParam;
            IntPtr tooltipHandle = nmhdr->hwndFrom;
            
                
            NativeMethods.TV_HITTESTINFO tvhip = new NativeMethods.TV_HITTESTINFO();
            Point pos = Cursor.Position;
            pos = PointToClientInternal(pos);
            tvhip.pt_x = pos.X;
            tvhip.pt_y = pos.Y;
            IntPtr hnode = UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.TVM_HITTEST, 0, tvhip);
 
            if (hnode != IntPtr.Zero && ((tvhip.flags & NativeMethods.TVHT_ONITEM) != 0)) {
 
                TreeNode tn = NodeFromHandle(hnode);
                if (tn != null) 
                {
                    if (!ShowNodeToolTips) // default ToolTips
                    {
                        Rectangle bounds = tn.Bounds;
                        bounds.Location = this.PointToScreen(bounds.Location);
 
                        UnsafeNativeMethods.SendMessage(new HandleRef(this, tooltipHandle), NativeMethods.TTM_ADJUSTRECT, 1, ref bounds);
                        SafeNativeMethods.SetWindowPos(new HandleRef(this, tooltipHandle),
                                NativeMethods.HWND_TOPMOST, bounds.Left, bounds.Top, 0, 0, NativeMethods.SWP_NOACTIVATE | NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOZORDER);
                        return true;
                    }
                }
            }
            return false;
        }



И если я правильно понимаю(?), вместо того чтобы отдать TTN_SHOW в дефолтную обработку API контрола,
Net сам "разбирается с тултипом" (и естественно стиль TVS_EX_RICHTOOLTIP идет лесом).
Т.е. "тривьюшный тултип" он уже ни фига не тривьюшный (да он и смещен вверх-влево, дефолтный всегда четко накладывается на родной текст узла)

Я конечно могу сделать свою
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Class TreeViewMy
  Inherits TreeView

  Protected Overrides Sub WndProc(ByRef m As Message)
    'Debug.Print(m.ToString)
    Select Case m.Msg
      Case WM_NOTIFY
        Dim nmhdr As NMHDR = CType(Marshal.PtrToStructure(m.LParam, GetType(NMHDR)), NMHDR)
        Select Case nmhdr.code
          Case TTN_SHOW
            Debug.Print("TTN_SHOW")



А дальше у меня какие варианты?
Могу сделать Exit sub, но тогда я в дефолтное API-поведение уже не попадаю
Могу сделать MyBase.WndProc(m), но тогда я попадаю опять в лапы кода который я цитировал выше
А как мне обойти .Net код, при этом прийти в дефолтную API-процедуру, при кот. срабатывает TVS_EX_RICHTOOLTIP?

Еще есть подозрение(?) что что-то не так с ImageList, по крайней мере скормить API-ImageList через TVM_SETIMAGELIST мне не удается. Тогда соответственно вопрос, а содержится ли вообще картинка в TTN_SHOW...

Вообще конечно проще на это забить с моими м.б. 3-4 узлами с относит. длинным текстом. Ну надо красоту, раздвинь дерево вправо ибо возможность есть.

А с API, там неделю сидеть ковыряться, еще проблема с фокусом будет и куча всего еще, ну его.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39278227
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

может поможет, часть 100% рабочего исходника
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function TWTreeView.GetRootNode: TWTreeViewItem;
begin
  Result.Ctrl:=Ctrl;
  Result.FId:= TVI_ROOT;
end;

function TWTreeViewItem.Append(const AText: WinString; AImageIndex: integer): TWTreeViewItem;
var info:tagTVINSERTSTRUCTW;
begin
  info.hParent:=id;
  info.hInsertAfter:=TVI_LAST;

  info.item.mask:=TVIF_TEXT or TVIF_IMAGE or TVIF_SELECTEDIMAGE;
  info.item.pszText:=PWinChar(AText);
  info.item.cchTextMax:=Length(AText);
  info.item.iImage:=AImageIndex;
  info.item.iSelectedImage:=AImageIndex;


  Result.FId:=HTREEITEM(Ctrl.Perform(TVM_INSERTITEMW,0,LPARAM(@info)));
  Result.Ctrl:=Ctrl;
end;
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39278531
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А дальше у меня какие варианты?
Могу сделать Exit sub, но тогда я в дефолтное API-поведение уже не попадаюну так это же и нужно. сам рисуешь свой тултип по этому событию, а дефолтное поведение идет лесом.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39278596
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно читать топики Дмитрий77.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39278785
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyну так это же и нужно. сам рисуешь свой тултип по этому событию, а дефолтное поведение идет лесом.
Не, не хочу. Нужно чтоб лесом шло Net- дефолтное а не API- дефолтное, которое в .Net-контроле именно и идет лесом.

Я все же решил набросать свой TreeView.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39279024
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77Я все же решил набросать свой TreeView.
Вам же уже писали про WPF
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39279026
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

А я уже отвечал про WPF.
...
Рейтинг: 0 / 0
Никто не знает примера как в .Net на чистом API Treeview сделать?
    #39279031
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77Cat2,

А я уже отвечал про WPF.
Кушайте кактус дальше, что бы все было "как в Дельфи"
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Никто не знает примера как в .Net на чистом API Treeview сделать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]