티스토리 툴바

블로그 이미지

Passion of ComputerScience

Team Blog For Soft Engineering Team Project Manager : Park, Choi, Jeon Project Name : Linkube (Link + cube) "Passion is survival, not death." by cocy


'Project_Linkube'에 해당되는 글 7건

  1. 2008/12/17 프로젝트 진행상황파악용 프로토타입 ver.1.0.3
  2. 2008/11/12 [help메뉴]키보드 단축키 설명
  3. 2008/11/08 [API-스크랩] 볼륨제어 -waveOutSetVolume
  4. 2008/11/01 동영상, 사운드 제어
  5. 2008/10/23 [API] 파일 드래그 드랍다운 오픈
  6. 2008/10/04 대략적인 GUI와 동작환경&작업환경
  7. 2008/10/04 이미지 뷰어 참조모델

프로젝트 진행상황파악용 프로토타입 ver.1.0.3


2008. 12. - 프로토타입 최종 마무리 
  캡션바를 활용한 정보전달
            디렉토리 탐색 추가

            텍스트 메뉴 저장기능 추가
            프로그램 안정성 확보

넘어온 오류
            이미지, 텍스트의 메뉴들은 아직 미구현
                      이미지, 텍스트의 경우 스크롤이 안생김
   인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)
추가된 오류
볼륨 조절기능 작동 불가
            추가할 기능
            볼륨 조절기능
                     디렉토리를 열고 다음,이전파일 열기
            이미지파일 사이즈 조절
                      이미지 확장자 추가

2008. 11. 20. 목요일 - 기타 메뉴 수정
스크립트 메뉴 즐겨찾기 추가
            스크립트 파일 php확장자 추가 
 - php파일은 웹서버의 연동이 필요하므로, 차선책으로 대응.
            텍스트 메뉴 수정기능 추가. (저장은 아직 안됌.)

넘어온 오류
            이미지, 텍스트의 메뉴들은 아직 미구현
                        이미지, 텍스트의 경우 스크롤이 안생김
인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)
추가된 오류
텍스트파일 열람시 널문자를 만나면 리드 종료
            추가할 기능
            볼륨 조절기능
                        디렉토리를 열고 다음,이전파일 열기
            이미지파일 사이즈 조절
                        이미지 확장자 추가

2008. 11. 12. 수요일 - 브라우저 메뉴 수정
뒤로, 앞으로 이동버튼 추가
            HELP 메뉴 수정, 단축키 메뉴얼 추가
            11.9일 두가지오류 수정

넘어온 오류
            이미지, 텍스트의 메뉴들은 아직 미구현
                        이미지, 텍스트의 경우 스크롤이 안생김
인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)
추가된 오류
텍스트파일 열람시 널문자를 만나면 리드 종료
            추가할 기능
            볼륨 조절기능
                        디렉토리를 열고 다음,이전파일 열기
            이미지파일 사이즈 조절
                        이미지 확장자 추가

2008. 11. 09. 일요일 - Alpha test 시작.

파일 오픈, 클로즈 오류 수정
사운드 파일 확장자 추가
주소창 추가
동영상, 사운드파일 일시정지, 재생 추가
동영상, 사운드파일 이동바 추가
스크립트 메뉴에 특정 링크 추가(naver, daum)

오류
주소창이 한번에 뜨질않음(창 사이즈 조절하면 나타남) 수정
스크립트메뉴의 소스보기에서 인터넷링크된 페이지는 소스를 볼 수 없음.  해당기능제거
이미지, 텍스트의 메뉴들은 아직 미구현
이미지, 텍스트의 경우 스크롤이 안생김.
인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)

열람 가능한 확장자
movie -> avi, wmv, mpg, mpeg
script -> htm, html
txt -> txt
image -> bmp
sound -> wav, wma, mp3

공통
동영상, 사운드파일의 경우 컴퓨터에 코덱이 설치되어있어야 재생이 가능하므로
통합 코덱 설치 파일도 함께 올립니다.

메뉴나 기능이 많이 부족하니 수정, 보완하겠습니다..
이건 샘플파일입니다. avi, wav, bmp, htm, txt


Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/26 관련글 쓰기

Top

[help메뉴]키보드 단축키 설명

Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/33 관련글 쓰기

Top

[API-스크랩] 볼륨제어 -waveOutSetVolume

그럴땐.... waveOutSetVolume 을 이용하면 되겠네요

 

1) 관련 레지스트리는 다음과 같습니다.

  HKEY_CURRENT_USER\ControlPanel\Volume\Volume   

 

