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

📄 hikerwbstatewnd.cpp

📁 自己用Markov模型做的一个整句物笔输入法的原型
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		break;
	}

	//displaying refresh
	m_iHangOn = HitTest(point);
	if (m_iHangOn == ACT_SIZING)
	{
		hc = LoadCursor(NULL, IDC_SIZEWE);
		SetCursor(hc);
	}

	if (m_iLastHangOn != m_iHangOn)
	{
		rt = GetRect(m_iHangOn);
		InvalidateRect(&rt, FALSE);

		if (m_iLastHangOn != ACT_OTHER)
		{
			rt = GetRect(m_iLastHangOn);
			InvalidateRect(&rt, FALSE);
		}

		m_iLastHangOn = m_iHangOn;
	}
	
	CWnd::OnMouseMove(nFlags, point);
}

void CHikerWBStateWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rt;
	HCURSOR hc;

	GetWindowRect(m_rect);
	m_pos = point;
	m_iAct = HitTest(point);

	if (m_iAct == ACT_SIZING)
	{
		hc = LoadCursor(NULL, IDC_SIZEWE);
		SetCursor(hc);

		SetWindowRgn(0, FALSE);	//delete window region first for avoiding changing it when moving!
	}

	Invalidate(FALSE);

	SetCapture();
	
	CWnd::OnLButtonDown(nFlags, point);
}

