windows-nt/Source/XPSP1/NT/shell/ext/taskui/test/mainwnd.cpp
2020-09-26 16:20:57 +08:00

149 lines
3.7 KiB
C++

// MainWnd.cpp: implementation of the CMainWnd class.
//
//////////////////////////////////////////////////////////////////////
#include "pch.h"
#include "resource.h"
#include "Page1.h"
#include "MainWnd.h"
#include "pagefact.h"
//////////////////////////////////////////////////////////////////////
// CMainWnd
//////////////////////////////////////////////////////////////////////
CMainWnd::CMainWnd(void)
{
}
CMainWnd::~CMainWnd(void)
{
}
void CMainWnd::OnFinalMessage(HWND /*hwnd*/)
{
CloseTaskSheet();
PostQuitMessage(0);
}
LRESULT CMainWnd::OnInitMenuPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
const UINT uEnable = MF_BYCOMMAND | MF_ENABLED;
const UINT uDisable = MF_BYCOMMAND | MF_DISABLED | MF_GRAYED;
if (0 == LOWORD(lParam))
{
HMENU hMenu = (HMENU)wParam;
BOOL bSheetOpen = m_spTaskSheet ? TRUE : FALSE;
EnableMenuItem(hMenu, ID_TEST_DOMODAL, bSheetOpen ? uDisable : uEnable);
EnableMenuItem(hMenu, ID_TEST_DOMODELESS, bSheetOpen ? uDisable : uEnable);
EnableMenuItem(hMenu, ID_TEST_CLOSEMODELESS, bSheetOpen ? uEnable : uDisable);
}
return 0;
}
LRESULT CMainWnd::OnDoModal(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CreateTaskSheet(FALSE);
return 0;
}
LRESULT CMainWnd::OnDoModeless(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CreateTaskSheet(TRUE);
return 0;
}
LRESULT CMainWnd::OnCloseModeless(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CloseTaskSheet();
return 0;
}
LRESULT CMainWnd::OnExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
SendMessage(WM_CLOSE);
return 0;
}
HRESULT CMainWnd::CreateTaskSheet(BOOL bModeless)
{
HRESULT hr;
// For sanity
CloseTaskSheet();
hr = m_spTaskSheet.CoCreateInstance(__uuidof(TaskSheet));
if (SUCCEEDED(hr))
{
CComPtr<IPropertyBag> spProps = NULL;
hr = m_spTaskSheet->GetPropertyBag(IID_IPropertyBag, (void**)&spProps);
if (SUCCEEDED(hr))
{
CComVariant var(L"Task Sheet Test");
spProps->Write(TS_PROP_TITLE, &var);
var = 600;
spProps->Write(TS_PROP_WIDTH, &var);
var = 400;
spProps->Write(TS_PROP_HEIGHT, &var);
var = 400;
spProps->Write(TS_PROP_MINWIDTH, &var);
var = 250;
spProps->Write(TS_PROP_MINHEIGHT, &var);
WCHAR szTemp[MAX_PATH];
wnsprintfW(szTemp, ARRAYSIZE(szTemp), L"res://taskapp.exe/%d/%d", RT_BITMAP, IDB_WATERMARK);
var = szTemp;
//var = L"file://c:\\windows\\ua_bkgnd.bmp";
spProps->Write(TS_PROP_WATERMARK, &var);
// Note: Make modeless be resizable and modal not-resizable,
// just to exercise both resizable and not.
// Ditto for showing the statusbar.
var = bModeless;
spProps->Write(TS_PROP_MODELESS, &var);
spProps->Write(TS_PROP_RESIZABLE, &var);
spProps->Write(TS_PROP_STATUSBAR, &var);
ITaskPageFactory *pPageFactory = NULL;
hr = CPageFactory::CreateInstance(&pPageFactory);
if (SUCCEEDED(hr))
{
hr = m_spTaskSheet->Run(pPageFactory, CLSID_CPage1, m_hWnd);
pPageFactory->Release();
}
}
if (!bModeless)
m_spTaskSheet.Release();
}
return hr;
}
HRESULT CMainWnd::CloseTaskSheet()
{
HRESULT hr = E_UNEXPECTED;
if (m_spTaskSheet)
{
hr = m_spTaskSheet->Close();
m_spTaskSheet.Release();
}
return hr;
}