在YC++中如何实现Ajax功能

news/2024/7/4 13:09:31

                                       在YC++中如何实现Ajax功能

    在Web页面中,有时当用户点击一个按钮后,只有其中的一小块内容将要发生变化。在使用Ajax以前,一般必须刷新整个页面,无论页面中变化的部分还是没有变化的部分,都要从服务器中重新读取。使用Ajax后,只需要从服务器中读取变化了的那一部分,如此,不但减少了等待时间,还节省了网络带宽资源。
    在YC++中也可以实现Ajax功能,下面举例说明其原理及用法。
    首先创建一个主窗口, 在主窗口创建一个HTML窗口, 将网页rdweb.htm调入HTML窗口。
    在界面的输入框中敲入完整的网址,点击“读网页”按钮,即可将指定的网址文本读入编辑框中。
    这说明,每改变一次网址并按下按钮,页面中只有编辑框内容改变,因此只需重读编辑框中的内容,而其它内容不必重读。
    下面这个例子实现了这个功能,因而也就实现了Ajax功能。

/*****************************************************************************************************************/
将下列代码存入名字任取的文件, 如: ajax.cpp
在yc++中, 用 <文件 打开或创建cpp源程序> 调入ajax.cpp, 再用 <工具 执行> 运行ajax.cpp
   或在dos中, 用 ycc ajax.cpp 生成 ajax.exe, 再运行ajax.exe
在vc++中, 用 cl ajax.cpp 生成 ajax.exe, 再运行ajax.exe




#ifndef YCC
#include       
#include        "include/ycapi.h"

#pragma         comment(lib, "gdi32.lib")
#pragma         comment(lib, "user32.lib")
#pragma         comment(lib, "yxbapi.lib")
#endif


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
    HWND hwnd = YXB_Window(MainWndProc,NULL,0,             //创建主窗口. 用YC++的API函数创建, 它不需要注册.
      WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU,
      "YC++实现Ajax功能",110,50,800,600,NULL,WT_WIN);

    MSG  msg;
    while(GetMessage(&msg,NULL,0,0))
      {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
      }
    return 0;
}

int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
    static HWND  hwndHtml;
    switch(iMessage)
      {
 case WM_CREATE:
      hwndHtml = YXB_Window(NULL,0,WS_EX_CLIENTEDGE,0,NULL,0,0,0,0,hwnd,WT_HTML); //创建HTML窗口
      WEB_PAGE  apage;
      memset(&apage,0,sizeof(apage));
      apage.href = "rdweb.htm";
      SendMessage(hwndHtml,WM_COMMAND,WEB_A,(int)&apage);   //调入网页
      return FALSE;
 case WM_SIZE:
      RECT mRect;
      GetClientRect(hwnd,&mRect);
      MoveWindow(hwndHtml,0,0,mRect.right,mRect.bottom,TRUE);
      return TRUE;
 case WM_DESTROY:
      PostQuitMessage(0);
      return FALSE;
      }
    return DefWindowProc(hwnd,iMessage,wParam,lParam);
}

/*****************************************************************************************************************/
/*****************************************************************************************************************/
将下列HTML文本拷入指定文件: rdweb.htm

/*****************************************************************************************************************/

输入网址:
www.sohu.com"
 style="font-size:28; width=480; color:red; border:4 green solid; background-color:RGB(185,185,185);">


<script language=javascript>
function set_text(s)  //设置文本框
{
    htmltext.value = unescape(s);
}

function but_click()  //点击按钮时执行该函数
{
    read_web_file(myin.value);  //读网址中的网页文件
}
</script>


<script language=ycscript>
#define YCB
HWND htmlwnd;
void main(YARG *parg)
{
    htmlwnd = parg->hwnd;
}

