음악, 삶, 개발
Juce 로 만드는 GUI 파트2 : Component 의 paint 함수 본문
< 참고 자료 >
< 들어가기 앞서 >
앞서 우리는 juce::Component 를 상속받아 나의 클래스를 형성하고,
이들간에 부모-자식-관계를 설정하는 법에 대해 배웠다.
이제는 실질적으로 무언가를 그리는 방법에 대해 배울것이다.
< 콜백함수 paint 를 override 하기 >
앞서 만들었던 Canvas 클래스를 다시 보자.
class Canvas : public juce::Component {
public :
Canvas() {
setSize (canvasW, canvasH);
}
private :
const int canvasW {800};
const int canvasH {500};
};
이 상태로는 아무것도 그리지않은 상태이다.
그림을 그리기위해서는 그림을 그려줄 함수가 필요하다.
juce::Component 는 다음과 같은 가상함수를 가지고있다.
virtual void Component::paint(Graphics& g) // 난 가상함수!
우리는 juce::Component 를 상속받아 Canvas 클래스를 생성했으므로, 이 함수를 사용해야한다.
근데 앞에 virtual 키워드가 붙어있으므로, 호출해서 사용하는것이 아니라 override 해서 정의해야한다.
class Canvas : public juce::Component {
public :
Canvas() {
setSize (canvasW, canvasH);
}
void paint(juce::Graphics& g) override {
/* 여기서 그림을 그립니다! */
}
private :
const int canvasW {800};
const int canvasH {500};
};
이 paint 함수는 우리가 호출하는것이 아니라, Juce 가 호출하는 콜백함수이다.
따라서, 이 함수를 어딘가에서 우리 스스로가 호출할 일은 없어야하고,
저렇게 override 해서 함수 내부에서 그림을 그리는 코드를 짜는것이다.
그러면 그림을 그려야할때마다 Juce 가 알아서 paint 를 호출한다.
Juce 에서는 override 해야하는 가상함수들은 전부 콜백함수 (내가 직접 호출하지않는 함수) 이다.
(예를 들어, processBlock 이 있다)
< 이제부터 우리가 집중해야할 부분 : paint 안에서 일어날 일들 >
이제 무언가를 그리기로 마음먹었다면, 다른 모든것은 잊고,
이 paint 함수안에서 무엇을 할지만을 고민하도록 하자.
void paint(juce::Graphics& g) override {
/* 여기서 그림을 그립니다! */
}
< paint 에서 그림을 그리기위해 알아야할 클래스 발견하기 >
paint 에서 그림을 그리는것은 여러 클래스 객체들의 조합이 된다.
juce::Graphics 객체의 멤버 함수를 사용하게되는데,
이때 이 멤버 함수들의 인자가 또다른 클래스들의 객체이기때문이다.
언제나 클래스를 공부할때는, 이 클래스의 멤버 함수들을 보고,
각 함수들의 인자로 넘겨지는 클래스들을 확인하여 같이 공부하여야한다.
다음 포스팅에서 Graphics 클래스를 잘 사용하기위한 다른 클래스들이
무엇이 있는지 살펴보겠다.