用YC++创建HTML对话框

本文介绍如何使用YC++创建HTML对话框,利用HTML、CSS和JavaScript实现丰富的界面效果,并保持界面与逻辑分离,便于跨平台开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                       用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
/*****************************************************************************************************************/




    查找内容:




    区分大小写(F1)


    输入二进制码(F2)



 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值