📄 mainfrm.h
字号:
{
MessageBox(_T("Not enough timers available for this window."),
_T("MDI:Bounce"), MB_ICONEXCLAMATION | MB_OK);
// signal creation failure...
return -1;
}
CClientDC dc(m_hWnd);
m_ptPixel.x = dc.GetDeviceCaps(ASPECTX);
m_ptPixel.y = dc.GetDeviceCaps(ASPECTY);
bHandled = FALSE;
return 1;
}
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_pUpdateUI->UIEnable(ID_BLACK, TRUE);
m_pUpdateUI->UIEnable(ID_RED, TRUE);
m_pUpdateUI->UIEnable(ID_GREEN, TRUE);
m_pUpdateUI->UIEnable(ID_BLUE, TRUE);
m_pUpdateUI->UIEnable(ID_WHITE, TRUE);
m_pUpdateUI->UIEnable(ID_CUSTOM, TRUE);
m_pUpdateUI->UIEnable(ID_SPEED_SLOW, TRUE);
m_pUpdateUI->UIEnable(ID_SPEED_FAST, TRUE);
UpdateColorButtons();
UpdateSpeedButtons();
bHandled = FALSE;
return 1;
}
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int cx = LOWORD(lParam);
int cy = HIWORD(lParam);
LONG lScale;
m_ptCenter.x = cx >> 1;
m_ptCenter.y = cy >> 1;
m_ptCenter.x += cx >> 3; // make the ball a little off-center
lScale = min((LONG)cx * m_ptPixel.x,
(LONG)cy * m_ptPixel.y) >> 4;
m_sizeRadius.cx = (int)(lScale / m_ptPixel.x);
m_sizeRadius.cy = (int)(lScale / m_ptPixel.y);
m_sizeMove.cx = max(1, m_sizeRadius.cy >> 2);
m_sizeMove.cy = max(1, m_sizeRadius.cy >> 2);
MakeNewBall();
bHandled = FALSE;
return 1;
}
LRESULT OnTimer(UINT, WPARAM, LPARAM, BOOL& bHandled)
{
if (m_bmBall.m_hBitmap == NULL)
return 1; // no bitmap for the ball
RECT rcClient;
GetClientRect(&rcClient);
CClientDC dc(m_hWnd);
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
dcMem.SelectBitmap(m_bmBall);
dc.BitBlt(m_ptCenter.x - m_sizeTotal.cx / 2,
m_ptCenter.y - m_sizeTotal.cy / 2,
m_sizeTotal.cx, m_sizeTotal.cy,
dcMem, 0, 0, SRCCOPY);
m_ptCenter.x += m_sizeMove.cx;
m_ptCenter.y += m_sizeMove.cy;
if((m_ptCenter.x + m_sizeRadius.cx >= rcClient.right) ||
(m_ptCenter.x - m_sizeRadius.cx <= 0))
{
m_sizeMove.cx = -m_sizeMove.cx;
}
if((m_ptCenter.y + m_sizeRadius.cy >= rcClient.bottom) ||
(m_ptCenter.y - m_sizeRadius.cy <= 0))
{
m_sizeMove.cy = -m_sizeMove.cy;
}
return 0;
}
LRESULT OnColor(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
switch(wID)
{
case ID_BLACK:
ClearAllColors();
m_bBlack = !(m_bBlack);
break;
case ID_WHITE:
ClearAllColors();
m_bWhite = !(m_bWhite);
break;
case ID_RED:
m_bRed = !(m_bRed);
m_bBlack = FALSE;
m_bWhite = FALSE;
break;
case ID_GREEN:
m_bGreen = !(m_bGreen);
m_bBlack = FALSE;
m_bWhite = FALSE;
break;
case ID_BLUE:
m_bBlue = !(m_bBlue);
m_bBlack = FALSE;
m_bWhite = FALSE;
break;
default:
TCHAR buff[256];
::LoadString(_Module.GetResourceInstance(), IDS_UNKCOLOR, buff, 255);
MessageBox(buff);
return 1;
}
MixColors();
return 0;
}
LRESULT OnCustomColor(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CColorDialog dlgColor(m_clrBall);
if(dlgColor.DoModal() == IDOK)
{
m_clrBall = dlgColor.GetColor();
ClearAllColors();
m_bCustom = TRUE;
UpdateColorButtons();
MakeNewBall();
Invalidate();
}
return 0;
}
LRESULT OnChangeSpeed(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
m_bFastSpeed = (wID == ID_SPEED_FAST) ? TRUE : FALSE;
UpdateSpeedButtons();
KillTimer(1);
#if (_ATL_VER >= 0x0300)
if(!SetTimer(1, m_bFastSpeed ? 0 : 100))
#else
if(!SetTimer(1, m_bFastSpeed ? 0 : 100, NULL))
#endif //(_ATL_VER == 0x0300)
{
MessageBox(_T("Not enough timers available for this window."),
_T("MDI:Bounce"), MB_ICONEXCLAMATION | MB_OK);
DestroyWindow();
}
return 0;
}
};
class CBounceWnd : public CMDIChildWindowImpl<CBounceWnd>
{
public:
CBounceView* m_pView;
CUpdateUIBase* m_pUpdateUI;
CBounceWnd(CUpdateUIBase* pUpdateUI) : m_pView(NULL), m_pUpdateUI(pUpdateUI)
{ }
DECLARE_FRAME_WND_CLASS(NULL, IDR_BOUNCETYPE)
HWND Create(HWND hWndParent, WTL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0,
UINT nMenuID = 0, LPVOID lpCreateParam = NULL)
{
CFrameWndClassInfo& wci = GetWndClassInfo();
wci.m_lpszCursorID = IDC_UPARROW;
return CMDIChildWindowImpl<CBounceWnd>::Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, nMenuID, lpCreateParam);
}
virtual void OnFinalMessage(HWND /*hWnd*/)
{
delete this;
}
BEGIN_MSG_MAP(CBounceWnd)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
CHAIN_CLIENT_COMMANDS()
CHAIN_MSG_MAP(CMDIChildWindowImpl<CBounceWnd>)
END_MSG_MAP()
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL& bHandled)
{
m_pView = new CBounceView(m_pUpdateUI);
RECT rect = { 0, 0, 1, 1 };
m_hWndClient = m_pView->Create(m_hWnd, rect, NULL, WS_CHILD | WS_VISIBLE, WS_EX_CLIENTEDGE);
bHandled = FALSE;
return 1;
}
};
class CAboutDlg : public CDialogImpl<CAboutDlg>
{
public:
enum { IDD = IDD_ABOUTDLG };
BEGIN_MSG_MAP(CAboutDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnCloseCmd)
COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd)
END_MSG_MAP()
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CenterWindow(GetParent());
return (LRESULT)TRUE;
}
LRESULT OnCloseCmd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
};
class CMDIFrame : public CMDIFrameWindowImpl<CMDIFrame>, CUpdateUI<CMDIFrame>,
public CMessageFilter, public CUpdateUIObject
{
public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)
virtual BOOL PreTranslateMessage(MSG* pMsg)
{
return CMDIFrameWindowImpl<CMDIFrame>::PreTranslateMessage(pMsg);
}
virtual BOOL DoUpdate()
{
UIUpdateToolBar();
return FALSE;
}
BEGIN_MSG_MAP(CMDIFrame)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)
COMMAND_ID_HANDLER(ID_FILE_NEWBOUNCE, OnBounce)
COMMAND_ID_HANDLER(ID_FILE_NEWHELLO, OnHello)
COMMAND_ID_HANDLER(ID_WINDOW_CASCADE, OnWindowCascade)
COMMAND_ID_HANDLER(ID_WINDOW_TILE_HORZ, OnWindowTile)
COMMAND_ID_HANDLER(ID_WINDOW_ARRANGE, OnWindowArrangeIcons)
COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)
COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
CHAIN_MDI_CHILD_COMMANDS()
CHAIN_MSG_MAP(CUpdateUI<CMDIFrame>)
CHAIN_MSG_MAP(CMDIFrameWindowImpl<CMDIFrame>)
END_MSG_MAP()
BEGIN_UPDATE_UI_MAP(CMDIFrame)
UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP)
UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP)
UPDATE_ELEMENT(ID_BLACK, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_RED, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_GREEN, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_BLUE, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_WHITE, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_CUSTOM, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_SPEED_SLOW, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_SPEED_FAST, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
END_UPDATE_UI_MAP()
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CreateSimpleToolBar(IDR_MAINFRAME);
CreateSimpleStatusBar(_T("Ready"));
CreateMDIClient();
UIAddToolBar(m_hWndToolBar);
UISetCheck(ID_VIEW_TOOLBAR, 1);
UISetCheck(ID_VIEW_STATUS_BAR, 1);
UIEnable(ID_BLACK, FALSE);
UIEnable(ID_RED, FALSE);
UIEnable(ID_GREEN, FALSE);
UIEnable(ID_BLUE, FALSE);
UIEnable(ID_WHITE, FALSE);
UIEnable(ID_CUSTOM, FALSE);
UIEnable(ID_SPEED_SLOW, FALSE);
UIEnable(ID_SPEED_FAST, FALSE);
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddUpdateUI(this);
return 0;
}
LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
UISetCheck(ID_BLACK, 0);
UISetCheck(ID_RED, 0);
UISetCheck(ID_GREEN, 0);
UISetCheck(ID_BLUE, 0);
UISetCheck(ID_WHITE, 0);
UISetCheck(ID_CUSTOM, 0);
UISetCheck(ID_SPEED_SLOW, 0);
UISetCheck(ID_SPEED_FAST, 0);
UIEnable(ID_BLACK, FALSE);
UIEnable(ID_RED, FALSE);
UIEnable(ID_GREEN, FALSE);
UIEnable(ID_BLUE, FALSE);
UIEnable(ID_WHITE, FALSE);
UIEnable(ID_CUSTOM, FALSE);
UIEnable(ID_SPEED_SLOW, FALSE);
UIEnable(ID_SPEED_FAST, FALSE);
bHandled = FALSE;
return 1;
}
LRESULT OnFileExit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
PostMessage(WM_CLOSE);
return 0;
}
LRESULT OnBounce(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CBounceWnd* pChild = new CBounceWnd((CUpdateUIBase*)this);
pChild->CreateEx(m_hWndClient, NULL, _T("Bounce"));
return 0;
}
LRESULT OnHello(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CHelloWnd* pChild = new CHelloWnd((CUpdateUIBase*)this);
pChild->CreateEx(m_hWndClient, NULL, _T("Hello"));
return 0;
}
LRESULT OnWindowCascade(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
MDICascade(0);
return 0;
}
LRESULT OnWindowTile(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
MDITile(MDITILE_HORIZONTAL);
return 0;
}
LRESULT OnWindowArrangeIcons(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
MDIIconArrange();
return 0;
}
LRESULT OnViewToolBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
BOOL bNew = !::IsWindowVisible(m_hWndToolBar);
::ShowWindow(m_hWndToolBar, bNew ? SW_SHOWNOACTIVATE : SW_HIDE);
UISetCheck(ID_VIEW_TOOLBAR, bNew);
UpdateLayout();
return 0;
}
LRESULT OnViewStatusBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
BOOL bNew = !::IsWindowVisible(m_hWndStatusBar);
::ShowWindow(m_hWndStatusBar, bNew ? SW_SHOWNOACTIVATE : SW_HIDE);
UISetCheck(ID_VIEW_STATUS_BAR, bNew);
UpdateLayout();
return 0;
}
LRESULT OnAppAbout(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CAboutDlg dlg;
dlg.DoModal();
return 0;
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -