PyPb系列-技术实现原理(二)-如何open一个窗口

8 篇文章 0 订阅

首先我们要知道pb是如何打开一个窗口,大概就open,opensheet,openwitparam,opensheetwithparm,这四个函数

 open ( ref window o ) returns integer 
 open ( ref window o, string n ) returns integer 
 open ( ref window o, string n, window p ) returns integer 
 open ( ref window o, window p ) returns integer 
 opensheet ( ref window o, string n, window p ) returns integer 
 opensheet ( ref window o, string n, window p, integer w ) returns integer 
 opensheet ( ref window o, string n, window p, integer w, arrangeopen t ) returns integer 
 opensheet ( ref window o, window p ) returns integer 
 opensheet ( ref window o, window p, integer w ) returns integer 
 opensheet ( ref window o, window p, integer w, arrangeopen t ) returns integer 
 opensheetwithparm ( ref window o, readonly double a, string n, window p ) returns integer 
 opensheetwithparm ( ref window o, readonly double a, string n, window p, integer w ) returns integer 
 opensheetwithparm ( ref window o, readonly double a, string n, window p, integer w, arrangeopen t ) returns integer 
 opensheetwithparm ( ref window o, readonly double a, window p ) returns integer 
 opensheetwithparm ( ref window o, readonly double a, window p, integer w ) returns integer 
 opensheetwithparm ( ref window o, readonly double a, window p, integer w, arrangeopen t ) returns integer 
 opensheetwithparm ( ref window o, readonly powerobject a, string n, window p ) returns integer 
 opensheetwithparm ( ref window o, readonly powerobject a, string n, window p, integer w ) returns integer 
 opensheetwithparm ( ref window o, readonly powerobject a, string n, window p, integer w, arrangeopen t ) returns integer 
 opensheetwithparm ( ref window o, readonly powerobject a, window p ) returns integer 
 opensheetwithparm ( ref window o, readonly powerobject a, window p, integer w ) returns integer 
 opensheetwithparm ( ref window o, readonly powerobject a, window p, integer w, arrangeopen t ) returns integer 
 opensheetwithparm ( ref window o, readonly string a, string n, window p ) returns integer 
 opensheetwithparm ( ref window o, readonly string a, string n, window p, integer w ) returns integer 
 opensheetwithparm ( ref window o, readonly string a, string n, window p, integer w, arrangeopen t ) returns integer 
 opensheetwithparm ( ref window o, readonly string a, window p ) returns integer 
 opensheetwithparm ( ref window o, readonly string a, window p, integer w ) returns integer 
 opensheetwithparm ( ref window o, readonly string a, window p, integer w, arrangeopen t ) returns integer 
 openwithparm ( ref window o, readonly double a ) returns integer 
 openwithparm ( ref window o, readonly double a, string n ) returns integer 
 openwithparm ( ref window o, readonly double a, string n, window p ) returns integer 
 openwithparm ( ref window o, readonly double a, window p ) returns integer 
 openwithparm ( ref window o, readonly powerobject a ) returns integer 
 openwithparm ( ref window o, readonly powerobject a, string n ) returns integer 
 openwithparm ( ref window o, readonly powerobject a, string n, window p ) returns integer 
 openwithparm ( ref window o, readonly powerobject a, window p ) returns integer 
 openwithparm ( ref window o, readonly string a ) returns integer 
 openwithparm ( ref window o, readonly string a, string n ) returns integer 
 openwithparm ( ref window o, readonly string a, string n, window p ) returns integer 
 openwithparm ( ref window o, readonly string a, window p ) returns integer 

那我们要使用systemlibrary来调用上面的,下面以实现opensheet为例详细讲解

opensheet ( ref window o, readonly string a, window p, integer w, arrangeopen t ) returns integer 

先看PyPB中如何调用这个函数的

def opensheet(self,parentwindow,w,arrangeopen:str="layered",mutil=False):
    # 创建临时变量OB_DATA
    rt2  = ctypes.cast( (OB_DATA*2)() , POBDATA)
    local_var(rt2[0],"window")
    d = ref_obdata(rt2[1],rt2[0])
    # 创建一个枚举类型 arrangeopen 默认为layered
    ly = Obj("arrangeopen")[arrangeopen]
    # 父窗口对象
    self.parent = parentwindow
    # 调用opensheet方法
    return Obj().opensheet(d,self.name,self.parent.obj,w,ly)

 演示视频

打开窗口演示

实现的流程如下:

1 Obj().opensheet(d,self.name,self.parent.obj,w,ly)这个调用的语句原理和systemlibrary中调用messagebox一样,我们这里不再将了,详见https://blog.csdn.net/u010238274/article/details/127079980?spm=1001.2014.3001.5501

这里OB_DATA() 等同于c中定义一个结构体OB_DATA ob

2 第一个参数ref window o的实现

先定义一个局部变量,window,具体api如下

def local_var(obdata:OB_DATA, vartype):
    ob_set_data_flags(obdata, 0xD00 )
    och,_=ob_global_reference(vartype)
    ob_set_data_type(obdata,och.class_id )#32781
    ob_set_data_ptr_val(obdata,ctypes.c_void_p(0))
    ob_init_var_data(obdata)

然后将变量添加ref引用,具体api如下

def ref_obdata(obdata:OB_DATA, fromob:OB_DATA )->OB_DATA:
    refpak=ot_build_simple_refpak(ctypes.pointer(fromob),0)
    ot_set_reference_argument(obdata, refpak )
    obdata.type = fromob.type
    return obdata

这里需要注意的一个地方,loval_var的vartype这里只能传window,如果传具体的窗口名称,api则会调用不成功,我猜测这个就是跟pb中定义的函数类型为 ref window有关

 3 第二个参数,具体窗口的类名,字符串类型,这个很简单,api如下

def ob_set_data_string(obdata, instr):
    ob_set_data_ptr(obdata,ob_dup_string(instr),STRING_TYPE,1 )

4 第三个参数,父窗口,这里好像超纲了,后文在讲窗口事件和python如何交互的时候,再介绍这一部分的内容,这里假设有个已经打开了的全局窗口,窗口名为w_main,也就是在pb中open(w_main)已经打开了的窗口,我们通过获取全局变量的方式来获取到这个窗口的OB_DATA

def gloab_var(varname:str):
    return return_point(
pbvm.ob_get_global_var_data,POBDATA, 
    __obThis,ctypes.c_char_p(varname.encode("GBK")) )

调用方式 gloab_var("w_main"),我们把返回值作为第三个参数传入

5 第四个参数,是一个Enumerated类型的变量,arrangeopen,pb中是这样定义的这个枚举类型

 och获取方式,通过ob_global_reference("arrangeopen"),通过遍历arrangeopen所有的内容,与layered匹配,找到对应的value,这个value值其实就是一个int,具体调用的api如下

def ob_get_enum_info( och):
    num=ctypes.pointer(ctypes.c_ushort())
    return return_point(
pbvm.ob_get_enum_info,POB_ENUM_INFO,__obThis,och,num),num.contents.value

def new_enum(intval,class_id):
    node = OB_DATA()
    ob_set_data_enum(node, intval,class_id)
    return node
if self.isEnum==True :
   pinfo,num = ob_get_enum_info(self.och)
   if pinfo and num>0:
       for i in range(num):
          name = pinfo[i].name.decode("GBK")
          if name==index:
             return new_enum(pinfo[i].value, self.och.class_id)

以上都是个人的理解,分享以及记录一下,怕过段时间就不记得了... 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值