⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childview.cpp

📁 一个完整的彩票软件的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ChildView.cpp : implementation of the CChildView class
//

#include "stdafx.h"
#include "Lottery.h"
#include "ChildView.h"
#include "DlgChoseNumber.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define C_30_7	2035800
#define C_30_8	5852925
CChildView *pCV;
extern CListCtrl * g_pList;
/////////////////////////////////////////////////////////////////////////////
// CChildView

CChildView::CChildView()
{
	m_nMin=2;
	m_nMax=10;
}

CChildView::~CChildView()
{
	if (m_pFreq) delete [] m_pFreq;
}


BEGIN_MESSAGE_MAP(CChildView,CWnd )
	//{{AFX_MSG_MAP(CChildView)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_COMMAND(ID_FREQUENCY_STATISTICS, OnFrequencyStatistics)
	ON_COMMAND(ID_EVEN_ODD_STATISTICS, OnEvenOddStatistics)
	ON_COMMAND(IDD_CONNTINUED_NUMBER, OnConntinuedNumber)
	ON_COMMAND(IDD_SEGMENT_STATISTICS, OnSegmentStatistics)
	ON_COMMAND(ID_RELATION_STATISTICS, OnRelationStatistics)
	ON_COMMAND(ID_LOTTERY, OnLottery)
	ON_NOTIFY(NM_RCLICK,IDC_LISTCTRL_LOTTERY,OnListRClick)
	ON_NOTIFY(NM_CLICK,IDC_LISTCTRL_LOTTERY,OnListClick)
	ON_NOTIFY(LVN_KEYDOWN,IDC_LISTCTRL_LOTTERY,OnListKeydown)
	ON_COMMAND(ID_SETUP_STATISTICS_NUMBER, OnSetupStatisticsNumber)
	ON_COMMAND(ID_SHOW_CURVE_VIEW, OnShowCurveView)
	ON_COMMAND(ID_SHOW_SEQUENCY, OnShowSequency)
	ON_COMMAND(ID_SHOW_GRAPH_LIST, OnShowGraphList)
	ON_UPDATE_COMMAND_UI(ID_SHOW_GRAPH_LIST, OnUpdateShowGraphList)
	ON_COMMAND(ID_SHOW_SUM_WINDOW, OnShowSumWindow)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);

	return TRUE;
}

void CChildView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
}


int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd ::OnCreate(lpCreateStruct) == -1)
		return -1;

	pCV=this;

	CRect rect;
	GetClientRect(&rect);
	m_list.Create(LVS_NOSORTHEADER|WS_TABSTOP|LVS_REPORT|LVS_SHOWSELALWAYS|WS_VISIBLE|WS_BORDER|WS_CHILD,rect,this,IDC_LISTCTRL_LOTTERY);
	m_list.InsertColumn(0,"期号",LVCFMT_CENTER,30,0);
	m_list.InsertColumn(1," 1 ",LVCFMT_CENTER,30,1);
	m_list.InsertColumn(2," 2 ",LVCFMT_CENTER,30,2);
	m_list.InsertColumn(3," 3 ",LVCFMT_CENTER,30,3);
	m_list.InsertColumn(4," 4 ",LVCFMT_CENTER,30,4);
	m_list.InsertColumn(5," 5 ",LVCFMT_CENTER,30,5);
	m_list.InsertColumn(6," 6 ",LVCFMT_CENTER,30,6);
	m_list.InsertColumn(7," 7 ",LVCFMT_CENTER,30,7);
	m_list.InsertColumn(8,"特号",LVCFMT_CENTER,30,8);
	
	m_listFrequency.Create(LVS_NOSORTHEADER|LVS_REPORT|WS_VISIBLE|WS_CHILD|WS_BORDER,rect,this,IDC_LISTBOX_FREQUENCY);
	m_listRelation.Create(LVS_NOSORTHEADER|LVS_REPORT|WS_VISIBLE|WS_CHILD|WS_BORDER,rect,this,IDC_LISTBOX_RELATION);
	m_listConntinue.Create(LVS_NOSORTHEADER|LVS_REPORT|WS_VISIBLE|WS_CHILD|WS_BORDER,rect,this,IDC_LISTBOX_CONNTINUE);


	DWORD style=m_list.GetExtendedStyle();
	style |=(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_FLATSB|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE);
	m_list.SetExtendedStyle(style);
	m_listFrequency.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);
	m_listRelation.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);
	m_listConntinue.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);
