윈도우 32비트 프로그래밍 26 |
안녕하세요....돌팔이 황동준입니다... 이번시간에는 저번시간에 알아본 함수들을 이용해서 프로그램을 하나 만들어 보겠습니다. 자 그러면 전체적인 프로그램을 보도록 합시다. 아래는 리소스 파일입니다. #include <windows.h> MyMenu MENU 아래는 프로그램 파일입니다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) dwID = case MM_MCINOTIFY : MoveStartPosition(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, case 200 : Pause(hWnd, case 300 : Resume(hWnd, case 400 : Stop(hWnd, case WM_DESTROY : Close(hWnd, DWORD Open(HWND hWnd) mciOpenParms.lpstrDeviceType = mciError = mciSendCommand(NULL, MCI_OPEN, void Play(HWND hWnd, DWORD mciPlayParms.dwCallback = void Stop(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_STOP, void Pause(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_PAUSE, void Resume(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_RESUME, void Close(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_CLOSE, void MoveStartPosition(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_SEEK, 어떻게 돌아가는지 짐작이 갑니까? 별로 어렵지 않죠? 에러 처리하는 부분만 새롭지 크게 오늘은 여기까지 |
윈도우 32비트 프로그래밍 27 |
안녕하세요...........돌팔이 황동준입니다.......... 이번시간에는 저번시간에 본 프로그램을 분석해 보겠습니다. 그리고 플레이하는 또 다른 방법도 먼저 저번시간에 만들어본 소스를 보도록 합시다. case WM_CREATE : dwID = Open(hWnd); 윈도우가 생성되었을때에 Open()이라는 함수에 의해서 장치의 아이디를 얻는 과정을 보여 case MM_MCINOTIFY : MoveStartPosition(hWnd, dwID); 이 메시지는 언제 발생됩니까? MCI_PLAY라는 파라미터를 지정해서 사용한 case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, 플레이를 하는 구문입니다. case 200 : Pause(hWnd, 잠시 중단하게 하는 구문입니다. case 300 : Resume(hWnd, 다시 플레이하는 구문입니다. case 400 : Stop(hWnd, 플레이를 중단하는 구문입니다. } case WM_DESTROY : Close(hWnd, 프로그램이 종료되면 MCI 장치를 닫는다는 것을 보여 주고 있습니다. 자 그러면 구체적으로 제가 만든 함수들을 보도록 합시다. DWORD Open(HWND hWnd) 이 함수는 MCI 장치를 여는 역할을 하는 함수입니다. MCI_OPEN_PARMS mciOpenParms; 장치를 열기 위해서는 위 구조체 변수가 필요하다고 이미 설명 드렸을 겁니다. MCIERROR mciError; 장치가 제대로 열렸는지 확인하기 위해서 위 MCIERROR이라는 변수를 선언한 mciOpenParms.lpstrDeviceType = "waveaudio"; 확장자가 wav인 파일을 열기 위해서 디바이스 타입능 waveaudio라고 지정해준 mciOpenParms.lpstrElementName = 플레이할 파일의 이름을 지정해 주고 있습니다. mciError = mciSendCommand(NULL, MCI_OPEN, 실제로 MCI 장치를 여는 과정을 보여 주고 있습니다. 특별한 부분은 없는 것 if(mciError) 에러 체크하는 과정이 간단하죠? return mciOpenParms.wDeviceID; 장치 아이디를 리턴하고 있습니다. 다른 함수에서 이 장치 아이디를 사용할 것입니다. } void Play(HWND hWnd, DWORD dwID) 이 함수는 플레이 하는 역할을 합니다. MCI_PLAY_PARMS mciPlayParms; 플레이 하기 위해서는 위 구보체 변수가 필요하죠. MCIERROR mciError; 역시 에러를 체크하기 위해서 선언한 것입니다. mciPlayParms.dwCallback = (DWORD)hWnd; 구조체 멤버중 dwCallback에 윈도우의 핸들을 지정해 주고 있습니다. mciError = mciSendCommand(dwID, MCI_PLAY, 이 구조체를 이용해서 플레이하는 과정을 보여주고 있습니다. 세번째 파라미터에 쓰인 if(mciError) 플레이가 안되면 에러 메시지를 출력하기 위한 구문입니다. } void Stop(HWND hWnd, DWORD dwID) 이 함수는 플레이를 중지하는 역할을 합니다. 이 함수에 의해서 플레이가 중지 되도 윈도우에 MCI_GENERIC_PARMS mciGenericParms; 중지하기 위해서 사용할 함수의 파라미터에 위 구조체 변수가 필요합니다. MCIERROR mciError; 에러를 체크하기 위한 변수입니다. mciError = mciSendCommand(dwID, MCI_STOP, 중지를 하는 과정입니다. 세번째 파라미터에 MCI_WAIT가 지정된다는 것을 기억하시기 if(mciError) 중지를 하는 과정에 에러가 있는지 판단하는 구문입니다. } void Pause(HWND hWnd, DWORD dwID) 이 함수는 연주중에 잠시 중단하는 역할을 하고 있습니다. MCI_GENERIC_PARMS mciError = mciSendCommand(dwID, MCI_PAUSE, 중지하는 구문과 그 쓰임이 크게 다르지는 않군요. } void Resume(HWND hWnd, DWORD dwID) 이 함수는 잠시 중지된 것을 다시 플레이하는 역할을 하고 있습니다. 물론 중지된 곳부터 다시 MCI_GENERIC_PARMS mciError = mciSendCommand(dwID, MCI_RESUME, 사용방법이 같죠? } void Close(HWND hWnd, DWORD dwID) 이 함수는 MCI 장치를 닫는 역할을 합니다. MCI_GENERIC_PARMS mciError = mciSendCommand(dwID, MCI_CLOSE, 역시 똑같군요. } void MoveStartPosition(HWND hWnd, DWORD 이 함수는 플레이 될 위치를 처음으로 옮기는 역할을 합니다. MCI_SEEK_PARMS mciSeekParms; 위치를 바꾸기 위해서는 위 구조채 변수를 사용한다고 설명 드렸을 겁니다. MCIERROR mciError; mciError = mciSendCommand(dwID, MCI_SEEK, 두번째 파라미터의 MCI_SEEK가 위치를 옮기겠다는 의미이고 세번째 파라미터에 쓰인 if(mciError) 별로 크게 어려운 부분은 없죠? 그러면 확장자가 wav인 파일을 플레이하는 다른 방법을 알아 이 방법은 문자열을 이용해서 하는 방법인데 상당히 간단합니다. 역시 커다란 과정은 같습니다. 우리는 앞에서 mciSendCommand()라는 함수를 이용해서 위의 모든 과정을 처리했는데 MCIERROR mciSendString( 첫번째 파라미터는 정의된 특별한 문자열을 지정해주면 되는데 이 부분에 어떻게 지정하느냐에 자 그러면 위 함수의 첫번째 파라미터에 어떤 문자열을 지정해서 어떤 작업을 하는지 알아 먼저 MCI 장치를 여는 방법부터 봅시다. MCI 장치를 열기 이해서는 open이라는 예를들어 볼까요? open d:\test.wav type waveaudio alias wavefile open 다음에 오는 것이 바로 플레이할 파일 이름입니다. 그리고 파일 타입이 어떤 것인지 자 그러면 여는 방법을 알았으니 닫는 방법도 알아 봅시다. 닫을 때에는 close라는 플레이할 때에는 어떤 문자열을 사용할까요? 짐작이 가죠? 바로 play라는 문자열을 그러면 실제로 문자열을 이용해서 플레이하는 프로그램을 작성해 |
윈도우 32비트 프로그래밍 28 |
아래는 리소스 파일입니다. #include <windows.h> MyMenu MENU 아래는 프로그램 파일입니다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) strcpy(szID, case MM_MCINOTIFY : Close(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, case 200 : Pause(hWnd, case 300 : Resume(hWnd, case 400 : Stop(hWnd, case WM_DESTROY : Close(hWnd, char* Open(HWND hWnd) mciError = mciSendString("open d:\test.wav type void Play(HWND hWnd, char sprintf(szString, "play %s notify", void Stop(HWND hWnd, char sprintf(szString, "stop %s", void Pause(HWND hWnd, char sprintf(szString, "pause %s", void Resume(HWND hWnd, char sprintf(szString, "resume %s", void Close(HWND hWnd, char sprintf(szString, "close %s", 오늘은 여기까지 |
윈도우 32비트 프로그래밍 29 |
안녕하세요.....돌팔이 황동준입니다......... 이번시간에는 확장자가 mid인 미디 파일을 어떻게 플레이하는지 알아 보겠습니다. 아마 머리가 이곳도 역시 mciSendCommand()함수와 mciSendString()함수 두가지 아주 간단합니다. 위에서 사용했던 MCI 장치 이름인 waveaudio 대신에 #include <windows.h> MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) strcpy(szID, case MM_MCINOTIFY : Close(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, case 200 : Stop(hWnd, case WM_DESTROY : Close(hWnd, char* Open(HWND hWnd) mciError = mciSendString("open d:\test.mid type void Play(HWND hWnd, char sprintf(szString, "play %s notify", void Stop(HWND hWnd, char sprintf(szString, "stop %s", void Close(HWND hWnd, char sprintf(szString, "close %s", 전체적으로 웨이브 파일을 플레이할 때와 크게 달라진 점은 없을 겁니다. 그런데 한 가지 자 그러면 또 달라진 점을 보도록 하죠. case MM_MCINOTIFY : Close(hWnd, szID); 바로 위 메시지 처리 부분입니다. 웨이브 파일을 플레이했을 때 발생되는 이제 MCI 장치를 여는 Open()함수를 보도록 합시다. char* Open(HWND hWnd) mciError = mciSendString("open d:\test.mid type 함수의 사용방법은 같습니다. 단 waveaudio라는 장치 이름대신에 미디 파일을 의미하는 if(mciError) 에러 처리부분은 변한게 없구요. return "midifile"; 그 외에는 다른점이 없죠? 자 그러면 이번에는 PAUSE기능과 RESUME기능이 있는 미디 플레이를 구현해 봅시다. 전체적인 원리는 간단합니다. MCI_STOP을 사용해서 정지를 시키던 MCI_PAUSE를 플레이될 위치를 처음으로 옮기는 방법은 앞에서 알아 보았으니 생략하고 현재 플레이되고 있는 우리는 앞에서 mciSendCommand()함수를 사용할때 마지막 파라미터에 특수한 구조체 typedef struct { 멤버중 dwItem에 MCI_STATUS_POSITION이라는 예약어를 지정해준 다음에 mciStatusParms.dwItem = 바로 위와 같이 사용하면 됩니다. 두번째 파라미터에 MCI_STATUS를 지정하고 세번째 위와 같이 사용하면 구조체 멤버중 dwReturn에 그 위치가 저장되니 이 값을 얻으면 바로 그러면 이번에는 플레이될 위치를 세팅하는 방법을 알아 봅시다. 그런데 이것은 이미 낯이 이 구조체 멤버중 dwTo에 옮길 곳을 지정해 주고 mciSendCommand()함수의 세 그러면 이것을 이용한 실제적인 프로그램을 보도록 |
윈도우 32비트 프로그래밍 30 |
#include <windows.h> MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) dwID = case MM_MCINOTIFY : if(bPause) case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, case 200 : Pause(hWnd, case 300 : Play(hWnd, case 400 : Stop(hWnd, case WM_DESTROY : Close(hWnd, DWORD Open(HWND hWnd) mciOpenParms.lpstrDeviceType = mciError = mciSendCommand(NULL, MCI_OPEN, void Play(HWND hWnd, DWORD mciPlayParms.dwCallback = void Stop(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_STOP, void Pause(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_PAUSE, void Close(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_CLOSE, void MoveStartPosition(HWND hWnd, DWORD mciError = mciSendCommand(dwID, MCI_SEEK, DWORD MoveStartCurrentPosition(HWND hWnd, DWORD mciStatusParms.dwItem = void SetCurrentPosition(HWND hWnd, DWORD dwID, mciSeekParms.dwTo = dwPos; 오늘은 여기까지 |