vector<CharSet> GetCharSets(CharRange ranges) { vector<CharSet> ret_val; for(int i = 1; i & static_cast<int>(CharRange::All); i <<= 1) { if(! (i & static_cast<int>(ranges))) continue; CharRange range = static_cast<CharRange>(i); switch(range) { case CharRange::LowerAtoZ: ret_val.push_back(CharSet(GetLowerAtoZ(), range)); break; case CharRange::UpperAtoZ: ret_val.push_back(CharSet(GetUpperAtoZ(), range)); break; case CharRange::Numbers: ret_val.push_back(CharSet(GetNumbers(), range)); break; case CharRange::Symbols: ret_val.push_back(CharSet(GetSymbols(), range)); break; case CharRange::Other: // ignore break; default: assert(false); return ret_val; } } return ret_val; }
/// Clears a number /// @param number The number to clear (one based) /// @return True if the number was cleared, false if not bool AlternateEnding::ClearNumber(wxUint32 number) { //------Last Checked------// // - Jan 12, 2005 wxCHECK(IsValidNumber(number), false); wxWord numbers = GetNumbers(); numbers &= ~(wxWord)(pow(2, (number - 1))); SetNumbers(numbers); return (true); }
/// Sets a number /// @param number The number to set (one based) /// @return True if the number was set, false if not bool AlternateEnding::SetNumber(wxUint32 number) { //------Last Checked------// // - Jan 12, 2005 wxCHECK(IsValidNumber(number), false); // Note: Numbers are stored in zero-based form wxWord numbers = GetNumbers(); numbers |= (wxWord)(pow(2, (number - 1))); return (SetNumbers(numbers)); }
/// Determines if a number is set /// @param number A one-based index of the number to test /// @return True if the number is set, false if not bool AlternateEnding::IsNumberSet(wxUint32 number) const { //------Last Checked------// // - Jan 12, 2005 wxCHECK(IsValidNumber(number), false); // Number is one based, so subtract one number--; // Determine if bit is set wxWord numbers = GetNumbers(); wxWord power = (wxWord)pow(2, number); return ((numbers & power) == power); }
void CNumberShow::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == TIMER_NUMBERS) //显示数字窗口动画 { for (int i = 0; i < 6; i++) //6*6 组合 { for (int j = 1; j < 6; j++) { int p = m_WndRange[i][j].ptr; if (p < m_WndRange[i][j].Count) { m_WndRange[i][j].m_Curx = m_WndRange[i][j].X[p]; m_WndRange[i][j].m_Cury = m_WndRange[i][j].Y[p]; m_WndRange[i][j].ptr = p + 20; //每次步长为20,速度较快 } else { p = m_WndRange[i][j].Count - 1; m_WndRange[i][j].m_Curx = m_WndRange[i][j].X[p]; m_WndRange[i][j].m_Cury = m_WndRange[i][j].Y[p]; } } } int count = 0; for (int i = 0; i < 6; i++) //统计是否每个数字窗口都更新完毕 { for (int j = 0; j < 6; j++) { int p = m_WndRange[i][j].ptr; if (p >= m_WndRange[i][j].Count) { count++; } } } SendMessage(WM_PAINT); if (count == 36) //每个窗口更新结束,停止定时器 { KillTimer(TIMER_NUMBERS); //关闭定时器 m_bIsCreate = true; //动画效果 GetParent()->Invalidate(TRUE); //删除阴影 //SendMessage(WM_PAINT); } } if (nIDEvent == TIMER_FOR_LARGESHOWNUMBERS) //大窗口方式显示数字窗口 { int p = m_WndShowNumbers.ptr; CRect rect; GetClientRect(rect); int disx = m_NowShowNumbersRect.Width() - m_PreShowNumbersRect.Width(); int disy = m_NowShowNumbersRect.Height() - m_PreShowNumbersRect.Height(); if (p < m_WndShowNumbers.Count) { m_WndShowNumbers.m_Curx = m_WndShowNumbers.X[p]; m_WndShowNumbers.m_Cury = m_WndShowNumbers.Y[p]; m_WndShowNumbers.width = m_PreShowNumbersRect.Width() + disx*p / m_WndShowNumbers.Count; m_WndShowNumbers.height = m_PreShowNumbersRect.Height() + disy*p / m_WndShowNumbers.Count; m_pShowNumbers->SetWndRect(CRect(m_WndShowNumbers.m_Curx, m_WndShowNumbers.m_Cury, m_WndShowNumbers.m_Curx + m_WndShowNumbers.width, m_WndShowNumbers.height + m_WndShowNumbers.m_Cury)); m_WndShowNumbers.ptr = p + 80; } else { p = m_WndShowNumbers.Count - 1; m_WndShowNumbers.m_Curx = m_WndShowNumbers.X[p]; m_WndShowNumbers.m_Cury = m_WndShowNumbers.Y[p]; m_WndShowNumbers.width = m_NowShowNumbersRect.Width(); m_WndShowNumbers.height = m_NowShowNumbersRect.Height(); m_pShowNumbers->SetWndRect(CRect(m_WndShowNumbers.m_Curx, m_WndShowNumbers.m_Cury, m_WndShowNumbers.m_Curx + m_WndShowNumbers.width, m_WndShowNumbers.height + m_WndShowNumbers.m_Cury)); KillTimer(TIMER_FOR_LARGESHOWNUMBERS); } } if (nIDEvent == TIMER_FOR_SMALLSHOWNUMBERS) //小窗口方式显示数字窗口 { int p = m_WndShowNumbers.ptr; int disx = m_NowShowNumbersRect.Width() - m_PreShowNumbersRect.Width(); int disy = m_NowShowNumbersRect.Height() - m_PreShowNumbersRect.Height(); if (p < m_WndShowNumbers.Count) { m_WndShowNumbers.m_Curx = m_WndShowNumbers.X[p]; m_WndShowNumbers.m_Cury = m_WndShowNumbers.Y[p]; m_WndShowNumbers.width = m_PreShowNumbersRect.Width() + disx*p / m_WndShowNumbers.Count; m_WndShowNumbers.height = m_PreShowNumbersRect.Height() + disy*p / m_WndShowNumbers.Count; m_pShowNumbers->SetWndRect(CRect(m_WndShowNumbers.m_Curx, m_WndShowNumbers.m_Cury, m_WndShowNumbers.m_Curx + m_WndShowNumbers.width, m_WndShowNumbers.height + m_WndShowNumbers.m_Cury)); m_WndShowNumbers.ptr = p + 80; } else { p = m_WndShowNumbers.Count - 1; m_WndShowNumbers.m_Curx = m_WndShowNumbers.X[p]; m_WndShowNumbers.m_Cury = m_WndShowNumbers.Y[p]; m_WndShowNumbers.width = m_NowShowNumbersRect.Width(); m_WndShowNumbers.height = m_NowShowNumbersRect.Height(); m_pShowNumbers->SetWndRect(m_NumberFrame[5].rect); //更新窗口位置 KillTimer(TIMER_FOR_SMALLSHOWNUMBERS); } } if (nIDEvent == TIMER_FOR_SHOWTASKWND) //显示任务窗口动画 { int p = m_WndTaskRange.ptr; CRect tmprect; if (p < m_WndTaskRange.Count) { tmprect = CRect(m_NumberFrame[0].rect.left, m_NumberFrame[0].rect.top, m_WndTaskRange.X[p], m_WndTaskRange.Y[p]); m_pTaskNumberwnd->SetWndRect(tmprect); m_WndTaskRange.ptr = p + 50; //移动步长为50 } else { p = m_WndTaskRange.Count - 1; tmprect = CRect(m_NumberFrame[0].rect.left, m_NumberFrame[0].rect.top, m_WndTaskRange.X[p], m_WndTaskRange.Y[p]); m_pTaskNumberwnd->SetWndRect(tmprect); KillTimer(TIMER_FOR_SHOWTASKWND); } } if (nIDEvent == TIMER_FOR_SHOWTASKWND) { ShowTaskWnd(); KillTimer(TIMER_FOR_SHOWTASKWND); PostMessage(WM_KEYDOWN, VK_NUMPAD0, 0); //OnRemoveHint(); } if (nIDEvent == TIMER_FOR_POPNUMBERS) //删除数字 { PopNumbers(); //依次删除数字 if (GetNumbers().GetLength() <= 0) //删除完毕,停止 { KillTimer(TIMER_FOR_POPNUMBERS); } InvalidateRect(&(m_NumberFrame[5].rect), FALSE); } __super::OnTimer(nIDEvent); }