Sample5

[アイコン関係]



//--------------------------------------------------------------------------------
//
//【スモールアイコンのハンドル取得】
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	// IDI_ICONは求めたいアイコンのリソースID
	// hInstはアイコンリソースのあるインスタンスハンドル
	HICON hIconSmall = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), 
								IMAGE_ICON, 16, 16, 0) ;
}


//--------------------------------------------------------------------------------
//
//【タスクバーにアイコンを表示させない】
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// WinMain()内のウィンドウ作成部分
{
	// ウィンドウの作成時にWS_EX_TOOLWINDOWを指定する。
	HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | …,……) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	// ウインドウの拡張スタイルをツールウインドウとして作成させる
	cs.dwExStyle |= WS_EX_TOOLWINDOW ;

	return CFrameWnd::PreCreateWindow(cs) ;
}

//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	// 目的のウィンドウを一旦消す
	ShowWindow(hWnd, SW_HIDE) ;

	// 拡張ウィンドウスタイルの取得
	LONG lExStyle = GetWindowLong(hWnd, GWL_EXSTYLE) ;
	// WS_EX_TOOLWINDOWの指定
	lExStyle |= WS_EX_TOOLWINDOW ;
	// 新しい拡張ウィンドウスタイルの設定
	SetWindowLong(hWnd, GWL_EXSTYLE, lExStyle) ;

	// ウィンドウを表示する
	ShowWindow(hWnd, SW_SHOWNORMAL) ;
}

//--------------------------------------------------------------------------------
//
//【アイコンのままで開かなくするには】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// ウィンドウプロシージャ内のWM_QUERYOPENメッセージ処理部分
{
	case WM_QUERYOPEN:
	{
		return 0;
	}
}

(//MFC)
/////////////////////////////////////////////////////////////////////////////
// クラスウィザードで追加されたWM_QUERYOPENハンドラ
//※WM_QUERYOPENが一覧に表示されない場合は、クラス情報タブのメッセージ
//フィルタで「Windows」を選択すれば良い
CMainFrame::OnQueryOpen()
{
	return 0;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// クラスウィザードで追加されたWM_SHOWWINDOWハンドラ
void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CFrameWnd::OnShowWindow(bShow, nStatus);

	// ウインドウをアイコン化する
	ShowWindow(SW_SHOWMINNOACTIVE) ;
}


//--------------------------------------------------------------------------------
//
//【拡張子に対応したアイコンの取得】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
//
void OnTest(HWND hWnd)
{
	OPENFILENAME ofn ;
	char szFileName[MAX_PATH] ;

	szFileName[0] = '\0' ;

	ZeroMemory((LPVOID)&ofn, sizeof(OPENFILENAME)) ;
	ofn.lStructSize = sizeof(OPENFILENAME) ;
	ofn.hwndOwner = hWnd ;
	ofn.lpstrFilter = "全てのファイル(*.*)\0*.*\0\0" ;
	ofn.lpstrFileTitle = szFileName ;
	ofn.nMaxFileTitle = MAX_PATH ;
	ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER ;

	if(GetOpenFileName(&ofn)){
		SHFILEINFO shfi ;

		// ラージアイコンの取得
		SHGetFileInfo(szFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON) ;
		g_hIconLarge = shfi.hIcon ;
		// ショートカット矢印付きのアイコン取得
		SHGetFileInfo(szFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LINKOVERLAY) ;
		g_hIconLink = shfi.hIcon ;
		// スモールアイコンの取得
		SHGetFileInfo(szFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON) ;
		g_hIconSmall = shfi.hIcon ;
		// アイコンを描画させるために再描画の指定
		InvalidateRect(hWnd, NULL, TRUE) ;
	}
}
/////////////////////////////////////////////////////////////////////////////
// ダイアログプロシージャ内のWM_PAINTハンドラ部分

LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_PAINT:
			PAINTSTRUCT ps;
			HDC hdc;

			hdc = BeginPaint(hDlg, &ps) ;

			// g_hIconLarge,g_hIconLink,g_hIconSmallはHICON型のグローバル変数
			// ラージアイコンの描画
			DrawIcon(hdc, 5, 5, g_hIconLarge) ;
			// ショートカット矢印付きのアイコン描画
			DrawIcon(hdc, 45, 5, g_hIconLink) ;
			// スモールアイコンの描画
			DrawIconEx(hdc, 85, 5, g_hIconSmall, 16, 16, 0, NULL, DI_NORMAL) ;

			EndPaint(hDlg, &ps) ;
			return TRUE ;
		default :
			break ;
	}
	return FALSE ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
