Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CDialogBar 
:(
    Опции темы
vinter
Дата 31.8.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



Можно ли прикрепит диалог созданный не в ресурсах??
Я пытаюсь сделать так
Код

       CColorDialog dlg;
    CHOOSECOLOR dlgParam;
    dlgParam.lpTemplateName = "Цвета";
    //dlg.DoModal();
    CChildFrame::m_Color = dlg.GetColor();
    CreateDialogBar(dlgParam.lpTemplateName);

ф-ия создания Dialogbar
Код

int CMainFrame::CreateDialogBar(LPCTSTR lpTemplateName)
{
    CDialogBar DlgBar;
    if(!DlgBar.Create(this, lpTemplateName, CBRS_LEFT, ID_DLGBAR))
        return -1;
    return 1;
}

Выкидывает сюда
Код

    ASSERT(FALSE);          // invalid dialog template name
        PostNcDestroy();        // cleanup if Create fails too soon
        return FALSE;

Вот, не знаю че делать smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 31.8.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(vinter @  31.8.2006,  14:55 Найти цитируемый пост)
Вот, не знаю че делать 

Не делать так. Первый твой фрагмент кода - полная ересь.
Можно создать диалог, минуя ресурсы, но для этого нужно сгенерировать в памяти реальный DLGTEMPLATE.
Так что сформулируй задачу точнее.




--------------------
...
PM   Вверх
vinter
Дата 31.8.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



Цитата

 Первый твой фрагмент кода - полная ересь.

Почему??? диалог же создается...
Цитата

Так что сформулируй задачу точнее.

Мне надо создать диалог минуя ресурсы, чтобы потом прикрепить его к CDialogBar..



--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 1.9.2006, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Вот поэтому:
Цитата(vinter @  31.8.2006,  14:55 Найти цитируемый пост)

dlgParam.lpTemplateName = "Цвета";
CreateDialogBar(dlgParam.lpTemplateName);

Должен быть реальный шаблон, существующий. А шаблона "Цвета" нет в ресурсах, отсюда и ругань при выполнении.

Диалог создается внутри API, к шаблону доступа нет.

Цитата(vinter @  31.8.2006,  18:41 Найти цитируемый пост)
Мне надо создать диалог минуя ресурсы, чтобы потом прикрепить его к CDialogBar..

1й способ: сгененерировать шаблон в памяти (z уже говорила, DLGTEMPLATE)
2й способ: создать пустую панль (по пустому шаблону из ресурсов), и накидать туда контролов динамически, на OnCreate.

Ты что, хочешь использовать "готовый" шаблон стандартного диалога выбора цветов? Не выйдет. Да и в чем проблема, нарисовать шаблон самому? Функциональность то все равно ручками придется прописывать.



--------------------
...
PM   Вверх
vinter
Дата 4.9.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



создал блок диалога в памяти, а как теперь привязать его к какому- нибудь идентификатору???


--------------------
Мой блог
PM MAIL WWW   Вверх
vinter
Дата 4.9.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



И еще вопрос.. Как на этом диалоге теперь контролы создавать??? Ведь он как бы еще не создан(как я понимаю smile )...Но как то ведь можно??


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 4.9.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(vinter @  4.9.2006,  15:48 Найти цитируемый пост)
создал блок диалога в памяти, а как теперь привязать его к какому- нибудь идентификатору??? 

Что создал? DLGTEMPLATE? И зачем тебе теперь идентификатор?
Цитата(vinter @  4.9.2006,  16:50 Найти цитируемый пост)
 Как на этом диалоге теперь контролы создавать??? 

Если ты про DLGTEMPLATE, так в нем описания контролов и содержатся.



--------------------
...
PM   Вверх
vinter
Дата 4.9.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



Цитата

Что создал? DLGTEMPLATE? И зачем тебе теперь идентификатор?

Так че то не понятно как теперь его к DialogBar привязать... smile 
Цитата

Если ты про DLGTEMPLATE, так в нем описания контролов и содержатся.

Да вот только где контролы брать, при создании у них надо указывать родителя... smile 
на всякий случай выкладываю как создавал диалог..
*.сpp
Код

#include "stdafx.h"
#include ".\dlgcolor.h"

CMemory::CMemory(void)
{
    CRect rect(40, 10, 200, 35);
    m_dlgItems[0].Initialize(CItem::BUTTONOK, ID_BUTTON_OK, &rect, _T("Согласен"));
    SetRect(&rect, 40, 32, 200, 96);
    m_dlgItems[1].Initialize(CItem::BUTTONCANCEL, ID_BUTTON_CANCEL, &rect, _T("Отмена"));
    m_dlgMemory.cx = 240; 
    m_dlgMemory.cy = 104;
    m_dlgMemory.style = WS_CAPTION | WS_VISIBLE | WS_DLGFRAME | WS_POPUP | 
        DS_MODALFRAME |DS_SETFONT | WS_SYSMENU;
    m_dlgMemory.dwExtendedStyle = 0;
    m_dlgMemory.x = 0;
    m_dlgMemory.y = 0;
    m_dlgMemory.cdit = 0;
}

CMemory::~CMemory(void)
{
}

void CMemory::ShowDlg()
{
    
    WCHAR szBoxTitle[] = L"Шаблон Блока диалога в памяти";
    WCHAR szFontName[] = L"Arial";
    int nBufferSize = sizeof(DLGTEMPLATE) + 2*sizeof(WORD)
        + sizeof(szBoxTitle) + sizeof(szFontName) + sizeof(WORD);
    nBufferSize = (nBufferSize + 3) & ~3;
    for(int i = 0; i<2; i++)
    {
        int nItemLength = sizeof(DLGITEMTEMPLATE) + 3*sizeof(WORD) +
            (m_dlgItems[i].m_strTitle.GetLength() + 1) * sizeof(WCHAR);
        if(i != 1)
            nItemLength = (nItemLength + 3) & ~3;
        nBufferSize += nItemLength;
    }
    HLOCAL hLocal = LocalAlloc(LHND, nBufferSize);
    if(hLocal == NULL)
        TRACE0(_T("Память выделена неккоректно, или не выделена вообще!"));
    BYTE *pBuffer = (BYTE*)LocalLock(hLocal);
    if(*pBuffer = NULL)
        LocalFree(hLocal);
    BYTE *pBufferDest = pBuffer;
    memcpy(pBufferDest, &m_dlgMemory, sizeof(DLGTEMPLATE));
    pBufferDest += sizeof(DLGTEMPLATE);
    *(WORD *)pBufferDest = 0;
    *(WORD *)pBufferDest = 0;
    pBufferDest += 2*sizeof(WORD);
    memcpy(pBufferDest, szBoxTitle, sizeof(szBoxTitle));
    pBufferDest += sizeof(szBoxTitle);
    *(WORD *)pBufferDest = 12;
    pBufferDest += sizeof(WORD);
    memcpy(pBufferDest, szFontName, sizeof(szFontName));
    pBufferDest += sizeof(szFontName);

    for(int    i=0; i<2; i++)
    {
        pBufferDest = (BYTE*)(((DWORD)pBufferDest + 3) & ~3);
        memcpy(pBufferDest, &m_dlgItems[i].m_ctrItem, sizeof(DLGITEMTEMPLATE));
        pBufferDest += sizeof(DLGITEMTEMPLATE);
        *(WORD *)pBufferDest = 0xFFFF;
        pBufferDest += sizeof(WORD);
        *(WORD *)pBufferDest = m_dlgItems[i].m_ctrType;
        pBufferDest += sizeof(WORD);
        WCHAR *pwcCaption;
        int nCaptionLength;
        nCaptionLength = m_dlgItems[i].m_strTitle.GetLength()    + 1; 
        pwcCaption = new WCHAR[nCaptionLength];
        nCaptionLength = MultiByteToWideChar(CP_ACP, 0, m_dlgItems[i].m_strTitle,
            -1, pwcCaption, nCaptionLength); 
        ASSERT(nCaptionLength > 0);
        memcpy(pBufferDest, pwcCaption, nCaptionLength * sizeof(WCHAR));
        pBufferDest += nCaptionLength * sizeof(WCHAR);
        delete []pwcCaption;
        *(WORD *)pBufferDest = 0;
        pBufferDest += sizeof(WORD);
    }
    ASSERT(pBufferDest - pBuffer == nBufferSize);
    CDialog dlg;
    dlg.InitModalIndirect((DLGTEMPLATE *)pBuffer);
    dlg.DoModal();
    LocalUnlock(hLocal);
    LocalFree(hLocal);
}

CItem::CItem()
{
}

CItem::~CItem(void)
{
}
void CItem::Initialize(enum ctrType cType, UINT nID, CRect *pRect, LPCTSTR pszCaption)
{
    m_ctrType = cType;
    if(pRect != NULL)
    {
        m_ctrItem.x = (short)pRect->left;
        m_ctrItem.y = (short)pRect->top;
        m_ctrItem.cx = (short)pRect->Width();
        m_ctrItem.cy = (short)pRect->Height();
    }
    else
    {
        m_ctrItem.x = 0;
        m_ctrItem.y = 0;
        m_ctrItem.cx = 20;
        m_ctrItem.cy = 20;
    }
    m_ctrItem.dwExtendedStyle = 0;
    m_ctrItem.id = nID;
    switch(m_ctrType)
    {
    case BUTTONOK:
        m_ctrItem.style = WS_CHILD | WS_VISIBLE;
        break;
    case BUTTONCANCEL:
        m_ctrItem.style = WS_CHILD | WS_VISIBLE;
        break;
    default:
        ASSERT(FALSE);
    }
    m_strTitle = (pszCaption == NULL) ? _T("") : pszCaption;
}


*.h
Код

#pragma once
#include "resource.h"

class CItem
{
public:
    DLGITEMTEMPLATE m_ctrItem;
    enum ctrType {BUTTONOK = 0x0080, BUTTONCANCEL };
    ctrType m_ctrType;
    CString m_strTitle;
public:
    CItem();
    ~CItem(void);
public:
    void Initialize(enum ctrType cType, UINT nID, CRect *pRect = NULL, LPCTSTR pszCaption = NULL);
};


class CMemory
{
public:
    DLGTEMPLATE m_dlgMemory;
    CItem m_dlgItems[2];
public:
    CMemory(void);
    ~CMemory(void);
public:
    void ShowDlg();
};





--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 5.9.2006, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



1) Тебе нужен DLGTEMPLATE, а не DLGITEMTEMPLATE (первый содержит вторые, и все это должно располагаться в одном блоке памяти). 

