首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

c++编纂webui内核

2012-10-17 
c++编写webui内核这篇文章我一直想写,但是一直没有动笔,因为这里面牵扯的内容太多,而且有一部分并非我原创

c++编写webui内核

     这篇文章我一直想写,但是一直没有动笔,因为这里面牵扯的内容太多,而且有一部分并非我原创,拿出来有班门弄斧之嫌,所以一拖再拖,现在感觉可以把自己的一些经验心得和大家分享一下了。

       现在webui的使用范围很广,在一些大型软件上随处可见,其实这东西说白了也不难,就是c++(当然,也可以是其他语言)加个webbrowser,然后客户端与网页进行通信,牵扯到的主要是com技术。

webbro.h

// Main.cpp : 实现文件//#include "stdafx.h"#include "vNotes.h"#include "Main.h"#include "afxdialogex.h"#include "GetFlv.h"#include "vNotesDlg.h"// CMain 对话框void GetFlag(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;result->vt=VT_I4;result->lVal=d->m_flag;}void GetDate(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;BSTR bstr=_com_util::ConvertStringToBSTR(d->m_strDate.GetBuffer(0));result->vt=VT_BSTR;result->bstrVal=bstr;}void GetColor(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;CColorDialog   dlgColor;dlgColor.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;if(dlgColor.DoModal()){COLORREF col=dlgColor.m_cc.rgbResult;int r=GetRValue(col);int g=GetGValue(col);int b=GetBValue(col);CString strColor;strColor.Format("#%x%x%x",r,g,b);BSTR bstr=_com_util::ConvertStringToBSTR(strColor.GetBuffer(0));result->vt=VT_BSTR;result->bstrVal=bstr;}}void AddDowndLoad(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;char *url=_com_util::ConvertBSTRToString(par->rgvarg[1].bstrVal);char *file=_com_util::ConvertBSTRToString(CComBSTR(d->m_strPath+"\\html\\")+par->rgvarg[0].bstrVal);PostThreadMessage(d->m_ThredId,WM_MYDOWNLOAD,(WPARAM)url,(LPARAM)file);}void ViewNote(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;CMain *newDlg=new CMain;newDlg->m_flag=1;char *szDate=_com_util::ConvertBSTRToString(par->rgvarg[0].bstrVal);newDlg->m_strDate=szDate;delete[] szDate;newDlg->Create(IDD_VNOTES_MAIN);newDlg->CenterWindow();newDlg->ShowWindow(1);}void EditNote(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;CMain newDlg;newDlg.m_flag=2;char *szDate=_com_util::ConvertBSTRToString(par->rgvarg[0].bstrVal);newDlg.m_strDate=szDate;delete[] szDate;d->ShowWindow(0);newDlg.DoModal();d->ShowWindow(1);}void DelImg(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;char *file=_com_util::ConvertBSTRToString(CComBSTR(d->m_strPath+"\\html\\")+par->rgvarg[0].bstrVal);DeleteFile(file);delete[] file;}void GetFlv(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;CGetFlv flvDlg;CString strWeb;flvDlg.m_strWeb=&strWeb;d->ShowWindow(0);flvDlg.DoModal();d->ShowWindow(1);result->vt=VT_BSTR;result->bstrVal=_com_util::ConvertStringToBSTR(strWeb);}void EditPass(CWebDialog *dlg,DISPPARAMS* par,VARIANT* result){CMain* d=(CMain*)dlg;d->m_vNotesDlg->GetDlgItem(IDC_BUTTON2)->ShowWindow(0);d->m_vNotesDlg->EnableWindow(TRUE);d->m_vNotesDlg->ShowWindow(1);}IMPLEMENT_DYNAMIC(CMain, CDialogEx)DWORD CMain::m_ThredId=0;CMain::CMain(CWnd* pParent /*=NULL*/): CDialogEx(CMain::IDD, pParent){m_bInit=0;m_flag=0;}CMain::~CMain(){}void CMain::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CMain, CDialogEx)ON_WM_CLOSE()ON_WM_SYSCOMMAND()ON_WM_SIZE()ON_WM_DESTROY()ON_WM_NCLBUTTONDBLCLK()END_MESSAGE_MAP()// CMain 消息处理程序void CMain::OnClose(){if(m_flag==0){ShowWindow(0);}else if(m_flag==1){DestroyWindow();delete this;}else if(m_flag==2){EndDialog(IDOK);}//CDialogEx::OnClose();}void CMain::OnSysCommand(UINT nID, LPARAM lParam){// TODO: 在此添加消息处理程序代码和/或调用默认值if(nID==SC_MINIMIZE){if(m_flag==0){ShowWindow(0);}else if(m_flag==1){DestroyWindow();delete this;}else if(m_flag==2){EndDialog(IDOK);}return;}CDialogEx::OnSysCommand(nID, lParam);}BOOL CMain::OnInitDialog(){CDialogEx::OnInitDialog();CRect rect (0,0,450,500);   AdjustWindowRect(&rect,GetStyle(),false);   CRect   cDest; ::SystemParametersInfo(SPI_GETWORKAREA,   0,   &cDest,   0); if(m_flag==0){SetWindowPos(&wndTopMost,cDest.Width()-rect.Width(),cDest.Height()-rect.Height(),rect.Width(),rect.Height(),SWP_SHOWWINDOW);}else{MoveWindow((cDest.Width()-rect.Width())/2,(cDest.Height()-rect.Height())/2,800,600);CenterWindow();}InitWebUI();_GetWB2()->put_Silent(VARIANT_TRUE);GetCurrentDirectory(255,m_strPath.GetBuffer(255));m_strPath.ReleaseBuffer();InitExt();if(m_flag==0){LoadUIFromHtml(CComBSTR(m_strPath+"\\html\\edit.html"));}else if(m_flag==1){LoadUIFromHtml(CComBSTR(m_strPath+"\\html\\view.html"));}else if(m_flag==2){LoadUIFromHtml(CComBSTR(m_strPath+"\\html\\edit.html"));}m_bInit=1;if(m_ThredId==0){CreateThread(0,0,DownLoad,0,0,&m_ThredId);}return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE}void CMain::OnSize(UINT nType, int cx, int cy){__super::OnSize(nType, cx, cy);if(m_bInit)SetWebRect(&CRect(0,0,cx,cy));// TODO: 在此处添加消息处理程序代码}BOOL CMain::PreTranslateMessage(MSG* pMsg){// TODO: 在此添加专用代码和/或调用基类return  wndproc(pMsg);}void CMain::InitExt(){ONFUNCEVEVT(GetFlag);ONFUNCEVEVT(GetColor);ONFUNCEVEVT(AddDowndLoad);ONFUNCEVEVT(ViewNote);ONFUNCEVEVT(GetDate);ONFUNCEVEVT(EditNote);ONFUNCEVEVT(DelImg);ONFUNCEVEVT(GetFlv);ONFUNCEVEVT(EditPass);}DWORD WINAPI CMain::DownLoad(LPVOID l){while(1){Sleep(1);MSG msg;if(PeekMessage(&msg,0,0,0,PM_REMOVE)){if(msg.message==WM_MYDOWNLOAD){char* url=(char*)(msg.wParam);char* file=(char*)(msg.lParam);URLDownloadToFile(0,url,file,0,0);delete[] url;delete[] file;}else if(msg.message==WM_QUIT){break;}}}return 0;}void CMain::OnDestroy(){__super::OnDestroy();// TODO: 在此处添加消息处理程序代码}void CMain::OnNcLButtonDblClk(UINT nHitTest, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CRect   cDest,rect; ::SystemParametersInfo(SPI_GETWORKAREA,   0,   &cDest,   0); GetWindowRect(&rect);if(rect==cDest){MoveWindow((cDest.Width()-rect.Width())/2,(cDest.Height()-rect.Height())/2,800,600);CenterWindow();}else{SetWindowPos(&wndTop,0,0,cDest.Width(),cDest.Height(),SWP_SHOWWINDOW);}__super::OnNcLButtonDblClk(nHitTest, point);}

      以上代码是我最近编写的一个微笔记程序里的代码,有时间我把完整的程序发上来。

    不得不说的是这个webui有一个bug,就是无法响应html里的onkeydown事件,自己摸索半天仍然不知所谓何因,有大侠知道还望赐教。

    本文有不足之处,还望大家多多指正。


热点排行