在YC++中如何?Ajax功能

來源:互聯網
上載者:User

                                       在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        <windows.h>
#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

/*****************************************************************************************************************/
<BODY bgcolor=#556667>
輸入網址:
<input  id=myin value="www.sohu.com"
 style="font-size:28; width=480; color:red; border:4 green solid; background-color:RGB(185,185,185);">

<button onclick="but_click()"> 讀網頁 </button>

<textarea id=htmltext style="width=90%; height=470; background-color:RGB(185,185,185);"> </textarea>

<!----javascript指令碼----------------------------------------------------------------------->
<script language=javascript>
function set_text(s)  //設定文字框
{
    htmltext.value = unescape(s);
}

function but_click()  //點擊按鈕時執行該函數
{
    read_web_file(myin.value);  //讀網址中的網頁檔案
}
</script>

<!----c/c++指令碼-------------------------------------------------------------------------->
<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
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.