달력

07

« 2018/07 »

  • 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
  •  
  •  
  •  
  •  

'프로그래밍/API'에 해당되는 글 32

  1. 2010.06.28 API-GetAsyncKeyState( 키보드 입력함수 ) (1)
  2. 2010.05.10 API-ini파일 (1)
  3. 2010.05.10 API-알파값(비트맵 이미지 투명화)
  4. 2010.05.10 API-애니메이션
  5. 2010.05.10 API-PlaySound
  6. 2010.05.10 API-더블 버퍼링
  7. 2010.04.24 API-ChildWnd
  8. 2010.04.24 API-WindowLong
  9. 2010.04.24 API-WNDCLASSEX
  10. 2010.04.24 API-대화상자




DX에서 키보드 입력을 받게 될때,

API함수를 사용해 보았는데,

자꾸 까먹게 되어 따로 포스팅을 한다.

키보드 입력을 처리 하는 함수로는
GetAsyncKeyState 함수와 GetKeyState가 존재 하는데

GetAsyncKeyState에 대해서 간단하게 필요한 부분만

빠르게 포스팅하도록 하자.

주로 GetAsyncKeyState를 사용할 때 함수만 딸랑 쓰는게 아니라

추가적인 연산을 해주게 되는데,

GetAsyncKeyState는 키가 눌렸을 때 GetAsyncKeyState의 0x8000 bit가 1이된다.
그리고,
GetAsyncKeyState가 호출되었을 때부터 다음 GetAsyncKeyState가 호출될 때까지
키가 계속 눌려 있는 상태라면 0x0001 bit는 0, 그렇지 않은 경우는 1이 된다.

즉, 키를 한번만 눌리게 하고 싶다면, &연산을 사용 0x0001에 대해 검사하면 될것이고,
한번 눌릴키가 쭉 눌렸을때 무언가 반응하고 싶다면
0x8000 을 사용하면 될것이다.

상황에 따라 적절하게 사용하도록 하자.

'프로그래밍 > API' 카테고리의 다른 글

API-GetAsyncKeyState( 키보드 입력함수 )  (1) 2010.06.28
API-ini파일  (1) 2010.05.10
API-알파값(비트맵 이미지 투명화)  (0) 2010.05.10
API-애니메이션  (0) 2010.05.10
API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10
Posted by 안식의후크
2010.05.10 21:58

API-ini파일 프로그래밍/API2010.05.10 21:58







특정 값이나, 상황, 옵션등을 설정하고 싶을 때, 프로그램 코드에서 설정하거나, 사용자에게 입력받는 방법도 존재 하지만,

모든 상황에 대해서 그 값을 입력받는다거나, 확인하는 작업이 그렇게 편리하지만은 않다.

그래서 존재 하는 것이 ini파일의 활용인데, (확장자만 바꾸면 꼭 ini가 아니여도 상관은 없지만, 보통 확장자를 ini로 많이 사용한다.)

크게 ini파일을 만들면,

세션 과 키값, 그리고 데이터로 분리된다.

[TEST1]
HP=1
MP=2

라는 식을 ini 파일이 가지고 있다고 했을 때

TEST1은 세션
HP, MP는 키값
1과 2는 데이터라고 보면 된다.

크게 어려운 것은 없고.

WritePrivateProfileString 를 사용해 세션을 만들고, 키 값을 만들고, 데이터를 삽입한다.

이 함수는 4개의 인자가 들어가는데, 세션, 키, 데이터, 파일의 (저장될)주소라고 보면 된다.

그리고
GetPrivateProfileString는
세션, 키, 데이터를 추출하지 못하였을때의 기본값, String의 저장 위치, 저장하는 곳의 공간, 파일의 주소
를 인자로 받게 되며 함수명에서 볼 수 있듯이, 파일에서 문자열을 받아 오기 위한 함수이다.

반대로
GetPrivateProfileInt는
세션, 키, 데이터가 저장된 장소, 파일의 주소를 인자라 보내주면
int형 값을 반환한다.

예제를 보면 훨씬 이해가 빠를 것이다.



소스를 실행하면, 경로에 의해 파일이 생성되고,
파일의 내용은

