Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > создание тулбара


Автор: Loginanton 10.11.2009, 07:59
в качестве главного окна программы использую диалог. в ресурсах задаю для диалога контрол тулбар, но почему то тулбар не отображается. помогите пожалуйста, бьюсь с этой проблемой уже долго.
dialog.cpp:
Код
#include <windows.h>
#include <dialog.h>
#include <commctrl.h>
// переменные
HINSTANCE h; // хендл приложения
HWND hw; // хендл окна
int nresult; // код окончания программы
INITCOMMONCONTROLSEX cc;

TBBUTTON tbb[3];
TBADDBITMAP tbab;

int __stdcall DlgProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp)
{
    switch(msg)
    {
        case WM_CLOSE: // нажат крестик или alt+F4
            SendMessage(hw,WM_COMMAND,IDM_EXIT,0);
            return 1;
        case WM_COMMAND: // сообщения от меню и тулбара
            switch(LOWORD(wp))
            {
                case IDM_EXIT: // выход
                    EndDialog(hw,nresult);
                    return 1;
            }
        case WM_SIZE: // изменение размера окна
            SendMessage(GetDlgItem(hw,IDC_STATUS),WM_SIZE,0,0);
            return 1;
        case WM_INITDIALOG: // создание диалога
            tbab.hInst = HINST_COMMCTRL;
            tbab.nID = IDB_STD_SMALL_COLOR;
            SendMessage(GetDlgItem(hw,IDC_TOOLBAR), TB_ADDBITMAP, 0, (LPARAM)&tbab);
            ZeroMemory(tbb, sizeof(tbb));
            tbb[0].iBitmap = STD_FILENEW;
            tbb[0].fsState = TBSTATE_ENABLED;
            tbb[0].fsStyle = TBSTYLE_BUTTON;
            tbb[0].idCommand = IDM_FILE_NEW;
            tbb[1].iBitmap = STD_FILEOPEN;
            tbb[1].fsState = TBSTATE_ENABLED;
            tbb[1].fsStyle = TBSTYLE_BUTTON;
            tbb[1].idCommand = IDM_FILE_OPEN;
            tbb[2].iBitmap = STD_FILESAVE;
            tbb[2].fsState = TBSTATE_ENABLED;
            tbb[2].fsStyle = TBSTYLE_BUTTON;
            tbb[2].idCommand = IDM_FILE_SAVEAS;
            SendMessage(GetDlgItem(hw,IDC_TOOLBAR), TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
            return 1;
    }
    return 0;
}

int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    h = GetModuleHandle(0); // индусам передаём привет
    /* инициализация контролов */
    cc.dwSize = sizeof(INITCOMMONCONTROLSEX);
    cc.dwICC = ICC_BAR_CLASSES;    
    InitCommonControlsEx(&cc);
    /* создание главного окна */
    DialogBoxParam(h,"tmpl",hw,DlgProc,0);
    return nresult;
}
dialog.rc:
Код
#include <dialog.h>

tmpl DIALOG 50,50,100,100
STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
CAPTION "ImgView"
{
    CONTROL "",IDC_TOOLBAR,TOOLBARCLASSNAME,WS_CHILD|WS_TABSTOP|CCS_ADJUSTABLE|CCS_NODIVIDER|CCS_NOPARENTALIGN,0,0,100,0
    CONTROL "",IDC_STATUS,"msctls_statusbar32",0,0,0,0,0
}
dialog.h:
Код
#define IDM_EXIT 0
#define IDC_STATUS 1
#define IDC_TOOLBAR 2
#define IDM_FILE_NEW 3
#define IDM_FILE_OPEN 4
#define IDM_FILE_SAVEAS 5

Автор: Earnest 10.11.2009, 08:25
Скорее всего, тулбар сам не может разместиться. Посмотри Спаем, какие у него размеры. То, что ты задаешь в ресурсах, ему до лампочки. Там ведь нет загрузки кнопок (при создании). А тулбар определяет свой размер исходя из кнопок.

Так что проще все делать руками, динамически.

Автор: Loginanton 11.11.2009, 02:41
а не подскажите как посмотреть размер? никогда просто не пользовался spy++ и в интернете не нахожу

Автор: Earnest 11.11.2009, 09:18
Spy - это утилита, которая входит в набор VisualStudio. А смотреть просто: наводишь на окно, смотришь свойства.

Автор: Mikl_ 12.11.2009, 11:13
Loginanton, 
пример тулбара на ассемблере nasm под WinXP

Автор: Loginanton 28.11.2009, 06:28
пытаюсь добавить свои изображения на кнопки тулбара. но изображение добавляется только на первую кнопку. помогите пожалуйста.
Код

CreateWindowEx(0,TOOLBARCLASSNAME,0,WS_CHILD|WS_VISIBLE,0,0,0,0,hw,0,h,0);
SendMessage(ht, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
TBADDBITMAP tbab;
tbab.hInst = 0;
tbab.nID = (UINT_PTR)LoadBitmap(h,"LOL");
LRESULT iImageOffset = SendMessage(ht, TB_ADDBITMAP, 0, (LPARAM)&tbab);
TBBUTTON tbb[4];
ZeroMemory(tbb, sizeof(tbb));
tbb[0].iBitmap = iImageOffset + 0;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_BUTTON;
tbb[0].idCommand = IDM_OPEN;
tbb[1].iBitmap = iImageOffset + 1;
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = TBSTYLE_BUTTON;
tbb[1].idCommand = IDM_SAVE;
tbb[2].iBitmap = iImageOffset + 2;
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = TBSTYLE_BUTTON;
tbb[2].idCommand = IDM_SAVE;
tbb[3].iBitmap = iImageOffset + 3;
tbb[3].fsState = TBSTATE_ENABLED;
tbb[3].fsStyle = TBSTYLE_BUTTON;
tbb[3].idCommand = IDM_SAVE;
SendMessage(ht, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
ресурс:
Код
LOL BITMAP "tb.bmp"
Без iImageOffset тоже самое. А если писать так:
Код
tbab.hInst = h;
tbab.nID = LOL;
 то выдаёт ошибку (VS2008) что LOL неизвестный индефикатор

Автор: Loginanton 28.11.2009, 10:11
уже сам понял ошибку: надо писать так SendMessage(ht, TB_ADDBITMAP, 4, (LPARAM)&tbab);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)