Teď jste offline a čekáte, až se znova připojí internet.

Jak inicializovat podřízené ovládací prvky v odvozené CDialogBar

Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.

185672
Souhrn
Při vytváření jednoduchého CDialogBar, například jedna s pouze CButtons podobné MFC jeho náhledu není nutné odvodit z CDialogBar, protože nadřazený CControlBar přijímá oznamovací zprávy z libovolné podřízené ovládací prvky.

Však z složitější CDialogBar, pravděpodobně rozevíracím seznamem, stromu nebo ovládací prvek ActiveX může být užitečné odvodit z CDialogBar poskytují inicializace podřízené ovládací prvky.

Protože ClassWizard nepodporuje odvození třídy z CDialogBar, Tento článek obsahuje kroky potřebné k vytvoření třídy z CDialog a pak "převést" Třída CDialogBar.
Další informace
Spustit vytvořit třídy CDialog s podřízené ovládací prvky, které chcete použít. Třída CDialog transformaci do třídy CDialogBar pomocí devíti následující kroky:

  1. Změnit základní třídy z CDialog CDialogBar v deklaraci třídy. Nezapomeňte také změnit základní třídy v souboru cpp BEGIN_MESSAGE_MAP.
  2. Změnit konstruktor v h a cpp soubory. Také provést změnu DoDataExchange(). Níže jsou uvedeny tři položky změnit.

    Změnit následující z
          CMyDlgBar (CWnd* pParent = NULL);   // standard constructor      CMyDlgBar:: CMyDlgBar (CWnd* pParent /*=NULL*/)         : CDialog(CMyDlgBar::IDD, pParent)      {         ...      void CMyDlgBar::DoDataExchange(CDataExchange* pDX)      {         CDialog::DoDataExchange(pDX);         ...					
    následující:
          CMyDlgBar ();   // standard constructor      CMyDlgBar:: CMyDlgBar ()      {         ...      void CMyDlgBar::DoDataExchange(CDataExchange* pDX)      {         CDialogBar::DoDataExchange(pDX);         ...					
    klíč transformace je převod virtuální členské funkce OnInitDialog() metody zprávy mapovány WM_INITDIALOG změnou metody OnInitDialog a přidáním popisovač ON_MESSAGE(). Pravděpodobně nemáte přepsání OnInitDialog(). Pokud tomu tak není, přidejte jedno před pokračováním.
  3. Odebrat "virtuální BOOL OnInitDialog();" z hlavičky třída a přidání "afx_msg LONG OnInitDialog (UINT, LONG);" v jeho místo. Například:
          class CMyDlgBar : public CDialogBar      {         ...      // Implementation      protected:         // Generated message map functions         //<AngularNoBind>{{</AngularNoBind>AFX_MSG(CMyDlgBar)         virtual BOOL OnInitDialog();                // <-Remove this line.         //}}AFX_MSG         afx_msg LONG OnInitDialog ( UINT, LONG );   // <-Add this line.         DECLARE_MESSAGE_MAP()      };						
    nyní, proveďte odpovídající změny v části implementace třídy.
  4. Přidat "ON_MESSAGE (WM_INITDIALOG, OnInitDialog);" mapy zpráva v souboru .CPP implementace. Například:
          BEGIN_MESSAGE_MAP(CMyDlgBar, CDialogBar)         //<AngularNoBind>{{</AngularNoBind>AFX_MSG_MAP(CMyDlgBar)         ...         //<AngularNoBind>}}</AngularNoBind>AFX_MSG_MAP         ON_MESSAGE(WM_INITDIALOG, OnInitDialog )    // <-- Add this line.      END_MESSAGE_MAP()						
    nyní, převést virtuální OnInitDialog() OnInitDialog() mapované zprávu.
  5. Aby převod OnInitDialog() následovně:
       Change the following:      BOOL CMyDlgBar::OnInitDialog()      {         CDialog::OnInitDialog();   // <-- Replace this line:            ...						
    následující:
    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;						
    the CDialogBar třídy nemá virtuální OnInitDialog() a volání proto nefunguje. UpdateData nazývá podtřídy nebo inicializovat žádné podřízené ovládací prvky.
  6. Přesvědčte se, zda dialogové okno pole prostředku styly následující:
    Styl: podřízené
    Boarder: žádný
    Viditelné: Nekontrolovaná
    Znovu v tomto okamžiku vše má byly připojeny k transformaci z třídy CDialog třídy CDialogBar pracovat správně. Nyní vytvořit a použít ji.
  7. Přidat instanci CDialogBar odvozené třídy odvozené CframeWnd (obvykle nazývá CMainFrame). Například:
          class CMainFrame : public CFrameWnd      {          ...          CMyDlgBar m_myDlgBar;          ...      };					
  8. Volání metody vytvoření pro m_myDlgBar proměnnou v metodě CFrameWnd::OnCreate() podobná následující:
          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         }         ...      }					
  9. Nakonec, pokud chcete podporovat dynamické ukotvení a změna velikosti CDialogBar přidejte následující řádky na konec 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;      }
Odkazy
Další informace naleznete následujícím článku znalostní databáze Microsoft Knowledge Base:
99161Jak odvozena od třídy není uveden v ClassWizard