示例#1
0
    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);
}
示例#5
0
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);
}