Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Dinkin
646 / 444 / 116
Регистрация: 31.05.2013
Сообщений: 2,268
Записей в блоге: 2
#1

TListView +TCheckBox - C++ Builder

04.02.2015, 11:07. Просмотров 569. Ответов 13
Метки нет (Все метки)

Добрый день, возможно ли в шапку компонента вставить чекбокс, что бы получился эффект "выбрать все" как в почтовых страницах?
http://www.cyberforum.ru/cpp-builder/thread1554467.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2015, 11:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос TListView +TCheckBox (C++ Builder):

Как в ячейке TGrid использовать TDateTime, TCheckBox, TString и TButton?
Добрый день! Подскажите пожалуйста - как в ячейке TGrid использовать...

Недочёты в TListView
Фрагмент кода: TListColumn *NewColumn; ListView1->Align = alNone;...

Умные указатели и TListView
Здравствуйте!! Ребята подскажите по такому вопросу? Вот этот код ...

TListView и свойство Data
Добрый день. У меня вопрос следующего содержания: Формирую список TListView...

Компоненты TListView и TListBox
Привет всем! Подскажите чем можно реализовать вот это? (То что на скрине)...

13
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
04.02.2015, 11:28 #2
Возможно: How to show a check box in TListView header column?

В синтаксис Билдера сам переведешь?
1
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
04.02.2015, 11:34 #3
По конкатенации компонентов вот здесь можно еще чуток поглядеть: http://www.cyberforum.ru/cpp-builder/thread1148874.html
1
Dinkin
646 / 444 / 116
Регистрация: 31.05.2013
Сообщений: 2,268
Записей в блоге: 2
04.02.2015, 11:45  [ТС] #4
Отличный вариант с делфи, но перевести трудновато
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
04.02.2015, 12:22 #5
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Dinkin, header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TForm1 : public TForm
{
__published: // IDE-managed Components
 
    TListView *ListView1;
    void __fastcall FormCreate(TObject *Sender);
 
private: // User declarations
 
    int HeaderID;
    MESSAGE void __fastcall WMNotify(TWMNotify &Message);
 
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
 
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_NOTIFY, TWMNotify, WMNotify);
    END_MESSAGE_MAP(TForm)
};
cpp:
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
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
 
MESSAGE void __fastcall TForm1::WMNotify(TWMNotify &Message)
{
    if (Message.NMHdr->idFrom == HeaderID)
        if (Message.NMHdr->code == HDN_ITEMSTATEICONCLICK)
        {
            ShowMessage("You have clicked the header check box");
        }
    TForm::Dispatch(&Message);
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    HD_ITEM HeaderItem;
    ListView_SetExtendedListViewStyle(ListView1->Handle,
        LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
    HWND HeaderHandle = ListView_GetHeader(ListView1->Handle);
    int HeaderStyle = ::GetWindowLongPtr(HeaderHandle, GWL_STYLE);
    HeaderStyle |= HDS_CHECKBOXES;
    ::SetWindowLongPtr(HeaderHandle, GWL_STYLE, HeaderStyle);
 
    HeaderItem.mask = HDI_FORMAT;
    Header_GetItem(HeaderHandle, 0, &HeaderItem);
    HeaderItem.fmt |= (HDF_CHECKBOX | HDF_FIXEDWIDTH);
    Header_SetItem(HeaderHandle, 0, &HeaderItem);
 
    HeaderID = ::GetDlgCtrlID(HeaderHandle);
}
Как-то вот так, проверяй...
1
Dinkin
646 / 444 / 116
Регистрация: 31.05.2013
Сообщений: 2,268
Записей в блоге: 2
04.02.2015, 12:56  [ТС] #6
Компилица, но в шапочке не появляется чекик)
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
04.02.2015, 13:08 #7
А шапочка-то сама есть? ViewStyle в vsReport выставлен? Ибо:
1
Миниатюры
TListView +TCheckBox  
Dinkin
646 / 444 / 116
Регистрация: 31.05.2013
Сообщений: 2,268
Записей в блоге: 2
04.02.2015, 13:19  [ТС] #8
Да вроде все так же
0
Миниатюры
TListView +TCheckBox  
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
04.02.2015, 13:25 #9
У тебя не Vista+, поэтому работоспособность кода не гарантируется. По ссылке это написано вторым предложением (да еще и болдом выделено)

Решение для НЕ "Vista и старше" приведено чуть ниже, но это я уже переводить не буду.
1
Dinkin
646 / 444 / 116
Регистрация: 31.05.2013
Сообщений: 2,268
Записей в блоге: 2
04.02.2015, 13:31  [ТС] #10
Действительно,тестируется на XP....
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
04.02.2015, 14:04 #11
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Ну, вот для XP. Не проверял, ибо негде.