/*	m_list.SetTextBkColor(RGB(64,64,64));
	m_list.SetBkColor(RGB(64,64,64));
	m_list.SetTextColor(RGB(255,255,0));
	m_listFrequency.SetTextBkColor(RGB(64,64,64));
	m_listFrequency.SetBkColor(RGB(64,64,64));
	m_listFrequency.SetTextColor(RGB(255,255,0));
	m_listRelation.SetTextBkColor(RGB(64,64,64));
	m_listRelation.SetBkColor(RGB(64,64,64));
	m_listRelation.SetTextColor(RGB(255,255,0));
	m_listConntinue.SetTextBkColor(RGB(64,64,64));
	m_listConntinue.SetBkColor(RGB(64,64,64));
	m_listConntinue.SetTextColor(RGB(255,255,0));*/
	m_iWidth=5;

	m_bShowGraph=FALSE;
	m_GraphList.Create(LVS_NOSORTHEADER|WS_TABSTOP|LVS_REPORT|LVS_SHOWSELALWAYS|WS_BORDER|WS_CHILD,rect,this,IDC_LISTCTRL_GRAPH);
	m_GraphList.InsertColumn(0,"期号",LVCFMT_CENTER,30,0);
	for (int i=0; i<30; i++)
	{
		CString strText;
		strText.Format("%d",i+1);
		m_GraphList.InsertColumn(i+1,strText,LVCFMT_CENTER,20,i+1);
	}
	m_GraphList.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);
	m_GraphList.SetTextColor(RGB(255,0,0));
//--------------Initialize Flat ScrollBar------------//
	InitializeFlatSB(m_list.m_hWnd);
	FlatSB_EnableScrollBar(m_list.m_hWnd,SB_BOTH,ESB_ENABLE_BOTH);
//	FlatSB_SetScrollProp(m_list.m_hWnd,WSB_PROP_VBKGCOLOR,RGB(64,64,64),FALSE);
//	FlatSB_SetScrollProp(m_list.m_hWnd,WSB_PROP_HBKGCOLOR,RGB(64,64,64),FALSE);
	InitializeFlatSB(m_GraphList.m_hWnd);
	FlatSB_EnableScrollBar(m_GraphList.m_hWnd,SB_BOTH,ESB_ENABLE_BOTH);
//	FlatSB_SetScrollProp(m_GraphList.m_hWnd,WSB_PROP_VBKGCOLOR,RGB(64,64,64),FALSE);
//	FlatSB_SetScrollProp(m_GraphList.m_hWnd,WSB_PROP_HBKGCOLOR,RGB(64,64,64),FALSE);
	InitializeFlatSB(m_listConntinue.m_hWnd);
	FlatSB_EnableScrollBar(m_listConntinue.m_hWnd,SB_BOTH,ESB_ENABLE_BOTH);
//	FlatSB_SetScrollProp(m_listConntinue.m_hWnd,WSB_PROP_VBKGCOLOR,RGB(64,64,64),FALSE);
//	FlatSB_SetScrollProp(m_listConntinue.m_hWnd,WSB_PROP_HBKGCOLOR,RGB(64,64,64),FALSE);
	InitializeFlatSB(m_listFrequency.m_hWnd);
	FlatSB_EnableScrollBar(m_listFrequency.m_hWnd,SB_BOTH,ESB_ENABLE_BOTH);
//	FlatSB_SetScrollProp(m_listFrequency.m_hWnd,WSB_PROP_VBKGCOLOR,RGB(64,64,64),FALSE);
//	FlatSB_SetScrollProp(m_listFrequency.m_hWnd,WSB_PROP_HBKGCOLOR,RGB(64,64,64),FALSE);
	InitializeFlatSB(m_listRelation.m_hWnd);
	FlatSB_EnableScrollBar(m_listRelation.m_hWnd,SB_BOTH,ESB_ENABLE_BOTH);
//	FlatSB_SetScrollProp(m_listRelation.m_hWnd,WSB_PROP_VBKGCOLOR,RGB(64,64,64),FALSE);
//	FlatSB_SetScrollProp(m_listRelation.m_hWnd,WSB_PROP_HBKGCOLOR,RGB(64,64,64),FALSE);
//--------------Initialize Flat ScrollBar------------//

	LoadLotteryNumber(false);
	
	m_iStart=-1;
	m_iEnd=-1;
	m_pFreq=NULL;

	m_dlgFre.Create(IDD_DIALOG_FREQUENCY_STATISTICS,this);
	m_dlgEvenOdd.Create(IDD_DIALOG_EVEN_ODD,this);
	m_dlgConn.Create(IDD_DIALOG_CONNTINUED_NUMBER,this);
	m_dlgSeg.Create(IDD_DIALOG_SEGMENT,this);
	m_dlgRel.Create(IDD_DIALOG_RELATION,this);
	m_dlgLottery.Create(IDD_DIALOG_LOTTERY,this);
	m_dlgSeq.Create(IDD_DIALOG_SEQUENCY,this);
	m_CurveView.Create(IDD_DIALOG_CURVE_VIEW,this);
	m_dlgSum.Create(IDD_DIALOG_SUM,this);
	return 0;
}

void CChildView::ShowGraphList(BOOL bShow)
{
	if (bShow)
	{
		m_GraphList.ShowWindow(SW_SHOWNORMAL);
		m_list.ShowWindow(SW_HIDE);
		m_listRelation.ShowWindow(SW_HIDE);
		m_listFrequency.ShowWindow(SW_HIDE);
		m_listConntinue.ShowWindow(SW_HIDE);
	}
	else
	{
		m_GraphList.ShowWindow(SW_HIDE);
		m_list.ShowWindow(SW_SHOWNORMAL);
		m_listRelation.ShowWindow(SW_SHOWNORMAL);
		m_listFrequency.ShowWindow(SW_SHOWNORMAL);
		m_listConntinue.ShowWindow(SW_SHOWNORMAL);
	}
}
void CChildView::OnShowGraphList() 
{
	if (m_bShowGraph) m_bShowGraph=FALSE;
	else m_bShowGraph=TRUE;
	ShowGraphList(m_bShowGraph);
}

void CChildView::OnUpdateShowGraphList(CCmdUI* pCmdUI) 
{
	if (m_bShowGraph) pCmdUI->SetCheck(1);
	else pCmdUI->SetCheck(0);
}
//------------------主窗口ONSIZE处理--------------------//
void CChildView::OnSize(UINT nType, int cx, int cy) 
{
		CWnd ::OnSize(nType, cx, cy);
		int w=GetSystemMetrics(SM_CXVSCROLL);
		if (m_listFrequency.m_hWnd)
		{
			m_listFrequency.MoveWindow(cx/5*2,0,cx/5,cy);
		}
		if (m_listRelation.m_hWnd)
		{
			m_listRelation.MoveWindow(cx/5*3,0,cx/5*2,cy/5*3);
		}
		if (m_listConntinue.m_hWnd)
		{
			m_listConntinue.MoveWindow(cx/5*3,cy/5*3,cx/5*2,cy/5*2);
		}
		if (m_GraphList.m_hWnd)
		{
			m_GraphList.MoveWindow(0,0,cx,cy,FALSE);
			m_GraphList.SetColumnWidth(0,50);
			m_GraphList.SetColumnWidth(30,30);
			for (int i=1; i<30; i++)
			{
				m_GraphList.SetColumnWidth(i,(cx-100)/29);
			}
		}
		if (m_list.m_hWnd)
		{
			m_list.SetColumnWidth(0,70);
			m_list.MoveWindow(0,0,cx/5*2,cy);
			cx=cx/5*2-70;

			for (int i=1; i<8; i++)
			{
				m_list.SetColumnWidth(i,(cx-w)/8-1);
			}
			m_list.SetColumnWidth(i,(cx-w)-(cx-w)/8*7+7);
		}
}
//------------------从文件或者资源读入彩票号码--------------------//
void CChildView::LoadLotteryNumber(BOOL bFromFile)
{
	if (bFromFile)
	{
		CStdioFile file;
		CString strFileName="lottery.txt";
		if (!file.Open(strFileName,CFile::modeRead))
		{
			CFileDialog fd(TRUE,NULL,"lottery.txt");
			if (fd.DoModal()==IDCANCEL)
				return;
			strFileName=fd.GetPathName();
			file.Open(strFileName,CFile::modeRead);
		}
		CString strBuf,strNum;
		LOTTERY lty;
		int order=0;
		while(file.ReadString(strBuf))
		{
			int k=0;
			int len=strBuf.GetLength();
			m_list.InsertItem(order,NULL);
			int i=0;
			refill:
			while(i<len && (strBuf.GetAt(i) < 48 || strBuf.GetAt(i) > 57)) i++;
			int j=i;
			while(i<len && strBuf.GetAt(i) > 47 && strBuf.GetAt(i) < 58) i++;
			strNum=strBuf.Mid(j,i-j);
			lty.i[k]=atoi(strNum.GetBuffer(strNum.GetLength()));
			m_list.SetItemText(order,k++,strNum);
			if (k<9) goto refill;
			order++;
			m_array.Add(lty);
		}
		file.Close();
	}
	else
	{//load lottery from resource
		CString strName;
		strName.Format("#%d",IDR_MYDATA1);
		HRSRC hRsrc=FindResource(NULL,strName,"MYDATA");
		if (hRsrc)
		{
			HGLOBAL	hGlobal=LoadResource(NULL,hRsrc);
			if (hGlobal)
			{
				char *p=(char*)LockResource(hGlobal);
				CString str=p;
				CString strBuf="",strNum;
				LOTTERY lty;
				int order=0;
				while (*p!=0xa)	{strBuf+=*p;p++;}
				strBuf+=*p;p++;
				while(strBuf.GetLength() > 20 && strBuf.GetAt(0)==' ')
				{
					int k=0;
					int len=strBuf.GetLength();
					m_list.InsertItem(order,NULL);
					int i=0;
					refill2:
					while(i<len && (strBuf.GetAt(i) < 48 || strBuf.GetAt(i) > 57)) i++;
					int j=i;
					while(i<len && strBuf.GetAt(i) > 47 && strBuf.GetAt(i) < 58) i++;
					strNum=strBuf.Mid(j,i-j);
					lty.i[k]=atoi(strNum.GetBuffer(strNum.GetLength()));
					m_list.SetItemText(order,k++,strNum);
					if (k<9) goto refill2;
					order++;
					m_array.Add(lty);
					strBuf="";
					while (*p!=0xa)	{strBuf+=*p;p++;}
					strBuf+=*p;p++;
				}
			}
		}
	}
	//fill the graphlist
	int size = m_array.GetSize();
	for (int i=0; i<m_array.GetSize(); i++)
	{
		m_GraphList.InsertItem(i,NULL);
		LOTTERY lty=m_array.GetAt(i);
		CString strTemp;
		strTemp.Format("%d",lty.t.t0);
		m_GraphList.SetItemText(i,0,strTemp);
		strTemp="▲";
		for (int j=1; j<8; j++)
		{
			m_GraphList.SetItemText(i,lty.i[j],strTemp);
		}
		strTemp="△";
		m_GraphList.SetItemText(i,lty.i[8],strTemp);
	}   
}