void CHikerWBStateWnd::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int itgt = HitTest(point);

	if (m_iAct == ACT_SIZING)
	{
		UpdateRects();
		CRect rt;
		GetWindowRect(rt);
		m_cDefaultPos.right = m_cDefaultPos.left+rt.Width();

		CRgn rgnwnd;
		CRect rwnd;
		GetClientRect(&rwnd);
		rgnwnd.CreateRoundRectRgn(rwnd.left, rwnd.top, rwnd.right+1, rwnd.bottom+1, m_ptcornw.x, m_ptcornw.y); 
		SetWindowRgn(rgnwnd, TRUE);
	}
	else if (m_iAct == ACT_MOVING && !m_bFloatWnd)
	{
		GetWindowRect(m_cDefaultPos);
	}
	else if (m_iAct == ACT_OTHER && itgt == ACT_OTHER)		//click
	{
		int pos = GetWordIndex(point);
		if (pos >= 0)
		UISetCurrPos(pos);
	}
	else if (m_iAct == ACT_WORDPGUP && itgt == ACT_WORDPGUP)
	{
		if (m_bWdPgUpEnb)
			keybd_event(33, 0, 0, 0);
	}
	else if (m_iAct == ACT_WORDPGDN && itgt == ACT_WORDPGDN)
	{
		if (m_bWdPgDnEnb)
			keybd_event(34, 0, 0, 0);
	}
	else if (m_iAct == ACT_SENTPGUP && itgt == ACT_SENTPGUP)
	{
		if (m_bStPgUpEnb)
		{
			int iStPgSize = m_rsview.Width()-20;

			if (m_rslog.left + iStPgSize < m_rsview.left)
				m_rslog.OffsetRect(iStPgSize, 0);
			else
				m_rslog.OffsetRect(-m_rslog.left+m_rsview.left, 0);
			
			m_bStPgUpEnb = ((m_rslog.left < m_rsview.left)?TRUE:FALSE);
			m_bStPgDnEnb = ((m_rslog.right > m_rsview.right)?TRUE:FALSE);
		}
	}
	else if (m_iAct == ACT_SENTPGDN && itgt == ACT_SENTPGDN)
	{
		if (m_bStPgDnEnb)
		{
			int iStPgSize = m_rsview.Width()-20;

			if (m_rslog.right - iStPgSize > m_rsview.right)
				m_rslog.OffsetRect(-iStPgSize, 0);
			else
				m_rslog.OffsetRect(m_rsview.right - m_rslog.right, 0);
			
			m_bStPgUpEnb = ((m_rslog.left < m_rsview.left)?TRUE:FALSE);
			m_bStPgDnEnb = ((m_rslog.right > m_rsview.right)?TRUE:FALSE);
		}
	}
	else if (m_iAct == ACT_CHSSTA && itgt == ACT_CHSSTA)
	{
		m_bChsSta = !m_bChsSta;
		UISetChsState(m_bChsSta);		//set gbChsSta in UI.cpp
	}
	else if (m_iAct == ACT_SBCSTA && itgt == ACT_SBCSTA)
	{
		m_bSbcSta = !m_bSbcSta;
		UISetSbcState(m_bSbcSta);		//set gbSBCSta in UI.cpp
	}
	else if (m_iAct == ACT_CHSPCT && itgt == ACT_CHSPCT)
	{
		m_bChsPct = !m_bChsPct;
		UISetChsPctState(m_bChsPct);	////set gbChsPctSta in UI.cpp
	}

	m_iAct = -1;
	ReleaseCapture();

	Invalidate(FALSE);

	CWnd::OnLButtonUp(nFlags, point);
}

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

	// TODO: Add your specialized creation code here
	//set and save default window position
	m_bWdPgUpEnb = FALSE;
	m_bWdPgDnEnb = FALSE;
	m_bStPgUpEnb = FALSE;
	m_bStPgDnEnb = FALSE;

	m_iAct = -1;

	m_crWndBack = 0x00FFB000;
	m_crWndBord = 0x00000000;
	m_crLine	= 0x00000000;
	m_crCaret	= 0x0000007F;
	m_crTxtBack = 0x00E0E0E0;
	m_crTxtFore = 0x00000000;
	m_crHiTxtFore= 0x00FF0000;
	m_crHiTxtBack= 0x00000000;

	m_ptcornw = CPoint(6, 6);

	CDC dc;
	dc.CreateDC("DISPLAY", NULL, NULL, NULL);
	int iw = dc.GetDeviceCaps(HORZRES);
	int ih = dc.GetDeviceCaps(VERTRES);
	dc.DeleteDC();

	m_ScreenSize.cx = iw;
	m_ScreenSize.cy = ih;
	CRect rect(0, ih-28-STAWNDHEIGHT, STAWNDWIDTH, ih-28);
	SetWindowPos(&wndTopMost, rect.left, rect.top, rect.Width(), rect.Height(), SWP_HIDEWINDOW);

	GetWindowRect(m_cDefaultPos);		//save default window pos
	m_bFloatWnd = FALSE;

	CRgn rgnwnd;
	CRect rwnd;
	GetClientRect(&rwnd);
	rgnwnd.CreateRoundRectRgn(rwnd.left, rwnd.top, rwnd.right+1, rwnd.bottom+1, m_ptcornw.x, m_ptcornw.y); 
	SetWindowRgn(rgnwnd, TRUE);

	m_ptcornw = CPoint(5,5);
	m_ptcorn = CPoint(3,3);
	UpdateRects();
	m_rslog = m_rs;
	
	//load icons
	m_hiChs0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA0), IMAGE_ICON, m_rchs.Width()-2, m_rchs.Height()-2, LR_DEFAULTCOLOR);
	m_hiChs1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA1), IMAGE_ICON, m_rchs.Width()-2, m_rchs.Height()-2, LR_DEFAULTCOLOR);
	m_hiSbc0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA0), IMAGE_ICON, m_rsbc.Width()-2, m_rsbc.Height()-2, LR_DEFAULTCOLOR);
	m_hiSbc1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA1), IMAGE_ICON, m_rsbc.Width()-2, m_rsbc.Height()-2, LR_DEFAULTCOLOR);
	m_hiChsPct0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT0), IMAGE_ICON, m_rchspct.Width()-2, m_rchspct.Height()-2, LR_DEFAULTCOLOR);
	m_hiChsPct1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT1), IMAGE_ICON, m_rchspct.Width()-2, m_rchspct.Height()-2, LR_DEFAULTCOLOR);	

	//create font
	LOGFONT lf;
	memset(&lf,0,sizeof(LOGFONT));
	lf.lfHeight               =   -14 ;
	lf.lfWeight               =   FW_LIGHT ;
	lf.lfCharSet              =   ANSI_CHARSET ;
	lf.lfOutPrecision         =   OUT_DEFAULT_PRECIS ;
	lf.lfClipPrecision        =   CLIP_DEFAULT_PRECIS ;
	lf.lfQuality              =   DEFAULT_QUALITY ;
	lf.lfPitchAndFamily       =   FF_DONTCARE|DEFAULT_PITCH;
	lstrcpy (lf.lfFaceName, "Times New Roman") ;

	m_font.CreateFontIndirect(&lf);

	return 0;
}

