www.pudn.com > vcppnet2.rar > RygWnd.cpp


// RygWnd.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Ex20d.h" 
#include "RygWnd.h" 
 
LRESULT CALLBACK AFX_EXPORT 
    RygWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
 
    CWnd* pWnd; 
 
    pWnd = CWnd::FromHandlePermanent(hWnd); 
    if (pWnd == NULL) { 
        // Assume that client created a CRygWnd window 
        pWnd = new CRygWnd(); 
        pWnd->Attach(hWnd); 
    } 
    ASSERT(pWnd->m_hWnd == hWnd); 
    ASSERT(pWnd == CWnd::FromHandlePermanent(hWnd)); 
    LRESULT lResult = AfxCallWndProc(pWnd, hWnd, message, 
                                     wParam, lParam); 
    return lResult; 
} 
 
 
// static data members 
CRect  CRygWnd::s_rect(-500, 1000, 500, -1000); // outer rectangle 
CPoint CRygWnd::s_point(300, 300); // rounded corners 
CRect  CRygWnd::s_rColor[] = {CRect(-250, 800, 250, 300), 
                              CRect(-250, 250, 250, -250), 
                              CRect(-250, -300, 250, -800)}; 
CBrush CRygWnd::s_bColor[] = {RGB(192, 192, 192), 
                              RGB(0xFF, 0x00, 0x00), 
                              RGB(0xFF, 0xFF, 0x00), 
                              RGB(0x00, 0xFF, 0x00)}; 
 
BOOL CRygWnd::RegisterWndClass(HINSTANCE hInstance) // static member 
                                                    //  function 
{ 
    WNDCLASS wc; 
    wc.lpszClassName = "RYG"; // matches class name in client 
    wc.hInstance = hInstance; 
    wc.lpfnWndProc = RygWndProc; 
    wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); 
    wc.hIcon = 0; 
    wc.lpszMenuName = NULL; 
    wc.hbrBackground = (HBRUSH) ::GetStockObject(LTGRAY_BRUSH); 
    wc.style = CS_GLOBALCLASS; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    return (::RegisterClass(&wc) != 0); 
} 
 
 
// CRygWnd 
 
IMPLEMENT_DYNAMIC(CRygWnd, CWnd) 
CRygWnd::CRygWnd() 
{ 
	m_nState = 0; 
    TRACE("CRygWnd constructor\n"); 
} 
 
CRygWnd::~CRygWnd() 
{ 
	TRACE("CRygWnd destructor\n"); 
} 
 
 
BEGIN_MESSAGE_MAP(CRygWnd, CWnd) 
	ON_MESSAGE(RYG_SETSTATE, OnSetState) 
    ON_MESSAGE(RYG_GETSTATE, OnGetState) 
	ON_WM_PAINT() 
	ON_WM_LBUTTONDOWN() 
END_MESSAGE_MAP() 
 
void CRygWnd::SetMapping(CDC* pDC) 
{ 
    CRect clientRect; 
    GetClientRect(clientRect); 
    pDC->SetMapMode(MM_ISOTROPIC); 
    pDC->SetWindowExt(1000, 2000); 
    pDC->SetViewportExt(clientRect.right, -clientRect.bottom); 
    pDC->SetViewportOrg(clientRect.right / 2, clientRect.bottom / 2); 
} 
 
void CRygWnd::UpdateColor(CDC* pDC, int n) 
{ 
    if (m_nState == n + 1) { 
        pDC->SelectObject(&s_bColor[n+1]); 
    } 
    else { 
        pDC->SelectObject(&s_bColor[0]); 
    } 
    pDC->Ellipse(s_rColor[n]); 
} 
 
 
// CRygWnd message handlers 
 
 
void CRygWnd::OnPaint() 
{ 
	int i; 
    CPaintDC dc(this); // device context for painting 
    SetMapping(&dc); 
    dc.SelectStockObject(DKGRAY_BRUSH); 
    dc.RoundRect(s_rect, s_point); 
    for (i = 0; i < 3; i++) { 
        UpdateColor(&dc, i); 
    } 
 
} 
 
void CRygWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
	 
    // Notification code is HIWORD of wParam, 0 in this case 
    GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID(), 
        (LONG) GetSafeHwnd()); // 0 
 
} 
 
void CRygWnd::PostNcDestroy() 
{ 
	TRACE("CRygWnd::PostNcDestroy\n"); 
    delete this; // CWnd::PostNcDestroy does nothing 
} 
 
LRESULT CRygWnd::OnSetState(WPARAM wParam, LPARAM lParam) 
{ 
    TRACE("CRygWnd::SetState, wParam = %d\n", wParam); 
    m_nState = (int) wParam; 
    Invalidate(FALSE); 
    return 0L; 
} 
 
LRESULT CRygWnd::OnGetState(WPARAM wParam, LPARAM lParam) 
{ 
    TRACE("CRygWnd::GetState\n"); 
    return m_nState; 
}