WM_SIZE和WM_CREATE谁先谁后

我一直认为创建一个窗口的时候,窗口处理过程处理WM_CREATE是在处理WM_SIZE之前的,所以很多初始化的东西都放在WM_CREATE处来做,但最近弄一个程序发现到了WM_SIZE处出错,原因是空指针,而这个指针应该是在WM_CREATE的时候被赋值的,奇怪了,难道WM_SIZE会在WM_CREATE之前?于是设两个断点,不看不知道,一看还真的如此,如下图:

程序每次总是先触到WM_SIZE的这个断点,难道我理解一直有误?于是我创建了一个hello world程序,调试了半天,又发觉没有这个问题,WM_CREATE总是在WM_SIZE之前,我尝试在别处重现问题,无果……现在,你再仔细看一下上图,你发现问题了么?

我想经过我这么提示,你应该知道了:原因就是WM_CREATE这个断点前一行的SetWindowLong这个调用,这个调用会引起一个WM_SIZE事件,所以这就制造了WM_SIZE在WM_CREATE之前这个假象。处理这个问题很简单,把SetWindowLong这行拿掉,然后把WS_NONAVDONEBUTTON这个属性交给CreateWindow,如下图:

这样就好了,我想顺便提个问题,我在设计一个程序的时候,也碰到了“布局”和“加载”的先后问题,因为布局可能需要重新调整加载的资源,而加载资源又需要参考布局的尺寸,由于功能上的原因,我必须把两者分开,所以存在我前面说的这个先鸡先蛋的难题。最后我是这么弄的,做一个“资源是否已经加载”的标志,然后总是先“布局”,布局的时候检查这个标志,如果没有资源的加载,那就只更改尺寸参数而不调整资源,这样看起来就没什么问题了,从逻辑上来说我的设计确实是WM_SIZE优先于WM_CREATE……
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这段代码,只有文本框能显示,其它控件都不能显示。为什么呢?class tkinterGUI(): root = None # 定义为类属性,可以在类的多个实例中共享 def __init__(self, geometry): pass def test(self): pass def create_root_win(self): self.root, self.文本框_主消息 = self.create_toplevel_win(True, "软件标题", "430x670", self.test, False, False) self.root.mainloop() # 在 create_root_win 方法中调用 mainloop 方法,显示窗口 def root_win_add1(self): if self.root is None: self.create_root_win() self.文本框_主消息.insert("1.0","efdssfdadsfasf") # 主内容区域 notebook = Notebook(self.root) notebook.pack(fill=tk.BOTH, expand=True) def create_toplevel_win(self,if_root,title,size,close_cmd,textbox_n,if_resize_width=True,if_resize_heigh=True): if if_root: mygui=tk.Tk() else: mygui=tk.Toplevel(self.root) 窗口win启动 = True mygui.title = title mygui.protocol('WM_DELETE_WINDOW', close_cmd) # 把点击x关闭窗口变成不要关闭并最小化到托盘 # 设置大小 居中展示 #win.bind("<Configure>", lambda root:win_mouse_release(root)) mygui.resizable(width=if_resize_width, height=if_resize_heigh) mygui.wm_attributes('-topmost', 1) #mygui.geometry(size+ "+" + str(self.root.winfo_x() + self.root.winfo_width()) + "+" + str(self.root.winfo_y())) mygui.geometry(size) tbox = ScrolledText(mygui) #self.eval("文本框"+title) = ScrolledText(self.win) tbox.place(relx=0.01, rely=0.18, relwidth=0.99, relheight=0.8) mygui.mainloop() return mygui,tbox # a,b=400,650 def show_msg_in_toplevel(self): self.win_msg,self.win_msg_tb= self.create_toplevel_win(self.root,"实时解盘","350x670",self.隐藏到任务栏,False,False) if __name__=="__main__": root=tkinterGUI("360x670") root.root_win_add1()
最新发布
03-22

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值