Showing posts with label 테스크바 버튼. Show all posts
Showing posts with label 테스크바 버튼. Show all posts

2011/04/07

C++ Builder XE 에서 Win 7 Taskbar Button 제어하기

Visual C++ 에서는 MS 에서 지원하는 기술을 가장 먼저 접근할 수 있는 것 같다 . 얼마전 알게 된 Windows 7 의 Taskbar Button을 제어하는 것은 C++ Builder 에서 가능한지 알아 보았다. 의외로 Visual C++ 보다 수월 하였다. 물론 Dialog Based 프로젝트에 비해서...



TaskbarButtonCreated 메시지를 처리할 필요 없이 Form 생성자에서 Taskbar Button 객체를 가져오면 되었다.



일단 객체를 가져오면 이후 처리는 Visual C++ 과 별반 다를게 없다.



아래 코드는 Taskbar Button 을 가져오는 과정이다.

/////////////////////////////////////////////////////////
// Header
#include "objbase.h"
#include "Shobjidl.h"

ITaskbarList3 *m_pTaskbar;


/////////////////////////////////////////////////////////
// Source
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
:

m_pTaskbar = NULL;

if ( CoCreateInstance(
CLSID_TaskbarList,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&m_pTaskbar)) != S_OK )
{
m_pTaskbar = NULL;
}

:
}



2011/04/06 - [Dev Story/Tips] - Dialog based 프로젝트에서 Windows 7 Taskbar 아이콘에 Progress 출력하기

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


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