- 浏览: 4197076 次
最新评论
YC++创建HTML工具栏
YC++创建HTML工具栏
在YC++中,既可以用CreateWindowEx(WS_EX_TOOLWINDOW,TOOLBARCLASSNAME,...)等Win32函数创建
工具栏(例子见YC01/examples/ycp.cpp), 也可以用其API函数:
HWND YXB_Window(YHOOKPROC wnd_hook,void *pUserData,DWORD dwExStyle,DWORD dwStyle,LPCSTR lpWindowName,
int X,int Y,int nWidth,int nHeight,HWND hWndParent,int winType);
创建工具栏。
/*****************************************************************************************************************/
这个函数,用HTML文本和CSS样式表现工具栏的界面,用javascript脚本和DOM控制工具栏的元素,用C/C++实现程序逻辑。
这样的工具栏,不仅很容易做到界面华丽,还可以使界面和逻辑分开设计,便于调试。 并且可做到使界面源代码与平台无关。
如在Windows做的工具栏, 不用修改源代码就可以用在unix,linux等其它操作系统中。
下面对该函数的参数进行说明, 并列出示例代码。
/*****************************************************************************************************************/
参数
/*****************************************************************************************************************/
wnd_hook
回调函数指针,当发生与窗口(用该函数创建的)有关的事件时,将调用它。
其格式为:int WINAPI wnd_hook(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
参数
hwnd HTML所在窗口的句柄。
iMessage 消息类型。
wParam, lParam, 消息可能带有数据,数据可用wParam和lParam来表示。
pUserData 用户数据。用户创建窗口时传给系统,系统通过回调函数传回用户,这样可
避免使用全局变量。
//////////////////////////////////////////////////////////////////////////////////////////////////////////
回调函数wnd_hook可以让网页与调用者之间进行数据通信。目前有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: //有键按下时。其用法见文件: yctool.h
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 && 当在网页中调用了YC扩展javascript函数
hook(iMessage, ...)时,将调用回调函数,
其消息iMessage由用户自定义。
return (任意整数);
case (任何 为了方便C/C++向javascript传递字符串,特规定
消息为负时返回字符串指针。
return 字符串指针;
}
return FALSE;
}
/*****************************************************************************************************************/
pUserData
它是调用者传给回调函数wnd_hook的一个指针(或整数)。
/*****************************************************************************************************************/
lpWindowName
窗口名字。
/*****************************************************************************************************************/
dwExStyle,dwStyle
它们定义了窗口的格式。其意义与WIN32函数CreateWindowEx中的一样。
/*****************************************************************************************************************/
X,Y,nWidth,nHeight
它们定义了窗口的位置和大小。其意义与WIN32函数CreateWindowEx中的一样。
/*****************************************************************************************************************/
hWndParent 父窗口句柄
/*****************************************************************************************************************/
winType 要创建的窗口之类型。这里应设置为: WT_HTML
/*****************************************************************************************************************/
返回值 返回值表示被创建的窗口之句柄。若返回值为NULL,表示窗口未创建成功
/*****************************************************************************************************************/
创建工具栏窗口后,还需向窗口发送工具栏网页
/*****************************************************************************************************************/
例子:
/*****************************************************************************************************************/
该例子需将YC++的下列7个文件拷入你的源程序所在目录:
YC01/yxbapi.dll C/C++编译器, 浏览器内核库
YC01/yxbimg.dll 图象, 动画解码库
YC01/yxbext.dll 浏览器内核交互代码库
YC01/yc.ah C/C++编译器头文件包
YC01/yc.cmp C/C++编译器错误信息
YC01/yctool.bmp 工具栏图象文件
YC01/include/ycapi.h 用其它编译器运行该例时所需头文件
YC01/include/yxbapi.lib 用其它编译器运行该例时所需库文件, 如VC6.0
/*****************************************************************************************************************/
/*****************************************************************************************************************/
/*****************************************************************************************************************/
将下列代码拷入名字任取的文件, 如: blog3a.cpp
在YC++中, 用调入blog3a.cpp, 再用 运行blog3a.cpp
或在dos中, 用 ycc blog3a.cpp 生成 blog3a.exe, 再运行blog3a.exe
在VC++中, 用 cl blog3a.cpp 生成 blog3a.exe, 再运行blog3a.exe
/*****************************************************************************************************************/
/*****************************************************************************************************************/
#ifndef YCC
#include <windows.h><br>#pragma comment(lib, "gdi32.lib")<br>#pragma comment(lib, "user32.lib")<br>#pragma comment(lib, "yxbapi.lib")<br>#include "ycapi.h"<br>#endif</windows.h>
#define var const int
var ADDRESS_HIGH = 27;
var TOOL_HIGH = 24;
var ID_toolBarExist = 0;
var ID_toolbmp = 1;
var ID_go = 2;
var ID_edit = 3;
var ID_backward = 4;
var ID_MENU_backward = 5;
var ID_forward = 6;
var ID_MENU_forward = 7;
var ID_stop = 8;
var ID_refresh = 9;
var ID_home = 10;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
/////////创建主窗口. 用YC++的API函数创建, 它不需要注册. 也可以用Win32函数创建主窗口////////////////////////
int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
HWND hwnd = YXB_Window(MainWndProc,NULL,0,
WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU,
"a",110,50,800,600,NULL,WT_WIN);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI address_hook(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
HWND m_hToolWnd = *(HWND*)pUserData;
switch(iMessage)
{
case YM_KEYDOWN:
PostMessage(GetParent(hwnd), WM_KEYDOWN, wParam, lParam);
break;
case YM_ONLOAD:
SetFocus(m_hToolWnd); //输入焦点传给工具栏
YXB_RunJScript(m_hToolWnd, "set_edit_value('How do you do?')"); //编辑框初始化
break;
case ID_edit: break;
case ID_go: MessageBox(hwnd, "go", "YC++", MB_ICONHAND|MB_OK); break;
case ID_MENU_backward: MessageBox(hwnd, "MENU_backward", "YC++", MB_ICONHAND|MB_OK); break;
case ID_MENU_forward: MessageBox(hwnd, "MENU_forward", "YC++", MB_ICONHAND|MB_OK); break;
case ID_backward: MessageBox(hwnd, "backward", "YC++", MB_ICONHAND|MB_OK); break;
case ID_forward: MessageBox(hwnd, "forward", "YC++", MB_ICONHAND|MB_OK); break;
case ID_stop: MessageBox(hwnd, "stop", "YC++", MB_ICONHAND|MB_OK); break;
case ID_refresh: MessageBox(hwnd, "refresh", "YC++", MB_ICONHAND|MB_OK); break;
case ID_home: MessageBox(hwnd, "home", "YC++", MB_ICONHAND|MB_OK); break;
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
RECT mRect;
switch(iMessage)
{
case WM_CREATE:
/////////创建HTML工具栏//////////////////////////////////////////////////////////////
int WINAPI address_hook(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
static HWND m_hToolWnd; //工具栏窗口
m_hToolWnd = YXB_Window(address_hook, &m_hToolWnd,0,YS_NOWRERR,NULL,0,0,0,0, hwnd, WT_HTML);
//////////////向工具栏窗口发送网页////////////////////////////////////////////////////////////////////
WEB_PAGE apage;
memset(&apage,0,sizeof(apage));
apage.click_page = 3;
apage.href = "tool.htm";
SendMessage(m_hToolWnd, WM_COMMAND, WEB_A, (int)(WEB_PAGE*)&apage);
return FALSE;
case WM_SIZE:
GetClientRect(hwnd, &mRect);
MoveWindow(m_hToolWnd,mRect.left,mRect.top, mRect.right, ADDRESS_HIGH + TOOL_HIGH + 4, TRUE); //若为 FALSE 左右缩放时, rebar 右边部分不能刷新
return FALSE;
case WM_DESTROY: PostQuitMessage(0); return FALSE;
case WM_KEYDOWN:
if(wParam == VK_ESCAPE) DestroyWindow(hwnd);
return FALSE;
case WM_PAINT: //每当窗口客户区有需要重画的区域时, Windows便向这个窗口发出WM_PAINT消息.
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
YIMG yimg;
memset(&yimg,0,sizeof YIMG);
yimg.hdc = ps.hdc; //通过这个设置, 可以将窗口客户区当作一幅图象来操作
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文本拷入指定文件: tool.htm
/*****************************************************************************************************************/
type=toolbar //表示按钮,YC++扩展的HTML属性
onchange=tool_onchange(); //表示按钮事件
alink=blue
value="后退" //表示按钮的文字
content="drop icosize(16,16) paint(10,0) move(10,1) disabled(0,0) edgepaint=0 edgemove=1" //表示按钮的位置
src="yctool.bmp"> <!--co=表示按钮所在的图象-->
type=toolbar
onchange=tool_onchange();
title = "前进"
content="drop icosize(16,16) paint(11,0) move(11,1) disabled(0,1) edgepaint=0 edgemove=1"
src="yctool.bmp">
type=toolbar
onchange=tool_onchange();
title = "停止"
content="icosize(16,16) paint(12,0) move(12,1) edgepaint=0 edgemove=1"
src="yctool.bmp">
type=toolbar
onchange=tool_onchange();
title = "刷新"
content="icosize(16,16) paint(13,0) move(13,1) edgepaint=0 edgemove=1"
src="yctool.bmp">
type=toolbar
onchange=tool_onchange();
title = "主页"
content="icosize(16,16) paint(14,0) move(14,1) edgepaint=0 edgemove=1"
src="yctool.bmp">
oncontrol="hook(ID_edit, event.ctrl)"
style="position:absolute; font-family:Tahoma; font-size:16;">
onchange="hook(ID_go);"
value="转到"
content="icosize(16,16) paint(19,0) move(19,1) xpress(14,0) disabled(13,0) edgepaint=0 edgemove=1"
src="yctool.bmp"
style="position:absolute; font-family:Tahoma; font-size:16; height=25;">
<script language="javascript"><br />var ADDRESS_HIGH = 27;<br />var TOOL_HIGH = 24;</p><p>var ID_toolBarExist = 0;<br />var ID_toolbmp = 1;<br />var ID_go = 2;<br />var ID_edit = 3;<br />var ID_backward = 4;<br />var ID_MENU_backward = 5;<br />var ID_forward = 6;<br />var ID_MENU_forward = 7;<br />var ID_stop = 8;<br />var ID_refresh = 9;<br />var ID_home = 10;</p><p>document.body.size = TOOL_HIGH; //<BODY>标记的属性size>0时, 表示页面用于工具栏</p><p>function dialog_init(aa,bb)<br />{<br /> backward.disabled = aa;<br /> forward.disabled = bb;<br />}</p><p>function body_onload()<br />{<br /> hook(ID_toolbmp,go.img);<br /> edit.focus();<br /> body_onresize();<br />}</p><p>function body_onresize()<br />{<br /> addr_pos = TOOL_HIGH+1;</p><p> toolp.style.left = 2;<br /> toolp.style.top = 2;<br /> for(ii=0; ii<toolp.elements.length; ii++) toolp.elements[ii].style.height = TOOL_HIGH-2;</p><p> edit.style.top = addr_pos + 1;<br /> edit.style.left = addr.width + 3;<br /> edit.style.width = document.body.clientWidth - go.width - edit.style.left - 8;<br /> edit.style.height = ADDRESS_HIGH;</p><p> addr.style.left = 2;<br /> addr.style.top = addr_pos + (edit.style.height - addr.height)/2 + 1;</p><p> go.style.top = addr_pos + (edit.style.height - go.height)/2 + 1;<br /> go.style.left = edit.style.left + edit.style.width + 3;<br />}</p><p>function set_edit_value(ss)<br />{<br /> edit.value = ss;<br />}</p><p>function get_edit_value()<br />{<br /> return edit.value;<br />}</p><p>function set_edit_length(nn)<br />{<br /> edit.lines = nn;<br />}</p><p>function tool_onchange()<br />{<br /> var nn, selp=event.srcElement;<br /> switch(selp)<br /> {<br />case backward:<br /> if(event.ctrl == 1) nn = ID_backward;<br /> else nn = ID_MENU_backward;<br /> break;<br />case forward:<br /> if(event.ctrl == 1) nn = ID_forward;<br /> else nn = ID_MENU_forward;<br /> break;<br />case stop:<br /> nn = ID_stop;<br /> break;<br />case refresh:<br /> nn = ID_refresh;<br /> break;<br />case home:<br /> nn = ID_home;<br /> break;<br /> }<br /> hook(nn, selp.clientLeft + (selp.clientTop<<16), selp.clientWidth + (selp.clientHeight<<16));<br />}<br /></script>
相关推荐
YC++编译器,是一款全新的编译器,符合C++11标准,可嵌入的实时优化编译器,适用于大规模源代码的分析,编译速度远超其它任何C++编译器, www.ycbro.com
YC不但比其它工具容易使用,而且还具有许多其它工具所没有的重要功能。 YC不仅是软件生产线,还是软件组装线。它可以把任何人开发的程序“零部件”,包括COM代码部件、DLL代码部件、C/C++源程序部件等,组装成...
YC编译器--多语言程序设计 *可编译C/C++、ASM(包括SSE和AVX)、Javascript和YSP等语言的源代码 *YC服务器源代码(ycs.js、ychttp.cpp) *YCOS操作系统源代码(ycos.cpp、ycboot.cpp、ychead.cpp、ycker.cpp …) *...
YC2440工具软件YC2440工具软件YC2440工具软件YC2440工具软件YC2440工具软件YC2440工具软件
开关电源YC 开关电源YC 开关电源YC 开关电源YC 开关电源YC 开关电源YC
Yichip YC1021蓝牙芯片数据手册以及管脚定义,网上根本下载不到。General Description The YC1021 is a very low power, high performance and highly integrated Bluetooth 4.2 BR/EDR + BLE + 2.4G Proprietary ...
1、蓝牙芯片YC1021开发资料 2、MCU通过串口与YC1021通讯 3、蓝牙协议栈等都在YC1021端完成,所以主机只需要解析处理好与YC1021之间的通讯协议即可 4、建议用状态机来做 5、YC1021跟BM77通讯差不多,只要搞定一个...
蓝牙芯片YC1051数据手册,网上根本下载不到。The YC1051 is a very low power, high performance and highly integrated Bluetooth 4.2 BLE solution, designed for operation over the 2400MHz to 2483.5Mhz ISM ...
YC 创业课 2018 2019 中文笔记 YC 创业课 2018 2019 中文笔记 YC 创业课 2018 2019 中文笔记
YC1026 datasheet_1.38_200506.pdf
这份代码是我自己根据易兆微yc1021的规格书实现的一份嵌入式驱动程序,用户只需要移植几个简单的函数就可以实现蓝牙3.0和4.0通信功能,这么简单的玩意儿天天搞真的烦,下载源码一次搞定多好对吧
数字量模块YC1008相关资料
YC创业营- 硅谷顶级创业孵化器如何改变世界
YC2440开发指南 基于ARM9 可运行linux系统
YC315游车使用说明书ok.pdf
TM5和YC软件合集.7z
YC14 javascript c/c++ 编译器
YC小升初考试题.pdf
YC1021 YiChip Dual Mode bluetooth chip interduction