📄 occmgr.cpp
字号:
}
BOOL COccManager::CreateDlgControls(CWnd* pWndParent, void* lpResource,
_AFX_OCC_DIALOG_INFO* pOccDlgInfo)
{
// if there are no OLE controls in this dialog, then there's nothing to do
if (pOccDlgInfo->m_pNewTemplate == NULL)
return TRUE;
ASSERT(pWndParent != NULL);
HWND hwParent = pWndParent->GetSafeHwnd();
BOOL bDialogEx = IsDialogEx(pOccDlgInfo->m_pNewTemplate);
BOOL bSuccess = TRUE;
if (lpResource != NULL)
{
ASSERT(pOccDlgInfo != NULL);
ASSERT(pOccDlgInfo->m_ppOleDlgItems != NULL);
DLGITEMTEMPLATE** ppOleDlgItems = pOccDlgInfo->m_ppOleDlgItems;
UNALIGNED WORD* lpnRes = (WORD*)lpResource;
int iItem = 0;
HWND hwAfter = HWND_TOP;
while (bSuccess && *lpnRes != 0)
{
WORD nIDC = *lpnRes++;
WORD nMsg = *lpnRes++;
DWORD dwLen = *((UNALIGNED DWORD*&)lpnRes)++;
#define WIN16_LB_ADDSTRING 0x0401
#define WIN16_CB_ADDSTRING 0x0403
ASSERT(nMsg == LB_ADDSTRING || nMsg == CB_ADDSTRING ||
nMsg == WIN16_LB_ADDSTRING || nMsg == WIN16_CB_ADDSTRING ||
nMsg == WM_OCC_LOADFROMSTREAM ||
nMsg == WM_OCC_LOADFROMSTREAM_EX ||
nMsg == WM_OCC_LOADFROMSTORAGE ||
nMsg == WM_OCC_LOADFROMSTORAGE_EX ||
nMsg == WM_OCC_INITNEW);
if (nMsg == WM_OCC_LOADFROMSTREAM ||
nMsg == WM_OCC_LOADFROMSTREAM_EX ||
nMsg == WM_OCC_LOADFROMSTORAGE ||
nMsg == WM_OCC_LOADFROMSTORAGE_EX ||
nMsg == WM_OCC_INITNEW)
{
// Locate the DLGITEMTEMPLATE for the new control, and the control
// that should precede it in z-order.
DLGITEMTEMPLATE* pDlgItem;
while (((pDlgItem = ppOleDlgItems[iItem++]) == NULL) &&
(pDlgItem != (DLGITEMTEMPLATE*)(-1)))
{
if (hwAfter == HWND_TOP)
hwAfter = GetWindow(hwParent, GW_CHILD);
else
hwAfter = GetWindow(hwAfter, GW_HWNDNEXT);
ASSERT(hwAfter != NULL); // enough non-OLE controls?
}
ASSERT(pDlgItem != NULL); // enough dialog item templates?
HWND hwNew = NULL;
if (pDlgItem != (DLGITEMTEMPLATE*)(-1))
{
#ifdef _DEBUG
WORD id = bDialogEx ?
(WORD)((DLGITEMTEMPLATEEX*)pDlgItem)->id :
pDlgItem->id;
ASSERT(id == nIDC); // make sure control IDs match!
#endif
// Create the OLE control now.
hwNew = CreateDlgControl(pWndParent, hwAfter, bDialogEx,
pDlgItem, nMsg, (BYTE*)lpnRes, dwLen);
}
if (hwNew != NULL)
{
if (bDialogEx)
SetWindowContextHelpId(hwNew,
((DLGITEMTEMPLATEEX*)pDlgItem)->helpID);
if (GetParent(hwNew) == hwParent)
hwAfter = hwNew;
}
else
bSuccess = FALSE;
}
// skip past data
lpnRes = (WORD*)((LPBYTE)lpnRes + (UINT)dwLen);
}
}
if (bSuccess)
{
// unfreeze events now that all controls are loaded
if (pWndParent->m_pCtrlCont != NULL)
pWndParent->m_pCtrlCont->FreezeAllEvents(FALSE);
BindControls(pWndParent);
}
return bSuccess;
}
void COccManager::BindControls(CWnd* pWndParent)
{
HWND hWnd;
COleControlSite* pSite;
if (pWndParent->m_pCtrlCont != NULL)
{
// Now initialize bound controls
POSITION pos = pWndParent->m_pCtrlCont->m_siteMap.GetStartPosition();
while (pos != NULL)
{
pWndParent->m_pCtrlCont->m_siteMap.GetNextAssoc(pos, (void*&)hWnd, (void*&)pSite);
// For each cursor bound property initialize pClientSite ptr and bind to DSC
CDataBoundProperty* pBinding = pSite->m_pBindings;
if(pBinding)
{
while(pBinding)
{
pBinding->SetClientSite(pSite);
if (pBinding->m_ctlid != 0)
{
CWnd* pWnd = pWndParent->GetDlgItem(pBinding->m_ctlid);
ASSERT(pWnd);
ASSERT(pWnd->m_pCtrlSite);
pBinding->SetDSCSite(pWnd->m_pCtrlSite);
}
pBinding = pSite->m_pBindings->GetNext();
}
}
// Bind default bound property
if (pSite->m_ctlidRowSource != NULL)
{
CWnd* pWnd = pWndParent->GetDlgItem(pSite->m_ctlidRowSource);
ASSERT(pWnd); // gotta be a legitimate control id
ASSERT(pWnd->m_pCtrlSite); // and it has to be an OLE Control
pWnd->m_pCtrlSite->EnableDSC();
ASSERT(pWnd->m_pCtrlSite->m_pDataSourceControl); // and a Data Source Control
pSite->m_pDSCSite = pWnd->m_pCtrlSite;
pWnd->m_pCtrlSite->m_pDataSourceControl->BindProp(pSite);
}
}
// Finally, set up bindings on all DataSource controls
pos = pWndParent->m_pCtrlCont->m_siteMap.GetStartPosition();
while (pos != NULL)
{
pWndParent->m_pCtrlCont->m_siteMap.GetNextAssoc(pos, (void*&)hWnd, (void*&)pSite);
if (pSite->m_pDataSourceControl)
pSite->m_pDataSourceControl->BindColumns();
}
}
}
HWND COccManager::CreateDlgControl(CWnd* pWndParent, HWND hwAfter,
BOOL bDialogEx, LPDLGITEMTEMPLATE pItem, WORD nMsg, BYTE* lpData, DWORD cb)
{
#ifndef OLE2ANSI
LPWSTR pszClass = (LPWSTR)(pItem + 1);
#else
LPSTR pszClass = (LPSTR)(pItem + 1);
#endif
DLGITEMTEMPLATE dlgItemTmp;
if (bDialogEx)
{
// We have an extended dialog template: copy relevant parts into an
// ordinary dialog template, because their layouts are different
DLGITEMTEMPLATEEX* pItemEx = (DLGITEMTEMPLATEEX*)pItem;
dlgItemTmp.style = pItemEx->style;
dlgItemTmp.dwExtendedStyle = pItemEx->exStyle;
dlgItemTmp.x = pItemEx->x;
dlgItemTmp.y = pItemEx->y;
dlgItemTmp.cx = pItemEx->cx;
dlgItemTmp.cy = pItemEx->cy;
dlgItemTmp.id = (WORD)pItemEx->id;
pItem = &dlgItemTmp;
#ifndef OLE2ANSI
pszClass = (LPWSTR)(pItemEx + 1);
#else
pszClass = (LPSTR)(pItemEx + 1);
#endif
}
CRect rect(pItem->x, pItem->y, pItem->x + pItem->cx, pItem->y + pItem->cy);
::MapDialogRect(pWndParent->m_hWnd, &rect);
BSTR bstrLicKey = NULL;
// extract license key data, if any
if (cb >= sizeof(ULONG))
{
ULONG cchLicKey = *(UNALIGNED ULONG*)lpData;
lpData += sizeof(ULONG);
cb -= sizeof(ULONG);
if (cchLicKey > 0)
{
bstrLicKey = SysAllocStringLen((LPCOLESTR)lpData, cchLicKey);
lpData += cchLicKey * sizeof(WCHAR);
cb -= cchLicKey * sizeof(WCHAR);
}
}
// If WM_OCC_INITNEW, we should have exhausted all of the data by now.
ASSERT((nMsg != WM_OCC_INITNEW) || (cb == 0));
CDataBoundProperty* pBindings = NULL;
CString strDataField;
WORD ctlidRowSource = 0;
DISPID defdispid = 0;
UINT dwType = 0;
if (nMsg == WM_OCC_LOADFROMSTREAM_EX ||
nMsg == WM_OCC_LOADFROMSTORAGE_EX)
{
// Read the size of the section
ULONG cbOffset = *(UNALIGNED ULONG*)lpData;
ULONG cbBindInfo = cbOffset - sizeof(DWORD);
lpData += sizeof(DWORD);
ULONG dwFlags = *(UNALIGNED ULONG*)lpData;
cbBindInfo -= sizeof(DWORD);
lpData += sizeof(DWORD);
ASSERT(dwFlags == 1);
// ULONG cbBinding = *(UNALIGNED ULONG*)lpData;
cbBindInfo -= sizeof(DWORD);
lpData += sizeof(DWORD);
while (cbBindInfo > 0)
{
DISPID dispid;
UWORD ctlid;
dispid = *(UNALIGNED DISPID *)lpData;
lpData += sizeof(DISPID);
cbBindInfo -= sizeof(DISPID);
ctlid = *(UNALIGNED WORD *)lpData;
lpData += sizeof(WORD);
cbBindInfo -= sizeof(WORD);
if(dispid == DISPID_DATASOURCE)
{
defdispid = *(UNALIGNED ULONG*)lpData;
cbBindInfo -= sizeof(DISPID);
lpData += sizeof(DISPID);
dwType = *(UNALIGNED ULONG*)lpData;
cbBindInfo -= sizeof(DWORD);
lpData += sizeof(DWORD);
ASSERT(*(UNALIGNED DISPID *)lpData == DISPID_DATAFIELD);
lpData += sizeof(DISPID);
cbBindInfo -= sizeof(DISPID);
// Skip the string length
lpData += sizeof(DWORD);
cbBindInfo -= sizeof(DWORD);
strDataField = (char *)lpData;
lpData += strDataField.GetLength()+1;
cbBindInfo -= strDataField.GetLength()+1;
ctlidRowSource = ctlid;
} else
pBindings = new CDataBoundProperty(pBindings, dispid, ctlid);
}
cb -= cbOffset;
// From now on act as a regular type
nMsg -= (WM_OCC_LOADFROMSTREAM_EX - WM_OCC_LOADFROMSTREAM);
}
GUID clsid;
HRESULT hr;
#ifndef OLE2ANSI
if (pszClass[0] == L'{')
#else
if (pszClass[0] == '{')
#endif
hr = CLSIDFromString(pszClass, &clsid);
else
hr = CLSIDFromProgID(pszClass, &clsid);
#ifdef _DEBUG
if (FAILED(hr))
{
#ifndef OLE2ANSI
TRACE1("Unable to convert \"%ls\" to a class ID.\n", pszClass);
#else
TRACE1("Unable to convert \"%s\" to a class ID.\n", pszClass);
#endif
TRACE1(">>> Result code: 0x%08lx\n", hr);
if (pszClass[0] != L'{')
TRACE0(">>> Is the control properly registered?\n");
}
#endif
CMemFile memFile(lpData, cb);
CMemFile* pMemFile = (nMsg == WM_OCC_INITNEW) ? NULL : &memFile;
COleControlSite* pSite = NULL;
if (SUCCEEDED(hr) &&
pWndParent->InitControlContainer() &&
pWndParent->m_pCtrlCont->CreateControl(NULL, clsid, NULL, pItem->style,
rect, pItem->id, pMemFile, (nMsg == WM_OCC_LOADFROMSTORAGE),
bstrLicKey, &pSite))
{
ASSERT(pSite != NULL);
// freeze events until all controls are loaded
pSite->FreezeEvents(TRUE);
// set ZOrder only!
SetWindowPos(pSite->m_hWnd, hwAfter, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
pSite->m_pBindings = pBindings;
pSite->m_strDataField = strDataField;
pSite->m_ctlidRowSource = ctlidRowSource;
pSite->m_defdispid = defdispid;
pSite->m_dwType = dwType;
}
if (bstrLicKey != NULL)
SysFreeString(bstrLicKey);
return (pSite != NULL) ? pSite->m_hWnd : NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CDataExchange::PrepareOleCtrl
CWnd* CDataExchange::PrepareOleCtrl(int nIDC)
{
ASSERT(nIDC != 0);
ASSERT(nIDC != -1); // not allowed
CWnd* pWndCtrl = m_pDlgWnd->GetDlgItem(nIDC);
if ((pWndCtrl == NULL) || (pWndCtrl->m_hWnd == NULL))
{
TRACE1("Error: no data exchange control with ID 0x%04X\n", nIDC);
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
m_hWndLastControl = pWndCtrl->m_hWnd;
m_bEditLastControl = FALSE; // not an edit item by default
return pWndCtrl;
}
#endif //!_AFX_NO_OCC_SUPPORT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -