http://blog.csdn.net/sx1989827/article/details/8068779

#pragma once
#include <mshtmhst.h>
#include <mshtml.h>
#include <Exdisp.h>
#include <exdispid.h>
#include <MsHtmdid.h>
#include <initguid.h>
#include <map>
#include <vector>
using namespace std;
#define RECTWIDTH(r) ((r).right-(r).left)
#define RECTHEIGHT(r) ((r).bottom-(r).top)
class CExternal;
class CWebControl;
class CWebDialog;
struct CWebPar
{
typedef void (*Func)(CWebDialog*,DISPPARAMS*,VARIANT*);
CWebPar(CWebDialog* d,Func f):dlg(d),pfn(f){}
Func pfn;
CWebDialog* dlg;
};
DEFINE_GUID(CGID_IWebBrowser,0xED016940L,0xBD5B,0x11cf,0xBA,0x4E,0x00,0xC0,0x4F,0xD7,0x08,0x16);
#define ONWEBEVENT(obj,e,func)\
{\
this->m_Par.push_back(new CWebPar((CWebDialog*)this,func)); \
(obj).OnNewEvent((e),(this->m_Par[this->m_Par.size()-]),CComBSTR(#func));\
}
#define ONFUNCEVEVT(func)\
{\
this->m_Par.push_back(new CWebPar((CWebDialog*)this,func)); \
CComBSTR bstr;\
bstr+=#func;\
m_mFunc[bstr]=(this->m_Par[this->m_Par.size()-]);\
}
class CWebDialog :
public IDispatch,
public IOleClientSite,
public IOleInPlaceSite,
public IOleInPlaceFrame,
public IDocHostUIHandler,
public IDropTarget
{
public:
typedef void (*pFunc)(LPVOID);
friend CExternal;
friend CWebControl;
CWebDialog(void);
virtual ~CWebDialog(void);
virtual STDMETHODIMP QueryInterface(REFIID iid,void**ppvObject);
virtual STDMETHODIMP_(ULONG) AddRef();
virtual STDMETHODIMP_(ULONG) Release();
// IDispatch Methods
HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo);
HRESULT _stdcall GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo);
HRESULT _stdcall GetIDsOfNames(REFIID riid,OLECHAR FAR* FAR* rgszNames,unsigned int cNames,LCID lcid,DISPID FAR* rgDispId);
HRESULT _stdcall Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR* pDispParams,VARIANT FAR* pVarResult,EXCEPINFO FAR* pExcepInfo,unsigned int FAR* puArgErr); // IOleClientSite methods
virtual STDMETHODIMP SaveObject();
virtual STDMETHODIMP GetMoniker(DWORD dwA,DWORD dwW,IMoniker**pm);
virtual STDMETHODIMP GetContainer(IOleContainer**pc);
virtual STDMETHODIMP ShowObject();
virtual STDMETHODIMP OnShowWindow(BOOL f);
virtual STDMETHODIMP RequestNewObjectLayout(); // IOleInPlaceSite methods
virtual STDMETHODIMP GetWindow(HWND *p);
virtual STDMETHODIMP ContextSensitiveHelp(BOOL);
virtual STDMETHODIMP CanInPlaceActivate();
virtual STDMETHODIMP OnInPlaceActivate();
virtual STDMETHODIMP OnUIActivate();
virtual STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT r1,LPRECT r2,LPOLEINPLACEFRAMEINFO o);
virtual STDMETHODIMP Scroll(SIZE s);
virtual STDMETHODIMP OnUIDeactivate(int);
virtual STDMETHODIMP OnInPlaceDeactivate();
virtual STDMETHODIMP DiscardUndoState();
virtual STDMETHODIMP DeactivateAndUndo();
virtual STDMETHODIMP OnPosRectChange(LPCRECT); // IOleInPlaceFrame methods
virtual STDMETHODIMP GetBorder(LPRECT l);
virtual STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS);
virtual STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS w);
virtual STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject*pV,LPCOLESTR s);
virtual STDMETHODIMP InsertMenus(HMENU h,LPOLEMENUGROUPWIDTHS x);
virtual STDMETHODIMP SetMenu(HMENU h,HOLEMENU hO,HWND hw);
virtual STDMETHODIMP RemoveMenus(HMENU h);
virtual STDMETHODIMP SetStatusText(LPCOLESTR t);
virtual STDMETHODIMP EnableModeless(BOOL f);
virtual STDMETHODIMP TranslateAccelerator(LPMSG,WORD);
virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(DWORD dwID,POINT *ppt,IUnknown *pcmdtReserved,IDispatch *pdispReserved);
virtual HRESULT STDMETHODCALLTYPE GetHostInfo(DOCHOSTUIINFO *pInfo);
virtual HRESULT STDMETHODCALLTYPE ShowUI(DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame,IOleInPlaceUIWindow *pDoc);
virtual HRESULT STDMETHODCALLTYPE HideUI( void);
virtual HRESULT STDMETHODCALLTYPE UpdateUI( void);
virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(BOOL fActivate);
virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate( BOOL fActivate);
virtual HRESULT STDMETHODCALLTYPE ResizeBorder(LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,BOOL fRameWindow);
virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpMsg,const GUID *pguidCmdGroup,DWORD nCmdID);
virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(LPOLESTR *pchKey,DWORD dw);
virtual HRESULT STDMETHODCALLTYPE GetDropTarget(IDropTarget *pDropTarget,IDropTarget **ppDropTarget);
virtual HRESULT STDMETHODCALLTYPE GetExternal( IDispatch **ppDispatch);
virtual HRESULT STDMETHODCALLTYPE TranslateUrl(DWORD dwTranslate,OLECHAR *pchURLIn,OLECHAR **ppchURLOut);
virtual HRESULT STDMETHODCALLTYPE FilterDataObject(IDataObject *pDO,IDataObject **ppDORet);
//IDropTarget
virtual HRESULT STDMETHODCALLTYPE DragEnter(
IDataObject * pDataObject,
//Pointer to the interface of the source data
// object
DWORD grfKeyState, //Current state of keyboard modifier keys
POINTL pt, //Current cursor coordinates
DWORD * pdwEffect //Pointer to the effect of the drag-and-drop
// operation
)
{
return m_pDrop->DragEnter(pDataObject,grfKeyState,pt,pdwEffect);
}
virtual HRESULT STDMETHODCALLTYPE DragOver(
DWORD grfKeyState, //Current state of keyboard modifier keys
POINTL pt, //Current cursor coordinates
DWORD * pdwEffect //Pointer to the effect of the drag-and-drop
// operation
)
{
return m_pDrop->DragOver(grfKeyState,pt,pdwEffect);
}
virtual HRESULT STDMETHODCALLTYPE DragLeave()
{
return m_pDrop->DragLeave();
}
virtual HRESULT STDMETHODCALLTYPE Drop(
IDataObject * pDataObject,
//Pointer to the interface for the source data
DWORD grfKeyState, //Current state of keyboard modifier keys
POINTL pt, //Current cursor coordinates
DWORD * pdwEffect //Pointer to the effect of the drag-and-drop
// operation
)
{
// STGMEDIUM stgmed;
// // ask the IDataObject for some CF_TEXT data, stored as a HGLOBAL
// IEnumFORMATETC *enumetc;
// pDataObject->EnumFormatEtc(1,&enumetc);
// enumetc->Reset();
// FORMATETC etc;
// ULONG p;
// int nMaxFormat=0,nFormat=0;
// HRESULT hr=enumetc->Next(1,&etc,&p);
// while(hr==S_OK)
// {
//
// TCHAR szFormatName[100];
// GetClipboardFormatName(etc.cfFormat, szFormatName, 100-1);
//
//
// FORMATETC fmtetc = { etc.cfFormat, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
// if(SUCCEEDED(pDataObject->GetData(&fmtetc, &stgmed)))
// {
// // 我们必须锁定HGLOBAL句柄,因为我们不能确信这是否是一个GEM_FIXED数据
// char *data = (char*)GlobalLock(stgmed.hGlobal);
// WCHAR *data1 = (WCHAR*)GlobalLock(stgmed.hGlobal);
// // cleanup
// GlobalUnlock(stgmed.hGlobal);
// ReleaseStgMedium(&stgmed);
// }
//
//
// hr=enumetc->Next(1,&etc,&p);
// }
// FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
// if(SUCCEEDED(pDataObject->GetData(&fmtetc, &stgmed)))
// {
// // 我们必须锁定HGLOBAL句柄,因为我们不能确信这是否是一个GEM_FIXED数据
// char *data = (char*)GlobalLock(stgmed.hGlobal);
// // cleanup
// GlobalUnlock(stgmed.hGlobal);
// ReleaseStgMedium(&stgmed);
// } HRESULT hr=m_pDrop->Drop(pDataObject,grfKeyState,pt,pdwEffect);
return hr;
}
public: static DISPID FindId(IDispatch *pObj, LPOLESTR pName);
static HRESULT InvokeMethod(IDispatch *pObj, LPOLESTR pMehtod, VARIANT *pVarResult, VARIANT *ps, int cArgs);
static HRESULT GetProperty(IDispatch *pObj, LPOLESTR pName, VARIANT *pValue);
static HRESULT SetProperty(IDispatch *pObj, LPOLESTR pName, VARIANT *pValue);
BOOL OpenCWebDialogwser();
BOOL OpenURL(VARIANT* pVarUrl);
inline IOleObject* _GetOleObject(){return _pOleObj;};
inline IOleInPlaceObject* _GetInPlaceObject(){return _pInPlaceObj;};
inline IWebBrowser2* _GetWB2(){return _pWB2;};
IWebBrowser2* GetCWebDialogwser2();
BOOL SetWebRect(LPRECT lprc);
IDispatch* GetHtmlWindow();
IHTMLDocument2* GetDocument()
{
if(pHtmlDoc2)
{
pHtmlDoc2->Release();
}
IDispatch* pDp = NULL;
GetCWebDialogwser2()->get_Document(&pDp);
pDp->QueryInterface(IID_IHTMLDocument2,(void**)&pHtmlDoc2);
pDp->Release();
return pHtmlDoc2;
}
HWND GetSelfHwnd()
{
IOleWindow *pOWin;
HWND hBWnd;
HRESULT hRes=GetCWebDialogwser2()-> QueryInterface(IID_IOleWindow, (void**)&pOWin);
hRes=pOWin-> GetWindow(&hBWnd);
hBWnd=::FindWindowEx(hBWnd,,_T("Shell DocObject View"),);
hBWnd=::FindWindowEx(hBWnd,,_T("Internet Explorer_Server"),);
return hBWnd;
}
virtual HWND GetHWND(){return NULL;}
virtual void OnNavigateComplete(IDispatch* pDisp,VARIANT* url){return;} virtual void OnNewWindow(IDispatch **ppDisp,
VARIANT_BOOL *Cancel,
DWORD dwFlags,
BSTR bstrUrlContext,
BSTR bstrUrl
)
{
return;
}
virtual void OnKeyDown( IHTMLEventObj *pEvtObj
)
{
return;
} virtual void OnNewWindow2(IDispatch **ppDisp,
VARIANT_BOOL *Cancel)
{
return;
} virtual void OnProgressChange(long nProgress,long nProgressMax)
{
return;
}
virtual void OnDocumentComplete( IDispatch *pDisp,
VARIANT *URL
)
{
return ;
}
virtual VARIANT_BOOL OnDocumentClick(IHTMLEventObj *pEvtObj)
{
return VARIANT_FALSE;
}
virtual void OnQuit()
{
return;
}
virtual void OnBeforeNavigate(IDispatch *pDisp,
VARIANT *url,
VARIANT *Flags,
VARIANT *TargetFrameName,
VARIANT *PostData,
VARIANT *Headers,
VARIANT_BOOL *Cancel)
{
return;
}
virtual VARIANT_BOOL OnContextMenu(IHTMLEventObj *pEvtObj)
{
CComQIPtr<IHTMLElement> ele;
pEvtObj->get_srcElement(&ele);
CComBSTR tagname;
ele->get_tagName(&tagname);
if(wcsicmp(tagname.m_str,L"input")!= && wcsicmp(tagname.m_str,L"textarea")!=)
{
pEvtObj->put_cancelBubble(VARIANT_TRUE);
pEvtObj->put_returnValue(CComVariant(VARIANT_FALSE));
}
return VARIANT_TRUE;
}
virtual VARIANT_BOOL OnSelectStart(IHTMLEventObj *pEvtObj)
{
CComQIPtr<IHTMLElement> ele;
pEvtObj->get_srcElement(&ele);
CComBSTR tagname;
ele->get_tagName(&tagname);
if(wcsicmp(tagname.m_str,L"input")!= && wcsicmp(tagname.m_str,L"textarea")!=)
{
pEvtObj->put_cancelBubble(VARIANT_TRUE);
pEvtObj->put_returnValue(CComVariant(VARIANT_FALSE));
}
return VARIANT_TRUE;
} private:
IStorage *_pStorage;
IOleObject *_pOleObj;
IOleInPlaceObject *_pInPlaceObj;
RECT _rcWebWnd;
bool _bInPlaced;
bool _bExternalPlace;
bool _bCalledCanInPlace;
bool _bWebWndInited;
IHTMLWindow2* _pHtmlWnd2;
IWebBrowser2* _pWB2;
long _refNum;
IHTMLDocument2 *pHtmlDoc2;
IDropTarget *m_pDrop;
//dialog method
public:
void InitWebUI();
void SetBkColor(VARIANT);
void SetFgColor(VARIANT);
void GetCurPos(POINT *);
virtual void OnNewEvent(BSTR,CWebPar*,BSTR);
LRESULT WINAPI wndproc(MSG *);
LRESULT Eval(BSTR,VARIANT *);
bool LoadUIFromHtml(BSTR);
vector<CWebPar*> m_Par;
map<CComBSTR,CWebPar*> m_mFunc;
};
class CExternal:public IDispatch
{
private:
long num;
public:
typedef void (*pFunc)(LPVOID);
CWebDialog *pDlg;
CExternal(){num=;}
STDMETHODIMP QueryInterface(REFIID iid,void**ppvObject)
{
*ppvObject = NULL;
if (iid == IID_IUnknown) *ppvObject = this;
else if (iid == IID_IDispatch) *ppvObject = (IDispatch*)this;
if(*ppvObject)
{
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) AddRef()
{
return ::InterlockedIncrement( &num );
} STDMETHODIMP_(ULONG) Release()
{
InterlockedDecrement( &num );
long num1=num;
if(num1==)
{
delete this;
}
return num1;
}
HRESULT _stdcall GetTypeInfoCount(
unsigned int * pctinfo)
{
return E_NOTIMPL;
} HRESULT _stdcall GetTypeInfo(
unsigned int iTInfo,
LCID lcid,
ITypeInfo FAR* FAR* ppTInfo)
{
return E_NOTIMPL;
} HRESULT _stdcall GetIDsOfNames(
REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId
)
{
for(map<CComBSTR,CWebPar*>::iterator it=pDlg->m_mFunc.begin();it!=pDlg->m_mFunc.end();it++)
{
if(it->first==*rgszNames)
{
*rgDispId=(DISPID)&it->second;
break;
}
}
return S_OK;
}
HRESULT _stdcall Invoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pDispParams,
VARIANT* pVarResult,
EXCEPINFO* pExcepInfo,
unsigned int* puArgErr
)
{
for(map<CComBSTR,CWebPar*>::iterator it=pDlg->m_mFunc.begin();it!=pDlg->m_mFunc.end();it++)
{
if(dispIdMember==(DISPID)&it->second)
{
((CWebPar*)it->second)->pfn(((CWebPar*)it->second)->dlg,pDispParams,pVarResult);
break;
}
}
return S_OK;
} };
class CWebControl
{
public:
CWebControl(BSTR tag)
{
m_tagName=tag;
}
typedef void (*pFunc)(CWebDialog *);
virtual void Create(CWebDialog*,BSTR,BSTR,int,int,int,int);
virtual bool IsWindowVisible();
virtual void ShowWindow(bool);
virtual void MoveWindow(int,int,int,int);
virtual void OnNewEvent(BSTR,CWebPar*,BSTR);
virtual void SetBkColor(VARIANT);
virtual void SetFgColor(VARIANT);
virtual void GetWindowText(BSTR *);
virtual void SetWindowText(BSTR);
virtual void SetBkImg(BSTR);
virtual void SetZIndex(int);
virtual void GetWindowClient(RECT*);
virtual void SetTransparent(int);
virtual bool GetFromId(CWebDialog*,BSTR);
virtual bool GetFromEval(CWebDialog*,BSTR);
protected:
virtual void AppendChild();
CComBSTR m_bsId;
CWebDialog *m_pWeb;
CComQIPtr<IHTMLElement> m_iEle;
CComBSTR m_tagName;
int m_iZIndex;
};
class CWebButton:public CWebControl
{
public:
CWebButton():CWebControl(CComBSTR(L"button")){}
void Create(CWebDialog*,BSTR,BSTR,int,int,int,int);
};
class CWebText:public CWebControl
{
public:
CWebText():CWebControl(CComBSTR(L"input")),m_bPassword(false){}
void Create(CWebDialog*,BSTR,BSTR,int,int,int,int);
void SetPassWordType(bool);
void GetWindowText(BSTR *);
void SetWindowText(BSTR);
protected:
bool m_bPassword;
};
class CWebStatic:public CWebControl
{
public:
CWebStatic():CWebControl(CComBSTR(L"div")){}
void Create(CWebDialog*,BSTR,BSTR,int,int,int,int);
};
class CWebImage:public CWebControl
{
public:
CWebImage():CWebControl(CComBSTR(L"img")){}
void Create(CWebDialog*,BSTR,BSTR,int,int,int,int);
void SetImage(BSTR);
protected:
CComBSTR m_bsImg;
};
class CWebMultipyText:public CWebControl
{
public:
CWebMultipyText():CWebControl(CComBSTR(L"textarea")){}
void Create(CWebDialog*,BSTR,BSTR,int,int,int,int);
};

c++编写webui内核 .的更多相关文章

  1. 编写HSA内核

    编写HSA内核 介绍 HSA提供类似于OpenCL的执行模型.指令由一组硬件线程并行执行.在某种程度上,这类似于 单指令多数据(SIMD)模型,但具有这样的便利:细粒度调度对于程序员而言是隐藏的,而不 ...

  2. 编写CUDA内核

    编写CUDA内核 介绍 与用于CPU编程的传统顺序模型不同,CUDA具有执行模型.在CUDA中,编写的代码将同时由多个线程(通常成百上千个)执行.解决方案将通过定义网格,块和线程层次结构进行建模. N ...

  3. 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

    这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...

  4. 在Ubuntu上为Android系统编写Linux内核驱动程序

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6568411 在智能手机时代,每个品牌的手机都有 ...

  5. 使用FormatMessage函数编写一个内核错误码查看器

    在编写驱动程序的时候,常用的一个结构是NTSTATUS,它来表示操作是否成功,但是对于失败的情况它的返回码过多,不可能记住所有的情况,应用层有一个GetLastError函数,根据这个函数的返回值可以 ...

  6. 用JAVA编写浏览器内核之实现javascript的document对象与内置方法

    原创文章.转载请注明. 阅读本文之前,您须要对浏览器怎样载入javascript有一定了解. 当然,对java与javascript本身也须要了解. 本文首先介绍浏览器载入并执行javascript的 ...

  7. 内核第三讲,进入ring0,以及编写第一个内核驱动程序.

    内核第三讲,进入ring0,以及编写第一个内核驱动程序. PS: 请下配置双机调试,下方有可能用到.如果不配置,则你可以不用调试, 博客连接: http://www.cnblogs.com/iBina ...

  8. linux 内核邮件列表

    第一节 - 一般性问题 1. 为什么有些时候使用“GNU/Linux"而另一些时候使用“Linux”? 答:在这个FAQ中,我们尝试使用“linux”或者“linux kernel”来表示内 ...

  9. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

