정보공간_1

[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #4 본문

IT 놀이터/Elite Member Tech & Talk

[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #4

알 수 없는 사용자 2013. 11. 14. 23:50

안녕하세요~ 화면보호기를 계속 만들어보는 신촌 멤버십 김시재입니다.

이번에는 저번에 이어 사용자가 입력한 설정을 불러와서 출력하겠습니다. 아, 애니메이션도 넣기로 했었죠? 애니메이션은 어떻게 줄 수 있을까요? 여러가지 생각이 떠오르겠지만 가장 간단한 것은 WM_TIMER를 사용하는 방법입니다.

애니메이션 추가하기

애니메이션은 매우 간단하게 일정 시간 간격으로 표시되는 글자의 수가 달라지도록 해보겠습니다.
ScreenSaverProc의 내용을 아래와 같이 수정해보세요, 매우 간단한 기능이기 때문에 별로 바뀌는 건 없습니다.
WM_CREAT에서는 사용자의 설정을 불러오고 있습니다. 하지만 설정을 수정하는 건 아니기 때문에 WM_DESTROY에서는 사용자의 설정을 저장하지는 않습니다.

실행해보시면 여러분이 설정한 글자가 출력되는 걸 보실 수 있겠습니다!


아이콘 추가하기

거의 다 했습니다. 하지만 세상에 내놓기 전에 우리가 만든 실행파일에 아이콘을 입혀보겠습니다. 그냥 내놓으면 아무리 봐도 듣도보도 못한 바이러스 같잖아요?

아이콘은 .ico 확장자를 가지고 있습니다. 그림파일이랑 조금 다르죠?! 물론 VisualStudio의 리소스 편집기를 통해서도 아이콘을 만들 수 있습니다. 하지만 제공되는 기능이 워낙 열악해서 다른 그래픽 편집 툴을 사용해서 프로젝트에 적용하는게 낫습니다.

인터넷 어딘가에서 무료 아이콘을 구하세요, 만약 구하기 어렵다면 제가 준비한 아래의 아이콘을 프로젝트 폴더로 다운받아 주세요.

power_icon.ico

그리고 아래 그림과 같이 리소스 뷰에서 리소스 가져오기를 통해 여러분의 아이콘을 가져오세요. 

ScrnSave.h 에서는 #define ID_APP 100 으로 아이콘의 ID를 100으로 정하도록 명시하고 있습니다. 번거롭지만 다시 resource.h 로 가셔서 방금 추가하신 아이콘의 ID를 100으로 바꾸겠습니다. 그리고 컴파일을 하신 뒤 만들어진 파일을 확인해 보시면...

짠~ 그럴싸 한 모습입니다.

멋있게 완성이 되었군요! 이제 이걸 진짜 화면보호기에 적용시켜 보겠습니다. 화면보호기를 설치하는 방법은 우리가 만든 파일을 직접 C:\Windows 폴더에 옮겨넣는 것입니다. 그러면 화면보호기를 선택하는 목록에 자동으로 등장하게 됩니다.
또 다른 방법으로는 간단하게 만들어진 scr 파일에 마우스 오른쪽 버튼을 클릭하시면 나오는 메뉴 중 설치 라는 항목을 누르시면 운영체제가 알아서 해당 경로에 있는 scr 파일을 화면보호기로 사용할 수 있도록 도와줍니다. 물론 C:\Windows 폴더에 복사해주는 건 아니라 그 파일을 지우게 되면 경로가 무효하게 되어 화면보호기가 기본 값으로 돌아갑니다.

마우스 우측 클릭을 하면 화면보호기 관련 메뉴가 있습니다

좀 더 세련되게 여러분이 별도로 인스톨 기능을 넣으시는 방법을 사용하실 수 있지만 그것은 이번 글의 초점을 벗어나므로 생략하겠습니다. 

이제 아래 화면처럼 진짜 우리가 만든 화면보호기를 사용할 수 있게 되었습니다!

설정도 눌러보시고, 미리보기도 눌러보세요. 위 그림에 작게 보여지는 미리보기 부분을 조금 더 손보면 좋겠지만 다른 화면보호기 못지 않게 왠만한 기능들이 동작하는군요! 

이제 여러분은 나머지 그래픽적인 기능들을 원하는 대로 구현하시면 되겠습니다 ^_^


라이브러리의 한계

애니메이션은 보통 30프레임. 그러니까 초당 30번의 화면 갱신을 하는게 자연스럽죠, 게임은 초당 60번까지도 화면을 갱신합니다. 우리는 이 라이브러리를 사용하면서 애니메이션을 구현하는 데 타이머를 사용하였습니다. 타이머의 해상도는 1ms로 이론적으로는 초당 1천 번 메시지를 받을 수 있어 빠른 갱신에 부족함이 없어 보입니다.

하지만 메시지 큐에 들어갔다 나오기 때문에 항상 지정한 시간 간격에 맞게 메시지가 처리되지 않을 수 있고 요즘 프로세서에서는 1ms보다 더 빠르게 연산들이 수행되므로 상대적으로 타이머는 매우 느리게 수행된다고 볼 수 있습니다.

또한 화면을 갱신하지 않는 틈틈이 백그라운드에서 복잡한 연산을 계속 수행해야 하는 경우도 타이머와 같은 메시지 만으로는 이를 담당하기에 무리가 있습니다.

WinAPI 게임을 만들어 보신 분이라면 다음 그림과 비슷하게 GetMessage()가 아닌 PeekMessage()가 들어간 메시지 루프를 작성해 보셨을 겁니다.

이런 식으로 메시지가 없는 남은 모든 시간을 필요한 연산과 화면갱신에 집중시킬 수 있습니다. 하지만 Scrnsave 라이브러리는 main, WinMain과 같은 함수를 내부적으로 구현하고 호출되도록 만들어 놓았기 때문에 메시지 루프를 원하는 대로 수정할 수 없습니다.

또한 드문 경우겠지만 라이브러리에서 정해준 리소스 ID를 다른 용도로 써야 하는 경우도 문제가 될 수 있습니다. 이미 라이브러리가 용도를 정해준 ID이기 때문이지요.

이럴때는 고마운 라이브러리가 족쇄가 될 수도 있겠습니다. 하지만 웬만한 경우는 큰 문제가 되지 않으므로 여러분이 원하는 기능들을 구현하실 수 있을 겁니다. OpenGL도 활용해서 더욱 화려하게 꾸밀수도 있지요. 혹여나 관심이 있다면 라이브러리에서 제공하는 기능들을 직접 구현해 보시길 권해드립니다.



길고 두서없는 화면보호기 만들기가 끝났습니다. 더 궁금한 것들도 있고, 좀 더 화려한 예제를 만들고 싶지만 담백한 것이 최고죠! 상용으로 팔아보시려는게 아니라면 이정도 만으로도 여러분은 웬만한 화면보호기를 만들 수 있으실 거에요. 

혹시 지금까지 실습한 소스 코드가 필요하시다면 프로젝트 파일을 아래에 첨부하였으니 다운받아 사용하시기 바랍니다.

saver_controlbox.zip


그럼 고생 많으셨습니다. 항상 좋은 일만 가득하길 바라며 bye bye~