일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬
- Google App Engine
- 나르왈프레오
- 패턴인식
- Bidirectional Associative Memory
- 패턴 인식
- 고려대학교
- 멤버십
- NarwalFreo
- hopfield network
- Friendship
- 신경회로망
- 갤럭시탭S8울트라
- 동아리
- 인공지능
- 구글 앱 엔진
- 삼성소프트웨어멤버십
- Neural Network
- 가상화
- 삼성전자 소프트웨어멤버십 SSM
- 하이퍼바이저
- 빅데이터
- 삼성
- BAM
- SSM
- 증강현실
- Python
- 신경망
- 물걸레자동세척로봇청소기
- 물걸레로봇청소기추천
- Today
- Total
정보공간_1
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #2 본문
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #2
알 수 없는 사용자 2013. 11. 4. 14:51아, 안녕하세요~ Scrnsave 라이브러리를 이용한 화면보호기 만들기의 신촌멤버십 김시재입니다^^
오늘은 라이브러리를 직접 사용해서 화면보호기를 만들어보기로 했었죠! 상용의 프로그램을 만들 작정
만 아니라면 우리의 목표는 매우 쉽게 이룰 수 있습니다. 바로 시작해볼까요?
Scrnsave.lib
이 라이브러리는 대체 뭘 하는걸까요?
일단 간단하게 스크린세이버를 직접 만들려면 무엇이 필요한지 나열해 봅시다.
1. 명령행 인자를 분석하고, 미리보기, 설정하기, 실행에 대한 각각의 코드를 작성한다.
2-1. 실행 명령의 경우 전체화면으로 윈도우를 생성한다.
2-2. 메시지 루프를 돌면서 WM_MOUSEMOVE와 같은 사용자 입력이 발생하면 화면보호기를 종료한다.
2-3. 환상적인 그림을 그려준다.
3-1. 미리보기 명령인 경우 두 번째로 넘어오는 윈도우 핸들의 자식 윈도우로 자신을 실행한다.
4-1. 설정 명령인 경우 미리 준비한 설정 대화상자를 생성한다.
4-2. 변경된 설정을 어딘가(레지스트리 등)에 저장한다.
네, 대충 보더라도 많은 작업이 필요하다는 걸 알 수 있습니다. 하지만 우리가 정말 원하는건 굵게 표시된 두가지 작업 뿐입니다. 그것을 제외한 나머지는 특별한 경우가 아니면 모든 화면보호기가 공통으로 지켜야 하는 기능들입니다. 한마디로 지루한 반복 작업이 되는 것이죠.
반복작업들, 그러니까 위에 적은 항목의 대부분은 Scrnsave 라이브러리를 사용하면 생략할 수 있는 것입니다. 상황에 맞는 윈도우를 만들어주고, 메시지 루프를 돌려주며 마우스 및 키보드 메시지에 대한 처리도 수행합니다. 심지어 내부에 main 함수도 있습니다. (세상에, WinMain같은거 안 만들어도 된답니다!)
우리는 단지 필요한 화면보호기의 구동부분, 그러니까 메시지 프로시저에 그림그리는 코드를 집어넣는 데 집중할 수 있게 되는 겁니다.
역시 오늘도 잡설이 길군요! 실제로 해보죠, 3가지 함수만 만들어주면 됩니다. 간단하니까 무작정 따라해보는 방식으로 가볼까요?
프로젝트를 생성하고 scrnsave.lib, comctl32.lib 를 프로젝트에 추가하세요.
여기서 잠깐, 프로젝트에서 유니코드를 사용하는 경우 “scrnsavw.lib”, 아닌 경우 “scrnsave.lib” 를 구분하여 추가해 주세요. 귀찮으시면 다음과 같이 코드에 직접 써 넣으셔도 됩니다.
comctl32.lib 는 갑자기 왜 튀어나오는지 궁금해 하실 수 있겠는데요, 우리가 사용할 Scrnsave 라이브러리가 내부적으로 공용 컨트롤을 사용하기 때문에 공용컨트롤을 사용할 수 있도록 초기화시켜줘야 하기 때문입니다. 그것을 위해 Scrnsave 라이브러리가 호출하는 함수가 InitCommonControlsEx이기 때문에 comctl32.lib를 포함시키지 않으시면 다음과 같은 에러가 발생합니다.
으아아아아...!
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775697(v=vs.85).aspx
http://blog.naver.com/sainthkh?Redirect=Log&logNo=140062316898
이게 뭔고, 싶으시면 첫 번째 링크의 MSDN을 열어 보세요. 페이지 하단부에 comctl32.lib를 링크하라고 나올겁니다. ^^;;
네이버에 검색하신다면 두 번째 링크를 열어보세요. 같은 길을 걷는 우리에게 이 상황뿐 아니라 다른 문제에 대해 도와주시는 단비같은 한글 도움말이 있습니다.
좋습니다 좋아요. 반정도 진행했습니다. 다음으로 ScrnSave.h 라는 헤더 파일에 대해 살펴봅시다. ScrnSave.h에는 우리가 만들어야 할 함수의 프로토타입이나 아이콘의 ID값, 라이브러리에서 사용하는 전역 변수와 같은 것들을 포함하고 있습니다. 그냥 추가해주시고, 심심한번 한 번 열어보시기 바랍니다. 그곳에 쓰여진 주석들이 도움이 많이 될거에요!
이제 마지막입니다.
Scrnsave 라이브러리는 앞서 말씀드렸듯 윈도우 클래스를 등록하고 생성해주며 메시지 루프까지 돌려줍니다. 한마디로 우리가 평소 만들던 WinMain 같은 함수가 이미 만들어져 있다는 것이죠. 그렇지만 화면보호기가 어떻게 동작하는지 까지는 라이브러리도 만들어줄 수가 없습니다. 따라서 그런 세부 동작을 구현하는 프로시저 함수와 같은 부분을 사용자가 구현하라고 요구하게 됩니다.
따라서 우리가 필수적으로 작성해야 할 함수가 다음의 세 가지입니다.
(사실 귀찮으면 ScreenSaverProc만 제대로 작성하고 나머진 대충 return 처리 해버려도...)
LRESULT WINAPI ScreenSaverProc(HWND, UINT, WPARAM, LPARAM)
BOOL WINAPI RegisterDialogClasses (HANDLE)
BOOL WINAPI ScreenSaverConfigureDialog (HWND, UINT, WPARAM, LPARAM)
각 함수에 대해 설명해보겠습니다.
LRESULT WINAPI ScreenSaverProc(HWND, UINT, WPARAM, LPARAM)
화면보호기의 가장 핵심적인 녀석이죠! 화면보호기의 메시지를 받아서 처리하는 프로시저입니다. 평소 어플리케이션을 작성하실 때 처럼 작성하시면 됩니다. 다른게 있다면 여러분이 처리하지 않는 메시지들은 DefScreenSaverProc 함수로 전달해주시라는 겁니다.
DefScreenSaverProc 함수는 화면보호기가 처리해야 할 기본적인 메시지들을 처리합니다. 예를들어 마우스가 움직이면 프로그램이 종료되도록 WM_MOUSEMOVE를 처리한다던지가 그 예죠. 어떤 메시지를 처리하는지 자세히 보고싶다면 아래의 링크를 따라가보시기 바랍니다 ^_^
http://msdn.microsoft.com/en-us/library/bb776402(v=vs.85).aspx
BOOL WINAPI RegisterDialogClasses (HANDLE)
이 함수는 화면보호기 설정 다이얼로그를 띄우기 전에 호출됩니다. 우리가 살다보면 설정 다이얼로그에 버튼같은 표준 컨트롤 말도고 다른 특별한 컨트롤도 만들어 써보고싶잖아요? 그 때 이런 커스텀 컨트롤을 등록할 수 있도록 호출되는 함수입니다. 하지만 평민인 우리에겐 상관 없죠. 그런경우 일반적으로 return TRUE; 만 넣어줍니다.
BOOL WINAPI ScreenSaverConfigureDialog (HWND, UINT, WPARAM, LPARAM)
라이브러리는 설정을 조절해야 할 때 설정 다이얼로그를 생성합니다. 그리고 그 다이얼로그의 메시지를 이 함수로 보내죠. 평소처럼 다이얼로그 메시지 프로시저와 같이 코딩하시면 됩니다.
주로 여기서 사용자의 설정 수정 결과를 레지스트리에 저장하는 코드를 작성합니다.
자, 필요한 건 다 설명했습니다. 마지막으로 다음의 세 가지 함수에 대한 코드를 붙여 넣으시면 기본적인 건 완성! (하나하나 귀찮군요, 에잇!)
자! 이제 이걸 오타 없이 입력하고 실행하시는 순간 세상이 잠깐 멈춘 듯 느끼실 겁니다. 아무것도 변하는게 없기 때문이죠. 왜일까요?
후후, 다음에 뵙겠습니다!
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[4기 광주 박주연] Diff, Patch를 사용한 변경사항 처리 (0) | 2013.11.05 |
---|---|
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #3 (0) | 2013.11.04 |
[4기 신촌 백재현] C++ algorithm 헤더의 sort()를 사용하여 struct를 정렬해보자. (0) | 2013.11.04 |
[4기 신촌 김시재] Scrnsave 라이브러리를 이용한 화면보호기 #1 (0) | 2013.11.02 |
[4기 신촌 백재현] C++ 증감 연산자(var++/++var)를 연산자 오버로딩 하기 (0) | 2013.11.01 |