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