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

📄 hikerwbstatewnd.cpp

📁 自己用Markov模型做的一个整句物笔输入法的原型
💻 CPP
📖 第 1 页 / 共 2 页
字号:
     // HikerWBStateWnd.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"
#include "HikerWBStateWnd.h"
#include "HikerWBUI.h"

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

#define MINWNDWIDTH 483		//minimum stateWnd width
#define BUTTONWIDTH 9		
#define BUTTONHEIGHT 17


#define ACT_MOVING		0
#define ACT_SIZING		1
#define ACT_WORDPGUP	2
#define ACT_WORDPGDN	3
#define ACT_SENTPGUP	4
#define ACT_SENTPGDN	5
#define ACT_CHSSTA		6
#define ACT_SBCSTA		7
#define ACT_CHSPCT		8
#define ACT_TMPPY		9
#define ACT_OTHER		10

#define CODEMARGIN	3
#define	WORDMARGIN	15
#define	SENTMARGIN	15


/////////////////////////////////////////////////////////////////////////////
// CHikerWBStateWnd

CHikerWBStateWnd::CHikerWBStateWnd()
{
}

CHikerWBStateWnd::~CHikerWBStateWnd()
{
	m_font.DeleteObject();
}


BEGIN_MESSAGE_MAP(CHikerWBStateWnd, CWnd)
	//{{AFX_MSG_MAP(CHikerWBStateWnd)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_CREATE()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP

END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CHikerWBStateWnd message handlers

BOOL CHikerWBStateWnd::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	//POINT pt;

	HCURSOR hc = LoadCursor(NULL, IDC_ARROW);
	SetCursor(hc);

	LockInputWnd();	//05.11.10
	ReleaseFocus();
	UISetFocusWnd(m_hFocusWnd/*GetFocus()->GetSafeHwnd()*/);

	if (pMsg->message == WM_HOOKKEY)
		HookKeyHandle(pMsg->wParam, pMsg->lParam);
	
	return CWnd::PreTranslateMessage(pMsg);
}

void CHikerWBStateWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CBrush brushwbk(m_crWndBack);
	CBrush brushwbd(m_crWndBord);
	CBrush brushb(m_crTxtBack);
	CPen   penl(PS_SOLID, 1, m_crLine);
	CPen   penb(PS_SOLID, 1, m_crWndBack);		//pen for drawing button border
	CPen   penc(PS_SOLID, 1, m_crCaret);

	CRect rwnd;
	GetClientRect(rwnd);
	CRect rc = m_rc;
	CRect rw = m_rw;
	CRect rs = m_rs;
	CRect rp = m_rp;
	CRect rslog = m_rslog;
	CRect rsview = m_rsview;

	CRect rwpu = m_rwpu;
	CRect rwpd = m_rwpd;
	CRect rspu = m_rspu;
	CRect rspd = m_rspd;

	CRect rchs = m_rchs;
	CRect rsbc = m_rsbc;
	CRect rchspct = m_rchspct;
	CRect rtmppy = m_rtmppy;

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

	//fill window background
