Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Listbox Control - строки разных цветов  (Прочитано 22676 раз)
0 Пользователей и 1 Гость смотрят эту тему.
luden
Участник

ru
Offline Offline

« : 17-11-2011 13:22 » 

Суть в заголовке. Есть листбокс, который я использую для отображения лога, некоторые важные строки хорошо бы выделять цветом. Однако как получить из него конкретную строку мне не ясно. Я не уверен, что использую наиболее подходящий компонент, но лучше пока не нашёл.
Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #1 : 17-11-2011 14:37 » 

luden, если MFC, посмотри CListCtrl, режим "report".
каждая строка таблицы может выводиться с иконкой в начале. Соотв. выделять строки не цветом-фоном, а видом иконки. Хотя можно и цвет-фон, но мне удалость разобраться, только что для "раскраски" строк-фона_строк придется создавать свой класс, и раскраску писать "наразвес", заменяя метод ::DrawItem() базового класса.
Если кто подскажет, мне тоже надо.
---
ps
Цитата
как получить из него конкретную строку
ты имеешь ввиду как получить ссылку на строку, у которой требуется сделать выделение цветом ?
Или просто как получить инф из сторки N ?
« Последнее редактирование: 17-11-2011 14:42 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 17-11-2011 14:41 » 

Проблема заключается в том, что в самом общем случае ты не можешь сказать: listbox->строка Nr 3 -> красная. Отрисовка осуществляется контролом по сообщению WM_PAINT.
Но как известно, господь Бог хитёр, но не коварен. Поэтому, есть ф-ции типа DrawItem, чтобы её использовать необходимо указать стиль контрола LBS_OWNERDRAWVARIABLE.
Эта ф-я вызывается контролом для каждой строки и ты уже сам решаешь, как именно эту строчку отрисовать.
У тебя MFC?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
luden
Участник

ru
Offline Offline

« Ответ #3 : 02-12-2011 08:12 » 

Прошу прощенья, две недели проотсутствовал.
Да у меня MFC. Я правильно понимаю, что для использования функции DrawItem, нужно создавать свой класс наследник от CListBox и перегружать её там? Или мне достаточно будет правильно задать структуру передаваемую параметром?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 02-12-2011 09:38 » 

Сорри последнее предложение не понял: "правильно задать структуру передаваемую параметром". Какую структуру ты куда собрался передавать?
Ну не суть важно.

Лучше, конечно, сделать свой класс public CListBox. В нём (не перегружать, перегружать - overloading - это когда у тебя ф-ции имеют одинаковое имя, но разные параметры) переопределить (overriding) ф-ции MeasureItem и DrawItem.

Для удобства использования, я бы посоветовал тебе добавить к этому классу свою ф-ю напр. AddMyString(), в которой к кажому элементу листбокса добавлять информацию о состоянии этой строки с помощью SetItemDataPtr. Ещё лучше сделать класс или структуру (мне лично больше классы нравятся), в котором хранить ваще всё необходимое: цвет текста, цвет фона, шрифт, стиль шрифта и тд. В псевдокоде примерно так:


class MyLBItemInfo
{
public:
   MyLBItemInfo(цвет фона, цвет текста, стиль, шрифт, ...)
   {
      // инициаллизация
   }

   // members
   цвет фона
   цвет текста
   стиль
   шрифт
   ...

}

int CMyListBox::AddSpecialString(CString stItemText, цвет фона, цвет текста, стиль, шрифт, ...)
{
   int i = AddString(stItemText);
   SetItemDataPtr(i, new MyLBItemInfo(цвет фона, цвет текста, стиль, шрифт, ...));
   return i;
}

используешь:

m_lbMyLogList.AddSpecialString("строка 1", жёлтый, красный, жирный, Arial, ...)

В DrawItem ты легко получаешь доступ на дополнительно сохранённую инфу именно для этой строки из структуры LPDRAWITEMSTRUCT.

При разрушении объекта, или при переинициаллизации контрола не забудь удалять эту доп. инфу.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
luden
Участник

ru
Offline Offline

« Ответ #5 : 06-12-2011 08:34 » 