2) Чтобы создать диалог по шаблону, есть функция CreateDlgIndirect. К сожалению, готовой функции у DialogBar для этого нет, придется написать самому. Для этого спиши слова у функции CDialogBar::Create, но вместо вызова CreateDlg, поставь CreateDlgIndirect, ну и другие правки, связанныем отсутствием идентификатора - например, данных для инициализации у тебя не будет.

В архиве класс CDlgTemplate, который оборачивает шаблон и умеет создавать непрерывный блок DLGTEMPLATE.
А вот пример использования (заполнения). Не забудь, что координаты и размеры элементов в шаблоне диалоговые, а не пиксельные. Здесь создается что-то вроде таблички для редактирования атрибутов: для каждого элемента создается статик + едит.
Код

LPDLGTEMPLATE CBlkAttrDlg::CreateTemplate (int nWidth) 
{
    // ширина шаблона определяется заданной величиной за вычетом линейки прокрутки;
    // длина - количеством полей;

    nWidth -= GetSystemMetrics (SM_CXVSCROLL);
    CSize sz(nWidth, nWidth);
    ScrToDlg ((LPPOINT)&sz);

    int nCtrlNmb = m_nAttrNmb * 2;
    CDlgTemplate TemplObj(sz, WS_CHILD|DS_CONTROL, nCtrlNmb, 0, NULL);

    CRect rField[2];
    rField[0].SetRect (6, 3, 106, 15);
    rField[1].SetRect (108, 3, 236, 15);

    WORD    wClass;
    DWORD      dwStyle = WS_VISIBLE;
    UINT      nID;
    CString sTitle;
    for (int i=0, nBlk=0; i < nCtrlNmb; i++) {
        int nClmn = i%2, nRow = i/2;
        while (nBlk < m_nAttrNmb && m_AttrArray[nBlk].wFlags & ATTR_PERM) nBlk++;
        if (nBlk >= m_nAttrNmb)
            break;
        switch (nClmn) {
            case 0:        // имя поля
                wClass = C_STATIC;
                dwStyle = WS_VISIBLE|WS_GROUP|SS_LEFT|SS_CENTERIMAGE;
                nID = -1;
                sTitle.Format ("%s...........................................................................",m_AttrArray[nBlk].sPrompt);
                break;
            case 1:        // значение поля
                wClass = C_EDIT;
                dwStyle = WS_VISIBLE|WS_TABSTOP|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL;
                if (m_bReadOnly) dwStyle |= ES_READONLY;
                nID = IDC_FLDVALUE_FIRST + nRow;
                if (m_AttrArray[nBlk].sDefVal.IsEmpty())
                    m_AttrArray[nBlk].sDefVal = "?";
                sTitle = m_AttrArray[nBlk++].sDefVal;
                sTitle.OemToAnsi();
                break;
        }
        TemplObj.m_Items[i].InitItem (wClass, nID, dwStyle, rField[nClmn], 0, sTitle);
        rField[nClmn].OffsetRect(0, 15);
    }

    // модифицируем высоту шаблона в соответствии с числом полей
    TemplObj.m_Template.cy = rField[0].bottom - 10;

    return TemplObj.CreateTemplate();
}


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  DlgTempl.rar 2,73 Kb


--------------------
...
PM   Вверх
vinter
Дата 6.9.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



Цитата

Для этого спиши слова у функции CDialogBar::Create,

Earnest что то не совсем понял ,что имеется ввиду, Откуда списать то??
А потом мне просто зыбыть ,что существует  CDialogBar ,и просто создавать диалог видоизмененной ф-ией CDialogBar'а??
 



--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 7.9.2006, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Из кода MFC конечно. Про диалог-бар забывать не надо - ведь тебе нужна его функциональность, раз уж ты выбрал его в качестве основы? Нужно написать свой вариант создания, вот и все. Если диалог-бар для тебя не принципиален, то используй просто немодальный диалог: у CDialog есть функция создания по шаблону.


--------------------
...
PM   Вверх
vinter
Дата 7.9.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



скопировал ф-ию, немного подредактировал и вот что получилось:
Код

BOOL CDlgBar::CreateDialg(CWnd* pParentWnd,BYTE *pBuffer,UINT nStyle, UINT nID)
{
    ASSERT(pParentWnd != NULL);    
    // allow chance to modify styles
    m_dwStyle = (nStyle & CBRS_ALL);
    CREATESTRUCT cs;
    memset(&cs, 0, sizeof(cs));
    //cs.lpszClass = _afxWndControlBar;
    cs.style = (DWORD)nStyle | WS_CHILD;
    cs.hMenu = (HMENU)(UINT_PTR)nID;
    cs.hInstance = AfxGetInstanceHandle();
    cs.hwndParent = pParentWnd->GetSafeHwnd();
    if (!PreCreateWindow(cs))
        return FALSE;
    
    // initialize common controls
    //VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
//    AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
    BOOL bSuccess = CWnd::CreateDlgIndirect((DLGTEMPLATE *)pBuffer, pParentWnd, cs.hInstance);

    if (!bSuccess)
        return FALSE;
    // dialog template MUST specify that the dialog
    //  is an invisible child window
    SetDlgCtrlID(nID);
    CRect rect;
    GetWindowRect(&rect);
    m_sizeDefault = rect.Size();    // set fixed size
    // force WS_CLIPSIBLINGS
    ModifyStyle(0, WS_CLIPSIBLINGS);
    // force the size to zero - resizing bar will occur later
    SetWindowPos(NULL, 0, 0, 200, 200, SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);
    return TRUE;
}

