달력

5

« 2024/5 »

  • 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

'Programing/Windows Programing'에 해당되는 글 20

  1. 2008.05.21 다이얼로그 가장자리 깎아내기
  2. 2008.05.21 FMod 기본 사용법
  3. 2008.05.17 프로그램 Alt+F4 감지
  4. 2008.05.15 리스트컨트롤 아이템 자동 선택 하기 2
  5. 2008.05.14 List Ctrl 아래로 정렬 시키기
가장자리를 깎아낼 때 쓴다

<선언>

void CXXXDialog::RoundEdge(CRect clientRect)
{
      // 모서리를 둥글게
      CRgn rgnTop;
      CRgn rgnBottom;
      // 상단 모서리를 자르고.
      rgnTop.CreateRoundRectRgn(0,0,clientRect.Width(),clientRect.Height(),9,9);
      rgnBottom.CreateRectRgn(0, clientRect.Height()-10, clientRect.Width()-1, clientRect.Height());
      // 해당 영역을 합치고.
      CombineRgn(rgnTop, rgnTop, rgnBottom, RGN_OR);
      // 잘려진 영역을 적용하고
      SetWindowRgn(static_cast<HRGN>(rgnTop.GetSafeHandle()), TRUE);
      // 영역을 해제.
      rgnTop.Detach();
      rgnBottom.Detach();
}

<사용>
CRect clientRectt;
GetClientRect(&clientRectt);
RoundEdge(clientRectt);

뭔소리인고 하니...
사용자 삽입 이미지
빨간색 태두리 처럼 만든다 이거다...


:
Posted by Lunaness
2008. 5. 21. 11:24

FMod 기본 사용법 Programing/Windows Programing2008. 5. 21. 11:24

FMod를 사용하면서 설정을 어떻게 해야 하나 하고 한참 뒤적였는데
삭은이~님 덕분에 쉽게 해결했다..
----------------------------------------------------------------------------------------------------
FMod를 몇일 다루면서 정리할 것들

대부분 사운드 라이브러리가 그렇듯이 FMod도 간단한 초기화 몇개 호출로 시작이 가능하다.

<초기화>
// DSound 사용은 옵션사항이다. 기타 옵션이 다양하지만 대부분 FMod가 내부적으로 가장 적절한 방법을 찾는다고 한다.
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
FSOUND_SetHWND(hWnd);

const OUTPUT_FREQ = 44100;
const NUMCHANNELS = 32;

if (!FSOUND_Init(OUTPUT_FREQ, NUMCHANNELS, 0))
{
    return FALSE;
}

저장된 사운드는 Sample 과 Stream 두가지 타잎으로 가능한데 Sample은 메모리를 잡고 전부 로딩하는 것이고 Stream은 일정 용량씩 나눠서 재생해주는 것이다. 효과음은 Sample, 배경음악은 Stream 으로 하는게 일반적이라 생각된다.

<Sample 로딩 및 재생>
FSOUND_SAMPLE* sample = FSOUND_Sample_Load(FSOUND_FREE, (const char*)data->GetPtr(), FSOUND_LOADMEMORY, 0, data->GetSize());

int channel = FSOUND_PlaySoundEx(FSOUND_FREE, sample, NULL, TRUE);

FSOUND_SetVolume(channel, g_nWavVolume);

FSOUND_SetLoopMode(channel, fRepeat ? FSOUND_LOOP_NORMAL : FSOUND_LOOP_OFF);

FSOUND_SetPaused(channel, FALSE);

<Stream 로딩 및 재생>
FSOUND_STREAM stream = FSOUND_Stream_Open((const char*)data->GetPtr(), FSOUND_LOADMEMORY | FSOUND_LOOP_NORMAL, 0, data->GetSize());

int channel = FSOUND_Stream_Play(FSOUND_FREE, stream);

FSOUND_SetVolume(channel, g_nMp3Volume);

종료는 모든 Sample/Stream 을 지워주는게 좋지만 FMod 내부적으로 관리가 되어서 아래 함수만 호출해도 된다고 한다.

<종료시>
FSOUND_Sample_Free(sample);
FSOUND_Stream_Close(stream);
FSOUND_Close();

출처 : 삭은이~의 개인 블로그
http://zupet.tistory.com/3

:
Posted by Lunaness
2008. 5. 17. 15:13

프로그램 Alt+F4 감지 Programing/Windows Programing2008. 5. 17. 15:13

프로그램에서 Alt+F4를 입력받으면
중간에 어떠한 일을 수행하고 종료를 해야 하는 경우가 있다
그 때 Alt+F4 를 감지해서 특정 일을 수행 한 후 종료하게 하려면
다음과 같이 작성해라

BOOL CDirectVideoDialog::PreTranslateMessage(MSG* pMsg)
{
    // 중간 생략
    if(pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_F4) 
    {
        if (::GetKeyState(VK_MENU) < 0)
        {
             //여기에 할 일을 작성
             return TRUE;
        }
    }
    // 중간 생략
}

PreTranslateMessage에서 감지 하여도 되지만

WM_SYSCOMMAND에서도 처리할 수 있습니다.
아래와 같이 하면 프로그램 오른쪽 위에 있는 닫기 버튼에 대해서도 닫기가 안되도록 처리 할  수있고
Alt+F4에 대해서도 그리고 메뉴->닫기 에 대해서도 처리할 수 있습니다.

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
   if( nID == SC_CLOSE )
   {
        // 할일 작성
        return;
   }
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    } 
}

출처 : Devpia

:
Posted by Lunaness

리스트컨트롤을 사용하는데 자동으로 선택해와야 하는 경우가 생겨 찾아보니
데브피아에 저런 내용이 검색되었다

저도 같은 내용을 검색 하다가 다음과 같은 내용을 찾았습니다. 즐프.. ^^;

 ListCtrl::SetSelectionMark(int i)  : i번째 item을 선택하는 것은 맞습니다.

단지 포커스까지 주지 않기때문에 표시(파란줄)가 되지 않을 뿐이지 내부적으로 현재 선택된 아이템은 i번째 아이템입니다.

m_list1.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED)  : 이것만 사용하시면 문제가 발생할 수 있습니다.

내부적으로 자동 선택된 아이템의 인덱스와 표시(파란줄)된 아이템의 인덱스가 달라질 수 있거든요..
표시된 아이템을 삭제하려고 삭제 버튼을 눌렀는데 딴 아이템이 삭제되는 일이  생길 수 있겠죠..

그래~서 이렇게 사용하시면 깔끔하실 듯 싶습니다.^^호호

m_cListCtrl.SetSelectionMark(i);
m_cListCtrl.SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
m_cListCtrl.SetFocus();


깔끔하게 해결되는구만 -ㅂ-;
:
Posted by Lunaness
리스트 뷰를 추가되는 데이터 때문에 항상 아래를 보이게 해야 하는 상황이 나왔다

데브피아를 찾아보니

EnsureVisible() 쓰라능~!

라고 나와있길레.......

pListView->SetScrollPos(SB_VERT, pListView->GetListCtrl().GetItemCount());
pListView->GetListCtrl().EnsureVisible(pListView->GetListCtrl().GetItemCount() - 1, true);

이렇게 써봤더니..  엄청난 깜박임이 발생하였다 |||orz


그래서 다시 찾은 방법이
pListView->SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);
간단하게 해결 되는군;;

정보출처 : 현덕군
:
Posted by Lunaness