用YC++创建HTML对话框

                       用YC++创建HTML对话框

/*****************************************************************************************************************/
  
在YC++中,既可以用DialogBoxIndirectParam、DialogBoxParam等Windows函数创建对话框
   (例子见yc01/ycset.cpp),也可以用其内置函数:

    int YXB_Dialog(YHOOKPROC wnd_hook,void *pUserData,DWORD dwExStyle,
     DWORD dwStyle,LPCSTR lpWindowName,int X,int Y,int nWidth,int nHeight,
     HWND hWndParent, char *webfile,int weblen);

      创建对话框。

/*****************************************************************************************************************/
    这个函数,用HTML和CSS文本表现对话框的界面,用javascript和DOM控制界面元素,用C/C++实现程序逻辑。
这样的对话框,不仅很容易做到界面丰富多彩,还可以使界面和逻辑分开设计,便于调试,
并且使界面设计与平台无关。如在Windows做的界面, 不用修改任何代码就可以用在unix,linux等
操作系统中。
   下面对该函数的参数进行说明, 并列出示例代码.

/*****************************************************************************************************************/
参数
/*****************************************************************************************************************/
    wnd_hook
 回调函数指针,当发生与窗口(用该函数创建的)有关的事件时,将调用它。
 其格式为:HWND WINAPI wnd_hook(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
   参数
  hwnd,  HTML所在窗口的句柄。
  iMessage,  消息类型。
  wParam, lParam,  消息可能带有数据,数据可用wParam和lParam来表示。
  pUserData,  用户数据。用户创建窗口时传给系统,系统通过回调函数传回用户,这样可
       避免使用全局变量。
       回调函数可以让网页与调用者之间进行数据通信。目前有4种系统事件和无数种
       自定义事件发生时会自动调用其回调函数。例如:
  int WINAPI html_hook(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
      {
   switch(iMessage)
     {
       case YM_ONLOAD:  break;     //网页解析完毕并且onload函数执行完后。
       case YM_CLOSE:  break;      //网页所在窗口关闭前一刻。
       //wParam=0表示窗口未被javascript函数resizeTo缩放过
       case YM_PAINT:              //网页在其窗口中被刷新显示时。
     YIMG *pimg;
     pimg = (YIMG*)wParam;  //网页所在的图象指针
     RECT *pClientRect;
     pClientRect = (RECT*)lParam; //网页被刷新的区域
     return TRUE;  //返回值为TRUE,表示调用者处理了这个事件
       case YM_KEYDOWN: //有键按下时。
     int ctrl_flag,shift_flag,vkValue;
     ctrl_flag = wParam & CTRL_MASK;  //按下Ctrl键
     shift_flag = wParam & SHIFT_MASK; //按下Shift键
     vkValue = wParam & KEY_MASK;      //键值
     return TRUE;  //返回值为TRUE,表示调用者处理了这个事件
       case (任何>=0 && <0x7f000000的整数消息):
     当在网页中调用了YC扩展javascript函数
     hook(iMessage, ...)时,将调用回调函数,
     其消息iMessage由用户自定义。
     return (任意整数);
       case (任何<=-1的整数消息):
     为了方便C/C++向javascript传递字符串,特规定
     消息为负时返回字符串指针。
     return 字符串指针;
     }
   return FALSE;
      }

    /*****************************************************************************************************************/
    pUserData           它是调用者传给回调函数wnd_hook的一个指针(或整数)。
    lpWindowName        窗口名字。

    /*****************************************************************************************************************/
    dwExStyle,dwStyle  它们定义了窗口的格式。其意义与WIN32函数CreateWindowEx中的一样。

 但这里扩展了dwStyle的几个格式,它们可以加在一起使用。
 格式              意义
 YS_NOESCAPE       使对话框不能用Esc键退出。
 YS_MODELESS       使对话框成为非模态的。
 YS_RBUT           使对话框能用鼠标右键退出。
 YS_NOWRERR        使对话框的脚本错误信息不写入文件y.err或j.err。
 YS_THREAD         使对话框的HTML文本在线程中解析。设置该风格后,网页调出前的按键将丢失掉。
 X,Y,nWidth,nHeight  它们定义了窗口的位置和大小。其意义与WIN32函数CreateWindowEx中的一样。
 hWndParent        父窗口句柄

    /*****************************************************************************************************************/
    webfile, weblen
 当weblen = 0时, webfile指向一个文件名,该文件是HTML文本。
 当weblen > 0时, webfile指向一个缓冲区, 该缓冲区存放HTML文本,缓冲区长度为weblen字节。

    返回值
 当对话框为模态对话框时,返回值总是为NULL,故其返回值是无用的。

 当对话框为非模态对话框时,返回值为对话框的窗口句柄。

/*****************************************************************************************************************/
例子:
/*****************************************************************************************************************/
这个例子如果用VC++运行, 则需要下载最新的YC++, 因最新的YC++提供了库链接文件: yxbapi.lib
否则需改一改程序. 最新的YC++可能要到5月24日才能下载到.
该例子需将YC++的下列7个文件拷入你的目录:

   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

/*****************************************************************************************************************/
将下列代码拷入自己任取的文件, 如: blog20.cpp
在YC++中, 用 <文件 打开或创建cpp源程序> 调入blog20.cpp, 再用 <工具 执行> 运行blog20.cpp
   或在dos中, 用 ycc blog20.cpp 生成 blog20.exe, 再运行blog20.exe
在VC++中, 用 cl blog20.cpp 生成 blog20.exe, 再运行blog20.exe
/*****************************************************************************************************************/
#include       

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

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

#define var const int

var ID_find_ok = 0;
var ID_find_setcaps = 1;
var ID_find_setbinary = 2;
var ID_find_getcaps = 3;
var ID_find_getbinary = 4;
var ID_find_setfindbuf = 5;
var ID_find_init = 6;

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,
      "a",110,50,800,600,NULL,WT_WIN);

    int WINAPI find_hook(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
    YXB_Dialog(find_hook, NULL, 0,0, NULL, 250, 200, 0, 0, hwnd, "find.htm",0);

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

    return 0;
}

int WINAPI find_hook(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
    switch(iMessage)
      {
 case ID_find_init:
      YXB_RunJScript(hwnd, "dialog_init('你好!')");
      break;
 case ID_find_getcaps:         return 1;
 case ID_find_getbinary:       return 0;
 case ID_find_setcaps:         break;
 case ID_find_setbinary:       break;
 case ID_find_setfindbuf:
      break;
 case ID_find_ok:              break;
 case YM_CLOSE:
      break;
      }
    return 0;
}


int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
    switch(iMessage)
      {
 case WM_DESTROY:    PostQuitMessage(0);     return FALSE;

 case WM_KEYDOWN:
      if(wParam == VK_ESCAPE)    DestroyWindow(hwnd);
      YXB_Dialog(find_hook, NULL, 0,0, NULL, 250, 200, 0, 0, hwnd, "find.htm",0);
      return FALSE;

 case WM_PAINT:        //每当窗口客户区有需要重画的区域时, Windows便向这个窗口发出WM_PAINT消息.
      PAINTSTRUCT ps;
      BeginPaint(hwnd, &ps);
      YIMG yimg;
      memset(&yimg,0,sizeof YIMG);
      yimg.hdc = ps.hdc;     //通过这个设置, 可以将窗口客户区当作一幅图象来操作

      RECT  mRect;
      GetClientRect(hwnd, &mRect);

      用YC内置函数YXB_ImageFill在图象yimg中画出下面四个单色矩形/
      YXB_ImageFill(&yimg, mRect.left, mRect.top, mRect.right-mRect.left,
     mRect.bottom-mRect.top, RGB(130,150,160));
      YXB_ImageFill(&yimg, 100,100, 200,150, RGB(100,0,0));
      YXB_ImageFill(&yimg, 150,150, 200,150, RGB(0,100,0));
      YXB_ImageFill(&yimg, 200,200, 200,150, RGB(0,0,100));

      EndPaint(hwnd, &ps);
      return FALSE;
      }
    return DefWindowProc(hwnd,iMessage,wParam,lParam);
}

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


