// PreviewDlg.cpp : implementation file // #include "stdafx.h" #include "Resource.h" #include "CommandBarsDesigner.h" #include "IPCChannel.h" #include "IPCData.h" #include "PreviewDlg.h" #include "EmbeddedPreviewView.h" #include "EmbeddedPreviewFrame.h" #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #ifndef WS_EX_NOACTIVATE # define WS_EX_NOACTIVATE 0x08000000L #endif ///////////////////////////////////////////////////////////////////////////// // CPreviewDlg dialog CPreviewDlg::CPreviewDlg(CWnd* pParent /*= NULL*/) : CDialog(CPreviewDlg::IDD, pParent) , m_pFrame(NULL) , m_rectTracker(TRUE) , WM_EMBEDDED_PREVIEW_FRAME_ON_MOVE( ::RegisterWindowMessage(EMBEDDED_PREVIEW_FRAME_ON_MOVE_MSG_ID)) { m_pChannel = new CIPCChannel(*this); m_brWorkspace.CreateSolidBrush(::GetSysColor(COLOR_WINDOW)); } CPreviewDlg::~CPreviewDlg() { delete m_pChannel; } BOOL CPreviewDlg::OnInitDialog() { CDialog::OnInitDialog(); CWnd* pParent = GetParent(); if (NULL != pParent && ::IsWindow(*pParent)) { m_pChannel->OpenClientChannel(*this, *pParent); m_pFrame = new CEmbeddedPreviewFrame(); if (m_pFrame->LoadFrame(IDR_EMBEDDEDFRAME, WS_CHILD | WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, this, NULL)) { SyncFrameSize(); } else { delete m_pFrame; m_pFrame = NULL; Close(); } } else { Close(); } return TRUE; } void CPreviewDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BOOL CPreviewDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) { BOOL bResult = m_pChannel->ProcessMessage(message, wParam, lParam, *pResult); if (!bResult) { bResult = CDialog::OnWndMsg(message, wParam, lParam, pResult); if (WM_EMBEDDED_PREVIEW_FRAME_ON_MOVE == message) { if (m_pFrame) { CRect rect; m_pFrame->GetWindowRect(&rect); ScreenToClient(&rect); m_rectTracker.m_rect = rect; Invalidate(TRUE); bResult = TRUE; } } } return bResult; } LRESULT CPreviewDlg::OnIPCNotificationReceived(WORD wCode, LPARAM lParam) { TRACE(_T("OnIPCNotificationReceived: wCode=%i, lParam=%i\n"), wCode, lParam); switch (wCode) { case ipcNtfReposition: OnNtfReposition(); break; case ipcNtfSetWorkspaceColor: OnNtfSetWorkspaceColor(static_cast(lParam)); break; case ipcNtfHideMenu: OnNtfHideMenu(); break; } return 0; } LRESULT CPreviewDlg::OnIPCDataReceived(WORD wCode, const void* pData, SIZE_T cbSize) { TRACE(_T("OnIPCDataReceived: wCode=%i, cbSize = %i\n"), wCode, cbSize); switch (wCode) { case ipcNtfCommandBarsData: OnNtfCommandBarsData(reinterpret_cast(pData)); break; case ipcNtfSetTitle: OnNtfSetTitle(reinterpret_cast(pData)); break; case ipcNtfPreviewSettings: OnNtfPreviewSettings(reinterpret_cast(pData)); break; } return 0; } void CPreviewDlg::OnIPCPeerDisconnected() { TRACE(_T("OnIPCPeerDisconnected\n")); Close(); } void CPreviewDlg::UpdatePosition(BOOL bShow /*= FALSE*/) { _ASSERTE(NULL != GetParent()); _ASSERTE(::IsWindow(*GetParent())); if (IsWindowVisible()) { if (!bShow) ShowWindow(SW_HIDE); } else { if (bShow) ShowWindow(SW_SHOW); } CRect rcOwner; GetParent()->GetClientRect(&rcOwner); SetWindowPos(NULL, rcOwner.left, rcOwner.top, rcOwner.Width(), rcOwner.Height(), SWP_NOZORDER | SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE); } void CPreviewDlg::Close() { DestroyWindow(); ::PostQuitMessage(0); TRACE(_T("Close\n")); } void CPreviewDlg::SyncFrameSize() { if (NULL != m_pFrame) { m_pFrame->SetWindowPos(NULL, m_rectTracker.m_rect.left, m_rectTracker.m_rect.top, m_rectTracker.m_rect.Width(), m_rectTracker.m_rect.Height(), SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOZORDER); } } void CPreviewDlg::OnNtfReposition() { UpdatePosition(GetParent()->IsWindowVisible()); } void CPreviewDlg::OnNtfCommandBarsData(LPCTSTR xmlData) { if (NULL != m_pFrame) { m_pFrame->SetCommandBarsData(xmlData); } } void CPreviewDlg::OnNtfSetTitle(LPCTSTR lpTitle) { _ASSERTE(NULL != lpTitle); if (NULL != m_pFrame) { m_pFrame->SetWindowText(lpTitle); } } void CPreviewDlg::OnNtfPreviewSettings(const PREVIEW_SETTINGS* pSettings) { if (NULL != m_pFrame) { m_pFrame->SetSettings(pSettings); } Invalidate(); UpdateWindow(); } void CPreviewDlg::OnNtfSetWorkspaceColor(COLORREF crWorkspace) { m_brWorkspace.DeleteObject(); m_brWorkspace.CreateSolidBrush(crWorkspace); Invalidate(); UpdateWindow(); } void CPreviewDlg::OnNtfHideMenu() { SAFE_CALLPTR(m_pFrame, HideMenu()); } BEGIN_MESSAGE_MAP(CPreviewDlg, CDialog) //{{AFX_MSG_MAP(CPreviewDlg) ON_WM_CTLCOLOR() ON_WM_SETCURSOR() ON_WM_LBUTTONDOWN() ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() HBRUSH CPreviewDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hBrush = NULL; if (CTLCOLOR_DLG == nCtlColor) { hBrush = reinterpret_cast(m_brWorkspace.m_hObject); } else { hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); } return hBrush; } BOOL CPreviewDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { CPoint point; GetCursorPos(&point); pWnd->ScreenToClient(&point); int nHit = m_rectTracker.HitTest(point); switch (nHit) { case CRectTracker::hitRight: ::SetCursor(::LoadCursor(0, IDC_SIZEWE)); return TRUE; case CRectTracker::hitBottom: ::SetCursor(::LoadCursor(0, IDC_SIZENS)); return TRUE; case CRectTracker::hitBottomRight: ::SetCursor(::LoadCursor(0, IDC_SIZENWSE)); return TRUE; } return CDialog::OnSetCursor(pWnd, nHitTest, message); } void CPreviewDlg::OnLButtonDown(UINT nFlags, CPoint point) { if (NULL != m_pFrame) { int nHit = m_rectTracker.HitTest(point); if (nHit != CRectTracker::hitMiddle) { if (m_rectTracker.Track(this, point)) { SyncFrameSize(); Invalidate(TRUE); } } } CDialog::OnLButtonDown(nFlags, point); } void CPreviewDlg::OnPaint() { CPaintDC dc(this); m_rectTracker.Draw(&dc); }