일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- BAM
- Friendship
- Neural Network
- 동아리
- Bidirectional Associative Memory
- hopfield network
- 물걸레자동세척로봇청소기
- 고려대학교
- 삼성전자 소프트웨어멤버십 SSM
- NarwalFreo
- SSM
- 구글 앱 엔진
- 인공지능
- Python
- 증강현실
- 가상화
- 패턴 인식
- 삼성
- 하이퍼바이저
- 빅데이터
- 멤버십
- 삼성소프트웨어멤버십
- 물걸레로봇청소기추천
- 갤럭시탭S8울트라
- 나르왈프레오
- Google App Engine
- 신경회로망
- 신경망
- 파이썬
- 패턴인식
- Today
- Total
정보공간_1
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #3 본문
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #3
알 수 없는 사용자 2013. 11. 4. 18:05안녕하세요~ 화면보호기를 계속 만들어보는 신촌 멤버십 김시재입니다.
이번엔 저번에 남겨두었던 궁금증을 풀어보겠습니다. 눈치가 빠르신 분들이면 이미 알고 계시겠네요.
답은 바로 명령행 인자에 있습니다.
화면보호기는 실행할 때 명령행 인자를 받게 되는데 VisualStudio에서 실행하게 되면 그런 인자가 넘어가지 않기 때문입니다.
물론 화면보호기에 아무런 명령행 인자가 전달되지 않을 경우 설정 대화상자를 띄워주도록 되어있습니다. 하지만 우리는 아직 설정 대화상자를 작성하지 않았기 때문에 아무것도 띄워지지 않는거랍니다. 만약 그 부분을 작성했더라면 설정 대화상자가 보여졌겠죠.
에이 답답합니다, 일단 뭔가 실행이라도 되야 눈으로 보면서 작업을 하지 않겠습니까?
그래서 먼저 윈도우 탐색기에서 실행하는 방법을 해보고, 다음으로 프로젝트 설정을 바꾸어 VisualStudio에서 바로 실행할 때 명령행 인자를 넘겨주도록 하는 방법을 알아보겠습니다!
먼저 여러분의 Debug나 Release 폴더를 가보시면 만들어진 파일의 확장자가 .exe란걸 보실 수 있을겁니다. 일단 확장자를 .scr로 바꾸신 다음 실행해보세요. 그러면 나만의 화면보호기가 짠~ 하고 나타납니다!
.exe 확장자에서 .scr 확장자로 이름만 바꾸었을 뿐인데 먹통이던 화면보호기가 갑자기 실행되는 이유는 뭘까요? 앞서 설명드렸지만 윈도우는 .scr 확장자를 탐색기에서 실행하는 경우 /s 명령행 인자를 자동으로 넘겨주게 되어 있기 때문입니다. 그래서 바로 화면보호기가 실행되는 것이지요.
하지만 매번 컴파일할 때 마다 확장자를 바꾸는건 힘들기 때문에 자동으로 .scr로 컴파일 되도록 바꿔봅시다.
위의 스크린샷 처럼 대항 확장명을 .exe에서 .scr로 바꿔주세요. 그리고 여유가 있으시다면 좌측 상단의 구성을 'Release' 이거나 'Debuge' 어느 하나가 아닌 '모든 구성'으로 선택해 주시고 .scr로 바꾸시면 나중에 디버그 모드에서 릴리즈 모드로 전환하더라도 같은 설정이 유지됩니다.
이제 여러분은 컴파일 버튼을 누를 때마다 화면보호기를 뚝딱뚝딱 찍어낼 수 있게 되었습니다. 하지만 한 걸음 더 나아가 보겠습니다. 여전히 VisualStudio에서는 바로 실행되지 않고 실행파일이 있는 폴더로 이동해서 실행해야 합니다.
그것은 VisualStudio가 화면보호기를 실행하면서 명령행 인자를 전달하지 않아서 그런겁니다. 탐색기는 확장자가 .scr이기만 하면 /s 인자를 자동으로 넘겨서 엔터만 쳐도 실행되게 만들죠, 이걸 VisualStudio도 똑같이 하도록 바꿔보겠습니다.
자, 위의 스크린 샷처럼 프로젝트 설정을 수정하시면 이제부터 VisualStudio는 화면보호기를 실행할 때 마다 /s 명령인자를 넘겨주기 때문에 키보드 버튼 하나로 바로바로 실행되는 화면보호기를 보실 수 있습니다. 코딩하기 한 결 좋네요!
이제부터 여러분이 WinAPI를 사용하면서 원하시는 화면보호기를 만들어나가면 되겠습니다 ^_^
설정 대화상자 만들기
하지만 아직 더 이야기 할게 많군요, 설정 대화상자, 아이콘 추가 등등. 그리고 Scrnsave 라이브러리를 사용할 때의 단점에 대해서도요. 그럼 일단 이번엔 설정 대화상자에 대해 이야기를 해볼까요?
아시다시피 많은 기능을 라이브러리가 처리해줍니다. 설정 대화장자도 마찬가지인데요, 만약 화면보호기가 설정 대화상자를 보여주어야 할 경우 라이브러리는 미리 지정된 리소스 ID의 대화상자 템플릿을 사용해 대화상자를 생성합니다. 따라서 우리는 지정된 리소스 ID로 대화상자 템플릿을 만드는데 집중하기만 하면 됩니다.
우리가 설정 대화상자와 같은 리소스를 만들 때 그것들은 고유의 리소스 ID를 가지게 되는데, 그 ID가 라이브러리에 지정된 것과 같은 값을 가지도록 해야하는 것이죠. ScrnSave.h 헤더 파일을 열어보면 다음과 같이 설정 대화상자의 ID가 지정되어 있습니다.
ScrnSave.h 에서 확인할 수 있다
우리는 지금까지 문자열이 출력되는 화면보호기를 만들었으니, 문자열을 사용자가 설정할 수 있도록 설정 대화상자를 제공해보겠습니다.
아래 그림과 같이 프로젝트에 리소스 파일(.rc)을 추가해주세요, 이미 있는 분들은 리소스 파일을 더블클릭하여 리소스 뷰로 이동해주세요.
프로젝트 우클릭->추가->새 항목->리소스 파일 추가
리소스 파일이 추가되었으면 그것을 더블클릭하면 리소스 뷰로 이동합니다. 아래 그림과 같이 대화상자를 새로 만들어주세요. 이 과정이 번거로운 분들은 위의 그림에서 '프로젝트->추가->리소스' 를 선택하시면 대화상자를 바로 추가할 수 있습니다.
대화상자 템플릿 추가
대화상자 리소스를 추가하셨으면 아래 그림과 같이 대화상자에 Edit Control을 하나 놓아주세요
이제 우리가 만들고자 하는 설정 대화상자의 모양은 다 만들었습니다. 아래 그림과 같이 리소스 기호를 확인하면 대화상자의 리소스 ID가 2003번이 아닌 다른 값을 가지고 있을 겁니다. 이것을 라이브러리가 찾아낼 수 있도록 2003 이라는 값으로 바꿔야 합니다.
우리는 리소스 파일 생성과 동시에 추가된 resource.h 파일에서 직접 이 값을 수정하는 방법을 쓰겠습니다. 아래 그림과 같이 resource.h 파일에서 대화상자의 값을 수정하시고, 프로젝트에서 사용할 수 있도록 메인 소스 코드에 include 해주세요.
여기까지 해 놓으면 이제 라이브러리에서 우리가 준비한 설정 대화상자를 제대로 띄워주게 됩니다. 하지만 아직 대화상자의 메시지를 처리하는 프로시저를 제대로 작성하지 않았기 때문에 실행해봐야 제대로 동작하지 않습니다.
설정 대화상자에서는 사용자의 설정을 불러오거나 변경된 설정을 저장하고, 처음 실행한 경우 초기 설정 값으로 지정해주는 기능이 필요하게 됩니다. 이 외에도 각종 컨트롤의 제어 메시지 처리를 위한 코드도 들어가죠. 이것은 뒤로 미루고 일단 Edit Control이 너무 긴 문자열은 받지 않도록 32 자의 최대 길이를 지정하는 간단한 코드를 작성합니다.
아, #define MAX_LENGTH 32 는 이후 코드 전체에 걸쳐 쓰일 것이므로 코드 상단부에 작성해주세요.
이제 아무런 명령행 인자를 넘기지 않고 실행하면 우리가 만든 설정 대화상자가 보여질 것입니다. 글자를 마구 입력하게 되면 더 이상 입력하지 못하게 막기도 합니다. 이제 이런 사용자의 설정을 저장하는 기능을 구현해 보겠습니다.
사용자 설정 저장/불러오기
사용자가 설정 대화상자를 통해 수정한 설정은 나중에 화면보호기를 실행하거나 또 다시 설정 대화상자를 실행할 때마다 읽어올 필요가 있으며 이를 위해서 설정 정보는 어딘가에 저장되어야 합니다. 사용자의 설정은 보통 레지스트리에 저장하기 때문에 우리는 레지스트리에 접근하는 코드를 작성할 것입니다.
먼저 코드 파일 상단부에 다음과 같은 코드를 작성하도록 하겠습니다. 설정 값을 저장하고 활용하는 데 사용될 전역 변수와 함수 프로토타입들입니다. MYREG_SUBPATH는 저장될 레지스트리의 경로를 나타내는데, 필요한 경우 적당히 수정해서 사용하시기 바랍니다.
아래 그림은 설정을 불러오고 저장하는 함수의 본체입니다. 코드 파일 적당한 위치에 작성해주세요.
LoadSetting() 함수에서 특이한 점이 있다면 사용자가 처음 화면보호기를 실행하였을 때는 레지스트리에 값이 없기 때문에 불러오기가 실패할 것이므로 이 경우 "나만의 스크린 세이버!"라는 기본 설정 값으로 초기화 해주도록 해야 합니다.
이제 이렇게 저장하고 불러오는 함수를 설정 대화상자 프로시저에 적용합니다. 불러오기는 대화상자가 시작하는 WM_INITDIALOG에서, 저장하기는 사용자가 '확인' 버튼을 누르는 순간에 호출하면 됩니다. 프로시저를 아래 그림과 같이 수정해보세요!
그리고 대망의 실행...!! 아래 그림과 같이 여러분이 입력한 설정이 저장되는 것을 확인하실 수있습니다. 레지스트리 편집기를 열어 해당 경로를 찾아가보세요, 우리가 저장한 정보가 잘 저장되고 있습니다.
이제 이것을 화면보호기의 메인 프로시저인 ScreenSaverProc에서 활용하면 되겠습니다. 글이 길어졌군요, 다음 글에서는 사용자가 입력한 설정을 가져와 출력하도록 하겠습니다. 뿐만 아니라 출력되는 문자에 애니메이션도 살짝 넣어보겠습니다.
수고하셨습니다 --) __)
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[4기 광주 박주연] 2D 그래픽 애니메이션의 기본 원리 (0) | 2013.11.05 |
---|---|
[4기 광주 박주연] Diff, Patch를 사용한 변경사항 처리 (0) | 2013.11.05 |
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #2 (0) | 2013.11.04 |
[4기 신촌 백재현] C++ algorithm 헤더의 sort()를 사용하여 struct를 정렬해보자. (0) | 2013.11.04 |
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #1 (0) | 2013.11.02 |