Структура, которая LPDRAWITEMSTRUCT. Я пока разбираюсь. Но всё же, когда я выставляю флаг LBS_OWNERDRAWVARIABLE, программа начинает падать с дебагбрейком. Если перейти в релиз-компиляцию, она работает но упорно ничего не отрисовывает. Я правильно понимаю, что до тех пор пока я не оформлю DrawItem как, например, здесь http://msdn.microsoft.com/en-us/site/kc9hahtd оно не заработает?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 06-12-2011 12:26 » 

Причин может быть вагон и маленькая тележка. Поэтому прежде чем гадать, лучше сначала сделать всё как требуется. Глядишь, и заработает. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
luden
Участник

ru
Offline Offline

« Ответ #7 : 06-12-2011 14:02 » 

Так. Если подключить LBS_MULTICOLUMN то падать он перестаёт. Тем не менее, ни в событие WM_DRAWITEM, ни в событие WM_MEASUREITEM программа не входит вообще.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 06-12-2011 16:21 » 

Проект большой? Должен быть маленкий - тестовый. Код в студию.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
luden
Участник

ru
Offline Offline

« Ответ #9 : 07-12-2011 05:40 » 

Файл .h
Код:
// ListBoxColorDlg.h : файл заголовка
//

#pragma once


class CMyListBox : public CListBox
{
public:
virtual void DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct );

};

// диалоговое окно CListBoxColorDlg
class CListBoxColorDlg : public CDialogEx
{
// Создание
public:
CListBoxColorDlg(CWnd* pParent = NULL); // стандартный конструктор

// Данные диалогового окна
enum { IDD = IDD_LISTBOXCOLOR_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV


// Реализация
protected:
HICON m_hIcon;

// Созданные функции схемы сообщений
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButton1();
CMyListBox m_list;
afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
};

Файл .cpp
Код:
// ListBoxColorDlg.cpp : файл реализации
//

#include "stdafx.h"
#include "ListBoxColor.h"
#include "ListBoxColorDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// диалоговое окно CListBoxColorDlg




CListBoxColorDlg::CListBoxColorDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CListBoxColorDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CListBoxColorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_list);
}

BEGIN_MESSAGE_MAP(CListBoxColorDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CListBoxColorDlg::OnBnClickedButton1)
ON_WM_MEASUREITEM()
ON_WM_DRAWITEM()
END_MESSAGE_MAP()


// обработчики сообщений CListBoxColorDlg

BOOL CListBoxColorDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Задает значок для этого диалогового окна. Среда делает это автоматически,
//  если главное окно приложения не является диалоговым
SetIcon(m_hIcon, TRUE); // Крупный значок
SetIcon(m_hIcon, FALSE); // Мелкий значок
//m_list.DrawItem(
// TODO: добавьте дополнительную инициализацию

return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок. Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей областью.

void CListBoxColorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст устройства для рисования

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Выравнивание значка по центру клиентского прямоугольника
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Нарисуйте значок
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}


// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example draws an item's text centered vertically and horizontally. The
// list box control was created with the following code:
//   m_myODListBox.Create(
//      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
//      LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
//      CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
   ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX);
   LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData;
   ASSERT(lpszText != NULL);
   CDC dc;

   dc.Attach(lpDrawItemStruct->hDC);

   // Save these value to restore them when done drawing.
   COLORREF crOldTextColor = dc.GetTextColor();
   COLORREF crOldBkColor = dc.GetBkColor();

   // If this item is selected, set the background color
   // and the text color to appropriate values. Also, erase
   // rect by filling it with the background color.
   if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
      (lpDrawItemStruct->itemState & ODS_SELECTED))
   {
      dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
      dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
      dc.FillSolidRect(&lpDrawItemStruct->rcItem,
         ::GetSysColor(COLOR_HIGHLIGHT));
   }
   else
   {
      dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
   }

   // If this item has the focus, draw a red frame around the
   // item's rect.
   if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
      (lpDrawItemStruct->itemState & ODS_FOCUS))
   {
      CBrush br(RGB(255, 0, 0));
      dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
   }

   // Draw the text.
   dc.DrawText(
      lpszText,
      (int)_tcslen(lpszText),
      &lpDrawItemStruct->rcItem,
      DT_CENTER|DT_SINGLELINE|DT_VCENTER);

   // Reset the background color and the text color back to their
   // original values.
   dc.SetTextColor(0x0000FF);//crOldTextColor);
   dc.SetBkColor(crOldBkColor);

   dc.Detach();
}