void CTestDialog::OnTest() 
{
	CString	strFileName ;
	SHFILEINFO shfi ;

	CFileDialog	dlg(TRUE,"","",
				OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
				"全てのファイル(*.*)|*.*||",this) ;

	// オープンファイルダイアログでファイルを指定
	if(dlg.DoModal() == IDOK){
		strFileName = dlg.GetPathName() ;

		// ラージアイコンの取得
		SHGetFileInfo(strFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON) ;
		m_hIconLarge = shfi.hIcon ;
		// ショートカット矢印付きのアイコン取得
		SHGetFileInfo(strFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LINKOVERLAY) ;
		m_hIconLink = shfi.hIcon ;
		// スモールアイコンの取得
		SHGetFileInfo(strFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON) ;
		m_hIconSmall = shfi.hIcon ;
		// アイコンを描画させるために再描画の指定
		Invalidate() ;
	}
	
}
/////////////////////////////////////////////////////////////////////////////
// WM_PAINTハンドラ
void CTestDialog::OnPaint() 
{
	CPaintDC dc(this) ; // 描画用のデバイス コンテキスト

	// m_hIconLarge,m_hIconLink,m_hIconSmallはHICON型のメンバ変数
	// ラージアイコンの描画
	dc.DrawIcon(5, 5, m_hIconLarge) ;
	// ショートカット矢印付きのアイコン描画
	dc.DrawIcon(45, 5, m_hIconLink) ;
	// スモールアイコンの描画
	DrawIconEx(dc.m_hDC, 85, 5, m_hIconSmall, 16, 16, 0, NULL, DI_NORMAL) ;
}


//--------------------------------------------------------------------------------
//
//【アイコンをシステムトレイに表示させる】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// 自前のメッセージ番号を定義(100には特に意味はない)
#define NOTIFY_TRAYICON (WM_APP + 100)
// トレイアイコン管理用IDを定義(1には特に意味はない)
#define TRAY_ID		1
// Shell_NotifyIcon()用構造体の宣言
NOTIFYICONDATA g_nid ;
/////////////////////////////////////////////////////////////////////////////
// メインウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_CREATE :
			// システムトレイにアイコンを追加
			ZeroMemory(&g_nid, sizeof(NOTIFYICONDATA)) ;

			g_nid.cbSize			= sizeof(NOTIFYICONDATA) ;
			g_nid.hWnd				= hWnd ;
			g_nid.uID				= TRAY_ID ;
			g_nid.uFlags			= NIF_ICON | NIF_MESSAGE ;
			g_nid.uCallbackMessage	= NOTIFY_TRAYICON ;
			// IDC_ICONはアイコンのリソースID
			g_nid.hIcon			 = (HICON)LoadImage(g_hInstance, 
					MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ;
			
			Shell_NotifyIcon(NIM_ADD, &g_nid) ;
			return 0 ;
		// トレイアイコン用メッセージ処理
		case NOTIFY_TRAYICON :
			if(wParam == TRAY_ID){
				switch(lParam){
					case WM_LBUTTONDOWN :
					{
						// 左クリックされた時の処理
						MessageBeep(0) ;
						break ;
					}
					default :
						break ;
				}
			}
			return 0 ;
		case WM_DESTROY :
			// 登録したアイコンの削除
			Shell_NotifyIcon(NIM_DELETE, &g_nid) ;

			PostQuitMessage(0) ;
			return 0 ;
		default :
			break ;
	}
	return (DefWindowProc(hWnd, message, wParam, lParam)) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
//[MainFrm.h]
/////////////////////////////////////////////////////////////////////////////

// 自前のメッセージ番号を定義(100には特に意味はない)
#define NOTIFY_TRAYICON (WM_APP + 100)
// トレイアイコン管理用IDを定義(1には特に意味はない)
#define TRAY_ID		1

class CMainFrame: public CFrameWnd
{
		:
// 生成されたメッセージ マップ関数
protected:
	// Shell_NotifyIcon()用構造体の宣言
	NOTIFYICONDATA m_nid ;
	// メッセージ処理用関数宣言
	afx_msg LONG OnTrayIcon(WPARAM wParam, LPARAM lParam) ;
		:
}

/////////////////////////////////////////////////////////////////////////////
//[MainFrm.cpp]
/////////////////////////////////////////////////////////////////////////////

// メッセージマップの追加
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
		//{{AFX_MSG_MAP(CMainFrame)
		//}}AFX_MSG_MAP
		ON_MESSAGE(NOTIFY_TRAYICON, OnTrayIcon)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// WM_CREATEハンドラ

CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
		:
		:

	// システムトレイにアイコンを追加
	ZeroMemory(&m_nid, sizeof(NOTIFYICONDATA)) ;

	m_nid.cbSize			= sizeof(NOTIFYICONDATA) ;
	m_nid.hWnd				= m_hWnd ;
	m_nid.uID				= TRAY_ID ;
	m_nid.uFlags			= NIF_ICON | NIF_MESSAGE ;
	m_nid.uCallbackMessage	= NOTIFY_TRAYICON ;
	// IDC_ICON1はアイコンのリソースID
	m_nid.hIcon			= (HICON)LoadImage(AfxGetInstanceHandle(), 
						MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ;
	
	Shell_NotifyIcon(NIM_ADD, &m_nid) ;
	return 0 ;
}
/////////////////////////////////////////////////////////////////////////////
// メッセージ処理関数

LONG CMainFrame::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
	if(wParam == TRAY_ID){
		switch(lParam){
			case WM_LBUTTONDOWN:
				// 左クリックされた時の処理
				break ;
			default :
				break ;
		}
	}
	return 0 ;
}

