home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / tutorial.pak / OCFHLPR.H < prev    next >
C/C++ Source or Header  |  1997-07-23  |  15KB  |  517 lines

  1. // ---------------------------------------------------------------------------
  2. // Copyright (C) 1994 Borland International
  3. // ---------------------------------------------------------------------------
  4. #if !defined(_OCFHLPR_H)
  5. #define _OCFHLPR_H
  6.  
  7. #include <ocf/ocfpch.h>
  8. #include <ocf/ocapp.h>
  9. #include <ocf/ocdoc.h>
  10. #include <ocf/ocview.h>
  11. #include <ocf/ocremvie.h>
  12. #include <ocf/ocpart.h>
  13. #include <windowsx.h>
  14.  
  15. //
  16. // Forward ref.
  17. //
  18. class TOleWin;
  19.  
  20.  
  21. //
  22. // Prototypes of Accessors
  23. //
  24. TOcApp*   GetOcApp();
  25.  
  26.  
  27. //
  28. // Encapsulates a clientDC configured for OLE operations
  29. //
  30. class OleClientDC {
  31.   public:
  32.     OleClientDC(TOleWin&, bool scale = true);
  33.    ~OleClientDC();
  34.  
  35.     //
  36.     // HDC conversion operator for convenience
  37.     //
  38.     operator        HDC () const;
  39.  
  40.   protected:
  41.     HDC             Hdc;          //  Actual Handle to Device Context
  42.     HWND            HWnd;         //  Handle of Window whose DC was retrieved
  43. };
  44.  
  45.  
  46. //
  47. // Class encapsulating menu description for menu merging purposes
  48. //
  49. class MenuDescr : public TOcMenuDescr {
  50.   public:
  51.     MenuDescr(HMENU,
  52.               int fileGrp = 0, int editGrp = 0,
  53.               int contGrp = 0, int objGrp = 0,
  54.               int winGrp  = 0, int hlpGrp = 0);
  55.     //
  56.     // HMENU conversion operator for easy handling
  57.     //
  58.     operator HMENU() const { return HMenu; }
  59.  
  60.   private:
  61.     MenuDescr(const TOcMenuDescr&);
  62. };
  63.  
  64.  
  65. //
  66. // Object which initializes OLE and creates the basic OCF Helper objects
  67. // required by any application supporting Linking and Embedding
  68. //
  69. class TOleInit : public TOleAllocator {
  70.   public:
  71.     TOleInit(TRegList& regInfo,
  72.              TComponentFactory callback,
  73.              string& cmdLine, TRegLink* linkHead = 0,
  74.              HINSTANCE hInst = ::_hInstance);
  75.    ~TOleInit();
  76.  
  77.   protected:
  78.     TOcRegistrar*   OcRegistrar;
  79.     TOcApp*&        OcApp;
  80. };
  81.  
  82.  
  83. //
  84. // Handles OCF messages/events for an OLE Frame Window
  85. //
  86. class TOleFrameWin {
  87.   public:
  88.     TOleFrameWin(HWND);
  89.  
  90.     void            OnCreate();
  91.     void            OnDestroy();
  92.     void            OnActivateApp(bool);
  93.     operator        HWND() const {return Hwnd; };
  94.   protected:
  95.     HWND            Hwnd;
  96. };
  97.  
  98.  
  99. //
  100. // Object which handles OCF messages/events for an OLE Window and
  101. // provide various default behaviour.
  102. //
  103. class TOleWin : public TOcMenuDescr {
  104.   public:
  105.     TOleWin(HWND hwnd);
  106.  
  107.     operator        HWND() const {return Hwnd; };
  108.     void            SetWinMenu(const TOcMenuDescr& menuDescr);
  109.     HMENU           GetWinMenu() const {return HMenu; };
  110.     HMENU           GetMergedMenu() const {return MergedMenu; };
  111.  
  112.     //
  113.     // Windows message handlers
  114.     //
  115.     void            OnCreate();
  116.     void            OnDestroy();
  117.     void            OnSize();
  118.     void            OnPaint(HDC hdc, PAINTSTRUCT& ps);
  119.  
  120.     bool            OnCommand(UINT);
  121.     void            OnInitMenuPopup(HMENU hMenu, int item);
  122.     void            OnInitMenu(HMENU hMenu);
  123.  
  124.     bool            OnLButtonDown(int x, int y, UINT keyFlags);
  125.     bool            OnLButtonDblClk(int x, int y, UINT keyFlags);
  126.     bool            OnRButtonDown(int x, int y, UINT keyFlags);
  127.  
  128.     void            OnActivate(bool);
  129.     void            OnSetFocus(HWND lostFocus);
  130.  
  131.     //
  132.     // OCF event handlers
  133.     //
  134.     const char far* OnOcViewTitle();
  135.     void            OnOcViewSetTitle(const char far*);
  136.     bool            OnOcViewSetSiteRect(TRect far*);
  137.     bool            OnOcViewGetScale(TOcScaleFactor far*);
  138.     bool            OnOcViewPartInvalid(TOcPartChangeInfo far*);
  139.     bool            OnOcViewGetSiteRect(TRect far*);
  140.     bool            OnOcViewDrop(TOcDragDrop far*);
  141.     LRESULT         OnOcEvent(WPARAM wParam, LPARAM lParam);
  142.  
  143.     //
  144.     // The following events are actually sent to the frame
  145.     // However, the latter can delegate to the OLE Window
  146.     //
  147.     bool            OnOcAppInsMenus(TOcMenuDescr far* sharedMenu);
  148.     HMENU           OnOcAppMenus(TOcMenuDescr far* menuDescr);
  149.     HMENU           OnOcAppRestoreUI();
  150.  
  151.     //
  152.     // OLE UI Dialog methods
  153.     //
  154.     void            EditInsertObject();
  155.     void            EditPasteSpecial();
  156.     void            EditConvert();
  157.     void            EditLinks();
  158.  
  159.     //
  160.     // OCF Helper functions
  161.     //
  162.     bool            Deactivate();
  163.     void            SetSelection(TOcPart*);
  164.     void            GetInsertPosition(TRect& rect);
  165.     void            InvalidatePart(TOcInvalidate invalid);
  166.     bool            PaintParts(HDC dc, bool erase, TRect& rect, bool metafile);
  167.     void            GetLogPerUnit(TSize&);
  168.     void            SetupDC(HDC dc, bool scale = true);
  169.  
  170.     //
  171.     // Accessors
  172.     //
  173.     TOcDocument*    GetOcDoc() {return OcDoc;}
  174.     TOcView*        GetOcView() {return OcView;}
  175.     TOcRemView*     GetOcRemView() {return TYPESAFE_DOWNCAST(OcView, TOcRemView);}
  176.     bool            IsEmbedded() {return Embedded; }
  177.     bool            SelectEmbedded();
  178.  
  179.     //
  180.     // extra user info
  181.     //
  182.     void*           GetUserInfo()         {return UserInfo;}
  183.     void*           SetUserInfo(void* ui);
  184.  
  185.   protected:
  186.     HWND            Hwnd;
  187.     TOcDocument*    OcDoc;
  188.     TOcView*        OcView;
  189.     TOcScaleFactor  Scale;
  190.     TOcPart*        DragPart;
  191.     bool            Embedded;
  192.     TRect           Pos;
  193.     bool            ShowObjects;
  194.     HMENU           MergedMenu;
  195.     void*           UserInfo;
  196. };
  197.  
  198.  
  199. inline
  200. OleClientDC::OleClientDC(TOleWin& win, bool scale)
  201.             :HWnd(win), Hdc(GetDC(win))
  202. {
  203.   win.SetupDC(*this, scale);
  204. }
  205.  
  206.  
  207. inline
  208. OleClientDC::operator HDC() const
  209. {
  210.   return Hdc;
  211. }
  212.  
  213.  
  214. inline
  215. OleClientDC::~OleClientDC()
  216. {
  217.   ReleaseDC(HWnd, Hdc);
  218. }
  219.  
  220.  
  221. //
  222. //
  223. //
  224. inline
  225. MenuDescr::MenuDescr(HMENU menu, int fileGrp, int editGrp,
  226.                      int contGrp, int objGrp,
  227.                      int winGrp, int hlpGrp)
  228. {
  229.   HMenu = menu;
  230.   Width[0] = fileGrp;
  231.   Width[1] = editGrp;
  232.   Width[2] = contGrp;
  233.   Width[3] = objGrp;
  234.   Width[4] = winGrp;
  235.   Width[5] = hlpGrp;
  236. }
  237.  
  238.  
  239. bool MergeContainerMenu(TOcMenuDescr& dst, const TOcMenuDescr& src);
  240. bool MergeServerMenu(TOcMenuDescr& dst, const TOcMenuDescr& src);
  241.  
  242.  
  243. // -------------------------------------------------------------------------
  244. // Wrappers for common Windows routines
  245. // -------------------------------------------------------------------------
  246. bool GetOpenFileName(HWND owner, const char* filter, char* fileName,
  247.                      int size, DWORD flags = OFN_OVERWRITEPROMPT);
  248. bool GetSaveFileName(HWND owner, const char* filter, char* fileName,
  249.                      int size, DWORD flags = OFN_OVERWRITEPROMPT);
  250.  
  251.  
  252.  
  253. // -------------------------------------------------------------------------
  254. // Macros/templates to simplify OCF Event handling
  255. // -------------------------------------------------------------------------
  256.  
  257. //
  258. // Function template to send OCF events
  259. //
  260. template <class T> inline LRESULT
  261. SendOCFEvent(HWND hwnd, int ocfCode, const T far* t = 0)
  262. {
  263.   return SendMessage(hwnd, WM_OCEVENT, ocfCode, LPARAM(t));
  264. }
  265.  
  266.  
  267. // -------------------------------------------------------------------------
  268. //  Frame Events
  269. // -------------------------------------------------------------------------
  270.  
  271. //
  272. // LRESULT MainWnd_OnOcEvent(HWND hwnd, WPARAM wParam, LPARAM lParam)
  273. //
  274. #define HANDLE_WM_OCEVENT(hwnd, wParam, lParam, fn)\
  275.   (LRESULT)(fn)((hwnd), (wParam), (lParam))
  276.  
  277. //
  278. // macros for WM_OCEVENT subdispatching
  279. //
  280. #define HANDLE_OCF(hwnd, message, fn) \
  281.   case (message): return (LRESULT)HANDLE_##message((hwnd), (lParam), (fn))
  282.  
  283. //
  284. // bool Cls_OnOcAppInsMenus(HWND hwnd, TOcMenuDescr far* menuDescr)
  285. //
  286. #define HANDLE_OC_APPINSMENUS(hwnd, lParam, fn) \
  287.     (LRESULT)(UINT)(bool)(fn)((hwnd), (TOcMenuDescr far*)(lParam))
  288.  
  289. //
  290. // bool Cls_OnOcAppMenus(HWND hwnd, TOcMenuDescr far* menuDescr)
  291. //
  292. #define HANDLE_OC_APPMENUS(hwnd, lParam, fn) \
  293.     (LRESULT)(UINT)(bool)(fn)((hwnd), (TOcMenuDescr far*)(lParam))
  294.  
  295. //
  296. // bool Cls_OnOcAppProcessMsg(HWND hwnd, MSG far* msg)
  297. //
  298. #define HANDLE_OC_APPPROCESSMSG(hwnd, lParam, fn) \
  299.     (LRESULT)(UINT)(fn)((hwnd), (MSG far*)(lParam))
  300.  
  301. //
  302. // bool Cls_OnOcAppFrameRect(HWND hwnd, TRect far* rect)
  303. //
  304. #define HANDLE_OC_APPFRAMERECT(hwnd, lParam, fn) \
  305.     (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  306.  
  307. //
  308. // bool Cls_OnOcAppBorderSpaceReq(HWND hwnd, TRect far* rect)
  309. //
  310. #define HANDLE_OC_APPBORDERSPACEREQ(hwnd, lParam, fn) \
  311.     (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  312.  
  313. //
  314. // bool Cls_OnOcAppBorderSpaceSet(HWND hwnd, TRect far* rect)
  315. //
  316. #define HANDLE_OC_APPBORDERSPACESET(hwnd, lParam, fn) \
  317.     (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  318.  
  319. //
  320. // void Cls_OnOcAppStatusText(HWND hwnd, const char far* text)
  321. //
  322. #define HANDLE_OC_APPSTATUSTEXT(hwnd, lParam, fn) \
  323.     ((fn)((hwnd), (const char far*)(lParam)), 0L)
  324.  
  325. //
  326. // void Cls_OnOcAppRestoreUI(HWND hwnd)
  327. //
  328. #define HANDLE_OC_APPRESTOREUI(hwnd, lParam, fn) \
  329.     ((fn)((hwnd)), 0L)
  330.  
  331. //
  332. // void Cls_OnOcAppDialogHelp(HWND hwnd, TOcDialogHelp far* dialogHelp)
  333. //
  334. #define HANDLE_OC_APPDIALOGHELP(hwnd, lParam, fn) \
  335.     ((fn)((hwnd), (TOcDialogHelp far*)(lParam)), 0L)
  336.  
  337. //
  338. // TOcView far* Cls_OnOcAppCreateComp(HWND hwnd, TDocTemplate far* docTemplate)
  339. //
  340. #define HANDLE_OC_APPCREATECOMP(hwnd, lParam, fn) \
  341.     (LRESULT)(fn)((hwnd), (TDocTemplate far*)(lParam))
  342.  
  343. //
  344. // bool Cls_OnOcAppShutDown(HWND hwnd)
  345. //
  346. #define HANDLE_OC_APPSHUTDOWN(hwnd, lParam, fn) \
  347.     (LRESULT)(UINT)(fn)((hwnd))
  348.  
  349.  
  350. // -------------------------------------------------------------------------
  351. // View events
  352. // -------------------------------------------------------------------------
  353.  
  354. //
  355. // const char far* Cls_OnOcViewTitle(HWND hwnd)
  356. //
  357. #define HANDLE_OC_VIEWTITLE(hwnd, lParam, fn) \
  358.     (LRESULT)(fn)((hwnd))
  359.  
  360. //
  361. // void Cls_OnOcViewSetTitle(HWND hwnd, const char far* title)
  362. //
  363. #define HANDLE_OC_VIEWSETTITLE(hwnd, lParam, fn) \
  364.   ((fn)((hwnd), (const char far*)(lParam)), 0)
  365.  
  366. //
  367. // bool Cls_OnOcViewBorderSpaceReq(HWND hwnd, TRect far* rect)
  368. //
  369. #define HANDLE_OC_VIEWBORDERSPACEREQ(hwnd, lParam, fn) \
  370.     (LRESULT)(UINT)(fn)((hwnd), (TRECT far*)(lParam))
  371.  
  372. //
  373. // bool Cls_OnOcViewBorderSpaceSet(HWND hwnd, TRect far* rect)
  374. //
  375. #define HANDLE_OC_VIEWBORDERSPACESET(hwnd, lParam, fn) \
  376.     (LRESULT)(UINT)(fn)((hwnd), (TRECT far*)(lParam))
  377.  
  378. //
  379. // bool Cls_OnOcViewDrop(HWND hwnd, TOcDragDrop far* dragDropInfo)
  380. //
  381. #define HANDLE_OC_VIEWDROP(hwnd, lParam, fn) \
  382.     (LRESULT)(fn)((hwnd), (TOcDragDrop far*)(lParam))
  383.  
  384. //
  385. // bool Cls_OnOcViewDrag(HWND hwnd, TOcDragDrop far* dragDropInfo)
  386. //
  387. #define HANDLE_OC_VIEWDRAG(hwnd, lParam, fn) \
  388.   (LRESULT)(UINT)(fn)((hwnd), (TOcDragDrop far*)(lParam))
  389.  
  390. //
  391. // bool Cls_OnOcViewScroll(HWND hwnd, TOcScrollDir far* scrollDir)
  392. //
  393. #define HANDLE_OC_VIEWSCROLL(hwnd, lParam, fn) \
  394.   (LRESULT)(UINT)(fn)((hwnd), (TOcScrollDir far*)(lParam))
  395.  
  396. //
  397. // bool Cls_OnOcViewPartInvalid(HWND hwnd, TOcPartChangeInfo far* part)
  398. //
  399. #define HANDLE_OC_VIEWPARTINVALID(hwnd, lParam, fn) \
  400.   (LRESULT)(UINT)(fn)((hwnd), (TOcPartChangeInfo far*)(lParam))
  401.  
  402. //
  403. // bool Cls_OnOcViewPaint(HWND hwnd, TOcViewPaint far* paintInfo)
  404. //
  405. #define HANDLE_OC_VIEWPAINT(hwnd, lParam, fn) \
  406.   (LRESULT)(UINT)(fn)((hwnd), (TOcViewPaint far*)(lParam))
  407.  
  408. //
  409. // bool Cls_OnOcViewLoadPart(HWND hwnd, TOcSaveLoad far* loadInfo)
  410. //
  411. #define HANDLE_OC_VIEWLOADPART(hwnd, lParam, fn) \
  412.   (LRESULT)(UINT)(fn)((hwnd), (TOcSaveLoad far*)(lParam))
  413.  
  414. //
  415. // bool Cls_OnOcViewSavePart(HWND hwnd, TOcSaveLoad far* saveInfo)
  416. //
  417. #define HANDLE_OC_VIEWSAVEPART(hwnd, lParam, fn) \
  418.   (LRESULT)(UINT)(fn)((hwnd), (TOcSaveLoad far*)(lParam))
  419.  
  420. //
  421. // bool Cls_OnOcViewClose(HWND hwnd)
  422. //
  423. #define HANDLE_OC_VIEWCLOSE(hwnd, lParam, fn) \
  424.   (LRESULT)(UINT)(fn)((hwnd))
  425.  
  426. //
  427. // bool Cls_OnOcViewInsMenus(HWND hwnd, TOcMenuDescr far* menuDescr)
  428. //
  429. #define HANDLE_OC_VIEWINSMENUS(hwnd, lParam, fn) \
  430.   (LRESULT)(UINT)(fn)((hwnd), (TOcMenuDescr far*)(lParam))
  431.  
  432. //
  433. // bool Cls_OnOcViewShowTools(HWND hwnd, TOcToolBar far* toolBarInfo)
  434. //
  435. #define HANDLE_OC_VIEWWSHOWTOOLS(hwnd, lParam, fn) \
  436.   (LRESULT)(UINT)(fn)((hwnd), (TOcToolBar far*)(lParam))
  437.  
  438. //
  439. // bool Cls_OnOcViewGetPalette(HWND hwnd, LOGPALETTE far* far* paletteInfo)
  440. //
  441. #define HANDLE_OC_VIEWGETPALETTE(hwnd, lParam, fn) \
  442.   (LRESULT)(UINT)(fn)((hwnd), (LOGPALETTE far* far*)(lParam))
  443.  
  444. //
  445. // HANDLE Cls_OnOcViewClipData(HWND hwnd, TOcFormat far* formatInfo)
  446. //
  447. #define HANDLE_OC_VIEWCLIPDATA(hwnd, lParam, fn) \
  448.   (LRESULT)(fn)((hwnd), (TOcFormat far*)(lParam))
  449.  
  450. //
  451. // bool Cls_OnOcViewPartSize(HWND hwnd, TRect far* rect)
  452. //
  453. #define HANDLE_OC_VIEWPARTSIZE(hwnd, lParam, fn) \
  454.   (LRESULT)(UINT)(fn)((hwnd), (TRECT far*)(lParam))
  455.  
  456. //
  457. // bool Cls_OnOcViewOpenDoc(HWND hwnd, const char far* text)
  458. //
  459. #define HANDLE_OC_VIEWOPENDOC(hwnd, lParam, fn) \
  460.   (LRESULT)(UINT)(fn)((hwnd), (const char far*)(lParam))
  461.  
  462. //
  463. // bool Cls_OnOcViewAttachWindow(HWND hwnd)
  464. //
  465. #define HANDLE_OC_VIEWATTACHWINDOW(hwnd, lParam, fn) \
  466.   (LRESULT)(UINT)(fn)((hwnd))
  467.  
  468. //
  469. // bool Cls_OnOcViewSetScale(HWND hwnd, TOcScaleFactor* scaleInfo)
  470. //
  471. #define HANDLE_OC_VIEWSETSCALE(hwnd, lParam, fn) \
  472.   (LRESULT)(UINT)(fn)((hwnd), (TOcScaleFactor*)(lParam))
  473.  
  474. //
  475. // bool Cls_OnOcViewGetScale(HWND hwnd, TOcScaleFactor* scaleInfo)
  476. //
  477. #define HANDLE_OC_VIEWGETSCALE(hwnd, lParam, fn) \
  478.   (LRESULT)(UINT)(fn)((hwnd), (TOcScaleFactor*)(lParam))
  479.  
  480. //
  481. // bool Cls_OnOcViewGetSiteRect(HWND hwnd, TRect far* rect)
  482. //
  483. #define HANDLE_OC_VIEWGETSITERECT(hwnd, lParam, fn) \
  484.   (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  485.  
  486. //
  487. // bool Cls_OnOcViewSetSiteRect(HWND hwnd, TRect far* rect)
  488. //
  489. #define HANDLE_OC_VIEWSETSITERECT(hwnd, lParam, fn) \
  490.   (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  491.  
  492. //
  493. // bool Cls_OnOcViewGetItemName(HWND hwnd, TOcItemName far* ocItemName)
  494. //
  495. #define HANDLE_OC_VIEWGETITEMNAME(hwnd, lParam, fn) \
  496.   (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  497.  
  498. //
  499. // bool Cls_OnOcViewSetLink(HWND hwnd, TOcLinkView far* ocLinkView)
  500. //
  501. #define HANDLE_OC_VIEWSETLINK(hwnd, lParam, fn) \
  502.   (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  503.  
  504. //
  505. // bool Cls_OnOcViewBreakLink(HWND hwnd, TOcLinkView far* ocLinkView)
  506. //
  507. #define HANDLE_OC_VIEWBREAKLINK(hwnd, lParam, fn) \
  508.   (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  509.  
  510. //
  511. // bool Cls_OnOcViewPartActivate(HWND hwnd, TOcPart far* ocPart)
  512. //
  513. #define HANDLE_OC_VIEWPARTACTIVATE(hwnd, lParam, fn) \
  514.   (LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
  515.  
  516. #endif  //  _OCFHLPR_H
  517.