Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ааа, как сделать нормальный ToolBar с картинками на WinAPI?

32K
18 февраля 2008 года
Hind
7 / / 15.02.2008
То, что имеется сейчас, ужасает - картинки показываются только при наведении курсора мыши на кнопку, и почему-то в 16-цветном виде.
Как сделать нормальные True Color битмапы на кнопках? Мне даже прозрачность не нужна.

Лучше всего было бы увидеть пример кода работающей панели с True Color картинками... Облазил весь инет - то, что нашел, не работает...

Вот текущая функция создания панели. Не обращайте внимания на текстовые строки - потом буду грузить из ресурсов, но сейчас нужно, чтобы заработало хоть как-то.
Код:
HWND CreateSimpleToolbar(HWND hWndParent)
{
    const int ImageListID = 0;
    const int numButtons = 3;
    const DWORD buttonStyles = BTNS_AUTOSIZE;

    HWND hWndToolbar = CreateWindowEx(0x80, TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_FLAT | WS_BORDER, 0, 0, 0, 0, hWndParent, NULL, hInst, NULL);
    if (hWndToolbar == NULL)
        return NULL;

    HIMAGELIST hImageList = ImageList_Create(75, 66, ILC_COLOR, numButtons, 0);

    BITMAP BNew = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_NEW));
    HBITMAP BOpen = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_OPEN));
    HBITMAP BSave = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SAVE));
    ImageList_Add(hImageList, BNew, NULL);
    ImageList_Add(hImageList, BOpen, NULL);
    ImageList_Add(hImageList, BSave, NULL);
    SendMessage(hWndToolbar, TB_SETHOTIMAGELIST, 0, (LPARAM)hImageList);

    TBBUTTON tbButtons[numButtons] =
    {
        { 0, IDM_NEW, TBSTATE_ENABLED,
        buttonStyles, {TBSTYLE_BUTTON}, 0, (INT_PTR)L"Новый" },
        { 1, IDM_OPEN, TBSTATE_ENABLED,
        buttonStyles, {TBSTYLE_BUTTON}, 0, (INT_PTR)L"Открыть"},
        { 2, IDM_SAVE, TBSTATE_ENABLED,
        buttonStyles, {TBSTYLE_BUTTON}, 0, (INT_PTR)L"Сохранить"}
    };

    SendMessage(hWndToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(75, 66));
    SendMessage(hWndToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(75, 66));
    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(hWndToolbar, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons);

    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar, TRUE);
    return hWndToolbar;
}
397
20 февраля 2008 года
SergPas
527 / / 03.02.2007
Ребят! Вы хоть иногда заглядывайте в разделы справки MSDN - там всё чётко написано: создавать панель инструментов нужно с использованием функции CreateToolBarEx.
Цитата:

HIMAGELIST hImageList = ImageList_Create(75, 66, ILC_COLOR, numButtons, 0);
BITMAP BNew = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_NEW));
HBITMAP BOpen = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_OPEN));
HBITMAP BSave = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SAVE));
ImageList_Add(hImageList, BNew, NULL);
ImageList_Add(hImageList, BOpen, NULL);
ImageList_Add(hImageList, BSave, NULL);


Создавать список изображений не надо... Все картинки для кнопок размещайте в файле ресурсов. Вообщем, см. MSDN...

32K
20 февраля 2008 года
Hind
7 / / 15.02.2008
CreateToolBarEx вроде бы устаревшая функция и рекомендуется использовать именно CreateWindowEx.

В принципе, я уже все сделал, нужно было лишь заменить ILC_COLOR на ILC_COLOR32 и TB_SETHOTIMAGELIST на TB_SETIMAGELIST.
А картинки я и так беру из ресурсов. Видно же в коде.

P.S. Я все время сейчас провожу в MSDN...
397
20 февраля 2008 года
SergPas
527 / / 03.02.2007
Цитата:
CreateToolBarEx вроде бы устаревшая функция и рекомендуется использовать именно CreateWindowEx.


А зачем использовать функция CreateWindowEx, затем посылать сообщения для добавления кнопок, изображений, создавать список изображений и т.д., когда можно воспользоваться готовой функцией CreateToolbarEx...

32K
22 февраля 2008 года
Hind
7 / / 15.02.2008
Новый трабл.

Не получается управлять кнопками тулбара (TB_CHECKBUTTON и TB_SETSTATE не работают).
 
Код:
SendMessage(hwndTBar, TB_CHECKBUTTON, (WPARAM)(int)3, (LPARAM)MAKELONG(TRUE, 0));
// или
SendMessage(hwndTBar, TB_SETSTATE, (WPARAM)(int)3, (LPARAM)MAKELONG(TBSTATE_PRESSED, 0));


Кнопка должна зажаться, но ничего не происходит. Сообщение успешно отправляется, в hwndTBar лежит хэндл тулбара. Прямо не знаю, что и думать.

UPD:
Решено. Нужно чекать кнопку по командному идентификатору, а не по номеру.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог