在mfc编程中创建web风格的图形用户界面(四)

翻译 2006年06月19日 19:38:00

html窗口事件处理

   CHtmlView类中缺少了什么?

   典型的程序处理脚本都是假定能够从程序界面的各个元素(比如按钮)中接收到事件或者数据输入。所以在我们的程序中,还需要解决html界面与MFC后台程序的信息交互问题。我们不必头疼,其实这个问题也并不复杂,我们可以利用CHtmlView类中的OnBeforeNavigate2函数把html界面中的事件传递给MFC后台代码进行处理。

   在html上同样存在事件这个概念。在dhtml中的可能出现的事件模型数量很多。

   html事件的发生可以转化为对window.navigate(%line%)的调用。MFC后台代码可以截获到OnBeforeNavigate2函数以参数%line%调用的消息。用参数%line%我们可以传递任何html上的参数给MFC后台代码,以便于程序处理相关的用户操作。比如说,当用户点击ok按钮的时候该事件会被传递给后台,同时,相应文本框中的内容也会传递给后台。以下是一个实例:

--网页中的代码--

.
.
.
<SCRIPT LANGUAGE="JScript">
function onBtnOk(){
    
    var Txt = txtBox.value;   // the line from TextBox
    window.navigate("app:1005@" + Txt);
    // "app:1005@" – this is the MFC code command prefix.
    // Txt – data can be transmitted along with the event.
}
</SCRIPT>;

<BODY>
.
.
.
<input type=text style="width:50" id=txtBox >
<input type=BUTTON value="Ok" onClick="onBtnOk()" style="width:45%"> 
    // the button has an event handler – the onBtnOk() script function
.
.
.
</BODY>
</HTML>
--MFC后台的相应处理代码--
void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL,
    DWORD nFlags,
    LPCTSTR lpszTargetFrameName,
    CByteArray& baPostedData,
    LPCTSTR lpszHeaders,
    BOOL* pbCancel )
{
    const char APP_PROTOCOL[] = "app:";
    int len = _tcslen(APP_PROTOCOL);
    if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0) {
        // there is a specific Application’s reaction there.
        OnAppCmd(lpszURL + len);
        // Event cancellation, otherwise an error will occur.
        *pbCancel = TRUE;
    }

    CHtmlView::OnBeforeNavigate2(lpszURL, nFlags,
               lpszTargetFrameName, baPostedData,
               lpszHeaders, pbCancel);

}
 

    因为除了html界面以外,MFC本身也有可能成为事件来源,所以必须有相应的MFC代码能够将数据传递给html界面。为了实现这个要求,我们可以采用一种办法,调用html中的脚本函数,将要传递的数据以参数的方式传递给这些函数。这个好主意是由 Eugene Khodakovsky 提出的。

   下面是例子:

void CHtmlCtrl::OnDocumentComplete(LPCTSTR lpszURL) 
{
.
.
.
    HRESULT hr;
    
    hr = GetHtmlDocument()->QueryInterface(IID_IHTMLDocument, 
                                        (void**) &m_pDocument);
    if (!SUCCEEDED(hr))    {
        m_pDocument= NULL;        
        return;
    } 

    IDispatch *disp;
    m_pDocument->get_Script( &disp);    // get script object
.
.
.
}

--用来调用html脚本函数并传递参数的MFC代码--

.
.
.
    CStringArray strArray;
    
    strArray.Add("Parameter 1");
    strArray.Add("Parameter 2");
    strArray.Add("Parameter 3");

    // the call of "SetParameters" function
    // from the script, (passing array of strings)
    m_HtmlCtrl.CallJScript2("SetParameters", strArray);

// inside the CallJScript2 function:
//    GetIDsOfNames() – get the ID number of the script function
//    Invoke() – call the script-function by the number 
.
.
.

   html脚本是一个强大而简单易用的工具,整个程序的界面和相应的用户操作响应都可以用它来完成。用这种web风格的界面方式使得编程变得更简单。这种方式将MFC对于用户界面事件的响应和处理转到对html脚本进行处理。html的编写和程序后台的编写分开进行有一个好处:即使改变了html代码,也可以避免对MFC程序代码进行重新编译。(这里需要说明一下,不用重新编译代码,但是link资源这个步骤还是需要重新进行一下的)

  

相关文章推荐

java图形用户界面编程.rar

  • 2016年11月13日 20:08
  • 3.99MB
  • 下载

LinuxQT图形用户界面编程

  • 2009年03月02日 22:43
  • 907KB
  • 下载

MFC图形用户界面——简单一元二次方程求根

看了贺老师的C++“窗口”程序设计启蒙,模仿着完成了方程求根的图形用户界面,效果如下: 核心代码(鼠标单击求解按钮的消息响应函数): void CMFCApplication11Dlg::On...

Java图形用户界面编程

  • 2012年11月05日 21:10
  • 1.79MB
  • 下载

图形用户界面之窗口事件编程

编写一个JFrame窗口,要求如下: 1. 在窗口的NORTH区放置一个JPanel面板。 2. JPanel面板放置如下组件: (1) JLable标签,标签文本为“兴趣”,右边接着是三个JC...

图形用户界面的创建

  • 2015年10月30日 10:33
  • 52KB
  • 下载

JAVA—GUI(图形用户界面)编程

import java.awt.*; import java.awt.event.*; class Demo { private Frame f; private Button but; pr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在mfc编程中创建web风格的图形用户界面(四)
举报原因:
原因补充:

(最多只允许输入30个字)