header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TForm1 : public TForm
{
__published: // IDE-managed Components
 
    TListView *ListView1;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormDestroy(TObject *Sender);
 
private: // User declarations
 
    typedef LRESULT(__stdcall *func)(HWND, unsigned, WPARAM, LPARAM);
 
    HWND FListHeaderWnd;
    TCheckBox *FListHeaderChk;
    func FSaveListHeaderWndProc, FListHeaderWndProc;
    void __fastcall ListHeaderWndProc(TMessage &Msg);
 
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
};
cpp:
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
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
65
66
67
68
69
70
71
72
73
// ---------------------------------------------------------------------------
#define OEMRESOURCE
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <memory>
 
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
// ---------------------------------------------------------------------------
 
TPoint GetCheckSize()
{
    std::auto_ptr<TBitmap> bm(new TBitmap);
    bm->Handle = ::LoadBitmap(NULL, MAKEINTRESOURCE(OBM_CHECKBOXES));
    return Point(bm->Width / 4, bm->Height / 3);
}
 
void __fastcall TForm1::ListHeaderWndProc(TMessage &Msg)
{
    if (Msg.Msg == WM_COMMAND && ((HWND)(Msg.LParam))
        == FListHeaderChk->Handle && Msg.WParamHi == BN_CLICKED)
    {
        FListHeaderChk->Checked = !FListHeaderChk->Checked;
 
        ShowMessage("Click at header CheckBox");
 
    }
    Msg.Result = CallWindowProc(FSaveListHeaderWndProc, FListHeaderWnd, Msg.Msg,
        Msg.WParam, Msg.LParam);
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    ListView1->HandleNeeded();
    FListHeaderWnd = ListView_GetHeader(ListView1->Handle);
 
    FListHeaderChk = new TCheckBox((TComponent*)0);
    TPoint CheckSize = GetCheckSize();
    FListHeaderChk->Height = CheckSize.X;
    FListHeaderChk->Width = CheckSize.Y;
 
    TRect HeaderSize;
 
    ::ShowWindow(ListView1->Handle, SW_SHOWNORMAL);
    ::GetClientRect(FListHeaderWnd, &HeaderSize);
    FListHeaderChk->Top = (HeaderSize.Bottom - FListHeaderChk->Height) / 2;
    FListHeaderChk->Left = FListHeaderChk->Top;
 
    FListHeaderChk->Parent = this;
    ::SetParent(FListHeaderChk->Handle, FListHeaderWnd);
 
    FListHeaderWndProc = (func)Classes::MakeObjectInstance(ListHeaderWndProc);
    FSaveListHeaderWndProc = (func)::GetWindowLongPtr(FListHeaderWnd, GWLP_WNDPROC);
    ::SetWindowLongPtr(FListHeaderWnd, GWLP_WNDPROC, (LONG_PTR)FListHeaderWndProc);
}
 
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    ::SetWindowLongPtr(FListHeaderWnd, GWL_WNDPROC, (LONG_PTR)FSaveListHeaderWndProc);
    Classes::FreeObjectInstance(FListHeaderWndProc);
    delete FListHeaderChk;
}
// ---------------------------------------------------------------------------
Обрати внимание на вторую строку. Она ОБЯЗАТЕЛЬНА, без нее даже компилироваться не должно...
2
Dinkin
646 / 444 / 116
Регистрация: 31.05.2013
Сообщений: 2,268
Записей в блоге: 2
04.02.2015, 14:29  [ТС] #12
Да все отлично! и такой вопрос,а как достучаться к событиям данного чека, что в шапке?
0
BRcr
4015 / 2305 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
04.02.2015, 14:34 #13
Дык, ListHeaderWndProc() - диспетчер сообщений же.
1
Dinkin
646 / 444 / 116
Регистрация: 31.05.2013
Сообщений: 2,268
Записей в блоге: 2
04.02.2015, 14:38  [ТС] #14
Цитата Сообщение от BRcr Посмотреть сообщение
Дык, ListHeaderWndProc() - диспетчер сообщений же.
не внимательный я
0
04.02.2015, 14:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2015, 14:38
Привет! Вот еще темы с решениями:

Ошибки с модальными окнами и TListView
Добрый день. Возникла следующая проблема. Суть программы. Некое количество...

Ошибка доступа при очистке TListView
Всем привет! Помогите пожалуйста решить проблему. На форме имеется компонент...

Как связать между собой TListView
Всем доброй ночи. Пишу курсач на ночь глядя и некоторые аспекты меня волнуют. В...

TListView на PageControl теряет свой список
Ситуация такая: Имеется фрейм TFrame1, на котором PageControl1 с двумя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru