Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.127.232] |
|
Сообщ.
#1
,
|
|
|
У меня есть массив объеков собственного класса. Я отображаю весь массив в ListCtrl (для каждого объекта своя строка). У меня в классе есть переменная (поле) типа BOOL. Я хочу так сделать. Чтоб если она =TRUE строка выводилась жирной, иначе обычной. Ну ListCtrl стандартные какие нибудь средства имеет для этого. И вообще объясните как это сделать. По возможности ссылку на русскую инфу.
|
Сообщ.
#2
,
|
|
|
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
// **** OnCustomDraw **** void CMyListView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR; NMCUSTOMDRAW pLV = (NMCUSTOMDRAW) pLVCustomDraw->nmcd; CListCtrl &Ctrl = GetListCtrl(); *pResult = CDRF_DODEFAULT; switch(pLVCustomDraw->nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult |= CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: if (Ctrl.GetItemText(pLV.dwItemSpec, 8) == "Привет") { SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold); pLVCustomDraw->clrText = RGB(0, 0, 160); } break; } } Думаю, все понятно... Рыть надо по методу OnCustomDraw |
Сообщ.
#3
,
|
|
|
Я новичок. Можно поподробнее. К сожалению не все понятно.
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) где распологать? В карте сообщений главного окна? CMyListView это что класс унаследованный от ClistCtrl? И самое главное Цитата SexGenius, 13.10.03, 14:10:50 У меня в классе есть переменная (поле) типа BOOL. Я хочу так сделать. Чтоб если она =TRUE строка выводилась жирной, иначе обычной. Я имел ввиду что в классе главного окна она есть. Так как же будет происходить проверка и вывод в ListControl с учетом значения этой переменной? |
Сообщ.
#4
,
|
|
|
Много писать..
В кратце ты должен создать новый класс от CListCtrl, переопределить OnCustomDraw, а в методе: BEGIN_MESSAGE_MAP(CMyListCtrl, CMyListCtrl) //{{AFX_MSG_MAP(CMyListCtrl) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) //}}AFX_MSG_MAP END_MESSAGE_MAP() h файл //{{AFX_MSG(CMyListCtrl) ... afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); ... //}}AFX_MSG // **** OnCustomDraw **** void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR; NMCUSTOMDRAW pLV = (NMCUSTOMDRAW) pLVCustomDraw->nmcd; *pResult = CDRF_DODEFAULT; switch(pLVCustomDraw->nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult |= CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: if (m_ModeBold) // твоя переменная { SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold); // m_FontBold - твой жирный шрифт, которые ты должен создать заранее } break; } } это Notify NM_CUSTOMDRAW |
Сообщ.
#5
,
|
|
|
Ладно, надо помагать людям, сам таким был.. Вот щас наваял и выкладываю решение твоей проблемы.
Это класс: h файл class CMyListCtrl : public CListCtrl { // Construction public: CMyListCtrl(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyListCtrl) protected: virtual void PreSubclassWindow(); //}}AFX_VIRTUAL // Implementation public: virtual ~CMyListCtrl(); // Generated message map functions protected: CFont m_FontBold; BOOL m_ModeBold; //{{AFX_MSG(CMyListCtrl) afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; cpp файл ///////////////////////////////////////////////////////////////////////////// // CMyListCtrl CMyListCtrl::CMyListCtrl() { m_ModeBold = TRUE; } CMyListCtrl::~CMyListCtrl() { } BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) //{{AFX_MSG_MAP(CMyListCtrl) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyListCtrl message handlers // **** OnCustomDraw **** void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR; NMCUSTOMDRAW pLV = (NMCUSTOMDRAW) pLVCustomDraw->nmcd; *pResult = CDRF_DODEFAULT; switch(pLVCustomDraw->nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult |= CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: if (m_ModeBold) { SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold); pLVCustomDraw->clrText = RGB(0, 0, 160); } break; } } void CMyListCtrl::PreSubclassWindow() { LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); lf.lfHeight = 13; lf.lfWeight = FW_BOLD; strcpy(lf.lfFaceName, "Tahoma"); VERIFY(m_FontBold.CreateFontIndirect(&lf)); CListCtrl::PreSubclassWindow(); } |
Сообщ.
#6
,
|
|
|
Забыл добавить, написал только что и проверил. Все работает..
|
Сообщ.
#7
,
|
|
|
Уважаемый, CasperJr. Спасибо! Но понемая сколь много для меня было сделано я все же извиняюсь за свою тупизну и хочу спросить.
Ну вот есть у нас этот новый класс. Есть ListCtrl в ресурсах на диалоге. Есть связаная с ним переменная. И есть массив объектов некого класса MyRecord. В этом классе есть поле (пусть VarZirny) типа BOOL. Я перебираю все элементы массива, и в каком элементе VarZirny==TRUE, я отображаю строку этого элемент а жирным. Если FALSE то обычным. Мне для этого надо что? В CMyListCtrl добавить метод CMyListCtrl::SetFont(CFont) который изменяет protected: CFont m_FontBold; поле? Да? И если VarZirny==TRUE, то вызывать MyListCtrl.SetFont(<Жирный>)? Так я понял? И в результате в моем ListCtrl будут как жирные строки так и обычные (в зависимости от элементов моего массива)? Я все правильно понял? |
Сообщ.
#8
,
|
|
|
При заполении делай так:
int nItem = m_List.InsertItem(....); if (MyRecord[i].VarZirny) m_List.SetItemData(nItem, 1) // веделять жирным else m_List.SetItemData(nItem, 0) // не выделять жирным ... MyRecord[i] написал от руки, я не знаю как ты хранишь список MyRecord. Сам добавишь... .... case CDDS_ITEMPREPAINT: // pLV.dwItemSpec - номер item'а if (Ctrl.GetItemData(pLV.dwItemSpec) == 1) // Нужно выделить строку жирным { SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold); pLVCustomDraw->clrText = RGB(0, 0, 160); } Удачи |
Сообщ.
#9
,
|
|
|
СПАСИБО!! CasperJr !
ГВОЗДИ БЫ ДЕЛАТЬ ИЗ ЭТИХ ЛЮДЕЙ!!!!! ))))))))))) Только сдесь вот так: case CDDS_ITEMPREPAINT: // pLV.dwItemSpec - номер item'а if (GetItemData(pLV.dwItemSpec) == 1) // Здесь была ошибочка!!!!! { SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold); pLVCustomDraw->clrText = RGB(0, 0, 160); } Это я для тех у кого та же проблема возникнет.... Еще раз спасибо! |
Сообщ.
#10
,
|
|
|
[b] ... if ((int) GetItemData(pLV.dwItemSpec) == (int) 1) [/b] ... Ну забыл преобразование типов... От руки писал Удачи всем ! |