【问题标题】:Stroustrup's "Simple_window" shrinks when pushing "Next" button按下“下一步”按钮时,Stroustrup 的“简单窗口”会缩小
【发布时间】:2014-09-16 16:08:02
【问题描述】:

我的这段代码基于 Stroustrup 的 Programming, Principles and practice using C++ 一书。

Point p(20, 100);                            // instance point where to fix the window
Simple_window win(p, 100, 100, "Canvas");    // instance a simple_window 100x100 pixel

while(true)
{           
    win.wait_for_button();                   // show the window in your screen until
                                             // you hit the "Next" button of the
                                             // window
}

它所做的只是实例化一个具有指定属性(大小、位置等)的“Simple_window”对象,并绘制您决定附加到窗口的任何对象。

该窗口包含一个“下一步”按钮,当按下该按钮时,将重绘以后附加的任何内容。

问题在于,即使没有在窗口上附加任何东西,连续按下“下一步”按钮也会使窗口变小。我调试了 FLTK 库(适用于 Windows 的 fltk-1.3.2),只能找到一个名为

的函数
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

在似乎负责调整窗口大小的 Fl_win32.cxx 文件中,但我无法得到任何其他内容。

有人知道问题出在哪里吗?

提前谢谢你。

【问题讨论】:

  • 库的问题可能比 FLTK 的问题更大。 FLTK 中的按钮大小不会改变,无论您点击多少次。你从哪里得到图书馆的?它是预编译的还是你从源代码构建的?
  • 我从 Stroustrup 的书籍支持网页 stroustrup.com/Programming/PPP2code 下载了代码并自己构建。

标签: c++ visual-studio-2012 fltk


【解决方案1】:

This bug 在 2014 年 11 月 3 日发布的 FLTK 1.3.3 中得到修复。根据错误报告,问题是:

此行为的原因与 Windows 使用 Border Padding 设置的方式有关,以及 FLTK 没有完全考虑该设置这一事实。 Windows 7 使用填充来绘制可调整大小窗口的边框,并且不会将其用于不可调整大小的窗口,除非在 PE 标头中 MajorSubsystemVersion 为 6。如果正在使用 Windows Classic 或 Windows Basic 主题,则这是正确的。如果使用 Aero 主题,那么所有窗口都会无一例外地遵守 Border Padding 设置,但无论出于何种原因,我描述的行为仍然会发生。

更多详情请关注bug report

【讨论】:

    【解决方案2】:

    原来这是一个仅在 Windows 7 版本上的已知问题

    https://groups.google.com/forum/#!searchin/fltkgeneral/shrink/fltkgeneral/BRdzwxXJGgs/1lOkF_j9CyQJ

    我在将我的项目从 mac 迁移到 windows 时遇到了同样的问题。

    我忽略了很多,只是使用了一个丑陋的解决方法:每当我调用win->show() 时调整大小(即使用win->resize(x,y,w,h))。根据您想要的行为,从最后一个已知位置/大小或默认位置显式使用 x,y,w,h 进行初始化。

    更好的方法(但仍然是一个问题)可能是对窗口进行子类化(例如并称之为mywin),添加一些成员变量x_temp,y_temp,w_temp,h_temp。然后定义隐藏和显示函数,如

    mywin::hide(){
        x_temp=x();
        y_temp=y();
        w_temp=w();
        h_temp=h();
        Fl_Window::hide();
    }
    
    mywin::show(){
        Fl_Window::show();
        resize(x_temp,y_temp,w_temp,h_temp);
    }
    

    听起来 simple_window 是 Fl​​_Window 的子类,因此您可以自己修改 simple_window,也可以只修改 simple_window 的子类。

    【讨论】:

    • 我明白了。我不知道这个问题,是的,我使用的是 Windows 7。非常感谢。
    【解决方案3】:

    好的,我发现在Simple_window::next() 中对hide() 的调用和在Simple_window::wait_for_button() 中对show() 的调用都进行评论可以避免单击“下一步”按钮时窗口变小。

    真的不知道为什么或如何,但它解决了窗口缩小。我猜想整个 winodw 缩小是这个 GUI 库的某些“版本”中发生的问题,具体取决于您下载它的位置和时间。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多