随机推荐

  1. 九度OJ 1541 二叉树【数据结构】

    题目地址:http://ac.jobdu.com/problem.php?pid=1541 题目描述: 旋转是二叉树的基本操作,我们可以对任意一个存在父亲节点的子节点进行旋转,包括如下几种形式(设被旋 ...

  2. Linux 简单字符设备驱动程序 (自顶向下)

    第零章:扯扯淡 特此总结一下写的一个简单字符设备驱动程序的过程,我要强调一下“自顶向下”这个介绍方法,因为我觉得这样更容易让没有接触过设备驱动程序的童鞋更容易理解,“自顶向下”最初从<计算机网络 ...

  3. Windows服务器nginx+tomcat服务负载均衡

    一.安装两个tomcat服务自启动 1. 解压两个tomcat,名称为分别1,2 2. 配置环境变量 3. 修改文件server.xml中的三个端口号,使得两个tomcat不冲突 (1)<Ser ...

  4. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  5. winfrom 水晶按钮

    闲来无事,从网上找了不少自定义控件,然后整理了一下,做了一个水晶按钮 /// <summary> /// 表示 Windows 的按钮控 /// </summary> [Des ...

  6. 【转】DataGridView之为每行前面添加序号

    //最简单的方法是在Datagridview的事件RowPostPaint事件下面添加如下代码即可 private void dataGridView1_RowPostPaint(object sen ...

  7. 五个免费UML建模工具推荐

    UML工具很多是商用的,价格不菲:而免费的UML建模工具,功能完善的很少.以下推荐的是五个免费的UML建模工具,相对而言还算功能比较不错. 1.免费UML建模工具推荐:JUDE – community ...

  8. mysql中使用update select

    UPDATE t_user INNER JOIN t_shake ON t_shake.user_id = t_user.user_id SET t_user.shake_total_num = t_ ...

  9. gets--vs--fgets

    gets  fget的区别 这两个函数都能从标准的输入流中读取信息,比如从键盘中输入信息,但是有些区别.   使用gets当输入的字符多于预定个数时候,会造成溢出,程序报错. int main(int ...

  10. 1078. Hashing (25)

    时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task of this problem is simp ...