Showing posts with label MFC 10. Show all posts
Showing posts with label MFC 10. Show all posts

2011/04/06

Dialog based 프로젝트에서 Windows 7 Taskbar 아이콘에 Progress 출력하기

Dialog based 프로젝트의 경우 CFrameWnd 클래스가 없어서 적접적으로 Taskbar 관련 함수를 사용할 수 없다. 이때에는 CoCreateInstance 함수를 이용하여 Taskbar Button 객체를 가져와야 한다. 하지만 이때에 Taskbar Button 이 만들어 진 후에 작업을 해야 한다.



프로그램이 완전히 실행한 뒤에 Taskbar Button 객체를 가져와도 되지만 Taskbar Button 이 만들어진 후를 감지하여 객체를 가져오는 것이 보다 유연한 방법일 것이다. 그러기 위해서는 TaskbarButtonCreated 메시지를 받아 처리하여야 한다.



아래 코드는 메시지 등록과 이를 처리하는 과정 그리고 간단하게 Progress 를 출력하는 코드이다.

////////////////////////////////////////////////////////////////////////////////
// Header
ITaskbarList3* m_pTaskbar;

static const UINT WM_TASKBARBUTTONCREATED;
LRESULT OnTaskbarBtnCreated ( WPARAM wParam, LPARAM lParam );


////////////////////////////////////////////////////////////////////////////////
// Source
const UINT CMyTaskbarDlg::WM_TASKBARBUTTONCREATED
= RegisterWindowMessage( _T("TaskbarButtonCreated") );

BEGIN_MESSAGE_MAP(CMyTaskbarDlg, CDialogEx)
:
ON_REGISTERED_MESSAGE(WM_TASKBARBUTTONCREATED, &CMyTaskbarDlg::OnTaskbarBtnCreated)
:
END_MESSAGE_MAP()

LRESULT CMyTaskbarDlg::OnTaskbarBtnCreated ( WPARAM wParam, LPARAM lParam )
{
if ( CoCreateInstance(
CLSID_TaskbarList,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&m_pTaskbar) ) != S_OK )
{
m_pTaskbar = NULL;
}

return 0;
}

void CMyTaskbarDlg::OnBnClickedBtnProgressDisplay()
{
if ( m_pTaskbar != NULL )
{
switch ( m_cmbProgressType.GetCurSel() )
{
case 1:
m_pTaskbar->SetProgressState( m_hWnd, TBPFLAG::TBPF_INDETERMINATE );
TRACE("Display Progress TBPFLAG::TBPF_INDETERMINATE \n");
break;

case 2:
m_pTaskbar->SetProgressState( m_hWnd, TBPFLAG::TBPF_NORMAL );
m_pTaskbar->SetProgressValue( m_hWnd, 72, 100 );
TRACE("Display Progress TBPFLAG::TBPF_NORMAL \n");
break;

case 3:
m_pTaskbar->SetProgressState( m_hWnd, TBPFLAG::TBPF_ERROR );
m_pTaskbar->SetProgressValue( m_hWnd, 72, 100 );
TRACE("Display Progress TBPFLAG::TBPF_ERROR \n");
break;

case 4:
m_pTaskbar->SetProgressState( m_hWnd, TBPFLAG::TBPF_PAUSED );
m_pTaskbar->SetProgressValue( m_hWnd, 72, 100 );
TRACE("Display Progress TBPFLAG::TBPF_PAUSED \n");
break;

default:
m_pTaskbar->SetProgressState( m_hWnd, TBPFLAG::TBPF_NOPROGRESS );
TRACE("Display Progress TBPFLAG::TBPF_NOPROGRESS \n");
break;
}
}
}




2011/04/06 - [Dev Story/Tips] - Windows 7 Taskbar 아이콘에 Progress Bar 출력하기


Original Post : http://neodreamer-dev.tistory.com/530

Windows 7 Taskbar 아이콘에 Progress Bar 출력하기

Windows 7 의 테스트바 아이콘은 많은 기능을 갖고 있다. 그 중 하나인 진행 상태를 표시해 보았다.

Visual Studio 2010 버전을 사용할 경우 이는 대단히 간단한 것이다. 



CFrameWnd 의 멤버 변수인 아래 세 개의  함수로 구현할 수 있다.


  • SetProgressBarState

  • SetProgressBarRange

  • SetProgressBarPosition




SetProgressBarState





void SetProgressBarState(


   TBPFLAG tbpFlags


);



Progress 의 상태를 설정하는 함수로 인자 아래와 같은 인자를 넘겨줄 수 있다.