[TEST]
STR=This is Test
INT=92
[TEST2]
STR=This is Test
INT=92
[TEST3]
STR1=This iasdfs Test
INT1=921
STR2=Thisdfs is Test
INT2=912

다음과 같다.

// 실행 화면


A키를 누르고 S키를 누르게 되면 다음처럼 나온다.
만약 A키를 누르지 않고(즉 파일을 생성하지 않고) S키를 누르면

메시지는 ERROR,0 을 출력할 것이다.(단, 한번이라도 생성이 되었다면 파일이 삭제 되지 않는 이상은 옳바른 결과를 출력할 것이다.)

'프로그래밍 > API' 카테고리의 다른 글

API-GetAsyncKeyState( 키보드 입력함수 )  (1) 2010.06.28
API-ini파일  (1) 2010.05.10
API-알파값(비트맵 이미지 투명화)  (0) 2010.05.10
API-애니메이션  (0) 2010.05.10
API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10
Posted by 안식의후크





사실 예전엔 알파값을 사용하기 위해 매우 복잡한 연산을 사용(비트연산)하였으나,

지금은 TransparentBlt를 함수를 사용하면 1줄로 아주 간편하게 특정 값에 대한 수치를 제거 할 수 있다.



다음과 같은 이미지에 붉은값( 255, 0, 0 )을 투명처리 하고 싶다고 하자.
흔히들 알파값, 컬러키 라고 많이 불리우는데,


예제 소스를 보면
TransparentBlt( hdc, 0, 0, 48*12, 48, MemDC, 0, 0, 48*12, 48, RGB(255, 0, 0) ); 를 사용해서 마지막 인자값으로 RGB(255,0,0)을 준것을 알 수 있다.

이렇게 하게 되면 이미지를 띄우던중 RGB값이 동일하다면, 그 동일한 값에 대해서 투명처리를 해주게 되니 매우 쉽게 투명값을 먹을 수 있다.
BitBlt과 다른 점이라고는 마지막에 MemDC에 존재하는 이미지의 크기값이 들어간다는것만 빼면 차이가 없다. 하지만 투명값을 입히게 되면
그 색상에 대해서는 절대 화면에 보여 줄 수 없게 되니, 자주 쓰는 붉은색 보다는 자주 쓰지 않는, 핑크나 그린을 추천한다.
물론 수치가 1만 변경되도 다른 수치로 보기 때문에,
붉은 색을 알파값으로 정하더라도, 실제 붉은 색의 색상이 들어 간다면 255,0,0이 아닌 254,0,0으로 해도 전혀 다른 색으로 보기 때문에 크게 문제가 되진 않을것이다.

단 주의점은, TransparentBlt를 사용하기 위해서는
#pragma comment(lib, "Msimg32.lib") 선언해 주거나,
프로젝트에 추가해 주어야 한다는 것을 기억하자.
// 실행화면

'프로그래밍 > API' 카테고리의 다른 글

API-GetAsyncKeyState( 키보드 입력함수 )  (1) 2010.06.28
API-ini파일  (1) 2010.05.10
API-알파값(비트맵 이미지 투명화)  (0) 2010.05.10
API-애니메이션  (0) 2010.05.10
API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10
Posted by 안식의후크
2010.05.10 21:04

API-애니메이션 프로그래밍/API2010.05.10 21:04






애니메이션의 기본은 여러장, 또는 한장이지만 부분별로 쪼개어 번갈아 가면서 계속 보여줌으로써 애니메이션을 연출 할 수 있다.

긴 설명이 필요 할거 같지는 않고,

다음의 이미지를 번갈아서 출력한다고 생각해 보자.


이미지의 크기는 x축 48*12, y출 48이다.

따로 애니메이션을 플레이 해주는 함수가 존재하는 것은 아니고,

BitBlt 함수를 사용해 간단하게 화면에 뿌려 줄 수 있다.

예제를 보면 쉽게 이해 할 수 있다.

예제에서 보면

타이머를 사용해 frame를 수치를 조정하면서, 이미지를 48*fream, 0 으로 보여주는 것을 확인 할 수 있다.

즉 이미지 전체를 띄우는 것이 아니라.

이미지의 부분 부분을 잘라내어 특정 시간을 두고 조금씩 그 위치를 변경하는 것이다.