//	dc.SelectObject(&brushw);	//for draw round rectangle
//	dc.SelectObject(&penw);		//for draw round rectangle
//	dc.RoundRect(rt, ptcornw);
	//dynamically set cursor when sizing, the cursor set at OnMouseMove will be erased when Invalidate()
	CRgn rgnc, rgnw, rgnp, rgns, rgnwnd, rgnmar;
	//rgnwnd.DeleteObject();
	rgnwnd.CreateRoundRectRgn(rwnd.left, rwnd.top, rwnd.right+1, rwnd.bottom+1, m_ptcornw.x, m_ptcornw.y); 
	rgnmar.CreateRoundRectRgn(rwnd.left+1, rwnd.top+1, rwnd.right, rwnd.bottom, m_ptcornw.x, m_ptcornw.y); 

	rgnc.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, m_ptcorn.x, m_ptcorn.y);
	rgnw.CreateRoundRectRgn(rw.left, rw.top, rw.right, rw.bottom, m_ptcorn.x, m_ptcorn.y);
	rgnp.CreateRoundRectRgn(rp.left, rp.top, rp.right, rp.bottom, m_ptcorn.x, m_ptcorn.y);
	rgns.CreateRoundRectRgn(rs.left, rs.top, rs.right, rs.bottom, m_ptcorn.x, m_ptcorn.y);

	rgnmar.CombineRgn(&rgnmar, &rgnc, RGN_XOR);
	rgnmar.CombineRgn(&rgnmar, &rgnw, RGN_XOR);
	rgnmar.CombineRgn(&rgnmar, &rgnp, RGN_XOR);
	rgnmar.CombineRgn(&rgnmar, &rgns, RGN_XOR);

	dc.FrameRgn(&rgnwnd, &brushwbd, 1, 1);
	dc.FillRgn(&rgnmar, &brushwbk);

	//draw code word sentence and prompt area
	dc.SelectObject(&brushb);	//for draw round rectangle
	dc.SelectObject(&penl);		//for draw round rectangle
	dc.RoundRect(rc, m_ptcorn);
	dc.RoundRect(rw, m_ptcorn);
	dc.RoundRect(rs, m_ptcorn);
	dc.RoundRect(rp, m_ptcorn);

	//draw page up and down buttons
	if (m_iHangOn == ACT_WORDPGUP && m_bWdPgUpEnb)
	{
		if (m_iAct != ACT_WORDPGUP)
			dc.Draw3dRect(rwpu, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
		else
			dc.Draw3dRect(rwpu, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
	}
	if (m_iHangOn == ACT_WORDPGDN && m_bWdPgDnEnb)
	{
		if (m_iAct != ACT_WORDPGDN)
			dc.Draw3dRect(rwpd, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
		else
			dc.Draw3dRect(rwpd, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
	}
	if (m_iHangOn == ACT_SENTPGUP && m_bStPgUpEnb)
	{
		if (m_iAct != ACT_SENTPGUP)
			dc.Draw3dRect(rspu, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
		else
			dc.Draw3dRect(rspu, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
	}
	if (m_iHangOn == ACT_SENTPGDN && m_bStPgDnEnb)
	{
		if (m_iAct != ACT_SENTPGDN)
			dc.Draw3dRect(rspd, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
		else
			dc.Draw3dRect(rspd, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
	}

	DrawArrow(&dc, rwpu, 0, m_bWdPgUpEnb);
	DrawArrow(&dc, rwpd, 1, m_bWdPgDnEnb);
	DrawArrow(&dc, rspu, 0, m_bStPgUpEnb);
	DrawArrow(&dc, rspd, 1, m_bStPgDnEnb);

	//set clipping aera
	CRgn rgncc, rgnwc, rgnsc, rgnclt;
	rc.DeflateRect(CODEMARGIN,2);
	rw.DeflateRect(WORDMARGIN,2);
	//rgncc.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, ptcorn.x, ptcorn.y);
	rgnwc.CreateRoundRectRgn(rw.left, rw.top, rw.right, rw.bottom, m_ptcorn.x, m_ptcorn.y);
	rgnsc.CreateRoundRectRgn(rsview.left, rsview.top, rsview.right, rsview.bottom, m_ptcorn.x, m_ptcorn.y);

	rgnclt.CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
	rgnclt.CombineRgn(&rgnclt, &rgnwc, RGN_OR);
	rgnclt.CombineRgn(&rgnclt, &rgnp, RGN_OR);
	rgnclt.CombineRgn(&rgnclt, &rgnsc, RGN_OR);
	dc.SelectClipRgn(&rgnclt, RGN_OR);		//clipping the sentence outside rs
												//??? RGN_OR must be specified.

	//draw prompt buttons
	dc.SelectObject(&penb);		//for draw round rectangle
	if (m_iHangOn == ACT_CHSSTA)
		dc.RoundRect(rchs, m_ptcorn);
	if (m_iHangOn == ACT_SBCSTA)
		dc.RoundRect(rsbc, m_ptcorn);
	if (m_iHangOn == ACT_CHSPCT)
		dc.RoundRect(rchspct, m_ptcorn);
//	if (m_iHangOn == ACT_TMPPY)
//		dc.RoundRect(rtmppy, ptcorn);

	HBRUSH hBrushb = (HBRUSH)brushb.GetSafeHandle();
	if (m_bChsSta)
		DrawIconEx(dc.GetSafeHdc(), rchs.left+1, rchs.top+1, m_hiChs0, rchs.Width()-2, rchs.Height()-2, 0, hBrushb, DI_IMAGE);
	else
		DrawIconEx(dc.GetSafeHdc(), rchs.left+1, rchs.top+1, m_hiChs1, rchs.Width()-2, rchs.Height()-2, 0, hBrushb, DI_IMAGE);
	if (m_bSbcSta)
		DrawIconEx(dc.GetSafeHdc(), rsbc.left+1, rsbc.top+1, m_hiSbc0, rsbc.Width()-2, rsbc.Height()-2, 0, hBrushb, DI_IMAGE);
	else
		DrawIconEx(dc.GetSafeHdc(), rsbc.left+1, rsbc.top+1, m_hiSbc1, rsbc.Width()-2, rsbc.Height()-2, 0, hBrushb, DI_IMAGE);
	if (m_bChsPct)
		DrawIconEx(dc.GetSafeHdc(), rchspct.left+1, rchspct.top+1, m_hiChsPct0, rchspct.Width()-2, rchspct.Height()-2, 0, hBrushb, DI_IMAGE);
	else
		DrawIconEx(dc.GetSafeHdc(), rchspct.left+1, rchspct.top+1, m_hiChsPct1, rchspct.Width()-2, rchspct.Height()-2, 0, hBrushb, DI_IMAGE);

	//Draw text
	//rc.DeflateRect(CODEMARGIN, 2);
	//rw.DeflateRect(WORDMARGIN, 2);
	//dc.SetROP2(R2_COPYPEN);		//no use?
	dc.SelectObject(&m_font);
	dc.SetBkColor(m_crTxtBack);		//for drawtext()

	dc.SetTextColor(m_crHiTxtFore);
	dc.DrawText(m_code, rc, DT_LEFT|DT_TOP|DT_SINGLELINE);
	dc.SetTextColor(m_crTxtFore);
	dc.DrawText(m_word, rw, DT_LEFT|DT_TOP|DT_SINGLELINE);	
	dc.DrawText(m_sent, rslog, DT_LEFT|DT_TOP|DT_SINGLELINE);

	if (!m_bFullCode)
	{
		dc.SetTextColor(m_crTxtFore);
		dc.DrawText(m_code.Left(m_code.GetLength()-1), rc, DT_LEFT|DT_TOP|DT_SINGLELINE);
	}

	//draw hilight current word in the sentence
	//dc.SetBkColor(m_crHiTxtBack);
	dc.SetTextColor(m_crHiTxtFore);
	CRect rscurwd = rslog;
	rscurwd.left = m_rslog.left + m_iCurrWdPt;
	rscurwd.right = rscurwd.left + m_iCurrWdWid;
	dc.DrawText(m_sent.Mid(m_iCurrWdLoc, m_iCurrWdLen), rscurwd, DT_LEFT|DT_TOP|DT_SINGLELINE);

	rscurwd.left = rscurwd.right-1;
	dc.SelectObject(&penc);
	dc.Rectangle(rscurwd);

	
	// Do not call CWnd::OnPaint() for painting messages
}

void CHikerWBStateWnd::SetCode(LPCSTR pCode, BOOL bFull)
{
	m_code = CString(pCode);
	m_bFullCode = bFull;
	//UpdateWindow();
	InvalidateRect(m_rc);
}

void CHikerWBStateWnd::SetWord(LPCSTR pWord)
{
	m_word = CString(pWord);
	//UpdateWindow();
	m_bWdPgUpEnb = FALSE;
	m_bWdPgDnEnb = FALSE;

	InvalidateRect(m_rw);
}

void CHikerWBStateWnd::SetWord(LPCSTR pWord, int giPageNo, int selwordnum)
{
	m_word = CString(pWord);
	//UpdateWindow();
	m_bWdPgUpEnb = ((giPageNo == 0)?FALSE:TRUE);
	m_bWdPgDnEnb = (((giPageNo+1)*10 >= selwordnum)?FALSE:TRUE);

	InvalidateRect(m_rw);
}

void CHikerWBStateWnd::SetSent(LPCSTR pSent, int* wslen, int wdnum, int iCurrPos)
{
	m_sent = CString(pSent);
	m_wslen = wslen;
	m_wordnum = wdnum;
	//UpdateWindow();

	int iLeftLoc = 0;
	for (int i = 0; i < iCurrPos; i++)
		iLeftLoc += wslen[i];
	int iRightLoc = iLeftLoc + wslen[iCurrPos];

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

	CSize stsiz = pdc->GetTextExtent(m_sent);		//sent size
	CSize srsiz = pdc->GetTextExtent(m_sent.Left(iRightLoc));	//left sent size
	CSize siz = pdc->GetTextExtent(m_sent.Mid(iLeftLoc, iRightLoc-iLeftLoc));	//current word size
	CSize slsiz = srsiz;
	slsiz.cx = srsiz.cx - siz.cx;

	ReleaseDC(pdc);

	m_rslog.right = m_rslog.left + stsiz.cx;
	
	int iOffset = m_rslog.left + srsiz.cx - m_rsview.right;
	if (iOffset > 0)
		m_rslog.OffsetRect(-iOffset, 0);

	iOffset = m_rslog.left + slsiz.cx - m_rsview.left;
	if (iOffset < 0)
		m_rslog.OffsetRect(-iOffset, 0);
	
	//set sentence page up and down buttons' state
	m_bStPgUpEnb = ((m_rslog.left < m_rsview.left)?TRUE:FALSE);
	m_bStPgDnEnb = ((m_rslog.right > m_rsview.right)?TRUE:FALSE);

	m_iCurrWdLoc = iLeftLoc;
	m_iCurrWdLen = wslen[iCurrPos];
	m_iCurrWdPt = slsiz.cx;
	m_iCurrWdWid = siz.cx;

	InvalidateRect(m_rs);
}

void CHikerWBStateWnd::Clean()
{
	m_code = "";
	m_word = "";
	m_sent = "";

	m_rslog = m_rs;
	m_rslog.DeflateRect(SENTMARGIN, 2);

	m_iCurrWdLoc = 0;
	m_iCurrWdLen = 0;
	m_iCurrWdPt = 0;
	m_iCurrWdWid = 0;

	m_bWdPgUpEnb = FALSE;
	m_bWdPgDnEnb = FALSE;
	m_bStPgUpEnb = FALSE;
	m_bStPgDnEnb = FALSE;
	
	//UpdateWindow();
	Invalidate();
}

//05.11.10
void CHikerWBStateWnd::LockInputWnd()
{
	HWND wnd = ::GetForegroundWindow();
	if(IsWindow(wnd))
	{
		if(wnd != this->m_hWnd)
		{
			if(m_hInputWnd != wnd || ::GetFocus() != m_hFocusWnd)
			{
				if(IsWindow(m_hInputWnd))
				{
					AttachThreadInput(
						GetWindowThreadProcessId(m_hWnd,NULL),
						GetWindowThreadProcessId(m_hInputWnd, NULL),
						FALSE);
				}

				m_hInputWnd = wnd;
				AttachThreadInput(
					GetWindowThreadProcessId(m_hWnd,NULL),
					GetWindowThreadProcessId(m_hInputWnd,NULL),
					TRUE);

				m_hFocusWnd = ::GetFocus();
			}
		}
	}
}

void CHikerWBStateWnd::ReleaseFocus()
{
	if(IsWindow(m_hInputWnd))
	{
		HWND wnd = ::GetForegroundWindow();
		if(IsWindow(wnd))
		{
			if(wnd == m_hInputWnd)
			{
				return;
			}
		}
		::SetForegroundWindow(m_hInputWnd);
		::SetFocus(m_hFocusWnd);		//m_hInputWnd
	}
}

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

	//calculate offset
	pt.x = point.x - m_pos.x;
	pt.y = point.y - m_pos.y;
	GetWindowRect(rt);

	//sizing and moving
	switch (m_iAct)		//sizing
	{
	case ACT_SIZING:
//		hc = LoadCursor(NULL, IDC_SIZEWE);		//no use when Invalidate() is executed!
//		SetCursor(hc);							//so, the two sentence are placed in OnPaint()

		rt = m_rect;
		rt.right += pt.x;
		if (rt.Width() < MINWNDWIDTH)
			rt.right = rt.left+MINWNDWIDTH;

		MoveWindow(rt);
		UpdateRects();
		Invalidate(FALSE);

		break;
	case ACT_OTHER:	//moving
		if (abs(pt.x) > 2 || abs(pt.y) > 2)
			m_iAct = ACT_MOVING;
		break;
	case ACT_MOVING:
		hc = LoadCursor(NULL, IDC_SIZEALL);
		SetCursor(hc);

		rt.OffsetRect(pt);
		MoveWindow(rt);
		

⌨️ 快捷键说明

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