//------------------概率统计菜单处理--------------------//
void CChildView::OnFrequencyStatistics() 
{
	if (!m_dlgFre.m_isFilled)
	{
		FrequencyStatistics(0, m_array.GetSize()-1, &(m_dlgFre.m_list),&(m_dlgFre.m_list2));
		m_dlgFre.m_isFilled=TRUE;
	}
	m_dlgFre.ShowWindow(SW_SHOWNORMAL);
}
//----------------奇偶统计菜单处理------------------//
void CChildView::OnEvenOddStatistics() 
{
	if (!m_dlgEvenOdd.m_isFilled)
	{
		EvenOddStatistics(0, m_array.GetSize()-1, &(m_dlgEvenOdd.m_list));
		m_dlgEvenOdd.m_isFilled=TRUE;
	}
	m_dlgEvenOdd.ShowWindow(SW_SHOWNORMAL);		
}
//----------------连字号统计菜单处理-----------------//
void CChildView::OnConntinuedNumber() 
{
	if (!m_dlgConn.m_isFilled)
	{
		ConntinuedNumber(0, m_array.GetSize()-1, &(m_dlgConn.m_list));
		m_dlgConn.m_isFilled=TRUE;
	}
	m_dlgConn.ShowWindow(SW_SHOWNORMAL);
}
//----------------分段统计菜单处理-----------------//
void CChildView::OnSegmentStatistics() 
{
	if (!m_dlgSeg.m_isFilled )
	{
		SegmentStatistics(0, m_array.GetSize()-1, &(m_dlgSeg.m_list));
		m_dlgSeg.m_isFilled=TRUE;
	}
	m_dlgSeg.ShowWindow(SW_SHOWNORMAL);
}
//----------------相关统计菜单处理-----------------//
void CChildView::OnRelationStatistics() 
{
	if (!m_dlgRel.m_isFilled)
	{
		m_dlgRel.m_pArray=&m_array;
		RelationStatistics(0, m_array.GetSize()-1, &(m_dlgRel.m_list));
	}
	g_pList=&(m_dlgRel.m_list);
	m_dlgRel.ShowWindow(SW_SHOWNORMAL);
}

