Makale numarası: 194294 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 2.2

Nasıl yapılır: araç çubukları ve araç ipuçları için ActiveX denetimleri ekleme

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Hepsini aç | Hepsini kapa

Özet

Bir ActiveX denetimi (CToolBar sınıfı) bir araç çubuğu, bir alt pencere adı olabilir. Bu makalede, bu tür bir araç çubuğu oluşturmak için bir yol gösterir ve araç ipuçları için nasıl, araç çubuğunu pencerede ayrıca düğmeleri.

Daha fazla bilgi

Visual C++, bir araç çubuğu oluşturmak için kullanabileceğiniz iki yöntem sağlar. Makale desribes kaynak düzenleyici kullanarak bir araç çubuğu kaynak oluşturma. Bir bit eşlem kaynak zaten varsa, lütfen bit eşlem kaynağınız bir araç çubuğu kaynağına dönüştürmek için "araç dönüştürme bit eşlemler için çubukları" çevrimiçi belgelerine bakın.

Adımları aşağıda gösterilmektedir:

  1. Bir MFC ActiveX denetimi oluşturmak için MFC ActiveX Denetim Sihirbazı'nı kullanın.
  2. Bir araç çubuğu kaynak denetim projesi oluşturun.
  3. Bir araç ipucu dize kaynağı her düğmenin araç ekleyin. Bu araç ipucu dize kaynakları TTN_NEEDTEXT bildirim kodu işleyicisinde yüklenmeyecektir.
  4. WH_GETMESSAGE kanca geri arama işlevi, ActiveX denetimi-türetilmiş sınıf ekleyin. Kanca işlemi uygulamanın PreTranslateMessage() çağrılıyor sorumlu; Bu, araç ipuçları'nı etkinleştirir ve FilterToolTipMessage() çağrısına neden olur. ActiveX denetimi bulunan hiçbir ileti pump yalnızca bir inproc sunucu gibi [ASCII 151] olduğundan BIR kanca işlemi gerekiyor:
          HHOOK hHook = NULL;
    
          // Hook procedure for WH_GETMESSAGE hook type.
          LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM
             lParam)
          {
            // Switch the module state for the correct handle to be used.
            AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    
            // If this is a keystrokes message, translate it in controls'
            // PreTranslateMessage().
            LPMSG lpMsg = (LPMSG) lParam;
    
            if( (nCode >= 0) &&
              PM_REMOVE == wParam &&
              AfxGetApp()->PreTranslateMessage(lpMsg))
            {
               lpMsg->message = WM_NULL;
               lpMsg->lParam = 0L;
               lpMsg->wParam = 0;
            }
    
    
           // Passes the hook information to the next hook procedure in
           // the current hook chain.
           return ::CallNextHookEx(hHook, nCode, wParam, lParam);
          }
    					
  5. ActiveX denetiminin bir alt pencere araç çubuğu penceresi (bir CToolBar sınıfı) oluşturun. Bu düzeltme eki WM_CREATE iletiye yanıt olarak yapılır. Buna ek olarak, ileti işleyicisi WM_CREATE de WH_GETMESSAGE kanca işlemi'ni yüklemek için uygun bir yerdir.
          int CCToolBarCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {
             if (COleControl::OnCreate(lpCreateStruct) == -1)
                return -1;
    
             // Create a CToolBar window which is a child of ActiveX control.
             if (!m_ToolBar.Create(this,
                   WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS) ||
                  !m_ToolBar.LoadToolBar(IDR_TOOLBAR))
                {
                   TRACE0("Failed to create toolbar\n");
                   return -1;      // fail to create
                }
    
             // Toolbar has to have TBSTYLE_TOOLTIPS style. Otherwise,
             // notification handler for TTN_NEXTTEXT won't be called.
             m_ToolBar.ModifyStyle (0, TBSTYLE_TOOLTIPS);
    
             // Move the toolbar so it is VISIBLE on the screen.
             CRect rc;
             GetClientRect(&rc);
             rc.bottom = rc.top + 34;
             m_ToolBar.MoveWindow(&rc);
    
             // Because ActiveX control is an inproc server, it does not have a
             // message pump. So, messages to child windows created by the
             // ActiveX control are not going to be received by the control.
             // Thus, we set up a message hook to call PreTranslateMessage().
             // This results in the call to FilterToolTipMessage(), which
             // activates tooltips.
             hHook = ::SetWindowsHookEx(
                WH_GETMESSAGE,
                GetMessageProc,
                AfxGetInstanceHandle(),
                GetCurrentThreadId());
             ASSERT (hHook);
    
             return 0;
          }
    					
  6. Iletinin kanca işlev WM_DESTROY iletiye yanıt olarak kaldırın:
          void CCToolBarCtrl::OnDestroy()
          {
             // Remove the message hook function.
             VERIFY (::UnhookWindowsHookEx (hHook));
    
             COleControl::OnDestroy();
          }
    					
  7. Bir Unicode bildirim kodu) (için TTN_NEEDTEXTW TTN_NEEDTEXTA (ANSI bildirim kodu için) bildirim işleyicisi için ActiveX denetimi türetilmiş sınıf ekleme. Bu bildirim kodu işleyicisinde görüntülenecek araç ipucu dize yüklenemedi:
          BEGIN_MESSAGE_MAP(CCToolBarCtrl, COleControl)
             //{{AFX_MSG_MAP(CCToolBarCtrl)
             ON_WM_CREATE()
             ON_COMMAND(ID_BUTTON1, OnButton1) // first button on toolbar
             ON_COMMAND(ID_BUTTON2, OnButton2) // second button on toolbar
             ON_COMMAND(ID_BUTTON3, OnButton3) // third button on toolbar
             ON_WM_DESTROY()
             //}}AFX_MSG_MAP
             ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
    
             // ANSI notification code (for Windows 95)
             ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
    
             // Unicode notification code (for NT)
             ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
          END_MESSAGE_MAP()
    
          // Notification handler for tooltips - determine which tooltip
          // string resource to be displayed.
          BOOL CCToolBarCtrl::OnToolTipNotify(
             UINT id, NMHDR * pNMHDR, LRESULT * pResult)
          {
             TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*) pNMHDR;
             TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*) pNMHDR;
    
             int strid = 0;
             switch (pNMHDR->idFrom)
             {
             case ID_BUTTON1:
                strid = IDS_BUTTON1;
                break;
    
             case ID_BUTTON2:
                strid = IDS_BUTTON2;
                break;
    
             case ID_BUTTON3:
                strid = IDS_BUTTON3;
                break;
             }
    
      if (strid)
           {
              *pResult = 0;
      
              CString str;
              str.LoadString(strid);
      
              #define _countof(array) (sizeof(array)/sizeof(array[0]))
      
              #ifndef _UNICODE
              if (pNMHDR->code == TTN_NEEDTEXTA)
              lstrcpyn(pTTTA->szText, str, _countof(pTTTA->szText));
              else
              _mbstowcsz(pTTTW->szText, str, _countof(pTTTW->szText));
              #else
              if (pNMHDR->code == TTN_NEEDTEXTA)
              _wcstombsz(pTTTA->szText, str, _countof(pTTTA->szText));
              else
              lstrcpyn(pTTTW->szText, str, _countof(pTTTW->szText));
              #endif
      
               return TRUE;
            }
    
             return FALSE;
          }
     
    					
(c) Microsoft Corporation 1998, tüm hakları saklıdır. Katkıyı Yeong Kah Tam, Microsoft Corporation.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2, Ne zaman ne ile kullanilir:
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Aboneliği
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
Anahtar Kelimeler: 
kbmt kbhowto kbmfcctrlbar kbtoolbar KB194294 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:194294  (http://support.microsoft.com/kb/194294/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.