斯特劳斯特鲁普的"Simple_window"在按下按钮时收缩"Next"

Stroustrup's "Simple_window" shrinks when pushing "Next" button

本文关键字:按钮 Next window Simple 斯特劳斯      更新时间:2023-10-16

我有这段代码是基于Stroustrup的使用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文件中,它似乎负责调整窗口大小,但我无法获得其他任何信息。

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

提前谢谢。

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

这种行为的原因与Windows使用"边界填充"设置的方式有关,而且FLTK没有完全考虑该设置。Windows 7使用填充来绘制可调整大小的窗口的边界,并且不将其用于不可调整大小窗口,除非PE标头中的MajorSubsystemVersion为6。如果使用的是Windows经典或Windows基本主题,则情况也是如此。如果使用Aero主题,那么所有窗口都无一例外地尊重"边界填充"设置,但无论出于何种原因,我所描述的行为仍然会发生。

错误报告中的更多详细信息。

这是Windows 7上的一个已知问题,仅构建

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

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

我忽略了其中的大部分内容,只使用了一个丑陋的解决方法:每当我调用win->show()时都调整大小(即使用win->resize(x,y,w,h))。根据您想要的行为,从上次已知的位置/大小或初始化时使用的默认位置显式地使用x、y、w、h。

一个更好的方法(但仍然是bodge)可能是对窗口进行子类化(例如称为mywin),添加一些成员变量x_tempy_tempw_temph_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_windows,也可以只修改simple_wwindow的子类。

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

真的不知道为什么或如何,但它解决了窗口缩小的问题。我想整个winodw收缩是这个GUI库的某些"版本"中发生的问题,这取决于你从哪里和何时下载它

谢谢大家的帮助。