// SampleProjectDialog.h
#pragma once
class CSampleProjectDialog :
public CAppStdDialogImpl<CSampleProjectDialog>,
public CUpdateUI<CSampleProjectDialog>,
public CMessageFilter, public CIdleHandler
{
public:
DECLARE_APP_DLG_CLASS(NULL, IDR_MAINFRAME, L"Software\\WTL")
enum { IDD = IDD_MAINDLG };
CTabCtrl m_tab_display; // タブ
CListViewCtrl m_list_file; // [ファイル]リストビュー
CListViewCtrl m_list_dir; // [フォルダ]リストビュー
virtual BOOL PreTranslateMessage(MSG* pMsg){
return CWindow::IsDialogMessage(pMsg);
}
virtual BOOL OnIdle(){
return FALSE;
}
BEGIN_UPDATE_UI_MAP(CSampleProjectDialog)
END_UPDATE_UI_MAP()
BEGIN_MSG_MAP(CSampleProjectDialog)
MSG_WM_INITDIALOG(OnInitDialog)
MSG_WM_DESTROY(OnDestroy)
NOTIFY_HANDLER_EX(IDC_TAB_DISPLAY, TCN_SELCHANGING, OnTabSelChanging)
NOTIFY_HANDLER_EX(IDC_TAB_DISPLAY, TCN_SELCHANGE, OnTabSelChange)
CHAIN_MSG_MAP(CUpdateUI<CSampleProjectDialog>)
CHAIN_MSG_MAP(CAppStdDialogImpl<CSampleProjectDialog>)
END_MSG_MAP()
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
AtlCreateEmptyMenuBar(m_hWnd);
// コントロール設定
m_tab_display = GetDlgItem(IDC_TAB_DISPLAY);
m_list_file = GetDlgItem(IDC_LIST_FILE);
m_list_dir = GetDlgItem(IDC_LIST_DIR);
// タブアイテム追加
m_tab_display.AddItem(
TCIF_TEXT | TCIF_PARAM, _T("ファイル"), 0, (DWORD)m_list_file.m_hWnd);
m_tab_display.AddItem(
TCIF_TEXT | TCIF_PARAM, _T("フォルダ"), 0, (DWORD)m_list_dir.m_hWnd);
// タブコントロールの表示領域取得
CRect rcWindow;
GetWindowRect(rcWindow);
CRect rcTabClient;
m_tab_display.GetWindowRect(rcTabClient);
m_tab_display.AdjustRect(FALSE, rcTabClient);
rcTabClient.OffsetRect(-::GetSystemMetrics(SM_CXBORDER),
-(rcWindow.top + ::GetSystemMetrics(SM_CYCAPTION)));
// [ファイル]リストビューコントロールの配置
m_list_file.SetWindowPos(HWND_TOP, rcTabClient, SWP_SHOWWINDOW);
m_list_file.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
CRect rcList;
m_list_file.GetWindowRect(rcList);
int nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);
int nBorder = GetSystemMetrics(SM_CXBORDER);
m_list_file.InsertColumn(0, _T("名前"), LVCFMT_LEFT,
rcList.Width() - nScrollWidth - nBorder * 2, -1);
// アプリケーションがあるフォルダパスを取得
TCHAR szAppRoot[_MAX_PATH];
::GetModuleFileName(NULL, szAppRoot, sizeof(szAppRoot) / sizeof(TCHAR));
::StringCbCopy(::_tcsrchr(szAppRoot, _T('\\')) + 1,
sizeof(szAppRoot), _T("*.*"));
CFindFile find;
if(find.FindFile(szAppRoot)){
do{
if(!find.IsDots() && !find.IsDirectory()){
int nIndex = m_list_file.GetItemCount();
m_list_file.AddItem(nIndex, 0, find.GetFileName());
}
}while(find.FindNextFile());
}
// [フォルダ]リストビューコントロールの配置
m_list_dir.SetWindowPos(HWND_TOP, rcTabClient, SWP_HIDEWINDOW);
m_list_dir.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
m_list_dir.InsertColumn(0, _T("種類"), LVCFMT_LEFT, 90, -1);
m_list_dir.InsertColumn(1, _T("フォルダパス"), LVCFMT_LEFT,
rcList.Width() - 90 - nScrollWidth - nBorder * 2, -1);
TCHAR szPath[MAX_PATH];
SHGetSpecialFolderPath(m_hWnd, szPath, CSIDL_WINDOWS, 0);
m_list_dir.AddItem(0, 0, _T("Windows"));
m_list_dir.AddItem(0, 1, szPath);
SHGetSpecialFolderPath(m_hWnd, szPath, CSIDL_PROGRAM_FILES, 0);
m_list_dir.AddItem(1, 0, _T("Program Files"));
m_list_dir.AddItem(1, 1, szPath);
// メッセージループにメッセージフィルタとアイドルハンドラを追加
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
SetMsgHandled(false);
return TRUE;
}
void OnDestroy(){
// メッセージループからメッセージフィルタとアイドルハンドラを削除
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->RemoveMessageFilter(this);
pLoop->RemoveIdleHandler(this);
}
void SwitchWindow(bool bShow){
int nIndex = m_tab_display.GetCurSel();
TCITEM ti;
ti.mask = TCIF_PARAM;
m_tab_display.GetItem(nIndex, &ti);
CWindow win = (HWND)ti.lParam;
win.ShowWindow(bShow ? SW_SHOW : SW_HIDE);
if(bShow)
win.SetFocus();
}
LRESULT OnTabSelChanging(LPNMHDR pnmh){
SwitchWindow(false);
return 0;
}
LRESULT OnTabSelChange(LPNMHDR pnmh){
SwitchWindow(true);
return 0;
}
};
|