UI에서 특정 조합키를 입력하면 특정 UI가 켜지거나 실행되도록 구현하였다.

File의 아이템 목록에서 오른쪽 부분을 Shortcut이라고 하는데, Ctrl+O는 단순 미리보기 문자열에 불과해서 해당 조합키를 누르면 기능이 동작하도록 직접 핫키 기능을 구현해야했다. 

코드는 위에처럼 원하는 Dialog 클래스 안에 MenuItem 클래스를 선언하고 아이템 라벨과 숏컷 라벨을 인자로 준다. 
그리고 Bind를 하게되면 위에처럼 해당 UI가 활성화되어서 렌더링되는 구조이다.

우선 조합키를 저기서 매번 인자로 넘겨주게되면 코드가 굉장히 난잡해진다., 단순히 인자 2개만 줘서 해당 키를 현재 윈도우가 클릭될 때 입력할 경우 실행되도록 핫키 기능을 구현할 수 있지만, 이렇게되면 모든 함수마다 일일히 이런 코드를 작성해줘야하는 번거로움이 있다.
그리고 그럴 일은 많지 않겠지만 조합키를 3개 혹은 10개까지 써야할 경우엔.. 배열에 담아서 주거나 여러 파라미터를 받거나 가변인자로 줘야하는데 이러면 코드가 더더욱 난잡해질 것이다.

나는 HoyKey라는 클래스를 만들고 해당 클래스를 구성하는 KeyMap이라는 원소 클래스를 만들어서 좀 더 일반화하여 구현하기로 했다.

내가 원하는 코드 작성 방식은 대략 이렇다.

// Shortcut을 따로 인자로 주지 않을 경우 
// 알아서 Hoykey의 문자들을 출력
CzvMenuItem item("라벨");
// + 연산으로 보기 쉽게 조합키를 구성
item.SetHotKey(KeyMaps::KEY_CTRL + KeyMaps::KEY_A); 
if(item.Bind())
{
	...기능 동작
}

 

여러 방법을 고민하다가 나는 연산자 오버로딩을 활용하기 위해 Class를 활용하기로 하였다.
그리고 조합키의 기록은 List로 관리하게끔 하였다. 

우선 이렇게 키맵 클래스를 만들어준다. 해당 키맵 클래스는 실제 윈도우에서 사용되는 KeyCodes를 조합하는 일종의 커맨드 매니저 역할을 한다. 특정 키들을 조합하면 해당 조합된 키를 List로 관리하고, 조합된 키들을 디버깅이나 화면에 출력해주기 위해 GetKeyString()으로 문자열 변환도 해주도록 했다.

현재는 윈도우 생성 시, GLFW를 사용중이므로 키 코드를 GLFW 키코드에 대응시켰다

이 다음 해당 static 객체들을 버튼마다 생성해주고

내부 코드는 사칙연산으로 조합키를 표현할 수 있도록 구현해준다.

이제 완성된 KeyMaps들을 이용해서 조합키를 주고

내부에서 조합된 키들을 확인하기 위해 String 출력을 하면

정상적으로 나오는 것을 확인할 수 있다.

이제 HotKey 클래스에 해당 KeyMap 객체를 받아서 해당 키 메시지를 처리하기 전에 마우스로 메시지를 처리하고자 하는 Dialog가 현재 Dialog가 맞는지 확인하고 클릭 시 Bind가 True가 되도록 해준다. (혹은 이전에 등록한 콜백 함수를 호출해준다.)