// 실행 화면
1부터 12까지 꾸준하게 번갈아 가면서 출력된다.

'프로그래밍 > API' 카테고리의 다른 글

API-ini파일  (1) 2010.05.10
API-알파값(비트맵 이미지 투명화)  (0) 2010.05.10
API-애니메이션  (0) 2010.05.10
API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10
API-ChildWnd  (0) 2010.04.24
Posted by 안식의후크
2010.05.10 20:48

API-PlaySound 프로그래밍/API2010.05.10 20:48






API에서 음악을 출력하기 위해 사용하는, PlaySound라는 함수만 사용해 주면된다.

특별히 주의할 점은 없고.

딱히 소스를 첨부 하지도 않겠다.

단지 PlaySound라는 함수를 사용하기 위해서는,

프로젝트에서 winmm.lib를 링크 하거나,

#pragma comment(lib, "winmm.lib" )

를 선언해야 하며,

#include <MMSystem.h>가 필요하다.

PlaySound의 첫번째 인자는 파일의 주소 TEXT("test.wav") 식으로 선언해 주고,

두번째 인자는 리소스의 Wave 파일을 연주할 경우 그 핸들을 지정,

3번째에 플래그 값이 들어 가는데,

SND_ASYNC를 삽입해 주는 것이 가장 무난하다.

PlaySound( TEXT("test.wav"), NULL, SND_ASYNC); 처럼 사용해 주면 소리가 난다.

만약 배경음악 처럼 무한으로 나오게 하고 싶다면 플래스를 SND_LOOP로 해주면 된다.

그리고 그 무한의 사운드를 종료해 주고 싶다면 NULL 옵션을 사용해 다시 한번 호출해 주면 종료된다.

단 한가지 아쉬운 점은 기존에 사운드가 흘러 나오고 있을 때 또다시 함수를 호출하면 기존의 플레이 되던 사운드가 종료된 다는것이, 가장 큰 단점이 아닐까 싶다.

해결하기 위해선 MCI를 사용하면 될거 같다고 생각하는데, 그것에 대해선 그냥 지나치도록 하겠다.

'프로그래밍 > API' 카테고리의 다른 글

API-알파값(비트맵 이미지 투명화)  (0) 2010.05.10
API-애니메이션  (0) 2010.05.10
API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10
API-ChildWnd  (0) 2010.04.24
API-WindowLong  (0) 2010.04.24
Posted by 안식의후크
2010.05.10 20:21

API-더블 버퍼링 프로그래밍/API2010.05.10 20:21






api에서 paint를 호출 할때 사용하는 InvalidateRect 함수는 특정 영역(또는 전 화면)을 지우고 다시 그려주는 일을 하게 되는데, 그 순서는

기존의 이미지 -> 특정 영역(모든 영역)을 화면에서 지운다 -> 다시 그려준다

(물론 그려주기 위해서 MemDC가 필요 하다.)
이런 구조를 지니게 되는데,

그렇기 때문에 가끔씩 느껴지는 깜박임 현상을 보게 된다.

그때 그 문제를 해결하기 위해서 더블 버퍼링이라는 기술을 사용하게 되는데,

따로 더블버퍼링 함수를 제공한다거나 하는것이 아니기 때문에 처음엔 많이 해맬 수 있다.

기존에 영역을 지우고 다시 그려주는 것이 아닌,

hdc가 뿌려준 기존의 화면 -> 다음에 그려줄 이미지를 BackDC에 임시 저장 -> BackDC에 내용을 MemDC에 삽입한다. -> MemDC에 내용을 hdc로 넘긴다. -> hdc에서 화면에 뿌려준다.

의 순서로 돌아간다.

그렇기 때문에 화면의 깜박임 현상을 제거 할 수 있는데, 그리고 지우는게 아니라

그리고 덮허씌운다, 라는 표현이 맞을것 같다.

예제를 보도록 하자.

이 처럼, 해주면 된다.

여기서 더이상 어떻게 설명을 해야 할지 모르겠다.

이해가 가지 않는다면, bitmap을 그릴때 어떤식으로 그리는지 부터 다시 파악하는 것을 추천한다.