void read_web_file(char *fileptr)
{
    char *srcbuf=NULL;
    int  glen=0;

    //用WinInet读网址(fileptr)中的文件, 读者有兴趣的话可以改为用socket读
    HINTERNET hIS,hIC,hIR;
    hIS = InternetOpen("HTTPGET", INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    hIC = InternetConnect(hIS, fileptr, INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
    hIR = HttpOpenRequest(hIC,NULL, "", NULL,NULL,NULL,0,0);
    if(HttpSendRequest(hIR,NULL,0,NULL,0))
      {
 #define ONETIME_BYTES   4096
 DWORD   dwBytes;
 for(int rdlen=0; ; )
   {
     if(glen+ONETIME_BYTES >= rdlen)
       {
  srcbuf = (char*)realloc(srcbuf, rdlen + ONETIME_BYTES);
  rdlen += ONETIME_BYTES;
       }
     InternetReadFile(hIR,&srcbuf[glen], ONETIME_BYTES, &dwBytes);
     glen += dwBytes;
     if(!dwBytes)    break;
   }
      }
    InternetCloseHandle(hIC);
    InternetCloseHandle(hIS);


    if(!srcbuf)  //没有读到数据
      {
 MessageBox(htmlwnd, fileptr, "没有找到服务器!", MB_ICONHAND|MB_OK);
 return;
      }

    char *desbuf,*tempbuf;
    glen = YXB_escape(&desbuf, srcbuf, glen);  //将文本进行转换以使其中不含引号
    tempbuf = (char*)malloc(glen+128);
    sprintf(tempbuf,"set_text('%s')", desbuf);
    YXB_RunJScriptEx(htmlwnd, 0, tempbuf);  //在c/c++代码中执行javascript函数 set_text(s)
    free(tempbuf);
    free(desbuf);
    free(srcbuf);
}
</script>

/*****************************************************************************************************************/
该例子需将YC++的下列几个文件拷入源程序所在目录:

   YC01/yxbapi.dll    C/C++编译器, 浏览器内核库
   YC01/yxbimg.dll    图象, 动画解码库
   YC01/yxbext.dll    浏览器内核交互代码库
   YC01/yc.ah         C/C++编译器头文件包
   YC01/yc.cmp        C/C++编译器错误信息

   YC01/include/ycapi.h         用其它编译器运行该例时所需头文件
   YC01/include/yxbapi.lib      用其它编译器运行该例时所需库文件, 如VC6.0
 





http://www.niftyadmin.cn/n/3654710.html

相关文章

股票技术指标详解--移动平均线(MA)

移动平均线(MA) 移动平均线是应用非常广泛的一种技术指标。它构造简单&#xff0c;客观公正&#xff0c;不易人为操作骗线&#xff0c;受到很多股票投资者的青睐。 一、指数平均数的计算 所谓"移动平均线"是指一段时间内的算术平均线&#xff0c;通常以收盘价…

股票技术指标详解--指数平滑移动平均线(MACD)

指数平滑移动平均线(MACD) 一、指数平滑移动平均线 运用两条移动平均线相互背离&#xff0c;相互应证的交易法则&#xff0c;就可以得出指数平滑移动平均线(MACD)。它是运用快速和慢速移动平均线交叉换位、合并分离的特性加以双重平滑运算&#xff0c;来判断买卖时机。该指…

欢迎使用WINX!

WINX关注一个目标&#xff1a;简单而高效。它是一个C界面开发库&#xff0c;容易使用&#xff0c;兼容WTL。WTL是高效的&#xff0c;然而&#xff0c;它并不容易上手。官方博客&#xff1a;http://winxcn.blogspot.com/您可以在sourceforge获得WINX的最新版本&#xff1a;http:…

OWC学习笔记-Spreadsheet插入行/列

在owc提供的Spreadsheet api 中&#xff0c;没有直接添加行列的方法&#xff0c;可以使用执行命令的方式实现 添加新行在第3行&#xff0c;代码如下&#xff1a; varssConstants Spreadsheet1.Constants; Spreadsheet1.ActiveSheet.Row(3).Select(); Spreadsheet1.Command…

AOP, Signal/Slot, and Decoupling

解耦&#xff08;Decoupling&#xff09;是一个永恒的话题。本来没有打算这么早开始涉及“大型程序解耦”这一块内容&#xff0c;但是smithfox在winxcn论坛上提及相关的话题&#xff0c;所以决定还是在这里聊聊我对“解耦”的一些看法。面向方面编程&#xff08;AOP&#xff0c…

对比WINX,WTL,MFC,SmartWin代码效率

我们以Hello, World! 程序为例&#xff0c;对比一下各个界面库的代码效率。对于界面程序&#xff0c;个人认为空间效率较之时间效率要占据主导因素&#xff0c;故此这里比较的是空间效率。另外&#xff0c;由于优化的极限是直接用Windows SDK&#xff0c;故此对比亦加入Windows…

股票技术指标详解--指数平均数(EXPMA)

来源&#xff1a;http://wma.cmbchina.com/education/stock/index/expma.htm 指数平均数(EXPMA) 该指标以交叉为主要讯号。该指标可以随股价的快速移动&#xff0c;立即调整方向&#xff0c;有效地解决讯号落后的问题&#xff0c;但该指标在盘整行情中不适用。 一、使用方法&a…