// CMyListBox is my owner-drawn list box derived from CListBox. This
// example measures an item and sets the height of the item to twice the
// vertical extent of its text. The list box control was created with the
// following code:
//   pmyListBox->Create(
//      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
//      LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE,
//      myRect, pParentWnd, 1);
//
void CMyListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
   ASSERT(lpMeasureItemStruct->CtlType == ODT_LISTBOX);
   LPCTSTR lpszText = (LPCTSTR) lpMeasureItemStruct->itemData;
   ASSERT(lpszText != NULL);
   CSize   sz;
   CDC*    pDC = GetDC();

   sz = pDC->GetTextExtent(lpszText);

   ReleaseDC(pDC);

   lpMeasureItemStruct->itemHeight = 2*sz.cy;
}
// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR CListBoxColorDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

/*class MyLBItemInfo
{
public:
   MyLBItemInfo(цвет фона, цвет текста, стиль, шрифт, ...)
   {
      // инициаллизация
   }

   // members
   CFont *font;
}*/

void CListBoxColorDlg::OnBnClickedButton1()
{
CFont *font;
font = new CFont ();
font->CreateFontA (24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial"));
m_list.AddString ("1");
m_list.SetItemDataPtr (2, font);
UpdateData (false);
}


void CListBoxColorDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
m_list.MeasureItem (lpMeasureItemStruct);
CDialogEx::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}


void CListBoxColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
m_list.DrawItem (lpDrawItemStruct);
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
Файл .rc
Код:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Russian (Russia) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#include ""afxres.h""\r\n"
    "#include ""verrsrc.h""\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)\r\n"
    "LANGUAGE 25, 1\r\n"
    "#include ""res\\ListBoxColor.rc2""  // ресурсы, не редактируемые в Microsoft Visual C++\r\n"
    "#include ""l.RUS\\afxres.rc""      // Стандартные компоненты\r\n"
    "#endif\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME           ICON                    "res\\ListBoxColor.ico"

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_LISTBOXCOLOR_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION
EXSTYLE WS_EX_APPWINDOW
CAPTION "ListBoxColor"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    LISTBOX         IDC_LIST1,7,7,306,137,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP | LBS_OWNERDRAWVARIABLE | LBS_MULTICOLUMN
    PUSHBUTTON      "Button1",IDC_BUTTON1,21,166,50,14
END


/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "041904B0"
        BEGIN
            VALUE "CompanyName", "TODO: <Название организации>"
            VALUE "FileDescription", "ListBoxColor"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "ListBoxColor.exe"
            VALUE "LegalCopyright", "TODO: (c) <Название организации>. Все права защищены."
            VALUE "OriginalFilename", "ListBoxColor.exe"
            VALUE "ProductName", "TODO: <Название продукта>"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x419, 1200
    END
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_LISTBOXCOLOR_DIALOG, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 313
        TOPMARGIN, 7
        BOTTOMMARGIN, 193
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // Russian (Russia) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE 25, 1
#include "res\ListBoxColor.rc2"  // ресурсы, не редактируемые в Microsoft Visual C++
#include "l.RUS\afxres.rc"      // Стандартные компоненты
#endif

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 07-12-2011 16:07 » 

Блин, как всё запущено! Жаль

luden, ну как же так?

Но всё же, когда я выставляю флаг LBS_OWNERDRAWVARIABLE, программа начинает падать с дебагбрейком.

Правильно. А место где "падает" смотрел? Там же всё написано:

Код: (C++)
// Derived class is responsible for implementing these handlers
//   for owner/self draw controls (except for the optional DeleteItem)
void CListBox::DrawItem(LPDRAWITEMSTRUCT)
        { ASSERT(FALSE); }
void CListBox::MeasureItem(LPMEASUREITEMSTRUCT)
        { ASSERT(FALSE); }
int CListBox::CompareItem(LPCOMPAREITEMSTRUCT)
        { ASSERT(FALSE); return 0; }

ASSERT работает только в дебаггере, поэтому в релизе она и не "падает". А вобще это не "падение", а тычок носом, типа: "смотри что делаешь".

А что ты делаешь? Почему вдруг понадобилось ещё переопределить ф-ю CompareItem? Да потому, что ты определил стиль контрола - с сортировкой:

