//----------------------------------------------------------------------------- // Microsoft OLE DB RowsetViewer // Copyright (C) 1994 - 1999 By Microsoft Corporation. // // @doc // // @module CDIALOGLITE.H // //----------------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // Defines // ////////////////////////////////////////////////////////////////////////// #ifndef __CDIALOGLITE_H__ #define __CDIALOGLITE_H__ ////////////////////////////////////////////////////////////////////////// // Macros // ////////////////////////////////////////////////////////////////////////// #define ON_COMMAND(ID, func) case ID: (func); return TRUE; #define ON_COMMAND_UI(ID, flags) case ID: (*pdwFlags = (flags)); return TRUE; #define ON_COMMAND_UI_ENABLED(ID, func) ON_COMMAND_UI(ID, (func) ? MF_ENABLED : MF_GRAYED) #define ON_COMMAND_UI_CHECKED(ID, func) ON_COMMAND_UI(ID, (func) ? MF_CHECKED : MF_UNCHECKED) #define STATEIMAGEINDEX(iImage) INDEXTOSTATEIMAGEMASK(iImage+1) #define BST2STATE(dwValue) ((dwValue) ? BST_CHECKED : BST_UNCHECKED) #define BST3STATE(dwValue) ((dwValue) ? ((dwValue) == BST_INDETERMINATE ? (dwValue) : BST_CHECKED) : BST_UNCHECKED) //INDEX typedef LRESULT INDEX; const INDEX INVALID_INDEX = -1; ////////////////////////////////////////////////////////////////////////// // Includes // ////////////////////////////////////////////////////////////////////////// #include #include //IWebBrowser2, DIID_DWebBrowserEvents2 #include //DISPID_DOCUMENTCOMPLETE #include //DISPID_AMBIENT_DLCONTROL #include //DOM #include "Error.h" ////////////////////////////////////////////////////////////////////////// // Typedefs // ////////////////////////////////////////////////////////////////////////// #define REFPOINTS const POINTS & #define REFRECT const RECT & ////////////////////////////////////////////////////////////////////////// // Forwards // ////////////////////////////////////////////////////////////////////////// class CPropSheetLite; class CFrameWndLite; class CAppLite; ////////////////////////////////////////////////////////////////////////// // Globals // ////////////////////////////////////////////////////////////////////////// CAppLite* GetAppLite(); void SetAppLite(CAppLite* pCAppLite); BOOL DisplayContextMenu(HWND hWnd, UINT iID, REFPOINTS pts, HWND hWndParent, BOOL fRelCords = FALSE); LRESULT DisplayDialog(UINT uID, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParam); ///////////////////////////////////////////////////////////////////// // CAppLite // ///////////////////////////////////////////////////////////////////// class CAppLite { public: CAppLite(UINT nAppID); virtual ~CAppLite(); BOOL AppInitialize(HINSTANCE hInstance, HINSTANCE hPrevInstance, CHAR* pszCmdLine, INT nCmdShow); virtual BOOL InitInstance(); virtual int ExitInstance(); virtual int Run(); //protected: //data HINSTANCE m_hInstance; HINSTANCE m_hPrevInstance; CHAR* m_pszCmdLine; INT m_nCmdShow; UINT m_nAppID; static HWND m_hWndModeless; static CFrameWndLite* m_pCMainWindow; }; ///////////////////////////////////////////////////////////////////// // CWndLite // ///////////////////////////////////////////////////////////////////// class CWndLite { public: //constructors CWndLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CWndLite(); //Window Proc static LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); virtual BOOL HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); virtual LRESULT UnhandledMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //Inline helpers, (that deal with hWnds) HWND GetDlgItem(INT iResourceID) { return ::GetDlgItem(m_hWnd, iResourceID); } UINT IsDlgButtonChecked(INT iResourceID) { return ::IsDlgButtonChecked(m_hWnd, iResourceID); } BOOL CheckDlgButton(INT iResourceID, UINT uCheck){ ASSERT(uCheck == BST_CHECKED || uCheck == BST_UNCHECKED || BST_INDETERMINATE); return ::CheckDlgButton(m_hWnd, iResourceID, uCheck); } BOOL IsVisible() { return ::IsWindowVisible(m_hWnd); } HFONT GetFont() { return (HFONT)::SendMessage(m_hWnd, WM_GETFONT, 0, 0); } void SetFont(HFONT hFont) { ::SendMessage(m_hWnd, WM_SETFONT, (WPARAM)hFont, 0); } BOOL EnableWindow(BOOL bEnable = TRUE) { return ::EnableWindow(m_hWnd, bEnable); } HWND SetFocus() { return ::SetFocus(m_hWnd); } HWND GetWnd() { /*ASSERT(m_hWnd);*/ return m_hWnd; } BOOL GetWindowPlacement() { memset(&m_wndPlacement, 0, sizeof(WINDOWPLACEMENT)); m_wndPlacement.length = sizeof(WINDOWPLACEMENT); return ::GetWindowPlacement(m_hWnd, &m_wndPlacement); } BOOL SetWindowPlacement() { m_wndPlacement.length = sizeof(WINDOWPLACEMENT); return ::SetWindowPlacement(m_hWnd, &m_wndPlacement); } WCHAR* GetWindowText() { return wGetWindowText(m_hWnd); } LRESULT GetWindowText(WCHAR* pwszBuffer, ULONG ulMaxSize) { return wSendMessage(m_hWnd, WM_GETTEXT, ulMaxSize, pwszBuffer); } BOOL SetWindowText(WCHAR* pwszString) { return (BOOL)wSendMessage(m_hWnd, WM_SETTEXT, 0, pwszString); } LONG ShowWindow(UINT nCmdShow) { return ::ShowWindow(m_hWnd, nCmdShow); } LONG UpdateWindow() { return ::UpdateWindow(m_hWnd); } public: //protected: virtual BOOL PreCreateWindow(CREATESTRUCTW& cs); virtual BOOL Create(HWND hWndParent, WCHAR* pwszClassName, WCHAR* pwszWindowName, UINT uID, DWORD dwStyle = WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL, DWORD dwExStyle = WS_EX_CLIENTEDGE, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int cx = CW_USEDEFAULT, int cy = CW_USEDEFAULT); virtual BOOL CreateIndirect(HWND hWndParent, UINT nID = 0); virtual BOOL OnInitialUpdate(); virtual BOOL DestroyWindow(); virtual BOOL SubClassWindow(WNDPROC pWndProc); virtual BOOL OnMenuSelect(UINT uID); virtual BOOL OnInitMenuPopup(HMENU hMenu, UINT uPos, BOOL fSysMenu); virtual BOOL HandleMenuPos(HMENU hMenu, UINT uPos, DWORD* pdwFlags); virtual BOOL OnCreate(CREATESTRUCT* pCREATESTRUCT); virtual BOOL OnCommand(UINT iID, HWND hWndCtrl); virtual BOOL OnCommandNotify(INT wNotifyCode, INT iID, HWND hWndCtrl); virtual BOOL OnNotify(INT idCtrl, NMHDR* pNMHDR); virtual BOOL OnUpdateCommand(HMENU hMenu, UINT nID, DWORD* pdwFlags); virtual BOOL OnActivate(UINT fActive, UINT fMinimized, HWND hWndPrevious); virtual BOOL OnClose(); virtual BOOL OnDestroy(); virtual BOOL OnTimer(WPARAM nIDEvent); virtual BOOL OnDropFiles(HDROP hDrop); virtual BOOL OnSysCommand(WPARAM nCmdType, REFPOINTS pts); virtual BOOL OnSize(WPARAM nType, REFPOINTS pts); virtual BOOL OnSizing(WPARAM nType, REFPOINTS pts); virtual BOOL OnMove(REFPOINTS pts); virtual BOOL OnMouseMove(WPARAM nHittest, REFPOINTS pts); virtual BOOL OnDblclk(WPARAM fwKeys, REFPOINTS pts); virtual BOOL OnLButtonDown(WPARAM fwKeys, REFPOINTS pts); virtual BOOL OnLButtonUp(WPARAM fwKeys, REFPOINTS pts); virtual BOOL OnRButtonDown(WPARAM fwKeys, REFPOINTS pts); virtual BOOL OnRButtonUp(WPARAM fwKeys, REFPOINTS pts); virtual BOOL OnSetCursor(HWND hWnd, INT nHittest, INT nMouseMsg); virtual BOOL OnContextMenu(HWND hWnd, REFPOINTS pts); virtual BOOL OnChar(TCHAR chCharCode, LPARAM lKeyData); virtual BOOL OnKeyDown(WPARAM nVirtKey, LPARAM lKeyData); virtual BOOL OnSysKeyDown(WPARAM nVirtKey, LPARAM lKeyData); virtual BOOL OnVScroll(int nScrollCode, int nPos, HWND hWnd); virtual BOOL OnHScroll(int nScrollCode, int nPos, HWND hWnd); virtual BOOL OnNCMouseMove(WPARAM nHittest, REFPOINTS pts); virtual BOOL OnNCButtonDown(WPARAM nHittest, REFPOINTS pts); virtual BOOL OnSetFocus(HWND hWndPrevFocus); //Protect against leaks (reusing the window without destroying it...) virtual BOOL IsDestroyed() { return !m_hWnd && !m_hWndParent && !m_pSubClassProc && !m_pwszClassName; } //Data HWND m_hWnd; HWND m_hWndParent; WINDOWPLACEMENT m_wndPlacement; WCHAR* m_pwszClassName; UINT m_nID; BOOL m_bUnicodeMsg; //SubClass WNDPROC m_pSubClassProc; }; ///////////////////////////////////////////////////////////////////// // CMDIChildLite // ///////////////////////////////////////////////////////////////////// class CMDIChildLite : public CWndLite { public: //Constructors CMDIChildLite(); virtual ~CMDIChildLite(); //Window Proc static LRESULT WINAPI MDIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); virtual BOOL HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); virtual LRESULT UnhandledMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //Messages virtual BOOL OnMDIActivate(BOOL bActivate, HWND hWndActivate, HWND hWndDeactivate); //Helpers virtual BOOL AutoPosition(BOOL fDefaultPosition = TRUE); //protected: virtual BOOL Create(HWND hWndParent, WCHAR* pwszClassName, WCHAR* pwszWindowName, UINT uID, HICON hIcon, DWORD dwStyle = WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER, DWORD dwExStyle = WS_EX_CLIENTEDGE, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int cx = CW_USEDEFAULT, int cy = CW_USEDEFAULT); //protected: //data }; ///////////////////////////////////////////////////////////////////// // CFrameWndLite // ///////////////////////////////////////////////////////////////////// class CFrameWndLite : public CWndLite { public: //constructors CFrameWndLite(); virtual ~CFrameWndLite(); virtual BOOL Create(HWND hWndParent, WCHAR* pwszClassName, WCHAR* pwszWindowName, UINT uID, HICON hIcon, DWORD dwStyle = WS_OVERLAPPEDWINDOW, DWORD dwExStyle = WS_EX_APPWINDOW, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int cx = CW_USEDEFAULT, int cy = CW_USEDEFAULT); virtual BOOL PreTranslateMessage(MSG* pmsg); //Messages virtual BOOL OnNotify(INT idCtrl, NMHDR* pNMHDR); virtual BOOL OnClose(); virtual BOOL OnDestroy(); //Messages virtual void OnToolTip(INT idCtrl, NMHDR* pNMHDR); }; ///////////////////////////////////////////////////////////////////// // CMDIFrameLite // ///////////////////////////////////////////////////////////////////// class CMDIFrameLite : public CFrameWndLite { public: //constructors CMDIFrameLite(); virtual ~CMDIFrameLite(); //Overloads virtual LRESULT UnhandledMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); virtual BOOL PreTranslateMessage(MSG* pmsg); //Overloads virtual BOOL OnCommand(UINT iID, HWND hWndCtrl); virtual BOOL OnCommandNotify(INT wNotifyCode, INT iID, HWND hWndCtrl); virtual BOOL OnNotify(INT idCtrl, NMHDR* pNMHDR); virtual BOOL OnUpdateCommand(HMENU hMenu, UINT nID, DWORD* pdwFlags); //Messages virtual BOOL OnCreate(CREATESTRUCT* pCREATESTRUCT); virtual BOOL OnCreateClient(CREATESTRUCT* pCREATESTRUCT); virtual BOOL OnDestroy(); //Helpers virtual void OnAutoPosition(); //Helpers virtual void MDIActivate(HWND hWnd) { SendMessage(m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hWnd, 0); } virtual void MDIDestroy(HWND hWnd) { SendMessage(m_hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWnd, 0); } //Helpers virtual CMDIChildLite* GetActiveWindow(WCHAR* pwszClassName = NULL); virtual CMDIChildLite* FindWindow(WCHAR* pwszClassName = NULL); //Protect against leaks (reusing the window without destroying it...) virtual BOOL IsDestroyed() { return !m_hWndMDIClient && CFrameWndLite::IsDestroyed(); } //protected: //Data HWND m_hWndMDIClient; }; ///////////////////////////////////////////////////////////////////// // CDialogLite // ///////////////////////////////////////////////////////////////////// class CDialogLite : public CWndLite { public: //constructors CDialogLite(UINT uIDD = 0); virtual ~CDialogLite(); //members virtual LRESULT DoModal(HWND hWndParent); //Modal virtual HWND CreateDlg(HWND hWndParent); //Modeless (non-Modal) virtual void EndDialog(int nResult); //Dialog Proc static INT_PTR WINAPI DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); virtual BOOL HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //protected: virtual BOOL OnInitDialog(); virtual BOOL OnActivate(UINT fActive, UINT fMinimized, HWND hWndPrevious); virtual BOOL OnOK(); virtual BOOL OnCancel(); //Data UINT m_uIDD; BOOL m_fModal; }; ///////////////////////////////////////////////////////////////////// // CSplitterLite // ///////////////////////////////////////////////////////////////////// class CSplitterLite : public CWndLite { public: //constructors CSplitterLite(HWND hWndParent = NULL, UINT nID = 0); //Helpers virtual BOOL SetSplitter(CSplitterLite* pCWndTop, CSplitterLite* pCWndBottom = NULL, CSplitterLite* pCWndLeft = NULL, CSplitterLite* pCWndRight = NULL); virtual BOOL StartTracking(REFPOINTS ptsScreen, REFRECT rectLeft, REFRECT rectRight, BOOL fVertical, POINT* pPoint); virtual BOOL DrawSplitter(HDC hDC, BOOL fVertical, REFRECT rectLeft, REFRECT rectRight, REFPOINTS ptsClient); //Messages virtual BOOL OnNCMouseMove(WPARAM nHittest, REFPOINTS pts); virtual BOOL OnNCButtonDown(WPARAM nHittest, REFPOINTS pts); virtual BOOL OnBorder(REFPOINTS pts, INT iBorder); //protected: //Data CSplitterLite* m_pCWndTop; CSplitterLite* m_pCWndBottom; CSplitterLite* m_pCWndLeft; CSplitterLite* m_pCWndRight; HCURSOR m_hCursorOld; HCURSOR m_hCursorTop; HCURSOR m_hCursorRight; INT m_iBorderCX; INT m_iBorderCY; }; ///////////////////////////////////////////////////////////////////// // CEditBoxLite // ///////////////////////////////////////////////////////////////////// class CEditBoxLite : public CSplitterLite { public: //constructors CEditBoxLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CEditBoxLite(); //Messages virtual BOOL OnCreate(CREATESTRUCT* pCREATESTRUCT); //Interface virtual void SetSel(INDEX iMin, INDEX iMax) { SendMessage(m_hWnd, EM_SETSEL, (WPARAM)iMin, (LPARAM)iMax); } virtual BOOL GetSel(INDEX* piMin, INDEX* piMax) { CHARRANGE cr; BOOL bReturn = GetSel(&cr); if(piMin) *piMin = cr.cpMin; if(piMax) *piMax = cr.cpMax; return bReturn; } virtual BOOL GetSel(CHARRANGE* pcr) { ASSERT(pcr); SendMessageA(m_hWnd, EM_GETSEL, (WPARAM)&pcr->cpMin, (LPARAM)&pcr->cpMax); return pcr->cpMin != pcr->cpMax; } //Inline helpers, (that deal with hWnds) BOOL SetReadOnly(bool bReadOnly) { return (BOOL)SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); } INDEX LineIndex(INDEX nLine) { return (INDEX)SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0); } INDEX LineLength(INDEX nStartChar) { return (INDEX)SendMessage(m_hWnd, EM_LINELENGTH, nStartChar, 0); } void LineScroll(INDEX nLines, INDEX nChars = 0) { SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines); } LRESULT SetOptions(UINT dwOptions, UINT fOperation = ECOOP_OR) { return SendMessage(m_hWnd, EM_SETOPTIONS, fOperation, dwOptions); } BOOL CanPaste() { return (BOOL)SendMessage(m_hWnd, EM_CANPASTE, 0, 0); } void Cut() { SendMessage(m_hWnd, WM_CUT, 0, 0); } void Copy() { SendMessage(m_hWnd, WM_COPY, 0, 0); } void Paste() { SendMessage(m_hWnd, WM_PASTE, 0, 0); } BOOL ScrollCaret() { return (BOOL)SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0); } virtual void ReplaceSel(LPCWSTR pwszString, bool bCanUndo) { wSendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (WCHAR*)pwszString); } virtual void ReplaceAll(LPCWSTR pwszString, bool bReplaceAll = FALSE, bool fHighlight = FALSE); INDEX GetLineCount() { return (INDEX)SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0); } INDEX GetLine(INDEX iLine, CHAR* pszBuffer, ULONG ulMaxSize); INDEX GetTextRange(CHARRANGE& cr, WCHAR* pwszBuffer); INDEX GetTextRange(CHARRANGE& cr, CHAR* pszBuffer); //Helpers BOOL Save(LPCWSTR pwszFileName); //protected: //data }; ///////////////////////////////////////////////////////////////////////////// // COLORA // // These are the same as defined in CFM_*. But we need a "enumerable" type // so that we can easily pass these to operators, and it knows from the type // which function to call // ///////////////////////////////////////////////////////////////////////////// enum COLORA { CA_NORMAL = 0, CA_BOLD = CFM_BOLD, CA_ITALIC = CFM_ITALIC, CA_UNDERLINE = CFM_UNDERLINE, CA_STRIKEOUT = CFM_STRIKEOUT, CA_PROTECTED = CFM_PROTECTED, CA_LINK = CFM_LINK, CA_AUTO_COLOR = CFE_AUTOCOLOR, CA_COLOR = CFM_COLOR, CA_DISABLE = CFM_CHARSET, }; enum OUTPUT_SPECIAL { NEWLINE = 00000001, }; ///////////////////////////////////////////////////////////////////////////// // CConsole // ///////////////////////////////////////////////////////////////////////////// class CConsole /*: public CStringCache*/ { public: //Constructors CConsole() { m_pwszNewLine = wWndEOL; } virtual ~CConsole() { } //Interface inline CConsole& GetConsole() { return *this; } //Strings virtual CConsole& operator << (LPCWSTR pwsz ) { Write(pwsz); return GetConsole(); } // virtual CConsole& operator << (OUTPUT_SPECIAL eSpecial); // virtual CConsole& operator << (void* pv); //Overloads virtual HRESULT Write(LPCWSTR pwsz) = 0; virtual HRESULT WriteLine(LPCWSTR pwsz = NULL) { if(pwsz) Write(pwsz); return Write(m_pwszNewLine); } //Helpers // virtual HRESULT WriteMBCS(LPCSTR pwsz); //Colors virtual void SetColor(COLORREF refColor) { } virtual void SetColorAttrib(COLORA attColor, BOOL fEnable = TRUE) { } virtual CConsole& operator << (COLORREF refColor) { SetColor(refColor); return GetConsole(); } virtual CConsole& operator << (COLORA attColor) { SetColorAttrib(attColor); return GetConsole(); } protected: //Overloads //TODO: We should be implementing this here, the derived class of the console should... // virtual HRESULT WriteCore(ULONG cbBytes, BYTE* rgBytes, ULONG* pcbWritten = NULL); //Data WCHAR* m_pwszNewLine; private: //NOTE: Don't use MBCS - requires expensive conversions... // virtual CConsole& operator << (LPCSTR pwsz ); }; ///////////////////////////////////////////////////////////////////// // CRichEditLite // ///////////////////////////////////////////////////////////////////// class CRichEditLite : public CEditBoxLite, public CConsole { public: //constructors CRichEditLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CRichEditLite(); //Messages virtual BOOL OnCreate(CREATESTRUCT* pCREATESTRUCT); virtual BOOL OnNotify(INT idCtrl, NMHDR* pNMHDR); virtual BOOL SetWordWrap(BOOL fWordWrap); //Messages virtual BOOL OnLink(INT idCtrl, ENLINK* pEnLink); //Abstract - CConsole implementation virtual HRESULT Write(LPCWSTR pwszText) { Append(pwszText); return S_OK; } virtual void SetColor(COLORREF refColor) { if(refColor == RGB_NONE) { //Restore color SetEffects(CFM_COLOR, CFE_AUTOCOLOR, 0); } else { //Change color SetEffects(CFM_COLOR, 0, refColor); } } virtual void SetColorAttrib(COLORA attColor, BOOL fEnable = TRUE) { if(attColor == CA_NORMAL) { //Restore (all) Attributes //NOTE: Just simply using ULONG_MAX as the mask causes problems since //other things (ie: charset, etc) are also affected... SetEffects(CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_PROTECTED | CFM_LINK, 0, 0); } else { //Change Attributes SetEffects(attColor, fEnable ? attColor : ~attColor, 0); } } //Interface //NOTE: We overload Get and Set since for RichEdit controls these have different messages for > 64k virtual void SetSel(INDEX iMin, INDEX iMax) { CHARRANGE cr = { (LONG)iMin, (LONG)iMax }; SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr); } virtual BOOL GetSel(INDEX* piMin, INDEX* piMax) { CHARRANGE cr; BOOL bReturn = GetSel(&cr); if(piMin) *piMin = cr.cpMin; if(piMax) *piMax = cr.cpMax; return bReturn; } virtual BOOL GetSel(CHARRANGE* pcr) { ASSERT(pcr); SendMessageA(m_hWnd, EM_EXGETSEL, 0, (LPARAM)pcr); return pcr->cpMin != pcr->cpMax; } //Inline helpers, (that deal with hWnds) INDEX LineFromChar(INDEX nIndex) { return (INDEX)SendMessage(m_hWnd, EM_EXLINEFROMCHAR, 0, nIndex); } BOOL SetEffects(DWORD dwMask, DWORD dwEffects, COLORREF crTextColor); BOOL SetCharFormat(DWORD dwMask, CHARFORMATW& charFormatW); virtual void ReplaceSel(LPCWSTR pwszString, bool bCanUndo) { wSendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (WCHAR*)pwszString); } virtual void ReplaceSel(LPCWSTR pwszString, bool bCanUndo, DWORD dwMask, DWORD dwColor); virtual void Append(LPCWSTR pwszString, bool bCanUndo = TRUE, DWORD dwMask = 0, DWORD dwColor = 0); virtual INDEX FindText(DWORD dwFindFlags, FINDTEXTEXW* pFINDTEXT); virtual BOOL FindNext(DWORD dwFindFlags, WCHAR* pwszText); //Helpers LRESULT SetDefaultFont(); WCHAR* GetSelectedText(BOOL fEntireLine = TRUE); //protected: //data }; ///////////////////////////////////////////////////////////////////// // CScrollBarLite // ///////////////////////////////////////////////////////////////////// class CScrollBarLite : public CSplitterLite { public: //constructors CScrollBarLite(); virtual ~CScrollBarLite(); //Messages //Inline helpers, (that deal with hWnds) virtual INT SetScrollPos( int nPos, BOOL bRedraw = TRUE ) { return ::SetScrollPos(m_hWnd, SB_CTL, nPos, bRedraw); } virtual INT GetScrollPos() { return ::GetScrollPos(m_hWnd, SB_CTL); } virtual BOOL SetScrollRange( int nMin, int nMax, BOOL bRedraw = TRUE ) { return ::SetScrollRange(m_hWnd, SB_CTL, nMin, nMax, bRedraw); } virtual BOOL GetScrollRange( int* pnMin, int* pnMax ) { return ::GetScrollRange(m_hWnd, SB_CTL, pnMin, pnMax); } //Helpers virtual INT SetScroll( int nPos, BOOL bRedraw = TRUE ); virtual INT SetScrollInfo(INT iPos, INT iRangeSize, INT iPageSize, BOOL fRedraw = TRUE); virtual BOOL GetScrollInfo(INT* piPos, INT* piRangeSize, INT* piPageSize); //protected: //data }; ///////////////////////////////////////////////////////////////////// // CListBoxLite // ///////////////////////////////////////////////////////////////////// class CListBoxLite : public CWndLite { public: //constructors CListBoxLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CListBoxLite(); //Messages virtual BOOL OnCommandNotify(INT wNotifyCode, INT iID, HWND hWndCtrl); //Overloads virtual BOOL OnDblClk(INT iID, HWND hWndCtrl); //Inline helpers, (that deal with hWnds) virtual INDEX SetCurSel(WPARAM nSelect) { return (INDEX)::SendMessage(m_hWnd, LB_SETCURSEL, nSelect, 0); } virtual INDEX GetCurSel() const { return (INDEX)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0); } virtual INDEX AddString(WCHAR* pwszString) { return (INDEX)wSendMessage(m_hWnd, LB_ADDSTRING, 0, pwszString); } virtual INDEX DeleteString(WPARAM wParam) { return (INDEX)wSendMessage(m_hWnd, LB_DELETESTRING, wParam, 0); } virtual INDEX GetText(INDEX nIndex, WCHAR* pwszBuffer) { return (INDEX)wSendMessage(m_hWnd, LB_GETTEXT, nIndex, pwszBuffer); } virtual INDEX GetTextLen(INDEX nIndex) { return (INDEX)::SendMessage(m_hWnd, LB_GETTEXTLEN, nIndex, 0); } virtual BOOL SetItemParam(INDEX nIndex, LPARAM lParam) { return ::SendMessage(m_hWnd, LB_SETITEMDATA, nIndex, lParam) != CB_ERR; } virtual LPARAM GetItemParam(INDEX nIndex) const { return ::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0); } virtual INDEX GetCount() { return (INDEX)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0); } //Helpers //protected: //data }; ///////////////////////////////////////////////////////////////////// // CListViewLite // ///////////////////////////////////////////////////////////////////// class CListViewLite : public CSplitterLite { public: //constructors CListViewLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CListViewLite(); //Messages virtual BOOL OnCreate(CREATESTRUCT* pCREATESTRUCT); virtual BOOL OnNotify(INT idCtrl, NMHDR* pNMHDR); virtual BOOL OnColumnClick(INT idCtrl, NMLISTVIEW* pNMListView); virtual BOOL OnItemActivate(INT idCtrl, NMLISTVIEW* pNMListView); virtual BOOL OnItemChanged(INT idCtrl, NMLISTVIEW* pNMListView); //Inline helpers, (that deal with hWnds) BOOL DeleteColumn(INDEX nCol) { return (BOOL)SendMessage(m_hWnd, LVM_DELETECOLUMN, nCol, 0); } BOOL DeleteItem(INDEX iItem) { return (BOOL)SendMessage(m_hWnd, LVM_DELETEITEM, iItem, 0L); } BOOL DeleteAllItems() { return (BOOL)SendMessage(m_hWnd, LVM_DELETEALLITEMS, 0, 0L); } INDEX GetNextItem(INDEX iItem, INT nFlags) { return (INDEX)SendMessage(m_hWnd, LVM_GETNEXTITEM, iItem, MAKELPARAM(nFlags, 0)); } INDEX GetColumnWidth(INDEX nCol) { return (INDEX)SendMessage(m_hWnd, LVM_GETCOLUMNWIDTH, nCol, 0); } BOOL SetColumnWidth(INDEX nCol, INT cx) { return (BOOL)SendMessage(m_hWnd, LVM_SETCOLUMNWIDTH, nCol, MAKELPARAM(cx, 0)); } UINT GetItemState(INDEX iItem, UINT nMask) { return (UINT)SendMessage(m_hWnd, LVM_GETITEMSTATE, iItem, nMask); } BOOL EnsureVisible(INDEX iItem, bool fPartialOK = FALSE) { return (BOOL)SendMessage(m_hWnd, LVM_ENSUREVISIBLE, iItem, MAKELPARAM(fPartialOK, 0)); } INDEX GetItemCount() { return (INDEX)SendMessage(m_hWnd, LVM_GETITEMCOUNT, 0, 0); } INDEX GetCountPerPage() { return (INDEX)SendMessage(m_hWnd, LVM_GETCOUNTPERPAGE, 0, 0); } HWND EditLabel(INDEX iItem) { return (HWND)SendMessage(m_hWnd, LVM_EDITLABEL, iItem, 0L); } //Helpers LPARAM GetItemParam(INDEX iItem); INDEX GetItemText(INDEX iItem, INDEX iSubItem, WCHAR* wszName, ULONG ulMaxChars); INDEX InsertColumn(INDEX iColumn, WCHAR* wszName, INT iImage = IMAGE_NONE); BOOL SetColumn(INDEX iColumn, WCHAR* wszName, INT iImage = IMAGE_NONE); INDEX InsertItem(INDEX iItem, INDEX iSubItem, WCHAR* wszName, LPARAM lParam = PARAM_NONE, INT iImage = IMAGE_NONE, UINT iState = IMAGE_NONE, UINT iStateMask = IMAGE_NONE); BOOL SetItemText(INDEX iItem, INDEX iSubItem, WCHAR* pwszName); BOOL SetItemState(INDEX iItem, INDEX iSubItem, UINT iState, UINT iStateMask); INDEX HitTest(REFPOINTS pts, UINT* pFlags = NULL, BOOL fClientCoords = TRUE); INT GetItemImage(INDEX iItem, INDEX iSubItem = 0); BOOL SetItemImage(INDEX iItem, INDEX iSubItem, INT iImage); BOOL SetItemParam(INDEX iItem, INDEX iSubItem, LPARAM lParam); }; ///////////////////////////////////////////////////////////////////// // CTreeViewLite // ///////////////////////////////////////////////////////////////////// class CTreeViewLite : public CSplitterLite { public: //constructors CTreeViewLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CTreeViewLite(); //Messages virtual BOOL OnCreate(CREATESTRUCT* pCREATESTRUCT); virtual BOOL OnNotify(INT idCtrl, NMHDR* pNMHDR); virtual BOOL OnSelChanged(INT idCtrl, NMTREEVIEW* pNMTreeView); virtual BOOL OnBeginLabelEdit(INT idCtrl, NMTVDISPINFO* ptvdi); virtual BOOL OnEndLabelEdit(INT idCtrl, NMTVDISPINFO* ptvdi); virtual BOOL OnBeginDrag(INT idCtrl, NMTREEVIEW* pNMTreeView); virtual BOOL OnMouseMove(WPARAM nHittest, REFPOINTS pts); virtual BOOL OnLButtonUp(WPARAM fwKeys, REFPOINTS pts); //Inline helpers, (that deal with hWnds) BOOL SelectItem(HTREEITEM hItem) { ASSERT(IsWindow(m_hWnd)); return (BOOL)SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem); } HTREEITEM GetSelectedItem() { ASSERT(IsWindow(m_hWnd)); return (HTREEITEM)SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0); } BOOL DeleteAllItems() { ASSERT(IsWindow(m_hWnd)); return (BOOL)SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT); } HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode = TVGN_NEXT) { ASSERT(IsWindow(m_hWnd)); return (HTREEITEM)SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem); } HTREEITEM GetChildItem(HTREEITEM hItem) { ASSERT(IsWindow(m_hWnd)); return (HTREEITEM)SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); } HTREEITEM GetParentItem(HTREEITEM hItem) { ASSERT(IsWindow(m_hWnd)); return (HTREEITEM)SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem); } BOOL DeleteItem(HTREEITEM hItem) { ASSERT(IsWindow(m_hWnd)); return (BOOL)SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)hItem); } BOOL EnsureVisible(HTREEITEM hItem) { ASSERT(IsWindow(m_hWnd)); return (BOOL)SendMessage(m_hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItem); } BOOL Expand(HTREEITEM hItem, UINT flag = TVE_EXPAND) { ASSERT(IsWindow(m_hWnd)); return (BOOL)SendMessage(m_hWnd, TVM_EXPAND, flag, (LPARAM)hItem); } //Helpers LPARAM GetItemParam(HTREEITEM hItem); HTREEITEM HitTest(REFPOINTS pts, UINT* pFlags = NULL, BOOL fClientCoords = TRUE); BOOL SetItemState(HTREEITEM hItem, UINT iState, UINT iStateMask); BOOL SetItemImage(HTREEITEM hItem, INT iImage, INT iSelectedImage); BOOL SetItemParam(HTREEITEM hItem, LPARAM lParam); HTREEITEM InsertItem(HTREEITEM hParent, HTREEITEM hInsAfter, WCHAR* wszName, LPARAM lParam = PARAM_NONE, INT iImage = IMAGE_NONE, INT iSelectedImage = IMAGE_NONE, UINT iState = IMAGE_NONE, UINT iStateMask = IMAGE_NONE); BOOL SetItemText(HTREEITEM hItem, WCHAR* pwszText); protected: //Data HTREEITEM m_hDraggingItem; }; ///////////////////////////////////////////////////////////////////// // CComboBoxLite // ///////////////////////////////////////////////////////////////////// class CComboBoxLite : public CWndLite { public: //constructors CComboBoxLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CComboBoxLite(); //Messages virtual BOOL OnCommandNotify(INT wNotifyCode, INT iID, HWND hWndCtrl); //Overloads virtual BOOL OnSelChange(INT iID, HWND hWndCtrl); virtual BOOL OnDropDown(INT iID, HWND hWndCtrl); //Inline helpers, (that deal with hWnds) virtual INDEX GetCount() { return (INDEX)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0); } virtual INDEX GetCurSel() const { return (INDEX)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0); } virtual INDEX SetCurSel(WPARAM nSelect) { return (INDEX)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0); } virtual INDEX AddString(WCHAR* pwszString) { return (INDEX)::wSendMessage(m_hWnd, CB_ADDSTRING, 0, pwszString); } virtual INDEX DeleteString(INDEX nIndex) { return (INDEX)::SendMessage(m_hWnd, CB_DELETESTRING, nIndex, 0); } virtual BOOL SetItemParam(INDEX nIndex, LPARAM lParam) { return ::SendMessage(m_hWnd, CB_SETITEMDATA, nIndex, lParam) != CB_ERR; } virtual void ResetContent() { ::SendMessage(m_hWnd, CB_RESETCONTENT, 0, 0); } virtual LPARAM GetItemParam(INDEX nIndex) const { return ::SendMessage(m_hWnd, CB_GETITEMDATA, nIndex, 0); } virtual LRESULT GetTextLength(INDEX nIndex) { return ::SendMessage(m_hWnd, CB_GETLBTEXTLEN, nIndex, 0); } virtual INDEX GetText(INDEX nIndex, WCHAR* pwszBuffer) { return (INDEX)::wSendMessage(m_hWnd, CB_GETLBTEXT, nIndex, pwszBuffer); } virtual INDEX FindString(WCHAR* pwszString, INDEX nStartIndex = -1) { return (INDEX)wSendMessage(m_hWnd, CB_FINDSTRING, nStartIndex, pwszString); } virtual INDEX FindStringExact(WCHAR* pwszString, INDEX nStartIndex = -1) { return (INDEX)wSendMessage(m_hWnd, CB_FINDSTRINGEXACT, nStartIndex, pwszString); } //Helpers virtual INDEX GetSelText(WCHAR* pwszBuffer, ULONG ulMaxSize); virtual INDEX SetSelText(WCHAR* pwszBuffer, BOOL fAddItem = FALSE); virtual INDEX SetSelValue(LPARAM lParam); virtual LPARAM GetSelValue(); virtual INDEX AddString(WCHAR* pwszString, LPARAM lParam); //Helpers virtual INDEX SaveSelection() { return m_iSavedSel = GetCurSel(); } virtual INDEX RestoreSelection() { return SetCurSel(m_iSavedSel); } virtual BOOL Populate(ULONG cItems, const WIDENAMEMAP* rgItems); //protected: //data INDEX m_iSavedSel; }; ///////////////////////////////////////////////////////////////////// // CButtonLite // ///////////////////////////////////////////////////////////////////// class CButtonLite : public CWndLite { public: //constructors CButtonLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CButtonLite(); //Inline helpers, (that deal with hWnds) virtual UINT IsButtonChecked() { return ::IsDlgButtonChecked(m_hWndParent, m_nID); } virtual BOOL CheckButton(UINT uCheck) { ASSERT(uCheck == BST_CHECKED || uCheck == BST_UNCHECKED || BST_INDETERMINATE); return ::CheckDlgButton(m_hWndParent, m_nID, uCheck); } //protected: //data }; ///////////////////////////////////////////////////////////////////// // CComboBoxEx // ///////////////////////////////////////////////////////////////////// class CComboBoxEx : public CComboBoxLite { public: //constructors CComboBoxEx(HWND hWndParent = NULL, UINT nID = 0); virtual ~CComboBoxEx(); //Overrides virtual BOOL OnInitialUpdate(); //Messages INDEX InsertItem(INDEX iItem, WCHAR* pwszName, LPARAM lParam = PARAM_NONE, INT iIndent = PARAM_NONE, INT iImage = IMAGE_NONE, UINT iSelectedImage = IMAGE_NONE); //Inline helpers, (that deal with hWnds) //NOTE: AddString is not processed by ComboBoxEx so we have to fabricate the functionality virtual INDEX AddString(WCHAR* pwszString) { return InsertItem(-1/*iItem*/, pwszString); } virtual INDEX AddString(WCHAR* pwszString, LPARAM lParam) { return InsertItem(-1/*iItem*/, pwszString, lParam); } virtual BOOL SetUnicodeFormat(BOOL fUnicode = TRUE) { return (BOOL)::SendMessage(m_hWnd, CBEM_SETUNICODEFORMAT, fUnicode, 0); } //NOTE: FindString is not processed by ComboBoxEx, but FindStringExact is... virtual INDEX FindString(WCHAR* pwszString, INDEX nStartIndex = -1) { ASSERT(!L"FindString is not processed by ComboBoxEx, change code to use FindStringExact."); return FindStringExact(pwszString, nStartIndex); } //protected: //data }; ///////////////////////////////////////////////////////////////////// // CToolBarLite // ///////////////////////////////////////////////////////////////////// class CToolBarLite : public CWndLite { public: //constructors CToolBarLite(); virtual ~CToolBarLite(); virtual BOOL Create(HWND hWndParent, UINT nID, UINT nBitmapID, UINT cButtons, TBBUTTON* rgButtons, DWORD dwStyle = WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS /*| TBSTYLE_WRAPABLE | TBSTYLE_ALTDRAG | CCS_ADJUSTABLE*/); //Helpers virtual BOOL EnableButton(UINT nID, bool fEnable) { return (BOOL)SendMessage(m_hWnd, TB_ENABLEBUTTON, nID, fEnable); } }; ///////////////////////////////////////////////////////////////////// // CStatusBarLite // ///////////////////////////////////////////////////////////////////// class CStatusBarLite : public CWndLite { public: //constructors CStatusBarLite(); virtual ~CStatusBarLite(); //Creation virtual BOOL Create(HWND hWndParent, UINT nID, WCHAR* pwszText = L"", DWORD dwStyle = WS_CHILD | WS_VISIBLE); //Helpers virtual BOOL SetText(WCHAR* pwszText, int nPane, int nType) { return (BOOL)wSendMessage(m_hWnd, SB_SETTEXTW, (nPane|nType), pwszText); } virtual BOOL SetParts(int nParts, int* pWidths) { return (BOOL)SendMessage(m_hWnd, SB_SETPARTS, nParts, (LPARAM)pWidths); } }; ///////////////////////////////////////////////////////////////////// // CPropPageLite // ///////////////////////////////////////////////////////////////////// class CPropPageLite : public CDialogLite { public: //constructors CPropPageLite(UINT uIDD, TCHAR* ptszTitle = NULL); virtual ~CPropPageLite(); //Dialog Proc static INT_PTR WINAPI PropPageProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); virtual BOOL HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //Interface virtual void SetParent(CPropSheetLite* pCPropSheetLite); virtual CPropSheetLite* GetParent() { return m_pCPropSheet; } //protected: virtual BOOL OnSetActive(); virtual BOOL OnKillActive(); virtual BOOL OnOK(); virtual BOOL OnApply(); virtual BOOL OnCancel(); virtual BOOL OnReset(); //Data PROPSHEETPAGE m_psPage; //Parent Property Sheet CPropSheetLite* m_pCPropSheet; }; ///////////////////////////////////////////////////////////////////// // CPropSheetLite // ///////////////////////////////////////////////////////////////////// class CPropSheetLite : public CWndLite { public: //constructors CPropSheetLite(TCHAR* ptszTitle = NULL, HICON hIcon = NULL); virtual ~CPropSheetLite(); //protected: virtual void AddPage(CPropPageLite* pCPropPageLite); virtual LRESULT DoModal(HWND hWndParent, INT nStartPage = 0); //Data PROPSHEETHEADER m_psHeader; }; ///////////////////////////////////////////////////////////////////////////// // CTabLite // ///////////////////////////////////////////////////////////////////////////// class CTabLite : public CSplitterLite { public: //constructors CTabLite(HWND hWndParent = NULL, UINT nID = 0); virtual ~CTabLite(); //messages virtual BOOL OnCreate(CREATESTRUCT* pCREATESTRUCT); virtual BOOL OnNotify(INT idCtrl, NMHDR* pNMHDR); virtual BOOL OnSelChange(INT iID, HWND hWndCtrl); virtual BOOL OnSelChanging(INT iID, HWND hWndCtrl); //Inlines virtual INDEX GetItemCount() { return (INDEX)::SendMessageA(m_hWnd, TCM_GETITEMCOUNT, 0, 0); } virtual INDEX GetCurSel() const { return (INDEX)::SendMessageA(m_hWnd, TCM_GETCURSEL, 0, 0); } virtual INDEX SetCurSel(INDEX iItem, BOOL fSendNotification = FALSE); virtual BOOL DeleteAllItems() { return (BOOL)::SendMessageA(m_hWnd, TCM_DELETEALLITEMS, 0, 0); } virtual BOOL DeleteItem(INDEX iItem) { return (BOOL)::SendMessageA(m_hWnd, TCM_DELETEITEM, iItem, 0); } virtual void AdjustRect(RECT* pRect, BOOL fLarger = FALSE) { SendMessageA(m_hWnd, TCM_ADJUSTRECT, fLarger, (LPARAM)pRect); } virtual INDEX FindTab(LPARAM lParam); //Helpers BOOL GetItem(INDEX iItem, WCHAR* pwszText, ULONG ulMaxLength, LPARAM* plParam = NULL); LPARAM GetItemData(INDEX iItem); virtual BOOL SetItem(INDEX iItem, LPCWSTR pwszName, LPARAM lParam = PARAM_NONE, INT iImage = IMAGE_NONE, DWORD dwState = STATE_NONE, DWORD dwStateMask = STATE_NONE); virtual BOOL SetItemText(INDEX iItem, LPCWSTR pwszName); virtual INDEX InsertItem(INDEX iItem, LPCWSTR pwszText, LPARAM lParam = PARAM_NONE, INT iImage = IMAGE_NONE, DWORD dwState = STATE_NONE, DWORD dwStateMask = STATE_NONE); //protected: //data }; ////////////////////////////////////////////////////////////////////////// // CCmdLineLite // ////////////////////////////////////////////////////////////////////////// class CCmdLineLite { protected: // Attributes public: CCmdLineLite(); virtual ~CCmdLineLite(); // Operations virtual void ResetParser(); //protected: virtual void ParseParam(WCHAR* pwszParam, BOOL bFlag, BOOL bLast ); virtual BOOL ParseCommandLine(); virtual BOOL ParseFile(WCHAR* pwszFileName); WCHAR m_wszLastCmd[MAX_QUERY_LEN]; }; ///////////////////////////////////////////////////////////////////// // CWaitCursor // ///////////////////////////////////////////////////////////////////// class CWaitCursor { public: //Constructors CWaitCursor(); virtual ~CWaitCursor(); //Helpers void WaitCursor(); void RestoreCursor(); protected: //Data HCURSOR m_hPrevCursor; }; static const WCHAR UNICODE_BYTE_ORDER_MARK = 0xFEFF; ///////////////////////////////////////////////////////////////////// // CFileLite // ///////////////////////////////////////////////////////////////////// class CFileLite { public: //constructor CFileLite(); virtual ~CFileLite(); //Open virtual HRESULT Open(LPCWSTR pwszFileName, DWORD dwDesiredAccess = GENERIC_READ, DWORD dwShareMode = FILE_SHARE_READ, DWORD dwCreationDisposition = OPEN_EXISTING, BOOL fDisplayDialog = FALSE, HWND hWndParent = NULL); virtual HRESULT Open(LPCSTR pszFileName, DWORD dwDesiredAccess = GENERIC_READ, DWORD dwShareMode = FILE_SHARE_READ, DWORD dwCreationDisposition = OPEN_EXISTING, BOOL fDisplayDialog = FALSE, HWND hWndParent = NULL); //Low Level Byte Operations virtual HRESULT ReadBytes(ULONG cbBytes, BYTE* rgBytes, ULONG* pcbRead = NULL); virtual HRESULT WriteBytes(ULONG cBytes, BYTE* rgBytes, ULONG* pcbWritten = NULL); //Read virtual HRESULT Read(ULONG cbBytes, WCHAR* pwszText, ULONG* pcbRead = NULL); virtual HRESULT Read(ULONG cbBytes, CHAR* pszText, ULONG* pcbRead = NULL); //Write virtual HRESULT Write(LPCWSTR pwszText, ULONG* pcbWritten = NULL); virtual HRESULT Write(LPCSTR pszText, ULONG* pcbWritten = NULL); virtual HRESULT WriteFormat(LPCWSTR pwszFmt, ...); //Helpers virtual HRESULT Flush(); virtual HRESULT Close(); virtual DWORD Seek(LONG lDistanceToMove, DWORD dwOrigin); //Interface virtual BOOL IsOpen() { return m_hFile != NULL; } virtual BOOL IsEOF() { return m_bEOF; } //Unicode vs. MBCS virtual BOOL IsUnicode() { return m_bUnicode; } virtual void SetUnicode(BOOL bUnicode = TRUE) { m_bUnicode = bUnicode; } virtual BOOL DetermineUnicode(); private: //Data HANDLE m_hFile; BOOL m_bEOF; BOOL m_bUnicode; ULONG m_cbWritten; ULONG m_cbRead; }; ///////////////////////////////////////////////////////////////////// // CDropObject // ///////////////////////////////////////////////////////////////////// class CDropObject : public IDataObject { public: //constructor CDropObject(); virtual ~CDropObject(); //IUnknown STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); //Interface STDMETHODIMP GetData(FORMATETC* pformatetcIn, STGMEDIUM* pmedium); STDMETHODIMP GetDataHere(FORMATETC* pformatetc, STGMEDIUM* pmedium); STDMETHODIMP QueryGetData(FORMATETC* pformatetc); STDMETHODIMP GetCanonicalFormatEtc(FORMATETC* pformatectIn, FORMATETC* pformatetcOut); STDMETHODIMP SetData(FORMATETC* pformatetc, STGMEDIUM* pmedium, BOOL fRelease); STDMETHODIMP EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC** ppenumFormatEtc); STDMETHODIMP DAdvise(FORMATETC* pformatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection); STDMETHODIMP DUnadvise(DWORD dwConnection); STDMETHODIMP EnumDAdvise(IEnumSTATDATA** ppenumAdvise); private: //Data //IUnknown ULONG m_cRef; }; ///////////////////////////////////////////////////////////////////// // CDropSource // ///////////////////////////////////////////////////////////////////// class CDropSource : public IDropSource { public: //constructor CDropSource(); virtual ~CDropSource(); //IUnknown STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); //Interface STDMETHODIMP QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState); STDMETHODIMP GiveFeedback(DWORD dwEffect); private: //Data //IUnknown ULONG m_cRef; }; ///////////////////////////////////////////////////////////////////// // CDropTarget // ///////////////////////////////////////////////////////////////////// class CDropTarget : public IDropTarget { public: //constructor CDropTarget(); virtual ~CDropTarget(); //IUnknown STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); //Interface STDMETHODIMP DragEnter(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect); STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect); STDMETHODIMP DragLeave(); STDMETHODIMP Drop(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect); private: //Data //IUnknown ULONG m_cRef; }; /////////////////////////////////////////////////////////////////////////////// // COleClient // /////////////////////////////////////////////////////////////////////////////// class COleClient : public CWndLite, // public IDocHostUIHandler, // public IDocHostShowUI, public IOleClientSite, public IOleInPlaceSite, public IDispatch { public: //Constructors COleClient(HWND hWndParent = NULL, UINT nID = 0) : CWndLite(hWndParent, nID) { m_cRef = 0; } virtual ~COleClient() { } //IUnknown STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) { *ppvObject = NULL; if(riid == IID_IUnknown) *ppvObject = (IOleClientSite*)this; else if(riid == IID_IDispatch) *ppvObject = (IDispatch*)this; else if(riid == IID_IOleClientSite) *ppvObject = (IOleClientSite*)this; else if(riid == IID_IOleInPlaceSite) *ppvObject = (IOleInPlaceSite*)this; else if(riid == IID_IOleWindow) *ppvObject = (IOleWindow*)this; else if(riid == DIID_DWebBrowserEvents2) *ppvObject = (IDispatch*)this; else return E_NOINTERFACE; return S_OK; } STDMETHOD_(ULONG, AddRef)() { return ++m_cRef; } STDMETHOD_(ULONG, Release)() { return --m_cRef; } //IDispatch STDMETHOD(GetTypeInfoCount)(UINT* pctinfo) { return E_NOTIMPL; } STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) { return E_NOTIMPL; } STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) { return E_NOTIMPL; } STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { return E_NOTIMPL; } //IOleClientSite STDMETHOD(SaveObject)(void) { return S_OK; } STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) { ATLTRACENOTIMPL(_T("IOleClientSite::GetMoniker")); } STDMETHOD(GetContainer)(IOleContainer **ppContainer) { ATLTRACENOTIMPL(_T("IOleClientSite::GetContainer")); } STDMETHOD(ShowObject)(void) { return S_OK; } STDMETHOD(OnShowWindow)(BOOL fShow) { return S_OK; } STDMETHOD(RequestNewObjectLayout)(void) { return S_OK; } // IOleWindow STDMETHOD(GetWindow)(HWND *phwnd) { *phwnd = m_hWnd; return S_OK; } STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode) { return S_OK; } // IOleInPlaceSite STDMETHOD(CanInPlaceActivate)(void) { return S_OK; } STDMETHOD(OnInPlaceActivate)(void) { return S_OK; } STDMETHOD(OnUIActivate)(void) { return S_OK; } STDMETHOD(GetWindowContext)(IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) { GetClientRect(m_hWnd, lprcPosRect); GetClientRect(m_hWnd, lprcClipRect); return S_OK; } STDMETHOD(Scroll)(SIZE scrollExtant) { return S_OK; } STDMETHOD(OnUIDeactivate)(BOOL fUndoable) { return S_OK; } STDMETHOD(OnInPlaceDeactivate)( void) { return S_OK; } STDMETHOD(DiscardUndoState)( void) { return S_OK; } STDMETHOD(DeactivateAndUndo)( void) { return S_OK; } STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect) { return S_OK; } protected: //Data //IUnknown ULONG m_cRef; }; /////////////////////////////////////////////////////////////////////////////// // CWebBrowser // /////////////////////////////////////////////////////////////////////////////// class CWebBrowser : public COleClient { public: //Constructors CWebBrowser(HWND hWndParent = NULL, UINT nID = 0) : COleClient(hWndParent, nID) { } virtual ~CWebBrowser() { } //Helpers virtual BOOL OnInitialUpdate() { HRESULT hr = S_OK; DWORD dwCookie = 0; //Create the WebBrowser Control m_spOleObject.Release(); TESTC(hr = m_spOleObject.CoCreateInstance(CLSID_WebBrowser)); //Obtain the WebBrowser interface m_spWebBrowser2.Release(); TESTC(hr = m_spOleObject->QueryInterface(&m_spWebBrowser2)); //Advise our liseners TESTC(hr = AtlAdvise(m_spWebBrowser2, (IDispatch*)this, DIID_DWebBrowserEvents2, &dwCookie)); //Set the client to be this window TESTC(hr = m_spOleObject->SetClientSite(this)); CLEANUP: return SUCCEEDED(hr); } virtual HRESULT Show(LONG iVerb = OLEIVERB_INPLACEACTIVATE) { HRESULT hr = S_OK; MSG msg; RECT rect; GetClientRect(m_hWnd, &rect); //OLEIVERB_HIDE TESTC(hr = m_spOleObject->DoVerb(iVerb, &msg, this, 0, m_hWnd, &rect)); CLEANUP: return hr; } virtual HRESULT Navigate(LPWSTR pwszURL) { HRESULT hr = S_OK; //Navigate TESTC(hr = m_spWebBrowser2->Navigate(pwszURL, NULL, NULL, NULL, NULL)); //Show TESTC(hr = Show()); CLEANUP: return hr; } virtual HRESULT Load(IStream* pIStream) { HRESULT hr = S_OK; //We need a defualt page TESTC(hr = Navigate(L"about:blank")); //Save the stream for later use, since we have to wait for DocumentComplete //Before we can finish loading the stream. Se OnDocumentComplete for the remainder of //this function... m_spLoadStream = pIStream; CLEANUP: return hr; } // // IDispatch Methods // STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { switch (dispidMember) { case DISPID_DOWNLOADBEGIN: OnDownloadBegin(); break; case DISPID_DOWNLOADCOMPLETE: OnDownloadComplete(); break; case DISPID_DOCUMENTCOMPLETE: OnDocumentComplete(); break; case DISPID_NAVIGATECOMPLETE: OnNavigateComplete(); break; case DISPID_AMBIENT_DLCONTROL: OnDownloadControl(); break; default: return DISP_E_MEMBERNOTFOUND; } return S_OK; } //Dispatched Messages virtual BOOL OnDownloadBegin() { return FALSE; } virtual BOOL OnDownloadComplete() { return FALSE; } virtual BOOL OnDocumentComplete() { HRESULT hr = S_OK; //Default Implementation if(m_spLoadStream) { CComPtr spDocument; CComPtr spPersistStream; CComPtr spStream; CHAR szHTMLText[] = "

Stream Test

This HTML content is being loaded from a stream."; HGLOBAL hHTMLText = GlobalAlloc(GPTR, lstrlen(szHTMLText)+1); TESTC(hr = CreateStreamOnHGlobal(hHTMLText, TRUE, &spStream)); //Obtain the document TESTC(hr = m_spWebBrowser2->get_Document(&spDocument)); TESTC(hr = spDocument->QueryInterface(&spPersistStream)); //Load the passed in stream TESTC(hr = spPersistStream->InitNew()); TESTC(hr = spPersistStream->Load(/*m_spLoadStream*/spStream)); // TESTC(hr = m_spWebBrowser2->Refresh()); //We are now done with the stream m_spLoadStream.Release(); } CLEANUP: return SUCCEEDED(hr); } virtual BOOL OnNavigateComplete() { return FALSE; } virtual BOOL OnDownloadControl() { return FALSE; } //protected: //Data CComPtr m_spOleObject; CComPtr m_spWebBrowser2; CComPtr m_spLoadStream; }; ///////////////////////////////////////////////////////////////////// // _NoAddRefReleaseQIOnSmartPtr // // Make sure all calls go through the object, not overloaded operators. // This serves two purposes, firs tit prevent users from using spComPtr->Release(), // otherwise they have release the internal pointer, but our object still has a reference. // Second it ensures all calls (AddRef, Release, QI), actually go through the class // so we can correctly trace all (IUnknown) calls... ///////////////////////////////////////////////////////////////////// template class _NoAddRefReleaseQIOnSmartPtr : public T { private: STDMETHOD_(ULONG, AddRef)()=0; STDMETHOD_(ULONG, Release)()=0; STDMETHOD_(HRESULT, QI)(REFIID, void**)=0; }; ///////////////////////////////////////////////////////////////////// // CSmartPtr // // CComPtr ///////////////////////////////////////////////////////////////////// template class CSmartPtr { public: //Constructors CSmartPtr() { m_p = NULL; } ~CSmartPtr() { Release(); } //Inlines inline REFIID iid() { return __uuidof(T); } //Operators _NoAddRefReleaseQIOnSmartPtr* operator->() const { ASSERT(m_p); return (_NoAddRefReleaseQIOnSmartPtr*)m_p; } //The assert on operator& usually indicates a bug. If this is really //what is needed, however, take the address of the p member explicitly. T** operator&() { ASSERT(!m_p); return &m_p; } operator T*() const { return (T*)m_p; } bool operator!() const { return (m_p == NULL); } bool operator==(T* pT) const { return m_p == pT; } //IUnknown ULONG AddRef() { ASSERT(m_p); return m_p->AddRef(); } ULONG Release() { ULONG ulRefCount = 0; if(m_p) { ulRefCount = m_p->Release(); m_p = NULL; } return ulRefCount; } template HRESULT QueryInterface(Q** pp) const { ASSERT(pp && !*pp); return m_p->QueryInterface(__uuidof(Q), (void**)pp); } //Helpers HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) { ASSERT(!m_p); return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&m_p); } HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) { CLSID clsid; HRESULT hr = CLSIDFromProgID(szProgID, &clsid); if(SUCCEEDED(hr)) hr = CoCreateInstance(clsid, pUnkOuter, dwClsContext); return hr; } protected: T* m_p; }; ///////////////////////////////////////////////////////////////////// // CSmartPtrTrace // ///////////////////////////////////////////////////////////////////// template class CSmartPtrTrace : public CSmartPtr { public: //Overload ULONG AddRef() { //Delegate ULONG ulRefCount = CSmartPtr::AddRef(); //Trace the call Write(GetInterfaceName(__uuidof(T))); WriteLine(L"::AddRef() - "); return ulRefCount; } //Overload ULONG Release() { //Delegate ULONG ulRefCount = CSmartPtr::Release(); //Trace the call Write(GetInterfaceName(__uuidof(T))); WriteLine(L"::Release() - "); return ulRefCount; } //Overload template HRESULT QueryInterface(Q** pp) const { //Delegate HRESULT hr = CSmartPtr::QueryInterface(pp); //Trace the call // CSmartPtrTrace::Write(GetInterfaceName(__uuidof(T))); // CSmartPtrTrace::Write(L"::QueryInterface("); // CSmartPtrTrace::Write(GetInterfaceName(__uuidof(Q))); // CSmartPtrTrace::WriteLine(L") - "); return hr; } //Helpers HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) { //Delegate HRESULT hr = CSmartPtr::CoCreateInstance(rclsid, pUnkOuter, dwClsContext); //Trace the call // WriteLine(L"CoCreateInstance(..." WIDESTRING(__uuidof(T)) "..."); return hr; } inline void Write(LPCWSTR pwsz) { TRACE(pwsz); // CTrace* pCTrace = GetTrace(); // if(pCTrace) // pCTrace->OutputText(0, 0, pwsz); } inline void WriteLine(LPCWSTR pwsz) { Write(pwsz); Write(wWndEOL); // CTrace* pCTrace = GetTrace(); // if(pCTrace) // { // pCTrace->OutputText(0, 0, pwsz); // pCTrace->OutputLineEnd(); // } } }; /////////////////////////////////////////////////////////////////////////////// // CXmlDOM // /////////////////////////////////////////////////////////////////////////////// class CXmlDOM { public: //Constructors CXmlDOM(); virtual ~CXmlDOM(); //Helpers virtual HRESULT Create() { HRESULT hr = S_OK; //Create the DOM TESTC(hr = m_spXMLDocument.CoCreateInstance(CLSID_DOMDocument)); //TODO: Why is the DOM Asynch by default? //This makes it so an app has to register to events just to know when its complete... //We will make the Document Synchquential unless the user makes it asynch before they call load... TESTC(hr = m_spXMLDocument->put_async(VARIANT_FALSE)); CLEANUP: return hr; } virtual HRESULT LoadStream(IUnknown* pIUnkStream) { //Delegate CComVariant varXML = pIUnkStream; return LoadFile(&varXML); } virtual HRESULT LoadXML(BSTR bstrXML) { HRESULT hr = S_OK; VARIANT_BOOL bSuccessful = VARIANT_FALSE; //Load the document TESTC(hr = m_spXMLDocument->loadXML(bstrXML, &bSuccessful)); if(!bSuccessful) TESTC(hr = E_FAIL); CLEANUP: return hr; } virtual HRESULT LoadFile(VARIANT* pVariant) { ASSERT(pVariant); HRESULT hr = S_OK; VARIANT_BOOL bSuccessful = VARIANT_FALSE; //Load the document TESTC(hr = m_spXMLDocument->load(*pVariant, &bSuccessful)); if(!bSuccessful) TESTC(hr = E_FAIL); CLEANUP: return hr; } virtual HRESULT Save(BSTR bstrFileName) { //Prevent a copy of the BSTR CComVariant varFileName; varFileName.vt = VT_BSTR; varFileName.bstrVal = bstrFileName; //Delegate HRESULT hr = Save(&varFileName); varFileName.bstrVal = NULL; return hr; } virtual HRESULT Save(VARIANT* pVariant) { ASSERT(pVariant); HRESULT hr = S_OK; //Save the XML TESTC(hr = m_spXMLDocument->save(*pVariant)); CLEANUP: return hr; } virtual HRESULT PrintNode(IXMLDOMNode* spNode, CConsole& rConsole, ULONG ullevel = 0); virtual HRESULT PrintAttributes(IXMLDOMNode* spNode, CConsole& rConsole); //protected: //Data CSmartPtr m_spXMLDocument; }; ///////////////////////////////////////////////////////////////////// // CComWSTR // ///////////////////////////////////////////////////////////////////// class CComWSTR { protected: //Data WCHAR* m_str; private: //NOTE: Don't use Copy Constructors or Operators - Very DANGEROUS! //We have already have to track down a bug where SAFE_ALLOC(cwstr, WCHAR, 1), //corrupted memory later one, since it really means cwstr = "garbage-no-terminator-memory" CComWSTR(LPCOLESTR pSrc) { ASSERT(FALSE); } CComWSTR(const CComWSTR& src) { ASSERT(FALSE); } // CComWSTR& operator=(const CComWSTR& src){ ASSERT(FALSE); } // CComWSTR& operator=(LPCOLESTR pSrc) { ASSERT(FALSE); } public: //Constructors CComWSTR() { m_str = NULL; } virtual ~CComWSTR() { Empty(); } void Empty() { SAFE_FREE(m_str); } CComWSTR& operator+=(LPCOLESTR pSrc) { Append(pSrc); return *this; } bool operator!() const { return (m_str == NULL); } WCHAR** operator&() { ASSERT(m_str == NULL); return &m_str; } //Cast operator - so we can use this class in instances of just WCHAR operator WCHAR*() const { return m_str; } //Helpers unsigned int Length() const { return (m_str == NULL) ? 0 : (unsigned int)wcslen(m_str); } WCHAR* Copy() const { return wcsDuplicate(m_str); } HRESULT CopyFrom(LPCOLESTR pSrc) { Empty(); m_str = wcsDuplicate(pSrc); return S_OK; } //Non allocating functions - quick and easy attaching to exiting strings void Attach(WCHAR* src) { ASSERT(m_str == NULL); m_str = src; } WCHAR* Detach() { WCHAR* s = m_str; m_str = NULL; return s; } //Appending HRESULT Append(LPCOLESTR pSrc) { return Append(pSrc, pSrc ? (unsigned int)wcslen(pSrc) : 0); } HRESULT Append(LPCOLESTR pSrc, int nLen) { HRESULT hr = S_OK; if(nLen) { ASSERT(pSrc); int n1 = Length(); //Realloc the current string SAFE_REALLOC(m_str, WCHAR, n1+nLen+1); memcpy(m_str+n1, pSrc, nLen*sizeof(WCHAR)); m_str[n1+nLen] = NULL; } CLEANUP: return hr; } }; ///////////////////////////////////////////////////////////////////// // ListView Helpers // ///////////////////////////////////////////////////////////////////// INDEX LV_InsertColumn(HWND hWnd, INDEX iColumn, WCHAR* wszName, INT iImage = IMAGE_NONE); INDEX LV_InsertItem(HWND hWnd, INDEX iItem, INDEX iSubItem, WCHAR* wszName, LPARAM lParam = PARAM_NONE, INT iImage = IMAGE_NONE, UINT iState = IMAGE_NONE, UINT iStateMask = IMAGE_NONE); BOOL LV_SetItemState(HWND hWnd, INDEX iItem, INDEX iSubItem, UINT iState, UINT iStateMask); BOOL LV_SetItemText(HWND hWnd, INDEX iItem, INDEX iSubItem, WCHAR* pwszName); BOOL LV_SetItemImage(HWND hWnd, INDEX iItem, INDEX iSubItem, INT iImage); BOOL LV_SetItemParam(HWND hWnd, INDEX iItem, INDEX iSubItem, LPARAM lParam); INDEX LV_GetItemText(HWND hWnd, INDEX iItem, INDEX iSubItem, WCHAR* pwszName, ULONG ulMaxSize); UINT LV_GetItemState(HWND hWnd, INDEX iItem, UINT iMask = 0); INT LV_GetItemImage(HWND hWnd, INDEX iItem, INDEX iSubItem); LPARAM LV_GetItemParam(HWND hWnd, INDEX iItem, INDEX iSubItem); INDEX LV_FindItem(HWND hWnd, LPARAM lParam, INDEX iStart = -1); LRESULT LV_GetSelItems(HWND hWnd, INDEX* pcItems = NULL, INDEX** prgSelItems = NULL, LPARAM** prgSelParams = NULL); LRESULT LV_GetAllItems(HWND hWnd, INDEX* pcItems = NULL, INDEX** prgItems = NULL, LPARAM** prgParams = NULL); ///////////////////////////////////////////////////////////////////// // TreeView Helpers // ///////////////////////////////////////////////////////////////////// HTREEITEM TV_InsertItem(HWND hWnd, HTREEITEM hParent, HTREEITEM hInsAfter, WCHAR* wszName, LPARAM lParam = 0, INT iImage = 0, INT iSelectedImage = 0, UINT iState = 0, UINT iStateMask = 0); BOOL TV_GetItemText(HWND hWnd, HTREEITEM hItem, WCHAR* pwszBuffer, LONG ulMaxSize); LPARAM TV_GetItemParam(HWND hWnd, HTREEITEM hItem); BOOL TV_SetItemState(HWND hWnd, HTREEITEM hItem, UINT iState, UINT iStateMask); HTREEITEM TV_FindItem(HWND hWnd, HTREEITEM hParent, WCHAR* wszName); #endif //__CDIALOGLITE_H__