Высота ячейки таблицы
От: Antech  
Дата: 18.11.02 07:40
Оценка:
Как для list control в стиле таблицы (report) задать высоту строк (ячеек)?
Re: Высота ячейки таблицы
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 18.11.02 13:25
Оценка:
Здравствуйте, Antech, Вы писали:

A>Как для list control в стиле таблицы (report) задать высоту строк (ячеек)?


По-моему, под высоту шрифта он сам подстраивается... А если надо сделать выше, то создаешь image list (ImageList_Create) с нужной высотой и назначаешь этот image list твоему контролу (ListView_SetImageList).
Re[2]: Высота ячейки таблицы
От: Antech  
Дата: 22.08.05 10:49
Оценка:
Здравствуйте, Flamer, Вы писали:

Вот опять этот вопрос всплыл...

F>По-моему, под высоту шрифта он сам подстраивается...


Если не OwnerDraw. Иначе подстраивается под шрифт по-умолчанию. Если я меняю шрифт на произвольный, в обычном режиме прорисовки высота строк подстраивается, но вот если задать стиль OwnerDraw — фиг, остается прежняя высота.
Пытался ловить WM_MEASUREITEM — нет результата.
Неужели только задавать ImageList? Мне там не нужен ImageList .
Re[3]: Высота ячейки таблицы
От: OLEGus1 Россия  
Дата: 22.08.05 11:00
Оценка:
Здравствуйте, Antech, Вы писали:

A>но вот если задать стиль OwnerDraw — фиг, остается прежняя высота.

С этим стилем надо вручную отрисовывать
Crescite, nos qui vivimus, multiplicamini
Re[4]: Высота ячейки таблицы
От: Antech  
Дата: 22.08.05 11:10
Оценка:
Здравствуйте, OLEGus1, Вы писали:

OLE>С этим стилем надо вручную отрисовывать


Ну ясен пень . Отрисовывается все нормально (уже делал для стандартного шрифта). Но высота строк при смене шрифта не меняется ... Даже если Вы не обработаете сообщение WM_DRAWITEM, но у лист-контрла (т. е. таблицы) есть стиль, отображающий линии сетки, то и так видно, что высота строк не соответсвует высоте шрифта.
Покопал поиск. WM_MEASUREITEM появляется только при изменении размеров окна ListView. Сейчас попробую...
Re[4]: Высота ячейки таблицы
От: Antech  
Дата: 22.08.05 11:17
Оценка:
Так, проверил. Действительно, если изменить размеры окна ListView и обработать WM_MEASUREITEM, высота строк изменяется.

Но нет ли более элегантного метода, чтобы не дергать внешний вид контрола?
Re[5]: Высота ячейки таблицы
От: rus blood Россия  
Дата: 23.08.05 05:25
Оценка:
Здравствуйте, Antech, Вы писали:

A>Так, проверил. Действительно, если изменить размеры окна ListView и обработать WM_MEASUREITEM, высота строк изменяется.


A>Но нет ли более элегантного метода, чтобы не дергать внешний вид контрола?


WM_MEASUREITEM посылается родителю контрола в момент создания окна.
Если оно у тебя не ловится, значит что-то не так делаешь...
Имею скафандр — готов путешествовать!
Re[6]: Высота ячейки таблицы
От: Antech  
Дата: 25.08.05 07:39
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>WM_MEASUREITEM посылается родителю контрола в момент создания окна.

RB>Если оно у тебя не ловится, значит что-то не так делаешь...

Во время создания окна сообщения не ловятся, потому что окно создается из ресурсов (точнее, это один из режимов работы). Но даже если создавать окно на лету, я ведь вначале создаю, а потом сабклассирую. Поэтому при создании окна это сообщение опять же я отловить не могу.
В общем, сделал через изменение размера лист-контрола +/- 1 пиксель с применением LockWindowUpdate().
Re[7]: Высота ячейки таблицы
От: rus blood Россия  
Дата: 25.08.05 08:19
Оценка:
Здравствуйте, Antech, Вы писали:

A>Здравствуйте, rus blood, Вы писали:


RB>>WM_MEASUREITEM посылается родителю контрола в момент создания окна.

RB>>Если оно у тебя не ловится, значит что-то не так делаешь...

A>Во время создания окна сообщения не ловятся, потому что окно создается из ресурсов (точнее, это один из режимов работы). Но даже если создавать окно на лету, я ведь вначале создаю, а потом сабклассирую. Поэтому при создании окна это сообщение опять же я отловить не могу.


Сообщение ловится родителем...
#include "stdafx.h"
#include "resource.h"
#include <commctrl.h>  

BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    InitCommonControls();

     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);

    return 0;
}

BOOL CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM)
{
    if (WM_MEASUREITEM == uMsg)
        MessageBox(NULL, "WM_MEASUREITEM", NULL, MB_OK);
    if (WM_CLOSE == uMsg)
        EndDialog(hDlg, IDCANCEL);

    return FALSE;
}


Если родителем ловить не хочется, то можно создавать окно динамически.
Можно создавать окно-суперкласс от lisview, и ловить reflection от родителя.
Или перед созданием окна делать сабклассинг родителя и ловить нужное сообщение.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.