LISTBOX         IDC_LIST1,7,7,306,137,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP | LBS_OWNERDRAWVARIABLE | LBS_MULTICOLUMN

А как он должен сортировать? Правильно, для этого и нужно переопределение ф-ции CompareItem, в ней контрол тебя спрашивает типа: сравни эти две строки.
А ты отвечаешь, какая "больше", а какая "меньше". В соответствии с этим ответом контрол их упорядочивает. Поэтому, если стиль LBS_SORT тебе важен, то добавь ф-ю CompareItem (в тестовом проекте в прицепе она есть), если нет, то выключи стиль и твой код заработает.

В общем, считай что тебе повезло, что у меня ща времени нет (поэтому рабочий проект в прицепе, дальше разбирёшься, надеюсь). Ага А то бы я тебя сначала мурыжил (ради твоей же пользы), пока ты не отчеканил бы что делает каждая строчка приведённого тобой выше кода. В итоге мы бы добрались и до этого пункта. Это я не злой, просто сторонник того, чтобы люди понимали, что они делают.
Особенно когда учатся. В противном случае, пополнишь ряды "псевдопрограммистов"-однокнопочных, которые "программируют" с помощью перетаскивания контролов на форму мышом, после чего нажимают ОДНУ КНОПКУ и ВСЁ РАБОТАЕТ.
Пока у тебя на лицо отсутствие элементарных знаний матчасти. Без основных понятий далеко не уедешь, тем более замахиваться на OnerDraw. Метод "научного тыка" иногда приносит результаты, но это не есть овладение надёжными знаниями:
Так. Если подключить LBS_MULTICOLUMN то падать он перестаёт. Тем не менее, ни в событие WM_DRAWITEM, ни в событие WM_MEASUREITEM программа не входит вообще.

А зачем ты это ваще делал? Объяснить можешь? Почему не посметрел просто "место падения"?

Тему переношу в раздел для начинающих, там сильные "педагоги".

зы Под тестовым проектом я понимал нечто вроде такого (чтобы можно было быстренько запустить и "поковыряться"):


* CustomItemsListBoxTest.zip (62.68 Кб - загружено 960 раз.)
« Последнее редактирование: 07-12-2011 16:10 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
luden
Участник

ru
Offline Offline

« Ответ #11 : 08-12-2011 07:35 » 

В общем, считай что тебе повезло, что у меня ща времени нет (поэтому рабочий проект в прицепе, дальше разбирёшься, надеюсь). Ага А то бы я тебя сначала мурыжил (ради твоей же пользы), пока ты не отчеканил бы что делает каждая строчка приведённого тобой выше кода. В итоге мы бы добрались и до этого пункта. Это я не злой, просто сторонник того, чтобы люди понимали, что они делают.
Хых, не выглядит это так что мне повезло. В любом случае, раньше или позже я во всём этом разберусь, спасибо за код.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 08-12-2011 09:48 » 

Хых, не выглядит это так что мне повезло. В любом случае, раньше или позже я во всём этом разберусь, спасибо за код.

А, ну дык. В таком случае давай разбираться! И в этом деле, поверь, лучше раньше. Просто лично у меня сейчас не так много времени - клиенты хотят под конец года израсходовать бюджет, а то в след. году его урежут, вот и завалили "срочной" работой. Поэтому длинных лекций не обещаю.

Но в нужном направлении попинать могу. Да и не один я тут.

Для начала расскажи немного о себе: чем занимаешься, чего хочешь достигнуть, какая подготовка - давно занимаешься программированием, в частности VS MFC, какой опыт работы, какими книгами (справочниками и тд) пользуешься. Чтобы знать на какой уровень ориентироваться и с чего начать/продолжить.

След. шагом попробуй рассказать твоё понимание, как это всё работает: как создаются контролы, как они взаимодействуют с родительским окном, что такое MFC.

зы да, совсем забыл, какой версией студии пользуешься.

зы зы за код благодарить не надо, это скорей медвежья услуга и противоречит моим принципам. Просто, как я уже сказал, времени нет, да и в качестве примера. Те если у тебя что-то не получается, то можешь просто выложить такой тестовый проектик, в ктором что-то не работает, так проще объяснять/общаться.

