윈도우 32비트 프로그래밍 31 |
안녕하세요.....돌팔이 황동준입니다............... 이번시간에는 저번시간에 만든 프로그램을 분석해 보겠습니다. 뭐 별로 그렇게 어려운 부분은 case WM_CREATE : dwID = Open(hWnd); MCI 장치를 여는 방법에는 차이가 없습니다. case MM_MCINOTIFY : 이 메시지 처리하는 부분이 바꾸었군요. 이미 앞에서 원리는 설명 드렸을 겁니다. 메뉴 if(bPause) 각 함수에 대한것은 아래 부분에서 설명 드리겠습니다. } 이 함수는 이미 웨이브 파일을 플레이할때 설명 드렸던 함수입니다. 기억 납니까? return 0; case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, case 200 : Pause(hWnd, case 300 : Play(hWnd, Resume이 선택되었을때 그냥 플레이하는 함수를 사용했습니다. 플레이될 위치를 지정했기 case 400 : Stop(hWnd, case WM_DESTROY : Close(hWnd, 나머지 부분은 크게 다른점이 없습니다. 그러면 새롭게 나온 두 함수에 대해 DWORD MoveStartCurrentPosition(HWND hWnd, DWORD 이 함수는 현재 플레이된 위치를 반환하는 역할을 합니다. MCI_STATUS_PARMS mciStatusParms.dwItem = 위 구문은 이미 앞에서 예로 알아본 구문과 같죠? if(mciError) 현재 위치를 반환하고 있습니다. } void SetCurrentPosition(HWND hWnd, DWORD dwID, mciSeekParms.dwTo = dwPos; 파라미터로 지정되는 값을 dwTo에 저장하고 있습니다. 플레이될 위치를 지정하기 위한 mciError = mciSendCommand(dwID, MCI_SEEK, 이것도 이미 설명드렸을 겁니다. if(mciError) 크게 어려운 점은 없을 겁니다. 그러면 이번에는 CD 플레이어를 어떻게 구현하는지 알아보도록 우리가 앞에서 알아본 웨이브 파일, 미디 파일은 파일명을 지정해서 플레이 해주면 됐지만 CD typedef struct { 위 구조체 변수의 멤버중 dwTimeFormat에 MCI_FORMAT_TNSF라는 예약어를 mciSetParms.dwTimeFormat = 이 부분까지 됐으면 그 다음부터는 미디 파일을 플레이할 때와 같습니다. 즉 잠시 중단했다가 mciStatusParms.dwItem = 에러가 발생하지 않고 성공적으로 되었다면 mciStatusParms.dwReturn에 현재 이동이 됐으면 이 부분으로 플레이 위치를 세팅해 주어야 할겁니다. 이 부분은 이미 앞에서 다 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) MoveStartPosition(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, case 200 : Pause(hWnd, case 300 : Pause(hWnd, case 400 : Pause(hWnd, case 500 : Play(hWnd, case 600 : Stop(hWnd, case WM_DESTROY : Close(hWnd, DWORD Open(HWND hWnd) mciOpenParms.lpstrDeviceType = "cdaudio"; 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 SetFormat(HWND hWnd, DWORD mciSetParms.dwTimeFormat = 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; DWORD MoveNextTrack(HWND hWnd, DWORD mciStatusParms.dwItem = DWORD MovePrevTrack(HWND hWnd, DWORD mciStatusParms.dwItem = 오늘은 여기까지 |
윈도우 32비트 프로그래밍 32 |
안녕하세요......돌팔이 황동준입니다............... 이번시간에는 저번시간에 만든 CD 플레이어 프로그램을 분석해 보겠습니다. case WM_CREATE : dwID = Open(hWnd); 윈도우가 생성될 때 MCI 장치를 열고 그 포맷을 트랙단위로 하겠다는 것을 명시해주는 case MM_MCINOTIFY : if(bPause) 이 부분은 이미 미디 파일을 플레이할 때 다루었을 겁니다. } 다음 곡 플레이가 선택되었을 때 현재 플레이 위치를 다음 트랙으로 옮긴 후에 다시 플레이하는 } 이전 곡 플레이가 선택되었을 때 현재 플레이 위치를 이전 트랙으로 옮긴 후에 다시 플레이하는 } case WM_COMMAND : switch(LOWORD(wParam)) Play(hWnd, case 200 : Pause(hWnd, dwID); 다음곡 플레이가 선택되었을 때도 역시 Pause()함수를 이용해서 중단한 뒤 다음 곡 플레이 case 300 : Pause(hWnd, dwID); 이전 곡 플레이가 선택되었을 때도 역시 Pause()함수를 이용해서 중단한 뒤 이전 곡 case 400 : Pause(hWnd, case 500 : Play(hWnd, case 600 : Stop(hWnd, case WM_DESTROY : Close(hWnd, 나머지 부분은 크게 달라진 점이 없을 겁니다. 그러면 MCI 장치를 여는 Open() 함수를 DWORD Open(HWND hWnd) mciOpenParms.lpstrDeviceType = "cdaudio"; mciError = mciSendCommand(NULL, MCI_OPEN, 세번째 파라미터에 MCI_OPEN_ELEMENT라는 예약어가 없죠? 파일을 읽어서 플레이하는 if(mciError) void SetFormat(HWND hWnd, DWORD mciSetParms.dwTimeFormat = 트랙단위로 길이 단위를 사용하겠다는 것을 지정해주고 있습니다. 이미 앞에서 if(mciError) void SetCurrentPosition(HWND hWnd, DWORD dwID, mciSeekParms.dwTo = dwPos; 에러가 발생된다는 것은 그 트랙의 범위에 벗어난다는 의미이므로 이럴 때 그냥 현재 트랙의 } DWORD MoveNextTrack(HWND hWnd, DWORD dwID) 이 함수는 다음 트랙번호를 얻는 역할을 합니다. MCI_STATUS_PARMS mciStatusParms.dwItem = 현재 트랙번호를 얻는 구문입니다. if(mciError) 트랙번호를 증가해서 값을 리턴하고 있습니다. } DWORD MovePrevTrack(HWND hWnd, DWORD dwID) 이 함수는 다음 트랙번호를 얻는 역할을 합니다. MCI_STATUS_PARMS mciStatusParms.dwItem = 현재 트랙번호를 얻는 구문입니다. if(mciError) 트랙번호를 감소해서 값을 리턴하고 있습니다. } 자 그렇게 크게 어려운 점은 없죠? 그러면 이번에는 멀티미디어 관련 마지막인 확장자가 함수 하나로 플레이할수 있다고 했는데 과연 그 함수가 뭘까요? HWND VFWAPIV MCIWndCreate(HWND hwndParent, 바로 위 함수 하나로 avi를 플레이할 수 있는 조그만 윈도우를 만들 수 있습니다. 첫번째 위 함수를 이용해서 윈도우를 생성하고 나면 나중에 프로그램 종료시 윈도우를 제거해 주어야 void MCIWndDestroy(HWND hwnd); 그러면 이 두함수를 이용해서 구현한 간단하고 뛰어난 avi 플레이어를 만들어 봅시다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = hInst = hInstance; ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) hAviWnd = case WM_DESTROY : MCIWndDestroy(hAviWnd); 정말로 간단하죠? 이 소스를 보신 분은 정말 이 프로그램이 avi 파일을 플레이할 수 있는지 #include <vfw.h> 프로그램 상단에 위 헤더 파일을 포함시켜 줘야 합니다. 물론 컴파일할 때에는 HWND hAviWnd; 조그마하게 생성되는 avi 플레이어 윈도우의 핸들을 얻기 위해서 위 변수를 switch(message) hAviWnd = 윈도우가 생성될때 avi 플레이어 윈도우를 생성하는 구문입니다. case WM_DESTROY : MCIWndDestroy(hAviWnd); 윈도우가 종료될때 avi 플레이어 윈도우를 없애는 구문입니다. PostQuitMessage(0); 오늘은 여기까지 |
윈도우 32비트 프로그래밍 33 |
안녕하세요..........돌팔이 황동준입니다......... 이번시간에는 폰트에 대해 알아보겠습니다. 윈도우즈 95에서 제공하는 제공하는 트루타입 폰트를 전반적으로 구현하는 방법은 간단합니다. 먼저 폰트의 핸들을 의미하는 HFONT 변수를 선언한 그러면 폰트를 생성하는 함수를 보도록 합시다. HFONT CreateFont( 상당히 복잡하죠? 그러면 각 파라미터에 대해 알아 봅시다. 예약어 진한정도 fdwItalic은 이탤릭체를 사용할것인지 지정하는것인데 이값이 1이면 사용하겠다는 것을 fdwUnderline은 밑줄이 그어진 글자를 출력할때 사용하는 파라미터인데 이 값이 1이면 fdwStrikeOut은 글자의 가운데에 선이 그어진 형태를 지정할때 사용하는데 이 값이 fdwCharSet은 문자세트를 지정할때 사용하는데 이 파라미터에 지정될수 있는 예약어는 ANSI_CHARSET fdwOutputPrecision은 정밀도를 지정하는 것인데 이 파라미터에 지정될수 있는 OUT_DEFAULT_PRECIS fdwClipPrecision은 클리핑 정밀도를 지정할때 사용하는데 이 파라미터에 지정될 수 CLIP_DEFAULT_PRECIS fdwQuality은 역시 정밀도를 지정하는 것인데 이 파라미터에 지정될수 있는 예약어는 DEFAULT_QUALITY fdwPitchAndFamily은 글자의 피치를 지정하는 것인데 이 파라미터에 지정될수 있는 DEFAULT_PITCH FF_DECORATIVE lpszFace은 구체적인 글자의 폰트 이름을 지정해 주면 됩니다. 이 폰트 이름에는 다음과 Arial 아마 여러분들도 이 폰트 이름을 본적이 있을 겁니다. 바로 윈도우즈에 설치되어 있는 폰트의 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) hDC = BeginPaint(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) hFont = case 200 : hFont = case 300 : hFont = case WM_DESTROY : PostQuitMessage(0); HFONT SelectMyFont(int nIndex) if(nIndex == 0) ); 뭐 그렇게 새로운 것은 없군요. 어떤 메뉴 아이템을 선택했는냐에 따라서 해당 문자열을 그 |
윈도우 32비트 프로그래밍 34 |
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) hDC = BeginPaint(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) hMenu = case 200 : hMenu = case 300 : hMenu = case 400 : hMenu = case 500 : hMenu = case 600 : hMenu = case 700 : hMenu = case 800 : hMenu = case 900 : hMenu = case 1000 : hFont = SelectMyFont(nSize, case WM_DESTROY : PostQuitMessage(0); HFONT SelectMyFont(int nSize, int nWeight, DWORD hFont = CreateFont( 오늘은 여기까지 |
윈도우 32비트 프로그래밍 35 |
안녕하세요..........돌팔이 황동준입니다................ 이번 시간부터는 파일과 디렉토리를 다루어 보도록 하겠습니다. 모든 운영체제를 처음 배울 때 아마 비트맵 부분을 설명드릴 때 이미 파일 입출력 부분을 제가 설명 드렸을 겁니다. 먼저 그 HFILE _lcreat( 위 함수를 이용해서 파일을 생성할 수 있는데 첫번째 파라미터에 생성될 파일이름을 지정하면 0 일반적인 파일을 생성합니다. 파일을 생성하는 과정은 파일에 어떠한 정보를 쓸 때 사용하는 것입니다. 먼저 생성한 후에 HFILE _lopen( 위 함수를 이용해서 존재하는 파일을 열 수 있습니다. 첫번째 파라미터로 열 파일 이름을 OF_READ 읽기 전용으로 파일을 파일을 여는 과정을 알았으니 파일을 닫는 방법도 알아 봅시다. 파일을 열어서 읽거나 쓰는 HFILE _lclose( 첫번째 파라미터로 파일을 연 핸들을 지정해 주면 됩니다. 자 그러면 실제로 읽거나 쓸 때 UINT _lread( 파일에서 어떠한 정보를 읽어오고자 할 때에는 위 함수를 이용해서 하면 됩니다. 첫번째 UINT _lwrite( 파일에 정보를 기록할 때에는 위 함수를 이용해서 하면 됩니다. 첫번째 파라미터는 역시 파일의 이미 앞에서 해본 것들이라서 그렇게 크게 어려운 점은 없을 겁니다. 그러면 이것을 이용한 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, typedef struct tagMYFILE MYFILE MyFile; int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK static char cHeader; switch(message) cHeader = ' case WM_PAINT : hDC = BeginPaint(hWnd, case WM_COMMAND : switch(LOWORD(wParam)) SaveProc(); case 200 : LoadProc(); case WM_DESTROY : PostQuitMessage(0); void SaveProc(void) tmpMyFile.cHeader = _lcreat("e:\test.txt", 0); void LoadProc(void) hFile = _lopen("e:\test.txt", char GetHeader(void) LPSTR GetData(void) 위 프로그램은 하나의 구조체를 만든 후에 그 구조체 맴버 변수에 값을 채운 후에 그 구조체의 void SaveProc(void) 이 함수는 구조체 멤버에 값을 채워 넣은 뒤에 그 정조를 파일에 저장하는 역할을 HFILE hFile; 파일을 열고 쓰기 위해서 위 변수를 선언했습니다. MYFILE tmpMyFile; tmpMyFile.cHeader = 구조체 변수에 값을 채워넣고 있는 구문입니다. _lcreat("e:\test.txt", 0); 파일에 쓰기 위헤서 먼저 파일을 생성하고 있습니다. hFile = _lopen("e:\test.txt", OF_WRITE); 파일을 열고 있습니다. _lwrite(hFile, (char *)&tmpMyFile, 파일에 정보를 기록한후에 파일을 닫는 구문입니다. } void LoadProc(void) 이 함수는 파일에서 정보를 가져오는 역할을 합니다. HFILE hFile; hFile = _lopen("e:\test.txt", 역시 파일을 연후에 정보를 가져오고 닫는 과정을 보여 주고 있습니다. } char GetHeader(void) LPSTR GetData(void) 위 두함수는 가져온 정보를 분리해서 그 값을 리턴해주는 역할을 합니다. 그렇게 어려운 부분은 오늘은 여기까지 |