2017-08-09 22 views
7

Tôi đang cố gắng làm cho cửa sổ OF được thay đổi kích thước tương ứng với tỷ lệ tương tự giữa các số widthheight của cửa sổ. Ví dụ: nếu bạn đã tạo cửa sổ có kích thước 400x300 và nếu bạn kéo chiều rộng thành 800 thì chiều cao sẽ tự động được kéo dài đến 600 mặc dù bạn chỉ kéo dài cửa sổ theo chiều ngang.Gọi hàmSetWindowShape() trong windowResized() đóng băng ứng dụng trên Ubuntu

Dù sao, để triển khai tính năng này, tôi cần sử dụng ofSetWindowShape() bên trong trình nghe windowResized().

Tôi có thể nhanh chóng tạo mẫu này trên MacOS X và nó hoạt động rất tốt.

Dưới đây là các mã:

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? 

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); 
} 

Tuy nhiên, nếu tôi chạy cùng mã trên Ubuntu, đóng băng ứng dụng ngay sau khi tôi thay đổi kích thước cửa sổ. Có vẻ như ofSetWindowShape() gọi windowResized() người nghe và do đó nó đi vào vòng lặp vô hạn.

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

Làm thế nào tôi có thể thay đổi mã vì vậy nó cũng có thể làm việc trên Ubuntu mà không có vấn đề? Bất kỳ lời khuyên hoặc hướng dẫn nào sẽ được đánh giá cao!

P.S: Tôi cũng sẽ đánh giá cao nếu người dùng Linux có thể xác nhận việc đóng băng ứng dụng.

Trả lời

0

Bạn có thử:

ofSetupOpenGL(widthScaled, heightScaled, OF_WINDOW); 

Rõ ràng ofSetWindowShape() chỉ nên được gọi trong App :: Cài đặt() ... see OF tutorials here

+0

Cảm ơn cho câu trả lời, tôi đã thử nó nhưng nó doesn' t làm việc. AFAIK, ofSetupOpenGL() chỉ nên được sử dụng trong tệp main.cpp và củaSetWindowShape() có thể được gọi ở nơi khác ngoài thiết lập(). –

+0

Ah. Đây là vấn đề với các khung công tác mới - tài liệu này chậm hơn so với việc triển khai. Tôi đã căn cứ câu trả lời của tôi về báo giá này về SetWindowShape(): "Ngoài ra, bạn có thể đặt kích thước cửa sổ (và vị trí) trong chức năng cài đặt của ứng dụng, được gọi ngay khi bắt đầu ứng dụng khởi chạy" – ac1dh0n3ycl0ud

Các vấn đề liên quan