void CHikerWBStateWnd::UpdateRects()
{
	CRect rt;
	GetClientRect(rt);

	m_rc = CRect(2, 2, 80, 23);						//code rect
	m_rw = CRect(81, 2, 481 , 23);					//word rect
	m_rp = CRect(482, 2, max(rt.right-2, 482), 23);			//prompt rect
	m_rs = CRect(2, 24, rt.right-2, 45);	//sentence rect
	m_rsview = m_rs;
	m_rsview.DeflateRect(SENTMARGIN, 2);

	m_rwpu = CRect(m_rw.left+2, m_rw.top+2, m_rw.left+2+BUTTONWIDTH, m_rw.top+2+BUTTONHEIGHT);					//word page up button rect	
	m_rwpd = CRect(m_rw.right-2-BUTTONWIDTH, m_rw.top+2, m_rw.right-2, m_rw.top+2+BUTTONHEIGHT);	//word page down button rect	
	m_rspu = CRect(m_rs.left+2, m_rs.bottom-2-BUTTONHEIGHT, m_rs.left+2+BUTTONWIDTH, m_rs.bottom-2);							//sent page up button rect	
	m_rspd = CRect(m_rs.right-2-BUTTONWIDTH, m_rs.bottom-2-BUTTONHEIGHT, m_rs.right-2, m_rs.bottom-2);			//sent page down button rect

	m_rchs = CRect(m_rp.left+2, m_rp.top+2, m_rp.left+2+17, m_rp.top+2+17);
	m_rsbc = m_rchs;
	m_rsbc.OffsetRect(18, 0);
	m_rchspct = m_rsbc;
	m_rchspct.OffsetRect(18, 0);
	m_rtmppy = m_rchspct;
	m_rtmppy.OffsetRect(18, 0);
}

int CHikerWBStateWnd::HitTest(CPoint pt)
{
	CRect rt;
	GetWindowRect(rt);

	CPoint point = pt;
	ClientToScreen(&point);
	if (abs(point.x - rt.right) <= 3)		//sizing
	{
		return ACT_SIZING;
	}
	else
	{
		if (m_rwpu.PtInRect(pt))
			return ACT_WORDPGUP;
		else if (m_rwpd.PtInRect(pt))
			return ACT_WORDPGDN;
		else if (m_rspu.PtInRect(pt))
			return ACT_SENTPGUP;
		else if (m_rspd.PtInRect(pt))
			return ACT_SENTPGDN;
		else if (m_rchs.PtInRect(pt))
			return ACT_CHSSTA;
		else if (m_rsbc.PtInRect(pt))
			return ACT_SBCSTA;
		else if (m_rchspct.PtInRect(pt))
			return ACT_CHSPCT;
		else if (m_rtmppy.PtInRect(pt))
			return ACT_TMPPY;
		else
			return ACT_OTHER;
	}
}

void CHikerWBStateWnd::DrawArrow(CDC* dc, CRect rt, int direct, BOOL enable)
{
	CPoint pt;
	int i;

	CPen pen;//, *pOldPen;
	COLORREF cr;
	if (!enable)
		cr = 0x007F7F7F;
	else
		cr = 0x00000000;
	pen.CreatePen(PS_SOLID, 1, cr);

	dc->SelectObject(pen);

	if (direct == 0)
	{
		pt = CPoint(rt.right, rt.top);
		pt.Offset(-3,4);
		for (i = 4; i > 0; i--)
		{
			dc->MoveTo(pt);
			dc->LineTo(pt.x, pt.y+2*i);
			pt.Offset(-1, 1);
		}
	}
	else
	{
		pt = CPoint(rt.left, rt.top);
		pt.Offset(2,4);
		for (i = 4; i > 0; i--)
		{
			dc->MoveTo(pt);
			dc->LineTo(pt.x, pt.y+2*i);
			pt.Offset(1, 1);
		}
	}

	//dc->SelectObject(pOldPen);
	pen.DeleteObject();
}