프로그램을 실행하면, 검은 화면에 깜박이지 않는 어떠한 리소스가 좌우로 움직이는 것을 확인 할 수 있다.


// 실행 화면

'프로그래밍 > API' 카테고리의 다른 글

API-애니메이션  (0) 2010.05.10
API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10
API-ChildWnd  (0) 2010.04.24
API-WindowLong  (0) 2010.04.24
API-WNDCLASSEX  (0) 2010.04.24
Posted by 안식의후크
2010.04.24 20:23

API-ChildWnd 프로그래밍/API2010.04.24 20:23





프로그램이 간단하다면 괜찮지만, 그렇지 않다면, 하나의 메인 윈도우 만으로는 한계가 있을 것이다.
그때 차일드 윈도우를 생성하여 사용 할 수 있다.

일단 예제를 보고 설명을 하나씩 하도록 하겠다.


예제에 달린 주석을 보면 크게 무리 없이 이해가 갈듯 하다,
RegisterClass를 사용해서 각각 설정을 다르게( 예제에서는 커서와, 호출함수명, 클래스네임, 배경화면)을 바꿔준것을 알 수 있다)
최초에는 WinMain에서는 메인 윈도우만 생성해 주고,
생성 후 WM_CREATE: 에서 또 다른 윈도우를 생성하고 있다.
생성 시에 옵션을 주석 부분처럼 해주게 되면,
새로운 창이지만 크게 티가 나질 않는다(마치 그냥 네모를 그린 느낌?)
그래서 일브로 설정을 약간 바꿔서 팝업으로 띄우게 하였다.

// 실행 화면

'프로그래밍 > API' 카테고리의 다른 글

API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10
API-ChildWnd  (0) 2010.04.24
API-WindowLong  (0) 2010.04.24
API-WNDCLASSEX  (0) 2010.04.24
API-대화상자  (0) 2010.04.24
Posted by 안식의후크
2010.04.24 20:03

API-WindowLong 프로그래밍/API2010.04.24 20:03





CreateWindow로 윈도우를 만들 때 설정했던 윈도우의 속성들을 실행중에 조사하거나 바꾸고자 할때

LONG GetWindowLong(HWND hWnd, int nIndex);
LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);

이다.

이는 32비트용이고,

64비트를 지원하는 새로운 함수 원형은 다음과 같다.

LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex);
LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong);

쓰는 법은 똑같으며, 함수명 뒤에 Ptr이 붙고 LONG대신 LONG_PTR을 쓰는 정도의 차이밖에 없다고 한다.


특별한 기능은 없고, 실행 후 왼쪽 버튼을 누르면, 색상이 변경되고,
오른쪽 버튼을 누르면 마우스 포인터가 변경되는 간단한 예제이다.
특별히 살펴 볼 점은 SetClassLongPtr의 2번째 인자인데, 예제에서는 백그라운드를 관리하는 GCLP_HBRBACKGROUND와
커서를 관리하는 GCLP_HCURSOR 를 사용했었따는 점이다.

실행 화면은 pass 어차피 보여봤자, 백그라운드 색상 밖에 없으니까.

'프로그래밍 > API' 카테고리의 다른 글

API-더블 버퍼링  (0) 2010.05.10
API-ChildWnd  (0) 2010.04.24
API-WindowLong  (0) 2010.04.24
API-WNDCLASSEX  (0) 2010.04.24
API-대화상자  (0) 2010.04.24
API-Control(2)  (0) 2010.04.24
Posted by 안식의후크
2010.04.24 19:45

API-WNDCLASSEX 프로그래밍/API2010.04.24 19:45





기존의 Win16에서 Win32로 API가 업그레이드 되면서,

WNDCLASS에 멤버를 추가한 WNDCLASSEX 구조체를 대신 사용 할 수 있다.

특별히 추가된건 많이 없어 보이는데,

간단하게 살펴보자.