<script language=ycscript>

static char code_buf[8192];

char *Hex_to_Char(char *cbuf,int len)
{
    char *tmp = code_buf;
    if(len % 2)     {  cbuf[len] = '0';  len++; }
    byte uu,vv;
    for(int kk=0; kk       {
 uu = cbuf[kk++];
 vv = cbuf[kk++];
 if(uu >= 'A')   uu -= ('A'-10);
 else            uu -= '0';
 if(vv >= 'A')   vv -= ('A'-10);
 else            vv -= '0';
 *tmp++ = ((uu<<4) & 0xf0) + (vv & 0x0f);
      }
    char *mptr;
    YXB_escape(&mptr,code_buf,len/2);
    strcpy(code_buf, mptr);
    free(mptr);
    return code_buf;
}


void set_hex(byte uu,char *tmp)
{
    byte nn = (uu>>4) & 0x0f;
    if(nn <= 9)         *tmp = nn + '0';
    else                *tmp = nn - 10 + 'A';
    tmp++;
    nn = uu & 0x0f;
    if(nn <= 9)         *tmp = nn + '0';
    else                *tmp = nn - 10 + 'A';
}

char *Char_to_Hex(char *cbuf,int len)
{
#define         HZ_FIRST_BYTE           0x81
#define         HZ_SECOND_BYTE          0x40
#define         HZ_SECOND_X             0x7f
#define         HZ_EXCLUDE_X            0xff
#define         IS_HZtwoCHAR(uu,vv)     ((uu)>=HZ_FIRST_BYTE && /
      (uu)!=HZ_EXCLUDE_X && /
      (vv)>=HZ_SECOND_BYTE && (vv)!=HZ_SECOND_X && (vv)!=HZ_EXCLUDE_X)

    char *tmp = code_buf;
    for(int cnt=0; cnt       {
 byte uu,vv,nn;
 uu = *cbuf++;
 set_hex(uu,tmp);
 tmp += 2;
 vv = *cbuf;
 if(IS_HZtwoCHAR(uu,vv))
   {
     cbuf++;
     set_hex(vv,tmp);
     tmp += 2;
   }
      }
    *tmp = 0;
    return code_buf;
}
</script>



    查找内容:




    区分大小写(F1)


    输入二进制码(F2)


<script language=javascript>
var ID_find_ok = 0;
var ID_find_setcaps = 1;
var ID_find_setbinary = 2;
var ID_find_getcaps = 3;
var ID_find_getbinary = 4;
var ID_find_setfindbuf = 5;
var ID_find_init = 6;

window.resizeTo(526,232);
document.title = "HTML对话框";

find.style.width = 448;
find.style.height = 26;
find.style.left = parseInt(findwhat.style.left) - 2;
find.style.color = "#ffffff";
find.style.backgroundColor = "#505050";
find.style.top = parseInt(findwhat.style.top) + 22;

findbin.style.left = find.style.left;
findbin.style.top = parseInt(find.style.top) + parseInt(find.style.height) + 10;

caps.style.top = binary.style.top = 100;
caps.style.left = 30;
binary.style.left = 260;

capstxt.style.top = binarytxt.style.top = caps.style.top + 2;
capstxt.style.left = caps.style.left + 25;
binarytxt.style.left = binary.style.left + 25;

ok.style.width = cancel.style.width = 100;
ok.style.height = cancel.style.height = 28;
ok.style.top = cancel.style.top = caps.style.top+43;
ok.style.left = 120;
cancel.style.left = 300;


function ok_onclick()
{
    ret_value();
    hook(ID_find_ok);
    window.close();
}


function cancel_onclick()
{
    ret_value();
    window.close();
}


function set_state()
{
    capstxt.style.color =  caps.checked ? "#d00" : "#000";
    binarytxt.style.color =  binary.checked ? "#d00" : "#000";
}


capstxt.onmousedown = capstxt_mouse_down;
function capstxt_mouse_down()
{
    caps.checked = !caps.checked;
    set_state();
}


binarytxt.onmousedown = binarytxt_mouse_down;
function binarytxt_mouse_down()
{
    binary.checked = !binary.checked;
    binary_onmouseup();
}


caps.onmouseup = caps_onmouseup;
function caps_onmouseup()
{
    set_state();
}


var VK_SPACE = 0x20;
var VK_TAB = 0x09;
var VK_RETURN = 0x0d;
var VK_F2 = 0x71;
var VK_F1 = 0x70;


document.onkeypress = js_onkeypress;
function js_onkeypress()
{
    if(binary.checked && event.keyCode>=VK_SPACE)
      {
 if(event.keyCode>="a".charCodeAt() && event.keyCode<="f".charCodeAt())      return event.keyCode - VK_SPACE;
 if((event.keyCode>="A".charCodeAt() && event.keyCode<="F".charCodeAt())
  || (event.keyCode>="0".charCodeAt() && event.keyCode<="9".charCodeAt()) )  return true;
 MessageBeep(0);
 return false;
      }
}


document.onkeypressafter = js_onkeypressafter;
function js_onkeypressafter()
{
    if(event.keyCode >= VK_SPACE)    wr_bin();
}


document.onkeydownafter = js_onkeydownafter;
function js_onkeydownafter()
{
    if(event.keyCode }


function wr_bin()
{
    if(!binary.checked)         findbin.innerText = Char_to_Hex(find.value, find.value.length);
    else                        findbin.innerText = unescape(Hex_to_Char(find.value, find.value.length));
}


document.onkeydown = doc_onkeydown;
function doc_onkeydown()
{
    if(event.keyCode == VK_RETURN)      ok_onclick();
    if(event.keyCode == VK_F1 && !event.shiftKey)    capstxt_mouse_down();
    if(event.keyCode == VK_F2 && !event.shiftKey)    binarytxt_mouse_down();
    if(event.keyCode == VK_TAB)         return false;
}


document.body.onmouseup = body_onmouseup;
function body_onmouseup()
{
    find.focus();
}


binary.onmouseup = binary_onmouseup;
function binary_onmouseup()
{
    mptr = find.value;
    if(binary.checked)          find.value = Char_to_Hex(mptr, mptr.length);
    else                        find.value = unescape(Hex_to_Char(mptr, mptr.length));
    findbin.innerText = mptr;

    set_state();
}


function ret_value()
{
    hook(ID_find_setcaps, caps.checked);
    hook(ID_find_setbinary, binary.checked);
    editptr = find.value;
    if(binary.checked)  editptr = unescape(Hex_to_Char(editptr, editptr.length));
    hook(ID_find_setfindbuf, escape(editptr));
}


function body_onload()
{
    caps.checked = hook(ID_find_getcaps);
    binary.checked = hook(ID_find_getbinary);
    set_state();
    find.focus();
    if(hook(ID_find_init))    window.close();
    wr_bin();
}


function dialog_init(s0)
{
    mptr = s0;
    find.value = binary.checked ? Char_to_Hex(mptr, mptr.length) : mptr;
}

</script>
 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值