📄 mainfrm.h
字号:
class CHelloView : public CWindowImpl<CHelloView>
{
public:
COLORREF m_clrText;
//state of color buttons
BOOL m_bBlack;
BOOL m_bRed;
BOOL m_bBlue;
BOOL m_bGreen;
BOOL m_bWhite;
BOOL m_bCustom;
CUpdateUIBase* m_pUpdateUI;
CHelloView(CUpdateUIBase* pUpdateUI) : m_clrText(RGB(0, 0, 0)),
m_bBlack(TRUE),
m_bRed(FALSE),
m_bBlue(FALSE),
m_bGreen(FALSE),
m_bWhite(FALSE),
m_bCustom(FALSE),
m_pUpdateUI(pUpdateUI)
{ }
DECLARE_WND_CLASS(NULL)
void ClearAllColors()
{
m_bBlack = m_bBlue = m_bRed = FALSE;
m_bWhite = m_bGreen = FALSE;
}
void MixColors()
{
COLORREF tmpClr;
int r, g, b;
BOOL bSetColor;
// Determine which colors are currently chosen.
bSetColor = m_bRed || m_bGreen || m_bBlue || m_bWhite || m_bBlack;
// If the current color is custom, ignore mix request.
if(!bSetColor && m_bCustom)
return;
// Set color value to black and then add the necessary colors.
r = g = b = 0;
if(m_bRed)
r = 255;
if(m_bGreen)
g = 255;
if(m_bBlue)
b = 255;
tmpClr = RGB(r, g, b);
// NOTE: Because a simple algorithm is used to mix colors
// if the current selection contains black or white, the
// result will be black or white; respectively. This is due
// to the additive method for mixing the colors.
if(m_bBlack)
tmpClr = RGB(0, 0, 0);
if(m_bWhite)
tmpClr = RGB(255, 255, 255);
// Once the color has been determined, update document
// data, and force repaint of all views.
if(!bSetColor)
m_bBlack = TRUE;
m_clrText = tmpClr;
m_bCustom = FALSE;
UpdateButtons();
Invalidate();
}
void UpdateButtons()
{
m_pUpdateUI->UISetCheck(ID_BLACK, m_bBlack);
m_pUpdateUI->UISetCheck(ID_RED, m_bRed);
m_pUpdateUI->UISetCheck(ID_GREEN, m_bGreen);
m_pUpdateUI->UISetCheck(ID_BLUE, m_bBlue);
m_pUpdateUI->UISetCheck(ID_WHITE, m_bWhite);
m_pUpdateUI->UISetCheck(ID_CUSTOM, m_bCustom);
}
virtual void OnFinalMessage(HWND /*hWnd*/)
{
delete this;
}
BEGIN_MSG_MAP(CHelloView)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
COMMAND_RANGE_HANDLER(ID_BLACK, ID_WHITE, OnColor)
COMMAND_ID_HANDLER(ID_CUSTOM, OnCustomColor)
END_MSG_MAP()
LRESULT OnPaint(UINT, WPARAM, LPARAM, BOOL&)
{
CPaintDC dc(m_hWnd);
RECT rect;
GetClientRect(&rect);
dc.SetTextColor(m_clrText);
dc.SetBkColor(::GetSysColor(COLOR_WINDOW));
dc.DrawText(_T("Hello, ATL"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
return 0;
}
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->UISetCheck(ID_SPEED_SLOW, 0);
m_pUpdateUI->UISetCheck(ID_SPEED_FAST, 0);
m_pUpdateUI->UIEnable(ID_SPEED_SLOW, FALSE);
m_pUpdateUI->UIEnable(ID_SPEED_FAST, FALSE);
UpdateButtons();
bHandled = FALSE;
return 1;
}
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_clrText);
if(dlgColor.DoModal() == IDOK)
{
m_clrText = dlgColor.GetColor();
ClearAllColors();
m_bCustom = TRUE;
UpdateButtons();
Invalidate();
}
return 0;
}
};
class CHelloWnd : public CMDIChildWindowImpl<CHelloWnd>
{
public:
CHelloView* m_pView;
CUpdateUIBase* m_pUpdateUI;
CHelloWnd(CUpdateUIBase* pUpdateUI) : m_pView(NULL), m_pUpdateUI(pUpdateUI)
{ }
DECLARE_FRAME_WND_CLASS(NULL, IDR_HELLOTYPE)
virtual void OnFinalMessage(HWND /*hWnd*/)
{
delete this;
}
BEGIN_MSG_MAP(CHelloWnd)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
CHAIN_CLIENT_COMMANDS()
CHAIN_MSG_MAP(CMDIChildWindowImpl<CHelloWnd>)
END_MSG_MAP()
LRESULT OnCreate(UINT, WPARAM, LPARAM lParam, BOOL& bHandled)
{
m_pView = new CHelloView(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;
}
};
#define ABS(x) ((x) < 0? -(x) : (x) > 0? (x) : 0)
class CBounceView : public CWindowImpl<CBounceView>
{
public:
COLORREF m_clrBall;
//state of color buttons
BOOL m_bBlack;
BOOL m_bRed;
BOOL m_bBlue;
BOOL m_bGreen;
BOOL m_bWhite;
BOOL m_bCustom;
BOOL m_bFastSpeed; // current speed
POINT m_ptPixel; // pixel size
SIZE m_sizeRadius; // radius of ball
SIZE m_sizeMove; // move speed
SIZE m_sizeTotal; // total size for ball bitmap
POINT m_ptCenter; // current center for the ball
CBitmap m_bmBall; // for replicating bouncing ball
CUpdateUIBase* m_pUpdateUI;
CBounceView(CUpdateUIBase* pUpdateUI) : m_clrBall(RGB(0, 0, 0)),
m_bBlack(TRUE),
m_bRed(FALSE),
m_bBlue(FALSE),
m_bGreen(FALSE),
m_bWhite(FALSE),
m_bCustom(FALSE),
m_bFastSpeed(FALSE), m_pUpdateUI(pUpdateUI)
{ }
DECLARE_WND_CLASS(NULL)
HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0,
UINT nID = 0, LPVOID lpCreateParam = NULL)
{
CWndClassInfo& wci = GetWndClassInfo();
wci.m_lpszCursorID = IDC_SIZENS;
ATOM atom = wci.Register(&m_pfnSuperWindowProc);
return CWindowImplBase::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle,
nID, atom);
}
void ClearAllColors()
{
m_bBlack = m_bBlue = m_bRed = FALSE;
m_bWhite = m_bGreen = FALSE;
}
void MixColors()
{
COLORREF tmpClr;
int r, g, b;
BOOL bSetColor;
// Determine which colors are currently chosen.
bSetColor = m_bRed || m_bGreen || m_bBlue || m_bWhite || m_bBlack;
// If the current color is custom, ignore mix request.
if(!bSetColor && m_bCustom)
return;
// Set color value to black and then add the necessary colors.
r = g = b = 0;
if(m_bRed)
r = 255;
if(m_bGreen)
g = 255;
if(m_bBlue)
b = 255;
tmpClr = RGB(r, g, b);
// NOTE: Because a simple algorithm is used to mix colors
// if the current selection contains black or white, the
// result will be black or white; respectively. This is due
// to the additive method for mixing the colors.
if(m_bBlack)
tmpClr = RGB(0, 0, 0);
if(m_bWhite)
tmpClr = RGB(255, 255, 255);
// Once the color has been determined, update document
// data, and force repaint of all views.
if(!bSetColor)
m_bBlack = TRUE;
m_clrBall = tmpClr;
m_bCustom = FALSE;
UpdateColorButtons();
MakeNewBall();
Invalidate();
}
void UpdateColorButtons()
{
m_pUpdateUI->UISetCheck(ID_BLACK, m_bBlack);
m_pUpdateUI->UISetCheck(ID_RED, m_bRed);
m_pUpdateUI->UISetCheck(ID_GREEN, m_bGreen);
m_pUpdateUI->UISetCheck(ID_BLUE, m_bBlue);
m_pUpdateUI->UISetCheck(ID_WHITE, m_bWhite);
m_pUpdateUI->UISetCheck(ID_CUSTOM, m_bCustom);
}
void UpdateSpeedButtons()
{
m_pUpdateUI->UISetCheck(ID_SPEED_SLOW, !m_bFastSpeed);
m_pUpdateUI->UISetCheck(ID_SPEED_FAST, m_bFastSpeed);
}
void MakeNewBall()
{
m_sizeTotal.cx = (m_sizeRadius.cx + ABS(m_sizeMove.cx)) << 1;
m_sizeTotal.cy = (m_sizeRadius.cy + ABS(m_sizeMove.cy)) << 1;
if(m_bmBall.m_hBitmap != NULL)
m_bmBall.DeleteObject(); // get rid of old bitmap
CClientDC dc(m_hWnd);
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
m_bmBall.CreateCompatibleBitmap(dc, m_sizeTotal.cx, m_sizeTotal.cy);
_ASSERTE(m_bmBall.m_hBitmap != NULL);
dcMem.SelectBitmap(m_bmBall);
// draw a rectangle in the background (window) color
RECT rect = { 0, 0, m_sizeTotal.cx, m_sizeTotal.cy };
CBrush brBackground;
brBackground.CreateSolidBrush(::GetSysColor(COLOR_WINDOW));
dcMem.FillRect(&rect, brBackground);
CBrush brCross;
brCross.CreateHatchBrush(HS_DIAGCROSS, 0L);
dcMem.SelectBrush(brCross);
dcMem.SetBkColor(m_clrBall);
dcMem.Ellipse(ABS(m_sizeMove.cx), ABS(m_sizeMove.cy),
m_sizeTotal.cx - ABS(m_sizeMove.cx),
m_sizeTotal.cy - ABS(m_sizeMove.cy));
}
virtual void OnFinalMessage(HWND /*hWnd*/)
{
delete this;
}
BEGIN_MSG_MAP(CBounceView)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
COMMAND_RANGE_HANDLER(ID_BLACK, ID_WHITE, OnColor)
COMMAND_ID_HANDLER(ID_CUSTOM, OnCustomColor)
COMMAND_ID_HANDLER(ID_SPEED_SLOW, OnChangeSpeed)
COMMAND_ID_HANDLER(ID_SPEED_FAST, OnChangeSpeed)
END_MSG_MAP()
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL& bHandled)
{
#if (_ATL_VER >= 0x0300)
if(!SetTimer(1, 100)) // start slow
#else
if(!SetTimer(1, 100, NULL)) // start slow
#endif //(_ATL_VER == 0x0300)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -