请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 2672|回复: 4

HTMLayout中调用web界面实现打印

[复制链接]

19

主题

125

帖子

248

积分
交易币
0

编程二段

Rank: 3Rank: 3

发表于 2016-8-5 07:31:53 | 显示全部楼层 |阅读模式
用HTMLayout做东西,要用到打印。哥们是彩色打印机。说要效果好,就这样折中搞了下。
[aardio] 纯文本查看 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="HTMLayout 无边框窗体";right=759;bottom=469;border="none";parent=...)
winform.add()
/*}}*/

import web.layout;
import web.layout.behavior.windowCommand;//导入behavior:windowCommand; 
var wbLayout = web.layout( winform );//在窗体上创建HTMLayout对象

//开发环境中启用HTMLayout调试功能
if( _STUDIO_INVOKED ){
	import web.layout.debug;
	wbLayout.attachEventHandler( web.layout.debug );
}




//自定义网页打印库
namespace web.layout.behavior.myprint{
	import web.form;
	import web.form.util; 
	web.form.util.emulation(11000);
	import win.ui.ctrl.static;   //自定义控件
	import win.reg;
	
	var reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PageSetup")   //注册了准备打印
	
	//不要页眉页脚
	reg.setSzValue("header","") ;
	reg.setSzValue("footer","") ;
	
	//把页边距全部设置为0
	reg.setDwValue("margin_bottom",0) ;
	reg.setDwValue("margin_left",0)
	reg.setDwValue("margin_top",0) ;
	reg.setDwValue("margin_right",0)
	
	
	onElementControlCreated = function (ltTarget,ltOwner,reason,behaviorParams) {
			var ltCtrl = ltOwner.getCtrl(); 
			wb = ..web.form( ltCtrl,0x4/*_UIFLAG_NO3DBORDER*/  , , ,true/*securityTrusted*/ ) 
			ltCtrl.translateAccelerator = function( msg ){
				var message,vk = msg.message,msg.wParam;
    			if (   (message == 0x100/*_WM_KEYDOWN*/) || (message== 0x101/*_WM_KEYUP*/) ) { 
        			if( /**( vk == 0x74/*_VK_F5*/ )
            			|| **/( ( vk == 'N'# ) && ( ( ::GetKeyState(0x11/*_VK_CTRL*/) & 0x8000 ) == 0x8000 ) ) ) 
        			{
            			return true;   
        			} 
    			}  
    			return wb._host.tranacc(msg)
			}
			if( !_STUDIO_INVOKED ){
				wb.noScriptErr = true;
			}
			var homepage = ltOwner.getCustomAttribute("homepage");
			if( #homepage ) wb.go(  ltOwner.getCustomAttribute("homepage"))   
			ltOwner.sendEvent("onBrowserCreated",1);
		}
		
	//尺寸改变时调用	 
	onSize = function (ltOwner) {
		var ltCtrl = ltOwner.getCtrl();
		if( ltCtrl ) {
			ltCtrl.adjust(0,0,0);
		}
	}
	
	
	
	
	//插入每行
	addtable = function(tab){
		var tr = "";
			tr = "<tr class='reports_item_1'><td><B>"++ tab[1] ++ "</B></td>";
			tr += "<td >"++tab[2]++"</td>" ;
   			tr += "<td>"++tab[3]++"</td>" ;
   			tr += "<td>"++tab[4]++"</td>" ;
   			tr += "<td >"++tab[5]++"</td>" ;
      		tr +="</tr>"			
     	return tr; 		
	}
	
	
	
	
	
	//创建新的表格
	
	cretTable = function(data){
		var tablehl = "<table width='100%' id='reports'>"   ;
		var thead = "<thead>
			<tr class='reports_item_1'>
				<td width='15%'><B>名称</B></td><td width='*'><B>型号</B></td><td width='12%'><B>单价</B></td><td width='10%'><B>数量</B></td><td width='15%'><B>质保</B></td>
			</tr>
			</thead>"
		
		
		var rs = data.tab ;
		var tbody = "<tbody>"
		for(i=1; #rs; 1)
		{	
			var tr = addtable(rs[i]);      //插入数据每行	
			tbody += tr ;
		}
		var ztr = "<tr class='reports_item_1'><td><B>总计</B></td><td colspan='4' >"++data.receivables ++"</td></tr>"
		
		tbody +=ztr;
		
		tbody += "</tbody>"  ;
		
		tablehl =  tablehl ++ thead ++ tbody ++"</table>"
		
		
		return  tablehl; 
		
	
	}
	

	
	//打印调用的,参数数组
	print = function(data){
		wb.getEle("prname").innerText = data.name;
		wb.getEle("prtel").innerText = data.tel;
		wb.getEle("prtime").innerText = data.time;
		
		
		var htm = cretTable(data) ;
		
		wb.jQuery("#reports").html(htm)
	
		//添加备注
		wb.getEle("prbeizhu").innerText = data.beizhu;
		
		wb.execWb(7,1) ; //预览
		//wb.execWb(6,6)   //打印,不会弹出打印机窗口
	
	}

}








wbLayout.html = /**  
<!doctype html>
<html>
<body>
	<!-- 界面顶栏 -->
    <div id="header"> 
    
    	<!-- 下面是标题栏按钮,必须使用a标记表示,command属性指示该按钮执行的命令,可在窗体设计器中禁用最大化、最小化按钮 --> 
        <div class="titlebox">
            <a command="window-min">0</a><a command="window-max">1</a><a command="window-close" >r</a>
        </div>	
        
       	<!-- 标题栏弹出菜单,需要弹出节点的最好用div或button等元素,不要使用a,li等元素 -->
		<div .window-menu>u
			<menu .popup> <!-- .popup是内置的弹出菜单样式 -->
    			<li>在线帮助</li> 
    			<li>子菜单
      			<menu >
        			<li>这是子菜单</li>
      			</menu>
    			</li>
    			<li #exit>退出</li>
  			</menu>
		</div> 
		
		<!-- 下面是标题栏文本,凡在CSS中指定 behavior:windowCommand 的节点(含子节点) 可用 command 属性指明命令类型 -->
        <div class="title-bar" command="window-caption"> <span class=title> 我 的 软 件 </span></div>
    </div> 
    
    <!-- 界面中部内容栏 -->
    <div id="container"> 
    
    	<!-- 左边栏,固定宽度 -->
    	<div class="lside"> </div> 
    	
    	<!-- 右边栏,自适应宽度 -->
    	<div class="rside">
    			<div class="v-bricks">
       		
        		<table class="layout-grid" fixedrows="1" id="jszjtab">
		  		<thead>
					<tr>
			  		<th >品名</th>
			  		<th >品牌&型号</th>
			  		<th >价格</th>
			  		<th >数量</th>
			  		<th >备注</th>
			  		<th  >操作</th>
					</tr>
		  		</thead>
		  		<tbody>
		  		<? for(i=1; 8; 1){?>
						<tr>
						<td >品名<? =i ?></td>
						<td  >型号</td>
						<td  >0</td>
						<td  >0</td>
						<td  ></td>
						<td ><a href = "#">删除</a></td>
					</tr> 
				 <? } ?>
					
		  		</tbody>
				</table>
				
       		<widget cls="static" id="static"  style="width:100%%;height:100%%;display:none ;"></widget>  
    		</div>
    	
    	 </div>  
    </div>
    
    <!-- 界面底栏 -->
    <div id="footer">
    	<button id="print">打印</button>
    	<button id="help">HTMLayout 布局教程</button>
    </div>
</body>
</html>
**/ 

wbLayout.css = /**
html,body{
    margin:0; /*去掉默认的页面边距*/
    height:100%;/*因为HTML元素的高度默认是按需增加的,所有需要显示指定根节点高度*/
    background:#fff;/*网页背景色*/
}

body{
	overflow:hidden;/*避免出现滚动条*/
}

/*最大化后body会自动添加maximize属性,如果是圆角界面可以在这里移除圆角*/
body[maximize]{ 
	border-radius:0;
}

body[maximize] #header{
	border-radius:0;
}
#header{
    height:32px;
    background:rgb(52,152,220);
    cursor:default;
    behavior:windowCommand;
    overflow:hidden;/*清除浮动*/
}

#header .title-bar{
    margin-right:95px;
    padding-left:15px;
    height:28px;
    line-height: 28px;
    font:system;
    color:#fff; 
} 