void CHikerWBStateWnd::SetFloat(BOOL bFloat)
{
	m_bFloatWnd = bFloat;
}

BOOL CHikerWBStateWnd::GetFloat()
{
	return m_bFloatWnd;
}

void CHikerWBStateWnd::ShowFloat(CPoint pt)
{
	CRect rtwnd;
	GetWindowRect(rtwnd);
	CRect rt = CRect(pt.x, pt.y, pt.x+rtwnd.Width(), pt.y+rtwnd.Height());
	rt.OffsetRect(0, 16);

	if (rt.left < 0)
		rt.OffsetRect(-rt.left, 0);
	if (rt.top < 0)
		rt.OffsetRect(0, -rt.top);
	if (rt.right > m_ScreenSize.cx)
		rt.OffsetRect(m_ScreenSize.cx-rt.right, 0);
	if (rt.bottom > m_ScreenSize.cy)
		rt.OffsetRect(0, m_ScreenSize.cy-rt.bottom);
		
	MoveWindow(rt);
	ShowWindow(SW_SHOWNA);
	//SetWindowPos(&wndTopMost, rt.left, rt.top, rt.Width(), rt.Height(), SWP_SHOWWINDOW);
}

void CHikerWBStateWnd::ShowFix()
{
	MoveWindow(m_cDefaultPos);
	ShowWindow(SW_SHOW);
}

CRect CHikerWBStateWnd::GetRect(int iAct)
{
	switch (iAct)		//sizing
	{
	case ACT_WORDPGUP:
		return m_rwpu;
	case ACT_WORDPGDN:
		return m_rwpd;
	case ACT_SENTPGUP:
		return m_rspu;
	case ACT_SENTPGDN:
		return m_rspd;
	case ACT_CHSSTA:
		return m_rchs;
	case ACT_SBCSTA:
		return m_rsbc;
	case ACT_CHSPCT:
		return m_rchspct;
	case ACT_TMPPY:
		return m_rtmppy;
	default:		//moving or sizing
		CRect rt;
		GetClientRect(&rt);
		return rt;
	}
}

void CHikerWBStateWnd::SetChsSta(BOOL bSta)
{
	m_bChsSta = bSta;
	InvalidateRect(m_rchs);
}

void CHikerWBStateWnd::SetSbcSta(BOOL bSta)
{
	m_bSbcSta = bSta;
	InvalidateRect(m_rsbc);
}

void CHikerWBStateWnd::SetChsPct(BOOL bSta)
{
	m_bChsPct = bSta;
	InvalidateRect(m_rchspct);
}

BOOL CHikerWBStateWnd::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	return CWnd::OnEraseBkgnd(pDC);
	//return TRUE;
}

//get the index of the word that displaying position is specified by pt
int CHikerWBStateWnd::GetWordIndex(CPoint pt) 
{
	int iLeftLoc;
	CRect rt;
	CSize slsiz, siz, srsiz;

	if (!m_rsview.PtInRect(pt))
		return -1;

	CDC* pdc = GetDC();
	pdc->SelectObject(&m_font);

	rt.top = m_rslog.top;
	rt.bottom = m_rslog.bottom;	
	rt.left = m_rslog.left;
	iLeftLoc = 0;
	for (int i = 0; i < m_wordnum; i++)
	{
		siz = pdc->GetTextExtent(m_sent.Mid(iLeftLoc, m_wslen[i]));	//current word size
		rt.right = rt.left + siz.cx -1;

		if (rt.PtInRect(pt))
			return i;

		iLeftLoc += m_wslen[i];
		rt.left = rt.right + 1;
	}

	return -1;
}

⌨️ 快捷键说明

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