Zac*_*Lee 7 c++ openframeworks
我试图使窗口得到调整大小按比例之间保持相同的比例width和height窗口.
例如,如果您创建了一个具有400x300尺寸的窗口,并且如果您将宽度拉伸到800,则600即使您只是水平拉伸窗口,高度也会自动拉伸到.
无论如何,为了实现这个功能,我需要使用ofSetWindowShape()内部windowResized()监听器.
我可以在MacOS X上快速对其进行原型设计并且效果非常好.
这是代码:
ofApp.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?
Run Code Online (Sandbox Code Playgroud)
ofApp.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);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在Ubuntu上运行相同的代码,应用程序会在调整窗口大小时立即冻结.它似乎ofSetWindowShape()调用了windowResized()监听器,因此它进入了无限循环.
(windowResized - > ofSetWindowShape - > windowResized - > ofSetWindowShape ....)
如何更改代码,以便它也可以在Ubuntu上运行而不会出现问题?任何建议或指导将不胜感激!
PS:如果Linux用户可以确认应用冻结,我也很感激.
你试过了吗:
ofSetupOpenGL(widthScaled, heightScaled, OF_WINDOW);
Run Code Online (Sandbox Code Playgroud)
显然 ofSetWindowShape() 只能在 App::Setup() 期间调用... 请参阅此处的 OF 教程