#header .titlebox{  
    width:max-intrinsic; 
    height:28px; 
    float:right; 
    margin-right:8px; 
    overflow-x:hidden;
}

#header .titlebox a{ 
    display:inline-block; //显示为块节点 
    width:max-intrinsic; 
    height:14px;
    font-family:"Marlett";/*该字体显示按钮符号*/  
    font-size:14px;
    padding:4px;
    color:#fff; 
    cursor:default; 
}

/*CSS选择器中,方括号指定节点拥有的属性*/
#header .titlebox a[command]:hover{ 
    background:#6ebccf; 
}

#header .titlebox a[command]:active{ 
    background:#FF0000; 
} 

#header a[command="window-restore"]{ 
    content:"2";/*Marlett字体为还原按钮符号*/ 
} 

#header .window-menu{ 
	display:block;  
	float:right;
	behavior:popup-menu; 
	width:max-intrinsic; 
	height:14px;
	font-family:"Marlett";/*该字体显示按钮符号*/  
	font-size:14px;
	padding:4px;
	color:#fff;
}

#header .window-menu:hover{
	background:#6ebccf;
}

#header .window-menu:owns-popup /*菜单已弹出*/
{ 
    background-color: #FF0000;
    color: #FFFFFF;
}

#container{
    width:100%; 
    height:100%%; /*撑满剩余可用空间*/
    flow: horizontal; /*将容器内部块元素变为横向布局 - 比具有破坏性的float浮动布局更方便*/
    margin:0 auto; 
    overflow:hidden;  
    background:#ac0;
}

#container .lside{
    height:100%;
    width:150px;  
    background:rgb(110,179,210);
}

#container .rside{
    height:100%; 
    background:#FFF; 
}

#container .lside > *{
    margin:2px 0px;
}

#container .rside > *{
    margin:2px 10px;
    font-size:9pt;
}