« Последнее редактирование: 08-12-2011 09:50 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
luden
Участник

ru
Offline Offline

« Ответ #13 : 08-12-2011 11:46 » 

Для начала расскажи немного о себе: чем занимаешься, чего хочешь достигнуть, какая подготовка - давно занимаешься программированием, в частности VS MFC, какой опыт работы, какими книгами (справочниками и тд) пользуешься. Чтобы знать на какой уровень ориентироваться и с чего начать/продолжить.
Я пять лет занимаюсь программированием микроконтроллеров и систем управления ими с компьютера. До недавнего времени все системы со стороны компьютера я писал на Билдере, так как там были низкие требования по оформлению, да и вообще они были не более, чем инструментами. Однако, полтора месяца назад мне потребовалось сделать юзерскую программу и тут уже мне пришлось перейти на MFC  с которым я до этого дел не имел. Ну и пока он мне нравится намного больше Билдера, так что думаю на нём и останусь. Из книг у меня "Использование Visual C++ 6" Кейт Грегори и посоветованное здесь "Программирование под Windows 95" Петзольда. Достигнуть... сложно сказать, я пока не могу нащупать понимание всех принципов работы MFC, думаю в какой-то момент я смогу находить решения интуитивно, вот собственно его я и хочу достигнуть.
След. шагом попробуй рассказать твоё понимание, как это всё работает: как создаются контролы, как они взаимодействуют с родительским окном, что такое MFC.
Хм, контролы, наследники класса CWnd, используются для визуального отображения различных компонент, создаются либо на основе переменной через Create, либо простым перетаскиванием, информация о котором записывается в файл .rc. Второй случай нагляднее, но судя по всему из-за обилия лишних дефолтных значений - не предпочтительнее. Созданный контрол является самостоятельным объектом привязанным к тому или иному окну, вероятно он частично наследует от него видимость, позицию на экране и пр, что позволяет ему выглядеть с ним одним целым. MFC же это структура классов предназначенная для рисования окон и компонентов.
зы да, совсем забыл, какой версией студии пользуешься.
Десятая.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 08-12-2011 13:35 » new

А, ну тогда всё в порядке.

Петцольд хорош в том плане, что даёт понятие работы виндовской "кухни". Те для понимания работы тебе нужно о(у)своить Win API - это всё есть у Петцольда. Собственно говоря, всё что под виндой программируется есть Win API, проще говоря, говорить с системой ты можешь только на её языке, с помощью её ф-ций.
А это и есть Win API. Всё остальное: и Борланд (С++/Дельфи), виртуальная Ява-Машина, и .NET - это всё оболочки или врапперы (wrapper), которые явялются прослойкой между Win API и программером. Сама Win API не объектноориентированная, поэтому практически все эти оболочки стараются приложить максимум усилий для того, чтобы быть пригодными для ООП.

А MFC - потомок одой из первых попыток такой ООП оболочки - Application Framework eXtension. Отсюда во многих ф-ях ты увидишь приставку "afx".
Чтобы не повторяться, посмотри вот эту темку.
https://forum.shelek.ru/index.php/topic,6471.0.html
Ну и для общего развития:
https://forum.shelek.ru/index.php/topic,24158.msg233099.html#msg233099

MFC хорош тем, что позволяет использовать и "свои" ООП классы и ф-ции Win API напрямую, без всяких алиасов, как например в VB или .NET.
Вобще, лучше всего начинать с Win API. Тогда ты практически ручками создаёшь контрол с помощью ф-ции Create и любовно "облапываешь" каждый параметр. Включая стили. Стили бывают общими для окна, такие как, например, WS_VISIBLE - WS_ - указывает на Windows Style, так и "персональные" для контрола - LBS_SORT LBS_ - List Box Style. Они очень важны для работоспособности контрола. Некоторые несовместимы. ВСё это стоит в библиотеке MSDN, примеры из которой ты использовал. Это очень хорошо, без неё никуда. Но ещё лучше, не просто копипастить примеры, а разжёвывать их пока не достигнешь полнейшего понимания.

В случае ошибок всегда обращай внимание на место "падения". Внимательно читай коментарии в коде, если они есть конечно. Проверяй значения переменных в окне Watch, в месте "падения".

Ну как-то так. В общем с обращайся с вопросами.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines