--- mstools/samples/ole/srvrdemo/obj.c 2018/08/09 18:20:49 1.1 +++ mstools/samples/ole/srvrdemo/obj.c 2018/08/09 18:23:58 1.1.1.3 @@ -150,7 +150,8 @@ LPOBJ CreateNewObj (BOOL fDoc_Changed) VOID CutOrCopyObj (BOOL fOpIsCopy) { LPOBJ lpobj; - HANDLE hData; + HANDLE hData; +// UINT hBit; if (OpenClipboard (hwndMain)) { @@ -172,15 +173,16 @@ VOID CutOrCopyObj (BOOL fOpIsCopy) } if ((hData = GetEnhMetafile(lpobj)) != NULL) - { + { SetClipboardData(CF_ENHMETAFILE, hData); -// GlobalFree(hData); + GlobalFree(hData); } if ((hData = GetBitmap(lpobj)) != NULL) - { - SetClipboardData(CF_BITMAP, hData); -// DeleteObject(hData); + { + // SetClipboardData(CF_BITMAP, GetBitmap(lpobj)); + SetClipboardData(CF_BITMAP, hData); + DeleteObject(hData); } @@ -208,7 +210,7 @@ VOID DestroyObj (HWND hwnd) if(lpobj->aName) { GlobalDeleteAtom (lpobj->aName); - lpobj->aName = NULL; + lpobj->aName = '\0'; } if (lpobj->hpal) @@ -245,7 +247,8 @@ static VOID DrawObj (HDC hdc, LPOBJ lpob HPEN hpenOld; HPALETTE hpalOld = NULL; - if (dctype == dctypeMetafile || dctype == dctypeEnhMetafile) + + if (dctype == dctypeMetafile) { SetWindowOrgEx (hdc, 0, 0, NULL); // Paint entire object into the given rectangle. @@ -305,7 +308,7 @@ static VOID DrawObj (HDC hdc, LPOBJ lpob * RETURNS: A handle to the object's picture data * * CUSTOMIZATION: Re-implement - * + * */ static HBITMAP GetBitmap (LPOBJ lpobj) { @@ -313,7 +316,7 @@ static HBITMAP GetBitmap (LPOBJ lpobj) HDC hdcMem; RECT rc; HBITMAP hbitmap; - HBITMAP hbitmapOld; + HBITMAP hbitmapOld; hdcObj = GetDC (lpobj->hwnd); @@ -337,12 +340,18 @@ static HBITMAP GetBitmap (LPOBJ lpobj) // convert width and height to HIMETRIC units rc.right = rc.right - rc.left; rc.bottom = rc.bottom - rc.top; - DeviceToHiMetric (hwndMain, (LPPOINT) &rc.right); + DeviceToHiMetric ( (LPPOINT) &rc.right ); // Set the 1/10 of HIMETRIC units for the bitmap SetBitmapDimensionEx (hbitmap, (DWORD) (rc.right/10), (DWORD) (rc.bottom/10), NULL); - - return hbitmap; + +// if (OpenClipboard (hwndMain)) +// { +// // EmptyClipboard (); +// SetClipboardData(CF_BITMAP, hbitmap); +// CloseClipboard(); +// } + return hbitmap; } @@ -454,7 +463,7 @@ static HANDLE GetMetafilePict (LPOBJ lpo rc.right = rc.right - rc.left; rc.bottom = rc.bottom - rc.top; - DeviceToHiMetric (hwndMain, (LPPOINT) &rc.right); + DeviceToHiMetric ( (LPPOINT) &rc.right); lppict->mm = MM_ANISOTROPIC; lppict->hMF = hMF; @@ -482,19 +491,41 @@ static HANDLE GetEnhMetafile (LPOBJ lpob LPMETAFILEPICT lppict = NULL; HANDLE hemf = NULL; HANDLE hMF = NULL; - RECT rc,rect; - HDC hdc; + RECT rc; + HDC hdc, hdc2; + GetClientRect (lpobj->hwnd, (LPRECT)&rc); - rect.left = rect.top = 0; - rect.right = rc.right - rc.left; - rect.bottom = rc.bottom - rc.top; + rc.right -= rc.left; + rc.bottom -= rc.top; + rc.left = rc.top = 0; + + DeviceToHiMetric ( (LPPOINT) &rc.right ); + + hdc = CreateEnhMetaFile ( NULL, NULL, &rc, NULL ); - DeviceToHiMetric (hwndMain, (LPPOINT) &rect.right); + //* this is necessary because + //* we need to draw the object + //* in device coordinates that are + //* the same physical size as the HIMETRIC + //* logical space used in CreateEnhMetaFile. + //* In this case we have scaled the HIMETRIC + //* units down in order to use the logical + //* pixel ratio (which is recommended UI) + //* so we therefore have to convert the + //* scaled HIMETRIC units back to Device. + + hdc2 = GetDC(NULL); + + SetMapMode(hdc2, MM_HIMETRIC); + LPtoDP (hdc2, (LPPOINT)&rc.right, 1); + if (rc.bottom < 0) rc.bottom *= -1; + + ReleaseDC(NULL,hdc2); + + DrawObj (hdc, lpobj, rc, dctypeMetafile); - hdc = CreateEnhMetaFile(NULL, NULL, &rect, NULL); - DrawObj (hdc, lpobj, rc, dctypeMetafile); if ((hemf = (HANDLE)CloseEnhMetaFile (hdc)) == NULL) return NULL; @@ -675,9 +706,9 @@ OLECLIPFORMAT APIENTRY ObjEnumFormats return cfObjectLink; if (cfFormat == cfObjectLink) - return NULL; + return 0; - return NULL; + return 0; } @@ -771,7 +802,7 @@ OLESTATUS APIENTRY ObjGetData * ---------------- * * LPOLEOBJECT lpoleobject - The OLE object - * LPSTR lpszProtocol - The protocol name, either "StdFileEditing" + * OLE_LPCSTR lpszProtocol - The protocol name, either "StdFileEditing" * or "StdExecute" * * RETURNS: If lpszProtocol is supported, return a pointer to an OLEOBJECT @@ -783,7 +814,7 @@ OLESTATUS APIENTRY ObjGetData * */ LPVOID APIENTRY ObjQueryProtocol - (LPOLEOBJECT lpoleobject, LPSTR lpszProtocol) + (LPOLEOBJECT lpoleobject, OLE_LPCSTR lpszProtocol) { return lstrcmp (lpszProtocol, "StdFileEditing") ? NULL : lpoleobject ; } @@ -827,7 +858,7 @@ OLESTATUS APIENTRY ObjRelease (LPOLEOBJ * a linked object depends only on the source file. * * LPOLEOBJECT lpoleobject - The OLE object - * LPRECT lprect - The new bounds + * OLE_CONST RECT FAR* lprect - The new bounds * * RETURNS: OLE_OK * @@ -836,7 +867,7 @@ OLESTATUS APIENTRY ObjRelease (LPOLEOBJ * uses MoveWindow.) * */ -OLESTATUS APIENTRY ObjSetBounds (LPOLEOBJECT lpoleobj, LPRECT lprect) +OLESTATUS APIENTRY ObjSetBounds (LPOLEOBJECT lpoleobj, OLE_CONST RECT FAR * lprect) { if (docMain.doctype == doctypeEmbedded) { @@ -846,7 +877,7 @@ OLESTATUS APIENTRY ObjSetBounds (LPOLEO // the units are in HIMETRIC rect.right = rect.right - rect.left; rect.bottom = rect.top - rect.bottom; - HiMetricToDevice (hwndMain, (LPPOINT) &rect.right); + HiMetricToDevice ( (LPPOINT) &rect.right); MoveWindow (lpobj->hwnd, lpobj->native.nX, lpobj->native.nY, rect.right + 2 * GetSystemMetrics(SM_CXFRAME), rect.bottom + 2 * GetSystemMetrics(SM_CYFRAME), @@ -864,7 +895,7 @@ OLESTATUS APIENTRY ObjSetBounds (LPOLEO * the server to use for the object. * * LPOLEOBJECT lpoleobject - The OLE object - * LPLOGPALETTE lppal - Suggested palette + * OLE_CONST LOGPALETTE FAR * lppal - Suggested palette * * RETURNS: OLE_ERROR_PALETTE if CreatePalette fails, * OLE_OK otherwise @@ -876,7 +907,7 @@ OLESTATUS APIENTRY ObjSetBounds (LPOLEO * */ OLESTATUS APIENTRY ObjSetColorScheme - (LPOLEOBJECT lpoleobject, LPLOGPALETTE lppal) + (LPOLEOBJECT lpoleobject, OLE_CONST LOGPALETTE FAR *lppal) { HPALETTE hpal = CreatePalette (lppal); LPOBJ lpobj = (LPOBJ) lpoleobject; @@ -938,8 +969,11 @@ OLESTATUS APIENTRY ObjSetData docMain.rgfObjNums [GetObjNum(lpobj)] = TRUE; MoveWindow (lpobj->hwnd, 0, 0, - lpobj->native.nWidth + 2 * GetSystemMetrics(SM_CXFRAME), - lpobj->native.nHeight+ 2 * GetSystemMetrics(SM_CYFRAME), +// lpobj->native.nWidth + 2 * GetSystemMetrics(SM_CXFRAME), +// lpobj->native.nHeight+ 2 * GetSystemMetrics(SM_CYFRAME), + lpobj->native.nWidth, + lpobj->native.nHeight, + FALSE); GlobalUnlock (hdata); }