Использовать рызне IDD в одном классе
От: Dark_2k  
Дата: 18.05.05 17:58
Оценка:
WTL. Есть странное желание использовать разные IDD в зависимости от некоторого условия.

Сейчас, диалог объявляем как обычно:


class CAboutDlg:
    public CDialogImpl<CAboutDlg>
    
{
public:
    enum {IDD = IDD_ABOUT};


проблема в том, что непонятно как потом этот IDD поменять?

Есть необходимость, в одном классе, использовать ресурсы с одними и теми же контролами, но немного по разному расположеными. Только вот как это поумнее и попроще сделать, пока не представляю?
---
Всего хорошего,
Евгений.
Re: Использовать рызне IDD в одном классе
От: migel  
Дата: 18.05.05 20:04
Оценка:
Здравствуйте, Dark_2k, Вы писали:

D_>WTL. Есть странное желание использовать разные IDD в зависимости от некоторого условия.


D_>Сейчас, диалог объявляем как обычно:



D_>
D_>class CAboutDlg:
D_>    public CDialogImpl<CAboutDlg>
    
D_>{
D_>public:
D_>    enum {IDD = IDD_ABOUT};
D_>


D_>проблема в том, что непонятно как потом этот IDD поменять?


D_>Есть необходимость, в одном классе, использовать ресурсы с одними и теми же контролами, но немного по разному расположеными. Только вот как это поумнее и попроще сделать, пока не представляю?

Попробу енум заменить переменной класса и инициализируй ее по мере надобности:
class CAboutDlg:
    public CDialogImpl<CAboutDlg>
    
{
public:
    CAboutDlg() : IDD(IDD_ABOUT){;}
DWORD    IDD;
}
... << RSDN@Home 1.1.4 beta 6a rev. 440>>
Re[2]: Использовать рызне IDD в одном классе
От: MNZ Россия  
Дата: 19.05.05 06:07
Оценка: +1
Здравствуйте, migel, Вы писали:

D_>>Есть необходимость, в одном классе, использовать ресурсы с одними и теми же контролами, но немного по разному расположеными. Только вот как это поумнее и попроще сделать, пока не представляю?

M>Попробу енум заменить переменной класса и инициализируй ее по мере надобности:
M>
M>class CAboutDlg:
M>    public CDialogImpl<CAboutDlg>
    
M>{
M>public:
M>    CAboutDlg() : IDD(IDD_ABOUT){;}
M>DWORD    IDD;
M>}
M>


А если во время компиляции, то
template <int t_IDD>
class CAboutDlg:
    public CDialogImpl<CAboutDlg>
    
{
public:
    enum {IDD = t_IDD};
}

и потом создавать
CAboutDlg<IDD_ABOUTBOX> dlg1;
CAboutDlg<IDD_MYCOOLABOUTBOX> dlg2;
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[2]: Использовать рызне IDD в одном классе
От: Dark_2k  
Дата: 19.05.05 08:05
Оценка:
Здравствуйте, migel, Вы писали:

Я пробовал подобным образом, не копмилируется. Не может привести тип в методе ::DoModal. При вызове DialogBoxParam(..., T::IDD, ...).


M>Попробу енум заменить переменной класса и инициализируй ее по мере надобности:

M>
M>class CAboutDlg:
M>    public CDialogImpl<CAboutDlg>
    
M>{
M>public:
M>    CAboutDlg() : IDD(IDD_ABOUT){;}
M>DWORD    IDD;
M>}
M>
---
Всего хорошего,
Евгений.
Re[3]: Использовать рызне IDD в одном классе
От: Dark_2k  
Дата: 19.05.05 08:07
Оценка:
Привет,

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

MNZ>А если во время компиляции, то

MNZ>[ccode]
MNZ>template <int t_IDD>
MNZ>class CAboutDlg:
MNZ> public CDialogImpl<CAboutDlg>
---
Всего хорошего,
Евгений.
Re[4]: Использовать рызне IDD в одном классе
От: MNZ Россия  
Дата: 19.05.05 09:11
Оценка:
Здравствуйте, Dark_2k, Вы писали:

D_>Так, конечно, работает, но есть одна неприятность — приходится тело функций переносить в заголовочные файлы, что не очень удобно.

D_>Другие варианты есть?

Вряд ли. А что вы хотели? Издержки шаблонов на текущий момент. Тут варианта два: либо реализовывать все шаблоны в заголовочных файлах (на то они, собственно, и шаблоны), либо отказаться от шаблонов.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[5]: Использовать рызне IDD в одном классе
От: Dark_2k  
Дата: 19.05.05 09:58
Оценка:
Здравствуйте, MNZ, Вы писали:

Ну хотел то простого, — использовать немного разные диалоги в случае работы программы под Pocket PC или Smartphone.
Exeшник один.

MNZ>Вряд ли. А что вы хотели?
---
Всего хорошего,
Евгений.
Re[6]: Использовать рызне IDD в одном классе
От: Dark_2k  
Дата: 19.05.05 11:39
Оценка:
В общем, я поступил проще, добавил новый метод:


int DoModal2(HWND hWndParent, DWORD idd, LPARAM dwInitParam = NULL)
{
        ATLASSERT(m_hWnd == NULL);
        _Module.AddCreateWndData(&m_thunk.cd, this);
#ifdef _DEBUG
        m_bModal = true;
#endif // _DEBUG
        return ::DialogBoxParam(_Module.GetResourceInstance(), MAKEINTRESOURCE(idd),
                    hWndParent, (DLGPROC)StartDialogProc, dwInitParam);
}


Работает.
---
Всего хорошего,
Евгений.
Re[3]: Использовать рызне IDD в одном классе
От: migel  
Дата: 19.05.05 19:56
Оценка: 4 (1)
Здравствуйте, Dark_2k, Вы писали:

D_>Здравствуйте, migel, Вы писали:


D_>Я пробовал подобным образом, не копмилируется. Не может привести тип в методе ::DoModal. При вызове DialogBoxParam(..., T::IDD, ...).

class CAboutDlg:
    public CDialogImpl<CAboutDlg>
{
public:
    CAboutDlg() : IDD(IDD_ABOUT){;}
    static DWORD    IDD;
}

в cpp файле не забудь определить
DWORD CAboutDlg::IDD = IDD_COLOR;
... << RSDN@Home 1.1.4 beta 6a rev. 440>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.