вызываю так
Код

void CMainFrame::OnDialogColor()
{
    CMemory dlg;
    dlg.ShowDlg();//Здесь создается шаблон
    /*CDialog dlg1;
    dlg1.InitModalIndirect((DLGTEMPLATE*)CMainFrame::pBufferDlg);//, this, NULL);
    dlg1.DoModal();*/
    CDlgBar dlgBar;
    dlgBar.CreateDialg(this, pBufferDlg, 0, ID_DLGBAR);
    
}

Ошибок не возникает, но и диалог не появляется...Почему такое происходит? Из основной ф-ии вроде ничего связанного с отображением  не удалял

Добавлено @ 14:29 
Кстати ,такое впечатление что он появляется, и тут же исчезает. Потому что заметно какое-то мигание когда пытаешься его создать...


--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 8.9.2006, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Глядя на код сказать не могу... Могу подсказать варианты, куда двигаться.
1) Попробовать таким образом создать немодальный диалог (CDialog), с помощью готовой функции - исключить ошибки, связанные с шаблоном.
2) Посмотреть Спаем, панель есть, но не видна, или его таки уже нет (смотреть детей окна, куда ты помещаешь панель).
3) Поставить обработчики на WM_SHOWWINDOW и WM_DESTROY, посмотреть по стеку почему это посылается (не факт, что получится). Это конечно, если сама функция создания отдебажена...
Ты, кстати, стиль WS_CHILD не забываешь перед созданием поставить? Что-то не видно в коде...


--------------------
...
PM   Вверх
vinter
Дата 10.9.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



написал ф-ию обраьотчик WM_SHOWWINDOW, так вот при отладке он в эту ф-ию заходит, т.е все нормально , в этот же момент spy нормально видит мой диалог, вот только потом он куда-то исчезает smile  smile 
в OnDestroy он не заходит...
Цитата

Ты, кстати, стиль WS_CHILD не забываешь перед созданием поставить? Что-то не видно в коде...

забывал, но теперь поставил.. smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Dart
Дата 10.9.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 26.6.2006
Где: Саратов, РФ

Репутация: 2
Всего: 2



vinter, А зачем именно без ресурсов?
Тут мы недавно похожую тему обсуждали: о Property Pages
Я после этого 2 дня убил - пытался все таки докопаться. Ни фига  smile  - DLGTEMPLATE создавать для диалога надо. В моём-то случае это было оправдано - мне надо было разместить на щите динамическое количество страниц, состоящих из одного контрола.

А в твоем зачем?
Не проще ли все таки руками создать в ресурсах и не париться.
Диалог бар - он и есть диалог бар.

P.S. А в конце концов я создал для такого случая один диалог без контролов вообще, а все необходимые контролы создал динамически.
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.