waveOutSetVolume 를 호출하면 레지스트리 값을 변경하고 이벤트 정도를 device에 보내주겠군요

 

2) waveOutSetVolume  사용 예제

볼륨의 값은 0 ~ 0xFFFF 의 값입니다. 

 

void SetSoundVolume(DWORD dwVolume) {
WAVEFORMATEX wf;
wf.wFormatTag = WAVE_FORMAT_PCM;
wf.nChannels = 1;
wf.nSamplesPerSec = 8000 * 1000;
wf.wBitsPerSample = 8;
wf.nBlockAlign = wf.nChannels * wf.wBitsPerSample / 8;
wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;
wf.cbSize = 0;

HWAVEOUT hwo;
//Device를 검색하는 거죠 .. Device의 갯수를 가지고와서 open 해보고 open 되면 볼륨을 조절하는 겁니다.

 for (UINT id = 0; id < waveOutGetNumDevs(); id++) {                     

  if (waveOutOpen(&hwo, id, &wf, 0, 0, CALLBACK_NULL)
                    == MMSYSERR_NOERROR)
                {
waveOutSetVolume(hwo, dwVolume);
waveOutClose(hwo);
break;
}
}
}

 

2 -1 ) 만약 볼륨 조절을 % 로 하고 싶다면

DWORD dwSoundVolumePercents = 50;
SetSoundVolume( (DWORD)(0xFFFF*1.0*dwSoundVolumePercents/100.0) );

 

3) 전 간단히 이렇게 사용하고 있습니다.

볼륨의 단계를 총 15 단계로 구분하여 설정하기 위해 사용했습니다.

device는 하나뿐이라 0으로 했구요 .

 DWORD dwVolume = 0xFFFF*dwAudioVolume/15;
 waveOutSetVolume(0, MAKELONG(dwVolume,dwVolume));

 

3 - 1) 현재의 볼륨값 읽어 오기

void GetAudioVolume( DWORD * dwAudioVolume )
{
   waveOutGetVolume(0 , dwAudioVolume );
   *dwAudioVolume = (DWORD)(*dwAudioVolume & 0xFFFF);

   *dwAudioVolume = (*dwAudioVolume*15 / 0xFFFF);
}

이상 시골 아재였습니다.


-----------------------------
Option Explicit
Private Type WAVEFORMAT
        wFormatTag As Integer
        nChannels As Integer
        nSamplesPerSec As Long
        nAvgBytesPerSec As Long
        nBlockAlign As Integer
