gpt4 book ai didi

c++ - 在 windowResized() 中调用 SetWindowShape() 会卡住 Ubuntu 上的应用程序

转载 作者:可可西里 更新时间:2023-11-01 18:39:51 35 4
gpt4 key购买 nike

我试图使 OF 窗口按比例调整大小,以保持窗口的 widthheight 之间的比例相同。

例如,如果您创建了一个尺寸为 400x300 的窗口,并且如果您将宽度拉伸(stretch)到 800,那么高度将自动拉伸(stretch)到 600 即使您只是水平拉伸(stretch)了窗口。

无论如何,为了实现此功能,我需要在 windowResized() 监听器中使用 ofSetWindowShape()

我可以在 MacOS X 上快速制作原型(prototype),而且效果很好。

代码如下:

的App.h

enum ScaleDir { //window scaling directions

SCALE_DIR_HORIZONTAL,
SCALE_DIR_VERTICAL,
};
ScaleDir scaleDir;

int windowWidth, windowHeight; //original window dimensions
float widthScaled, heightScaled; //scaled window dimensions
float windowScale; //scale amount (1.0 = original)
bool bScaleDirFixed; //is direction fixed?

的App.cpp

//--------------------------------------------------------------
void ofApp::setup(){

windowWidth = ofGetWidth();
windowHeight = ofGetHeight();
windowScale = 1.0f;
widthScaled = windowWidth * windowScale;
heightScaled = windowHeight * windowScale;
}

//--------------------------------------------------------------
void ofApp::update(){

if (bScaleDirFixed) {

bScaleDirFixed = false;
}
}

//--------------------------------------------------------------
void ofApp::draw(){

ofSetColor(255, 0, 0);
ofSetCircleResolution(50);
ofDrawEllipse(widthScaled/2, heightScaled/2, widthScaled, heightScaled); //the ellipse will be scaled as the window gets resized.
}

//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){

if (!bScaleDirFixed) {

int gapW = abs(widthScaled - w);
int gapH = abs(heightScaled - h);

if (gapW > gapH)
scaleDir = SCALE_DIR_HORIZONTAL;
else
scaleDir = SCALE_DIR_VERTICAL;
bScaleDirFixed = true;
}
float ratio;

if (scaleDir == SCALE_DIR_HORIZONTAL) {

ratio = static_cast<float>(windowHeight) / static_cast<float>(windowWidth);
h = w * ratio;
windowScale = static_cast<float>(w) / static_cast<float>(windowWidth);
}
else if (scaleDir == SCALE_DIR_VERTICAL) {

ratio = static_cast<float>(windowWidth) / static_cast<float>(windowHeight);
w = h * ratio;
windowScale = static_cast<float>(h) / static_cast<float>(windowHeight);
}
widthScaled = windowWidth * windowScale;
heightScaled = windowHeight * windowScale;
ofSetWindowShape(widthScaled, heightScaled);
}

但是,如果我在 Ubuntu 上运行相同的代码,应用程序会在我调整窗口大小时卡住。似乎 ofSetWindowShape() 调用了 windowResized() 监听器,因此它进入了无限循环。

(windowResized -> ofSetWindowShape -> windowResized -> ofSetWindowShape....)

我怎样才能更改代码以便它也可以在 Ubuntu 上正常运行?任何建议或指导将不胜感激!

P.S:如果 Linux 用户可以确认应用卡住,我将不胜感激。

最佳答案

你试过吗:

ofSetupOpenGL(widthScaled, heightScaled, OF_WINDOW);

显然 SetWindowShape() 应该只在 App::Setup() 期间调用 ... see OF tutorials here

关于c++ - 在 windowResized() 中调用 SetWindowShape() 会卡住 Ubuntu 上的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45581406/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com