在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