몇몇 바뀐게 있긴 하지만 기존의 창 생성과 큰 차이는 없어 보인다.
혹시라도 윈도우 생성에 실패하면 확인해 주기 위해 if문 수식이 추가 되었지만, 그건 신경쓰지 말고,
멤버는 2개가 추가 되었는데,
WNDCLASSEX를 사용하게되면, cbsize에 WNDCLASSEX를 sizeof로 보내주어야 한다.
그리고 CreateWindowEx에 첫번째 인자는 확장 스타일에 관한 것이다.
스타일이 꽤 많아서 도표로 만들진 않겠지만, 이중 경계선을 가진다던지, 비활성화중에도 가장 상위에 보여진다거나, 타이틀바를 오른쪽으로 정렬한다거나 하는 등, 괜찮아 보이는 스타일들이 확장되었다.

'프로그래밍 > API' 카테고리의 다른 글

API-ChildWnd  (0) 2010.04.24
API-WindowLong  (0) 2010.04.24
API-WNDCLASSEX  (0) 2010.04.24
API-대화상자  (0) 2010.04.24
API-Control(2)  (0) 2010.04.24
API-Control(1)  (0) 2010.04.24
Posted by 안식의후크
2010.04.24 18:43

API-대화상자 프로그래밍/API2010.04.24 18:43





대화상자라 함은, 특정 상황에서 윈도우를 하나더 꺼내서 사용하게 만드는 것이다.

크게 2가지로 구분되는데,

모달, 모달리스 이렇게 2가지로 구분된다.

모달의 경우는 창이 띄워지면 메인 윈도우에 접근이 잠시동안 불가능하며,

모달리스의 경우에는 창이 띄워져도 메인 윈도우에 대한 접근이 가능하다는 차이가 있다.


소스 설명
하나씩 천천히 보도록 하자,
일단 전역으로 메인에 대한 핸들을 보관할 hWndMain과, 모달리스용 핸들 hMDlg를 설정해 주었다.

그리고 GetMessage를 받는 부분에서 추가적인 if문이 사용 되었는데,
IsWindow는 대상 핸들이 현재 유효한지 파악하여 윈도우가 존재하면 TRUE, 그렇지 않으면 FALSE를 리턴한다,
그리고 IsDialogMessage는 대화상자를 위한 메시지인지 검사한다, 만약 그렇다면 대화상자로 메시지를 보내는 일들을 한다.
즉, 아직 모달리스 대화상자가 유효하지 않거나, 현재 입력된 메시지가 대화상자를 위한것이 아니라면,
일반적인 메시지로 파악하여 TranslateMessage와 DispatchMessage를 보내게 된다, 라는 것이다.

그리고 모달용 함수와, 모달리스용 함수가 존재하는데,

는 WM_CREATE와 비슷하게 다이얼로그가 생성되면 최초 한번 초기화를 하는 부분이라고 보면된다,
그리고 모달용 함수와 모달리스용 함수의 차이점은, 모달용은 확인을 누르든, 취소를 누르든,
대화상자를 종료하는,

를 사용하고 있다는 것이고,
모달리스용은, 확인 버튼이 눌릴때는 창을 닫고 있지 않고

를 사용해 Main윈도우의 변경을 요구하고 있다.
또한 취소를 하게 되면,

를 해줌으로써, 대화상자를 파괴하고, hMDlg를 NULL로 변경해 준것을 확인 할 수 있다.
그리고 마지막으로 생성을 WndProc에서 해주고 있는데,

좀전과 마찬가지로 아직 hMDlg가 유효하지 않다면,
CreateDialog를 사용해 생성, SHowWindow를 사용해 화면에 보여주고 있다.
모달용도 비슷하지만, CreateDialog가 아닌 단순히 DialogBox를 사용하고 있는 것을 확인 할 수 있다.
메뉴와 다이얼로그 작성

// 실행 화면
프로그램 설명 : 메뉴에서 모달형식, 모달리스형식을 설정해서 다이얼로그를 띄운다.
다이얼로그에서는 x,y의 합을 보고, 메인에 띄워져 있는 string의 x,y좌표와 내용을 변경할 수 있는 기능을 가지고 있다.

'프로그래밍 > API' 카테고리의 다른 글

API-WindowLong  (0) 2010.04.24
API-WNDCLASSEX  (0) 2010.04.24
API-대화상자  (0) 2010.04.24
API-Control(2)  (0) 2010.04.24
API-Control(1)  (0) 2010.04.24
API-BitMap  (0) 2010.04.24
Posted by 안식의후크