TBPF_NOPROGRESS, TBPF_INDETERMINATE, TBPF_NORMAL, TBPF_ERROR, TBPF_PAUSED.



TBPF_NOPROGRESS - Progress 사용하지 않는 상태





TBPF_INDETERMINATE - 끝이 정해지지 않은 상태





TBPF_NORMAL - 기본 상태





TBPF_ERROR - 에러가 발생한 상태로 아래와 같이 붉은색으로 표시 된다.





TBPF_PAUSED - 진행이 멈춘 상태로 아래와 같이 노란색으로 표시 된다.









SetProgressBarRange 




void SetProgressBarRange(


   int nRangeMin,


   int nRangeMax


);



Progress 표시 범위 설정하는 함수로 최소값과 최대값을 전달하여 설정할 수 있다. 







SetProgressBarPosition




void SetProgressBarPosition(


   int nProgressPos

); 



Progress 의 현재 값을 설정하는 함수.

 

이 함수 사용에 주의할 점은 SetProgressBarState 에서 TBPF_NOPROGRESS, TBPF_INDETERMINATE 에서 설정을하고 SetProgressBarPosition 함수가 수행이 되면 Progress Bar 는 TBPF_NORMAL 상태로 출력하게 된다.



아래 코드는 간단한 사용 예로 실제 진행에 대하 것은 빠진 상태이다.

m_pFrame = (CMainFrame*)GetParentFrame();


switch ( m_cmbProgressType.GetCurSel() )
{
case 1: // TBPFLAG::TBPF_INDETERMINATE
m_pFrame->SetProgressBarState( TBPFLAG::TBPF_INDETERMINATE );
TRACE("Display Progress TBPFLAG::TBPF_INDETERMINATE \n");
break;

case 2: // TBPFLAG::TBPF_NORMAL
m_pFrame->SetProgressBarState( TBPFLAG::TBPF_NORMAL );
m_pFrame->SetProgressBarRange( 0, 100 );
m_pFrame->SetProgressBarPosition( 72 );
TRACE("Display Progress TBPFLAG::TBPF_NORMAL \n");
break;

case 3: // TBPFLAG::TBPF_ERROR
m_pFrame->SetProgressBarState( TBPFLAG::TBPF_ERROR );
m_pFrame->SetProgressBarRange( 0, 100 );
m_pFrame->SetProgressBarPosition( 72 );
TRACE("Display Progress TBPFLAG::TBPF_ERROR \n");
break;

case 4: // TBPFLAG::TBPF_PAUSED
m_pFrame->SetProgressBarState( TBPFLAG::TBPF_PAUSED );
m_pFrame->SetProgressBarRange( 0, 100 );
m_pFrame->SetProgressBarPosition( 72 );
TRACE("Display Progress TBPFLAG::TBPF_PAUSED \n");
break;

default: // TBPFLAG::TBPF_NOPROGRESS
m_pFrame->SetProgressBarState( TBPFLAG::TBPF_NOPROGRESS );
TRACE("Display Progress TBPFLAG::TBPF_NOPROGRESS \n");
break;
}

<

Original Post : http://neodreamer-dev.tistory.com/529

2011/03/11

Visual Studio 2010 Service Pack 1 설치~

Visual Studio 2010 Service Pack 1 설치후 About box

Visual Studio 2010 Service Pack 1 설치후 About box



점심시간 짬을 이용하여 Visual Studio 2010 Service Pack 1을 설치해 보았다.

기본 설치 파일은 800KB 정도로 인터넷을 통해 구성 파일을 다운 받아 설치하는 방식이다. 본인의 경우 대략 600MB 정도 다운로드 받아야 했다.

설치될 사항들구성 다운로드




설치 후 설치 경로의 예제 중에서 D2D 관련 예제를 실행해 보았다.

Direct2D 관련 예제는 4개가 있었으며 이 중 MFCDxgiSample 은 컴파일 되지 않았고(DirectX 10.0 설치가 필요한 것 같았다.) 나머지 세개의 예제는 컴파일 되고 동작을 하였다.


MFCDirect2DApp

MFCDirect2DApp 실행화면



MFCDirect2DHelloWorld

MFCDirect2DHelloWorld 실행화면



MFCGdiInteropSample

MFCGdiInteropSample 실행화면



좋은데 단점이 있다면 이 Direct2D 기능에 관련하여서는 Windows 7 에서만 사용할 수 있다는 것이다.

<

Original Post : http://neodreamer-dev.tistory.com/517