End Type
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function waveOutGetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, lpdwVolume As Long) As Long
Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long
Private Declare Function waveOutOpen Lib "winmm.dll" (lphWaveOut As Long, ByVal uDeviceID As Long, lpFormat As WAVEFORMAT, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Private Declare Function waveOutClose Lib "winmm.dll" (ByVal hWaveOut As Long) As Long

Private Sub setSoundVolume(ByVal dwPercent As Long)
    Dim hWaveOut As Long, wf As WAVEFORMAT, myVol As Long
    If dwPercent > 100 Then dwPercent = 100
    If dwPercent < 0 Then dwPercent = 0
    Call waveOutOpen(hWaveOut, 0, wf, &H0, 0, 0)
    myVol = CLng(Int(65535 / 100 * CDbl(dwPercent)))
    CopyMemory ByVal VarPtr(myVol) + 2, myVol, 2
    waveOutSetVolume hWaveOut, myVol
    waveOutClose hWaveOut
End Sub

Private Function getSoundVolume() As Long
    Dim hWaveOut As Long, wf As WAVEFORMAT, CurVol As Long
    Call waveOutOpen(hWaveOut, 0, wf, &H0, 0, 0)
    waveOutGetVolume hWaveOut, CurVol
    waveOutClose hWaveOut
    getSoundVolume = CLng(CDbl(LoWord(CurVol)) / 65535 * 100)
End Function

Private Function LoWord(ByVal dw As Long) As Long
    CopyMemory LoWord, dw, 2
End Function

Private Sub Command1_Click()
    MsgBox getSoundVolume
    setSoundVolume 80
End Sub
-----------------------------

 

특정 위치로의 이동은 다음 예제를 활용하시면 될 것 같습니다.
-----------------------------
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Declare Function mciGetErrorString Lib "winmm.dll" Alias "mciGetErrorStringA" (ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As Long

Dim strRetTmp As String * 1024
Dim intRetVal As Long
Dim RFSpeed As Integer

Private Function sndOpenFile(sFile As String)
    sndClose
    intRetVal = mciSendString("open " & Chr$(34) & sFile & Chr$(34) & " alias wave wait", strRetTmp, 1024, 0)
    If intRetVal <> 0 Then
        mciGetErrorString intRetVal, strRetTmp, 1024
        MsgBox strRetTmp, vbCritical, "파일 열기 실패"
        Exit Function
    End If
End Function

Private Function sndPlay()
    On Error GoTo er1
    intRetVal = mciSendString("play wave", strRetTmp, 1024, 0)
    Exit Function
er1:
End Function

Private Function sndStop()
    sndPause
End Function

Private Function sndClose()
    intRetVal = mciSendString("close wave", strRetTmp, 1024, 0)
End Function

Private Function sndPause()
    intRetVal = mciSendString("pause wave", strRetTmp, 1024, 0)
End Function

Private Function sndForward(Optional iPlace As Long = 1)
    On Error Resume Next
    Dim TmpStr As String * 128
    intRetVal = mciSendString("set wave save time format milliSeconds", strRetTmp, 1024, 0)
    intRetVal = mciSendString("status wave position wait", TmpStr, 128, 0)
    If iPlace = 1 Then
        intRetVal = mciSendString("play wave from " & CStr(CLng(TmpStr) + RFSpeed), 0, 0, 0)
    Else
        intRetVal = mciSendString("play wave from " & CStr(CLng(iPlace)), 0, 0, 0)
    End If
    intRetVal = mciSendString("set wave time format tmsf", TmpStr, 128, 0)
    intRetVal = mciSendString("pause wave", strRetTmp, 1024, 0)
End Function

Private Function sndRewind()
    On Error Resume Next
    Dim TmpStr As String * 128
    intRetVal = mciSendString("set wave time format milliSeconds", strRetTmp, 1024, 0)
    intRetVal = mciSendString("status wave position wait", TmpStr, 128, 0)
    intRetVal = mciSendString("play wave from " & CStr(CLng(TmpStr) - RFSpeed), 0, 0, 0)
    intRetVal = mciSendString("set wave time format tmsf", TmpStr, 128, 0)
End Function

Private Function GetPos() As String
    Dim sTime As String
    intRetVal = mciSendString("status wave position", strRetTmp, 1024, 0)
    GetPos = Val(strRetTmp)
End Function

Private Function GetLen() As String
    Dim sTime As String
    On Error GoTo ger1
    intRetVal = mciSendString("status wave length wait", strRetTmp, 1024, 0)
    GetLen = Val(strRetTmp)
ger1:
End Function
-----------------------------
위에서 sndForward 함수를 사용하면 특정 위치로 이동할 수 있습니다.

아 왜 하필 MFC여..ㅠㅠ
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/32 관련글 쓰기

Top

동영상, 사운드 제어

sound & video posting

2005/05/19 12:28

복사 http://blog.naver.com/slash512/40013274160

  • 사운드 연주
    • 1-1) PlaySound?

    MFC는 멀티미디어를 위한 별도의 클래스를 제공하지 않는다. Win32 API함수 차원에서 멀티미디어를 지원하기 때문에 MFC에서는 별도의 클래스로 만들어 놓지 않은 것이다.
    우선 사운드를 연주하는 API함수를 보자.

    BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound); 
    

    pszSound : 연주할 사운드 파일의 이름. 파일의 경로를 넣을 더 수도 있다.

    hmod : 리소스에 있는 Wave파일을 연주할 경우 리소스를 가진 실행파일의 핸들인데, 그 외의 경우는 NULL로 준다.

    fdwSound : 사운드의 연주방식과 연주할 사운드의 종류를 정의하는 플래그이다. 이것에 따라 첫 번째, 두 번째 인수의 해석 방식이 달라진다. 여러 플래그 중 몇 가지만 알아보자.

    - SND_FILENAME : 첫 번째 인수인 pszSound는 사운드 파일의 이름이다.
    - SND_ASYNC : 비동기화된 연수를 한다. 연주시작 후 바로 리턴하므로 다른 작업을 바로 시작할 수 있다.
    - SND_LOOP : 지정한 사운드를 반복적으로 계속 연주한다. 이 플래그는 반드시 SND_ASYNC와 함께 사용되어야 한다.
    - SND_SYNC : 동기화된 연주를 한다. 사운드 파일의 연주가 완전히 끝나기 전에는 리턴하지 않는다.

    예제) AppWizard^를 사용하여 Sound라는 이름으로 SDI 프로젝트를 만든다.
    뷰에 WM_LBUTTONDOWN메시지의 핸들러를 만들고 OnLButtonDown? 핸들러에 다음과 같이 코드를 작성한다.

    #include "mmsystem.h" 
    void CSoundView::..... 
    { 
            PlaySound("Battle.wav", NULL, SND_SYNC); 
     
            CView:.... 
    } 
    
      PlaySound? 함수를 사용하려면 mmsystem.h 파일을 먼저 include 해주어야 하고,
      Project/ Settings/Link 탭에서 winmm.lib를 링크해 주어야 한다.

    그 후 컴파일하고 실행한 후 작업영역을 왼쪽 마우스 버튼으로 누르면 소리가 날 것이다. 시스템에 사운드카드가 장착되어 있어야 하며 같은 디렉토리에 Battle.wav라는 파일이 있어야 할 것이다.

    1-2) 비동기 연주

      앞서 만든 예제를 보면 PlaySound? 함수는 사운드 파일 연주가 완전히 종료되기 전에는 리턴하지 않으므로 연주중인 동안은 어떤 일도 할 수 없다. 이런 방법을 동기화 방식이라고 한다.
      반대로 PlaySound?함수가 연주를 시작해 놓고 곧바로 리턴하는 비동기 연주 방식이 있다.

      이번에는 SND_LOOP 플래그를 사용하여 작성해 보고, WM_RBUTTONDOWN 메시지의 핸들러도 같이 만들어보자.

    void CSoundView::OnLB......... 
    { 
            PlaySound("Battle.wav", NULL, SND_ASYNC | SND_LOOP); 
     
            CView:.... 
    } 
     
    void CSoundView::OnRB...... 
    { 
            PlaySound(NULL, NULL, 0); 
     
            CView:.... 
    } 
    

      SND_LOOP 플래그를 지정하면 반복적인 효과음이나 배경음악을 연주하는 등의 설정을 할 수 있을 것이다. 연주를 중지시키려면 PlaySound? 함수의 첫 번째 인수를 NULL로 하여 다시 호출해 주면 된다. 따라서, 오른쪽 마우스 버튼을 누르면 연주가 중지될 것이다. 주의할 것은 SND_LOOP 플래그는 반드시 SND_ASYNC와 함께 사용해야 한다. 만약 동기화 연주방식으로 반복연주를 하면 무한 루프로 빠져버릴 위험이 있다.

    1-3) 리소스의 Wave 연주

      사운드 파일을 연주하는 것은 사용하기는 간단하지만 연주할 때마다 디스크에서 사운드 파일을 읽어와야 하므로 반응 속도가 느리다. 따라서 이 경우에는 사운드 파일을 리소스에 포함시켜 놓고 리소스에서 읽어서 연주하는 방법으로 하는 것이 좋을 것이다.

      앞에서 만든 예제를 수정해서 Battle.wav 파일을 실행파일에 합쳐보자.
      리소스 뷰의 팝업메뉴에서 Import 메뉴항목을 선택하고 리소스에 포함시키고자 하는 Wave 파일을 선택한다. 그러면 IDR_WAVE1이라는 ID로 리소스에 삽입될 것이다.
      리소스에 포함된 사운드를 연주하려면 PlaySound?의 세 번째 인수에 SND_RESOURCE 플래그를 주고 첫 번째 인수에 리소스의 ID를 준다. 두 번째 인수에는 리소스를 가진 실행파일의 인스턴스 핸들을 주어야 하는데 MFC에서는 AfxGetInstanceHandle?() 전역함수로 인스턴스 핸들을 구할 수 있다. 다음과 같이 코드를 작성해 보자.

    void CSoundView::OnLButtonDown(UINT nFlags, CPoint point) 
    { 
            PlaySound(MAKEINTRESOURCE(IDR_WAVE1), AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC); 
            CView:OnLButtonDown(nFlags, point); 
    } 
    
      이렇게 하면 실행파일 속에 wav파일이 포함되어 Battle.wav파일이 없어도 연주할수 있게 된다.

    1-4) MCI (Media Control Interface)

      PlaySound?함수는 메모리 크기의 제한을 받아서 1-2분 정도의 사운드 밖에 낼 수 없다는 점, Wave형태만 지원한다는 점, 연주과정에 사용자가 개입할 수 없다는 단점이 있다.
      MCI는 멀티미디어 요소에 대한 지원을 장치독립적으로 제공하는 일종의 라이브러리이다. 이것은 PlaySound? 함수가 하지 못하는 여러 가지 일을 할 수 있지만, 사용 방법은 훨씬 더 복잡하다.

    [Upload]SoundMwm.zip

  • 동영상 재생
  • HWND hWndAVI=0; 
    void CPlayAVIView::OnLButtonDown... 
    { 
            if(hWndAVI) { 
            MCIWndClose(hWndAVI); 
            MCIWndDestroy(hWndAVI); 
            hWndAVI=0; 
            } 
            hWndAVI=MCIWndCreate(this->m_hWnd, AfxGetInstanceHandle(), 0, "cf3.avi"); 
            if(hWndAVI) { 
            MCIWndPlay(hWndAVI); 
            } 
            CView::OnLButtonDown(nFlags, point); 
    } 
     
    void CPlayAVIView::OnDestroy() 
    { 
            CView::OnDestroy(); 
            MCIWndDestroy(hWndAVI); 
    } 
    

      동영상 연주는 Video fot window 라이브러리를 사용하므로 뷰에서 vfw.h를 인클루드 해 주어야 한다.

    #include "PlayAVIDoc.h" 
    #include "PlayAVIView.h" 
    #include <vfw.h> 
    

      또한 프로젝트에서 이 라이브러리를 사용할 수 있도록 Project/Settings/Link 탭에 vfw32.lib를 추가한다. 그리고 동영상 파일을 프로젝트 디렉토리에 넣어두면 된다.

    MCIWnd 윈도우는 마우스 왼쪽 버튼을 눌르면 만들어진다. 그 전에 hWndAVI가 유효하면 먼저 MCIWnd를 닫는 작업부터 해주고 있다. MCIWnd를 만드는 함수는 MCIWndCreate? 함수이다.

    HWND MCIWndCreate(HWND hwndParent, HINSTANCE hinstance, DWORD dwStyle, LPSTR szFile); 
    

    hWndParent?: 부모윈도우를 지정한다. NULL일 경우, 별도의 윈도우로 열린다.
    hInstance: MCIWnd롤 사용하는 인스턴스 핸들을 지정한다.
    dwStyle: MCIWnd의 모양, 동작방식등을 설정하는 스타일(플래그)이다.
    szFile: MCIWnd생성시 오픈할 장치, 또는 AVI파일을 지정한다.

    [Upload]PlayAviMwm.zip

    [출처] sound & video|작성자 오발이


    Comment 0 Trackback 0

    Trackback : http://sepoc.tistory.com/trackback/27 관련글 쓰기

    Top

    [API] 파일 드래그 드랍다운 오픈

    드래그 드랍을 지원하기 위해서는 다음과 같은 속성을 윈도우에 주어야 한다.


    hWnd = CreateWindowEx(WS_EX_ACCEPTFILES,.... )

    저렇게해야만 드래그앤 드랍이 가능해 진다.

    그리고 다음과 같은 메세지를 받을수 있다.


    switch(iMessage) {
    case WM_DROPFILES:
            DragQueryFile((HDROP)wParam, 0, d_filename,1024);
            loadFile(DROP_OK);
            DragFinish((HDROP) wParam);
            return 0;
    .....

    d_filename 으로 화일명을 받아 들일수 있다.
    여기서 1024는 화일명이 받을수 있는 크기이다.

    출처 : http://ggaman.com/tt/450
    Comment 0 Trackback 0

    Trackback : http://sepoc.tistory.com/trackback/22 관련글 쓰기

    Top

    대략적인 GUI와 동작환경&작업환경

     

    위의 플레시가 대략적인 프로그램의 모습입니다.  
    큐브의 각 색상은 각 프로그램을 뜻하며,
    실행시 위처럼 돌아가지는 않습니다.

    그리고 개발환경이나 동작환경은
    윈도우의 api나 mfc를 사용할 예정이고,
    무엇보다도 절대적인 윈도우의 점유율때문에,
    위 플레시처럼 윈도우에서만 작동할것입니다.

    Comment 0 Trackback 0

    Trackback : http://sepoc.tistory.com/trackback/8 관련글 쓰기

    Top

    이미지 뷰어 참조모델

    사용자 삽입 이미지
    사용자 삽입 이미지

    꿀뷰3라는 프로그램입니다.
    이 프로그램의 모든 기능까지는 다 구현할 순없어도
    GUI나 메뉴방식이 생각하고 있는 이미지와 비슷해서 참고하려고 합니다.
    아쉽게도 오픈소스 프로그램은 아니라서 정보는 자력으로 구해야겠네요.
    Comment 0 Trackback 0

    Trackback : http://sepoc.tistory.com/trackback/6 관련글 쓰기

    Top

    prev 1 next