/////////////////////////////////////////////////////////////////////////////
// WM_DESTROYハンドラ

void CMainFrame::OnDestroy() 
{
	// 登録したアイコンの削除
	Shell_NotifyIcon(NIM_DELETE, &m_nid) ;
	
	CFrameWnd::OnDestroy() ;
}

//--------------------------------------------------------------------------------
//
//【システムトレイのアイコンをアニメーションさせる】
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// タイマIDを定義(100には特に意味はない)
#define	TIMER_ID	100
// アニメーション用のアイコンハンドル
HICON	g_hIcon1 = NULL ;
HICON	g_hIcon2 = NULL ;
/////////////////////////////////////////////////////////////////////////////
// メインウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_CREATE :
			// アニメーション用のアイコンをあらかじめ読み込んでおく
			// g_hIcon1,g_hIcon2はHICON型のグローバル変数
			g_hIcon1 = (HICON)LoadImage(g_hInstance, 
							MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ;
			g_hIcon2 = (HICON)LoadImage(g_hInstance, 
							MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 16, 16, 0) ;

			// システムトレイにアイコンを追加
			ZeroMemory(&g_nid, sizeof(NOTIFYICONDATA)) ;

			g_nid.cbSize			= sizeof(NOTIFYICONDATA) ;
			g_nid.hWnd				= hWnd ;
			g_nid.uID				= TRAY_ID ;
			g_nid.uFlags			= NIF_ICON | NIF_MESSAGE ;
			g_nid.uCallbackMessage	= NOTIFY_TRAYICON ;
			g_nid.hIcon				= g_hIcon1 ;
				
			Shell_NotifyIcon(NIM_ADD, &g_nid) ;

			// システムトレイのアイコンをアニメーションさせるためにタイマを起動
			SetTimer(hWnd, TIMER_ID, 1000, NULL) ;
			return 0 ;
		case WM_TIMER :
			// アイコンを切り替える
			if(g_nid.hIcon == g_hIcon1){
				g_nid.hIcon = g_hIcon2 ;
			}
			else{
				g_nid.hIcon = g_hIcon1 ;
			}
			// アイコンの変更
			Shell_NotifyIcon(NIM_MODIFY , &g_nid) ;
			return 0 ;
		case WM_DESTROY :
			// タイマの削除
			KillTimer(hWnd, TIMER_ID) ;
			// 登録したアイコンの削除
			Shell_NotifyIcon(NIM_DELETE, &g_nid) ;

			PostQuitMessage(0) ;
			return 0 ;
		default :
			break ;
	}
	return (DefWindowProc(hWnd, message, wParam, lParam)) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
//[MainFrm.cpp]
/////////////////////////////////////////////////////////////////////////////

// タイマIDを定義(100には特に意味はない)
#define	TIMER_ID	100

/////////////////////////////////////////////////////////////////////////////
// WM_CREATEハンドラ
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
		:
		:

	// アニメーション用のアイコンをあらかじめ読み込んでおく
	// m_hIcon1,m_hIcon2はHICON型のメンバ変数
	m_hIcon1 = (HICON)LoadImage(AfxGetInstanceHandle(), 
					MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ;
	m_hIcon2 = (HICON)LoadImage(AfxGetInstanceHandle(), 
					MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 16, 16, 0) ;

	// システムトレイにアイコンを追加
	ZeroMemory(&m_nid, sizeof(NOTIFYICONDATA)) ;

	m_nid.cbSize			= sizeof(NOTIFYICONDATA) ;
	m_nid.hWnd				= m_hWnd ;
	m_nid.uID				= TRAY_ID ;
	m_nid.uFlags			= NIF_ICON | NIF_MESSAGE ;
	m_nid.uCallbackMessage	= NOTIFY_TRAYICON ;
	m_nid.hIcon				= m_hIcon1 ;

	Shell_NotifyIcon(NIM_ADD, &m_nid) ;

	// システムトレイのアイコンをアニメーションさせるためにタイマを起動
	SetTimer(TIMER_ID, 1000, NULL) ;
	return 0 ;
}
/////////////////////////////////////////////////////////////////////////////
// WM_TIMERハンドラ
void CMainFrame::OnTimer(UINT nIDEvent) 
{
	// アイコンを切り替える
	if(m_nid.hIcon == m_hIcon1){
		m_nid.hIcon = m_hIcon2 ;
	}
	else{
		m_nid.hIcon = m_hIcon1 ;
	}
	// アイコンの変更
	Shell_NotifyIcon(NIM_MODIFY , &m_nid) ;

	//CFrameWnd::OnTimer(nIDEvent);
}
/////////////////////////////////////////////////////////////////////////////
// WM_DESTROYハンドラ
void CMainFrame::OnDestroy() 
{
	// タイマの削除
	KillTimer(TIMER_ID) ;
	// 登録したアイコンの削除
	Shell_NotifyIcon(NIM_DELETE, &m_nid) ;

	CFrameWnd::OnDestroy() ;
}