[Rust] fltk GUI
fltk๋ ๊ฒฝ๋ํ์ ํฌ๋ก์คํ๋ซํผ GUI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์๋๋ C++ ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ, Rust์๋ ๋ฐ์ธ๋ฉ์ด ์ ์ ๊ณต๋๋ ํธ์ธ ๊ฒ ๊ฐ๋ค.
๋ฌด์๋ณด๋ค ๋ฌธ์ํ๋ ์ฌ์ฉ๋ฒ์ด ๊ฐํธํด์ ํ๋ฒ ์ฌ์ฉํด๋ณด๊ฒ ๋์๋ค.
์ด๊ฒ์ ๊ฒ ๋ญ ๊น๊ณ dll ์ฐ๋ฅด๋ฅด ๋ฐ์ ํ์ ์์ด ๊ทธ๋ฅ ๋ํ๋์ ํ๋๋ฉด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
toml์ ์ข
์์ฑ์ ์ถ๊ฐํด์ค๋ค.
fltk = { version = "^1.3", features = ["fltk-bundled"] }

๊ทธ๋ฆฌ๊ณ ์ด๋ฐ์์ผ๋ก ์ง๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋์์ ํ์ธํด๋ณผ ์ ์์ ๊ฒ์ด๋ค.
๊ฐ๋จํ ์ฐฝ ํ๋๋ง ๋์ฐ๋ ์ฝ๋๋ค.
use fltk::{app, prelude::*, window::Window};
#[tokio::main]
async fn main() {
let app = app::App::default();
let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
wind.end();
wind.show();
app.run().unwrap();
}
์ ๋๋ค.
๋ฒํผ ์ถ๊ฐํด๋ณด๊ธฐ
์ด๋ฒ์๋ ๋ฒํผ์ ์ถ๊ฐํด์ ๋ญ๊ฐ ๋์์ ํ๊ฒ ๋ง๋ค์ด๋ณด์.
๊ธฐ์กด ์๋์ฐ์ ๋ฒํผ์ ์ถ๊ฐํ๋ ๋ฒ์ ๊ฝค๋ ๊ฐ๋จํ๋ค.
end ๋ฉ์๋๋ฅผ ์ฐ๊ธฐ ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑ๋ง ํ๋ฉด ์๋์ผ๋ก ๋ฐ์ธ๋ฉ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒํผ์ ์ฝ๋ฐฑ ๋ฉ์๋๋ง ์ฐ์ด์ฃผ๋ฉด ๋๋ค.
use fltk::{app, button::Button, prelude::*, window::Window};
fn main() {
let app = app::App::default();
let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
let mut but = Button::new(160, 210, 80, 40, "Click me!");
wind.end();
wind.show();
but.set_callback(move |_| println!("๋๋ฆผ!")); // the closure capture is mutable borrow to our button
app.run().unwrap();
}

๋๋ฅผ๋๋ง๋ค ์ฝ์๋ก๊ทธ๊ฐ ์ ์ฐํ ๊ฒ์ด๋ค.
์ด๋ฒ์๋ ์ฝ์๋ง ์ฐ๋๊ฒ ์๋๋ผ ๋ฒํผ์ ๋๋ฅผ๋ ๋ญ๊ฐ ์ํธ์์ฉ์ ํ๋๋ก ํด๋ณด๊ฒ ๋ค.
ํ๋ ์์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๊น๊ณ , ๋ฒํผ์ ๋๋ ์ ๋๋ง ํ
์คํธ๊ฐ ๋ณด์ด๋๋ก ํ ๊ฒ์ด๋ค.
use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};
fn main() {
let app = app::App::default();
let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
let mut frame = Frame::new(0, 0, 400, 200, "");
let mut but = Button::new(160, 210, 80, 40, "Click me!");
wind.end();
wind.show();
but.set_callback(move |_| frame.set_label("Hello World!")); // the closure capture is mutable borrow to our button
app.run().unwrap();
}
๊ทธ๋ผ ์ฒ์์๋ ๋น์ด์๊ฒ ์ง๋ง

๋ฒํผ์ ๋๋ฅด๋ฉด ๋ ์ด๋ธ์ด ๊น๋ฆฌ๋ฉด์ ํ ์คํธ๊ฐ ๋ ธ์ถ๋๋ค.

๊ตฌ์กฐ๋ ๊ทธ๋ญ์ ๋ญ ๋์์ง ์์ ๊ฒ ๊ฐ๋ค.