div .v-bricks{
	flow:vertical; 
    overflow:auto;
	height:100%%; 
}
/*自定义控件*/
#static{
  border:1px solid #bdbccc; 
  behavior:myprint;	
  width:100%%;
  height:*;
  -homepage:"/print/print.html";	
}



table.layout-grid{
  background:white;
  border:1px solid #999; /*表格边框*/
  width:100%%;
  behavior:~zjtab;
  height:100%%;
  overflow:auto;
  flow: table-fixed;
  font-size:9pt;
  border-spacing:0;
}


/*表头样式*/
table.layout-grid th{
  color: #666;
  font-size:9pt; 
  border-right:1px solid #DDD;
  border-bottom:1px solid #EEE;
  padding:4px;
  background-color: white;
   font-weight:normal;
   
}
/*表头样式*/
.layout-grid thead tr th {
	padding:4px;
    border-right:1px solid silver;
    border-bottom:1px solid silver; 
    background-color:#efefef; 
	text-align: left;
	
}







/*每行的样式*/
table.layout-grid tr{  
   height:30px;
   border-bottom:1px solid #EEE;
}



/*鼠标经过行时的样式*/
table.layout-grid tr:hover{
  background-color: #FAFAFA;
}

/*当前被选中行的样式*/
table.layout-grid tr:current{ 
  background-color:#ff9933; 
}

/*单元格样式*/
table.layout-grid td {
  white-space: nowrap;
	height:20px;
    overflow:hidden;  
	text-overflow:ellipsis;
	padding: 4px;
  border-right:1px solid #EEE;
}


/*鼠标经过单元格时的样式*/
table.layout-grid td:hover {
  color: #F00;
}

#footer {
	background:rgb(239,237,238);
	height:25px;
	text-align:right;
	padding:10px 20px;
}

#footer button{
	padding:4px 13px;
	font-size:12px; 
	background:rgb(27,174,93);
	color:white; 
}

#footer button:hover { 
	background:rgb(33,127,188);
	outline: 1px glow rgb(91,171,230) 1px;
	cursor:pointer;
} 
**/

// 响应菜单点击事件
wbLayout.onMenuItemClick =  {

	// 事件可以是一个函数或列表,如果是列表键名匹配节点的id或name属性 
	exit = function (ltTarget,ltOwner,reason,behaviorParams) {
		winform.close();
	}
	
	//匹配不到id的节点会触发default函数*/
	default = function (ltTarget,ltOwner,reason,behaviorParams) {
		var ltPopupOwner = web.layout.element( behaviorParams.he );//这是弹出菜单的按钮节点
		winform.msgbox( ltTarget.innerText )
	}
}




import process;
wbLayout.onButtonClick = {
	help = function (ltTarget,ltOwner,reason,behaviorParams) {
		process.execute("http://api.aardio.com/v10/pages/htmlayout-introduction");
	}
	
	//打印预览
    print = function (layoutEle,reason,behaviorParams) {
        web.layout.behavior.myprint.print(getdata());  
    }
	
}




getTdContent = function(tablehl){
	var rows = tablehl.$("tr");
	if !rows return ; 
	var row = rows[1];
	var cells = row.childCount();
	var data = {};
	for(i=2;#rows;1){
		var tab = {};	
		for(m=1;cells;1){
		var str = rows[i].child(m).innerText:""     ;              //没有则设置为空
		..table.push(tab,str)
		}
		..table.push(data,tab)
	}
	return data; 
}



getdata = function(){
	
	var tabhl = wbLayout.getEle("jszjtab") ;
	var tab = getTdContent(tabhl) ;   //取表数据
	var  printdata = {};
	printdata.name = "隔壁老王"  ;
		printdata.tel = "189999999"  ;
	printdata.time = tostring(..time(),"%Y年%m月%d日 "); ;
	printdata.receivables = heji:"";    //合计
	printdata.beizhu = beizhu?"备注:"++beizhu:"";
	printdata.tab = tab ;   //表格数据
	return  printdata; 
}










import win.ui.shadow;
win.ui.shadow(winform); //添加阴影边框

winform.show();
win.loopMessage();


用到的附件 print.zip (240.41 KB, 下载次数: 41)
回复

使用道具 举报

0

主题

1

帖子

1

积分
交易币
0

新手入门

Rank: 1

发表于 2016-8-18 14:12:54 | 显示全部楼层
请问一下onElementControlCreated这个事件是怎么回事?参数ltOwner是什么? 表示这里看不懂啊
回复 支持 反对

使用道具 举报

0

主题

6

帖子

5

积分
交易币
0

新手入门

Rank: 1

发表于 2019-9-6 12:09:00 | 显示全部楼层
学习了,谢谢
回复 支持 反对

使用道具 举报

0

主题

5

帖子

3

积分
交易币
0

新手入门

Rank: 1

发表于 2021-2-14 22:38:12 | 显示全部楼层
支持打印功能
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



GMT+8, 2021-3-6 02:59 , Processed in 0.095443 second(s), 29 queries .

© 2001-2011 Powered by Discuz! X3.2.

快速回复 返回顶部 返回列表