При создании простой CDialogBar, например с CButtons только аналогичные
для предварительного просмотра MFC необязательно должен быть производным от CDialogBar
так как родительский CControlBar получающую уведомления от
все дочерние элементы управления.
Однако в случае использования более сложных CDialogBar, который, возможно, перейти
поле со списком, treeview или элемент управления ActiveX может быть использована
является производным от CDialogBar для инициализации для дочерних элементов управления.
Поскольку ClassWizard не поддерживает производный класс CDialogBar, это
в статье показаны действия, необходимые для создания класса из класса CDialog и затем
«преобразовать» класса CDialogBar.
Для начала создания класса CDialog с дочерними элементами управления, которые требуется
с помощью. Можно преобразовать в классе CDialogBar с помощью класса CDialog
девять шагов:
- Изменение базового класса из класса CDialog CDialogBar в классе
объявление. Не забудьте также изменить базовый класс в
BEGIN_MESSAGE_MAP в CPP-файле.
- Измените конструктор в файлах .cpp и .h. Также убедитесь,
Измените значение на DoDataExchange(). Ниже приведены три элемента для изменения.
Изменение следующих
CMyDlgBar (CWnd* pParent = NULL); // standard constructor
CMyDlgBar:: CMyDlgBar (CWnd* pParent /*=NULL*/)
: CDialog(CMyDlgBar::IDD, pParent)
{
...
void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
...
Чтобы изменить следующим образом:
CMyDlgBar (); // standard constructor
CMyDlgBar:: CMyDlgBar ()
{
...
void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
...
Клавиша для преобразования является преобразование виртуального
Функция-член OnInitDialog() на сообщение WM_INITDIALOG сопоставления
метод, изменяя метод OnInitDialog или путем добавления
Обработчик ON_MESSAGE(). Вы не имеете переопределение метода OnInitDialog(). Если
Нет добавьте перед продолжением. - Удалить «виртуальный OnInitDialog() BOOL»; из заголовка класса и добавить
«afx_msg ДЛИННЫЙ OnInitDialog (UINT, LONG);» в том же месте. Например:
class CMyDlgBar : public CDialogBar
{
...
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CMyDlgBar)
virtual BOOL OnInitDialog(); // <-Remove this line.
//}}AFX_MSG
afx_msg LONG OnInitDialog ( UINT, LONG ); // <-Add this line.
DECLARE_MESSAGE_MAP()
};
Теперь в разделе реализации класса выполните соответствующий
изменения. - "on_message (wm_initdialog, oninitdialog);" Добавить к схеме сообщений в
.Реализация файл CPP. Например:
BEGIN_MESSAGE_MAP(CMyDlgBar, CDialogBar)
//{{AFX_MSG_MAP(CMyDlgBar)
...
//}}AFX_MSG_MAP
ON_MESSAGE(WM_INITDIALOG, OnInitDialog ) // <-- Add this line.
END_MESSAGE_MAP()
Теперь преобразуйте виртуальный OnInitDialog() для отображения сообщений
OnInitDialog(). - Сделать преобразование OnInitDialog() следующим образом:
Change the following:
BOOL CMyDlgBar::OnInitDialog()
{
CDialog::OnInitDialog(); // <-- Replace this line:
...
Чтобы изменить следующим образом:
LONG CMyDlgBar::OnInitDialog ( UINT wParam, LONG lParam)
{
// <-- with these lines. -->
BOOL bRet = HandleInitDialog(wParam, lParam);
if (!UpdateData(FALSE))
{
TRACE0("Warning: UpdateData failed during dialog init.\n");
}
...
return bRet;
Класс CDialogBar не содержит виртуальный OnInitDialog() и
Поэтому один вызов не будет работать. UpdateData вызывается для подкласса
или инициализации любого дочернего элемента управления. - Убедитесь, что стили ресурс диалогового окна поле следующее:
Стиль: дочерние
Границу: нет
Видимые: Неограниченный
Был на этом этапе все, что смог сделать
преобразование из класса CDialog класс CDialogBar работы
правильно. Теперь создавать и использовать его. - Добавить экземпляр производного CDialogBar для производного класса CframeWnd
класс (обычно называемые CMainFrame). Например:
class CMainFrame : public CFrameWnd
{
...
CMyDlgBar m_myDlgBar;
...
};
- Вызовите метод create для переменной m_myDlgBar в
CFrameWnd::OnCreate() метод, аналогичный следующему:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
if (!m_myDlgBar.Create(this, IDD_DLGBAR1, CBRS_LEFT,
IDD_DLGBAR1))
{
TRACE0("Failed to create dialog bar\n");
return -1; // fail to create
}
...
}
- Наконец Если требуется поддержка динамического закрепления и изменение размера
CDialogBar, добавьте следующие строки в конец
CMainFrame::OnCreate():
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
m_myDlgBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_myDlgBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_myDlgBar);
return 0;
}
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
99161
(http://support.microsoft.com/kb/99161/
)
Как производные от классов, не перечисленные в ClassWizard
Код статьи: 185672 - Последнее изменение :: 4 июня 2011 г. - Редакция: 4.0
Информация в данной статье относится к следующим продуктам.
- Microsoft Foundation Class Library 4.2 на следующих платформах
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
| kbhowto kbmfcctrlbar kbuidesign kbwizard kbmt KB185672 KbMtru |
Переведено с помощью машинного переводаВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:
185672
(http://support.microsoft.com/kb/185672/en-us/
)