HRESULT CDockingTabFrame::AddTabWindow(INT_PTR hWnd, BSTR bstrName, VARIANT vPict, INT_PTR *phHandle) { if (NULL == phHandle) return E_POINTER; *phHandle = NULL; USES_CONVERSION; COM_TRY { if (SUCCEEDED(FindTabWindow(bstrName, phHandle)) && hWnd == *phHandle) return S_FALSE; // existierte bereits *phHandle = NULL; // doch nichts // neue TablaschenDaten erzeugen _ASSERTE(::IsWindow(reinterpret_cast<HWND>(hWnd))); CTabData *pTabData = new CTabData; CWnd *pWnd = CWnd::FromHandlePermanent(reinterpret_cast<HWND>(hWnd)); if (NULL == pWnd) { // hWnd ist kein MFC-Fenster pWnd = new CWnd; pWnd -> Attach(reinterpret_cast<HWND>(hWnd)); // trägt hWnd in CWndMap ein pTabData -> m_fIsAttached = true; pTabData -> m_pWnd = pWnd; pTabData -> m_hOldParentWnd = ::GetParent(reinterpret_cast<HWND>(hWnd)); pWnd -> SetParent(&m_wndTab); } else { pTabData -> m_fIsAttached = false; pTabData -> m_pWnd = pWnd; pTabData -> m_hOldParentWnd = NULL; } // erzeugen der TabLasche, speichern der eigenen Daten SECTab *pTab = m_wndTab.AddTab(pWnd, OLE2A(bstrName)); pTab -> m_pExtra = pTabData; // ggf. Bildchen hinzufügen WPictureDisp PictDisp; if (SUCCEEDED(RetrievePicture(vPict, PictDisp.ppi()))) { CPicture Pict (PictDisp, false); _ASSERTE(NULL != Pict.GetHandle()); m_wndTab.SetTabIcon(m_wndTab.GetTabCount()-1, reinterpret_cast<HICON>(Pict.GetHandle())); } // Erfolg: Fensterhandle wieder zurückliefern *phHandle = hWnd; } COM_CATCH; return S_OK; }
STDMETHODIMP CToolBarButton::GetImage (long *phBitmap, int *piCnt, int *piOffset) { if (NULL == phBitmap) return E_POINTER; if (BUTTONSTYLE_SEPARATOR == m_tb.fsStyle) return E_FAIL; // Separatoren haben keine Bitmap CPicture Pict (m_PictDisp, false); ATLTRY(*phBitmap = Pict.GetHandle()); if (NULL != piCnt) *piCnt = m_iCnt; if (NULL != piOffset) *piOffset = m_iOffset; return (NULL != *phBitmap) ? NOERROR : E_FAIL; }