//------------------产生中奖号码--------------------//
void CChildView::OnLottery() 
{
	if (!m_dlgRel.m_isFilled)
	{
		m_dlgRel.m_pArray=&m_array;
		RelationStatistics(0, m_array.GetSize()-1, &(m_dlgRel.m_list));
	}
	if (!m_dlgFre.m_isFilled)
	{
		FrequencyStatistics(0, m_array.GetSize()-1, &(m_dlgFre.m_list),&(m_dlgFre.m_list2));
		m_dlgFre.m_isFilled=TRUE;
		m_dlgFre.ForceInvalidate();
	}
	g_pList=&(m_dlgRel.m_list);
	m_dlgRel.GetRelationData();
	CString strText;
	strText.Format("%6.3f",m_dlgRel.m_dAve);
	m_dlgLottery.SetDlgItemText(IDC_EDIT_RELATION,strText);
	strText.Format("%5.3f",m_dlgFre.m_dAve);
	m_dlgLottery.SetDlgItemText(IDC_EDIT_FS1,strText);
	m_dlgLottery.ShowWindow(SW_SHOWNORMAL);
}

//----------------鼠标右键单击中奖列表处理-----------------//
void CChildView::OnListRClick(NMHDR * pNotifyStruct, LRESULT * result)
{
	NMLISTVIEW *pL=(NMLISTVIEW *)pNotifyStruct;
	POINT p=pL->ptAction;
	ClientToScreen(&p);
	CMenu menu,* pSubMenu;
	menu.LoadMenu(IDR_MAINFRAME);
	pSubMenu=menu.GetSubMenu(0);
	pSubMenu->DeleteMenu(ID_APP_EXIT,MF_BYCOMMAND);
	pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,p.x,p.y,this);
	pSubMenu->DestroyMenu();
	menu.DestroyMenu();
}
//----------------键盘消息列表项改变处理-----------------//
void CChildView::OnListKeydown( NMHDR * pNotifyStruct, LRESULT * result )
{
	NMLVKEYDOWN *pL=(NMLVKEYDOWN*)pNotifyStruct;
	{
		NMLISTVIEW nl;
		LRESULT result;
		switch (pL->wVKey)
		{
		case VK_UP:
			if (m_iStart > 0)
			{
				nl.iItem=((m_iEnd - m_iStart)>>1) + m_iStart - 1;
				OnListClick((NMHDR*)&nl,&result);
			}
			break;
		case VK_DOWN:
			if (m_iEnd < m_array.GetSize()-1)
			{
				nl.iItem=((m_iEnd - m_iStart)>>1) + m_iStart + 1;
				OnListClick((NMHDR*)&nl,&result);
			}
			break;
		}
	}
}
//----------------鼠标左键单击中奖列表处理-----------------//
void CChildView::OnListClick(NMHDR * pNotifyStruct, LRESULT * result)
{
	NMLISTVIEW *pL=(NMLISTVIEW *)pNotifyStruct;
	if (pL->iItem >= 0)
	{
		int count=m_list.GetItemCount();
		if (m_iStart != -1 && m_iEnd != -1)
		{
			for (int i=m_iStart; i<m_iEnd+1; i++)
				m_list.SetCheck(i,FALSE);
		}
		if (((int)(pL->iItem) + (int)m_iWidth/2) >= count)
		{
			m_iEnd = count-1;
			m_iStart = m_iEnd-m_iWidth+1;
		}
		else if (((int)(pL->iItem) - (int)m_iWidth/2) < 0)
		{
			m_iStart=0;
			m_iEnd=m_iStart+m_iWidth-1;
		}
		else
		{
			m_iStart=pL->iItem - m_iWidth/2;
			m_iEnd=pL->iItem + m_iWidth/2 - ((m_iWidth % 2)?0:1);
		}
		for (int i=m_iStart; i<m_iEnd+1; i++)
			m_list.SetCheck(i,TRUE);
		FrequencyStatistics(m_iStart,m_iEnd,&m_listFrequency);
		RelationStatistics(m_iStart,m_iEnd,&m_listRelation);
		ConntinuedNumber(m_iStart,m_iEnd,&m_listConntinue);
	}
}
//------------------分段统计--------------------//
void CChildView::SegmentStatistics(int iStart, int iEnd, CListBox *pListBox)
{
		if (pListBox->GetCount())
			pListBox->ResetContent();
		int count=(iEnd - iStart) + 1;
		UINT greate15=0;
		UINT less15=0;
		UINT between2030=0,between1020=0,between010=0;
		int acNumber[30];
		ZeroMemory(acNumber,30*sizeof(int));
		double dSum=0;
		for (int i=iStart; i<iEnd+1; i++)
		{
			LOTTERY lty=m_array.GetAt(i);
			acNumber[lty.GetAC()]++;
			dSum+=lty.GetAC();
			for (int j=0; j<9; j++)
			{
				if (lty.i[j] < 11)
				{
					between010++;
					less15++;
				}
				if (lty.i[j] > 10 && lty.i[j] < 15)
				{
					between1020++;
					less15++;
				}
				if (lty.i[j] >= 15 && lty.i[j] < 21)
				{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -