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

📄 statewnd.cpp

📁 自己用Markov模型做的一个整句物笔输入法的原型
💻 CPP
字号:
// StateWnd.cpp : implementation file
//

#include "stdafx.h"
#include "hikerwbstart.h"
#include "StateWnd.h"
#include "HikerWBUI.h"

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

/////////////////////////////////////////////////////////////////////////////
// CStateWnd

CStateWnd::CStateWnd()
{
}

CStateWnd::~CStateWnd()
{
}


BEGIN_MESSAGE_MAP(CStateWnd, CWnd)
	//{{AFX_MSG_MAP(CStateWnd)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CStateWnd message handlers

void CStateWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CRect rwnd, rc;
	GetClientRect(rwnd);
	rc = rwnd;
	rc.DeflateRect(3,3);
	
	CBrush brushwbk(GetSysColor(COLOR_ACTIVECAPTION));
	dc.SelectObject(&brushwbk);
	//dc.SetBkColor(COLORREF(0x00FF0000));

//	CFont 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, "宋体") ;
//	font.CreateFontIndirect(&lf);
//	dc.SelectObject(&font);

	dc.Rectangle(rwnd);
	//dc.SetTextColor(COLORREF(0x0000CCFF));
	//dc.SetTextColor(COLORREF(0x004FEF4F));
	//dc.DrawText("终结者", rc, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
	
//	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);

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

	CBrush brushb(GetSysColor(COLOR_ACTIVECAPTION));
	HBRUSH hBrushb = (HBRUSH)brushb.GetSafeHandle();


	DrawIconEx(dc.GetSafeHdc(), rlogo.left+1, rlogo.top+1, m_hiLogo, rlogo.Width()-2, rlogo.Height()-2, 0, hBrushb, DI_IMAGE);

	if (m_bCapSta)
	{
		dc.SelectObject(&m_font);
		dc.SetBkColor(GetSysColor(COLOR_ACTIVECAPTION));		//for drawtext()
		dc.SetTextColor(0x00FFFFFF);
		DrawText(dc.GetSafeHdc(), "大写", 4, rchs|rsbc, DT_CENTER|DT_SINGLELINE|DT_VCENTER);
	}
	else
	{
		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);

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

BOOL CStateWnd::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	//CWnd *pWnd = GetForegroundWindow();

	LockInputWnd();	//05.11.10
	ReleaseFocus();

//	if (pMsg->message == WM_ACTIVATE)
//	{
//		if (pWnd)
//		{
//			pWnd->SetForegroundWindow();
//			ReleaseFocus();
//		}
//	}
	if (pMsg->message == WM_MOUSEMOVE)
	{
		HCURSOR hc = LoadCursor(NULL, IDC_ARROW);
		SetCursor(hc);
	}
	
	return CWnd::PreTranslateMessage(pMsg);
}

void CStateWnd::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();
				//m_hFocusWnd = m_hInputWnd;

				return;
			}
		}
	}
}

void CStateWnd::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 CStateWnd::UpdateRects()
{
	m_rlogo = CRect(0, 0, 18, 18);
	m_rchs = m_rlogo;
	m_rchs.OffsetRect(18, 0);
	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 CStateWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	UpdateRects();

	m_hiLogo = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_LOGO), IMAGE_ICON, m_rlogo.Width(), m_rlogo.Height(), LR_DEFAULTCOLOR);
	m_hiChs0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA02), IMAGE_ICON, m_rchs.Width(), m_rchs.Height(), LR_DEFAULTCOLOR);
	m_hiChs1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA12), IMAGE_ICON, m_rchs.Width(), m_rchs.Height(), LR_DEFAULTCOLOR);
	m_hiSbc0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA02), IMAGE_ICON, m_rsbc.Width(), m_rsbc.Height(), LR_DEFAULTCOLOR);
	m_hiSbc1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA12), IMAGE_ICON, m_rsbc.Width(), m_rsbc.Height(), LR_DEFAULTCOLOR);
	m_hiChsPct0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT02), IMAGE_ICON, m_rchspct.Width(), m_rchspct.Height(), LR_DEFAULTCOLOR);
	m_hiChsPct1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT12), IMAGE_ICON, m_rchspct.Width(), m_rchspct.Height(), LR_DEFAULTCOLOR);	

	//make the window transprant
	//加入WS_EX_LAYERED扩展属性
	SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
	GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
	HINSTANCE hInst = LoadLibrary("User32.DLL"); 
	if(hInst) 
	{ 
		typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
		MYFUNC fun = NULL;
		//取得SetLayeredWindowAttributes函数指针 
		fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
		if(fun)fun(this->GetSafeHwnd(),GetSysColor(COLOR_ACTIVECAPTION), 128, 2); 
		FreeLibrary(hInst); 
	}

	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, "宋体") ;

	m_font.CreateFontIndirect(&lf);

	
	return 0;
}

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

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

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

void CStateWnd::SetCapSta(BOOL bSta)
{
	m_bCapSta = bSta;
	Invalidate();
}

void CStateWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	if (!m_bCapSta)
	{
		if (m_rchs.PtInRect(point))
			SetChsState(!m_bChsSta);
		if (m_rsbc.PtInRect(point))
			SetSbcState(!m_bSbcSta);
	}
	if (m_rchspct.PtInRect(point))
		SetChsPctState(!m_bChsPct);

	CWnd::OnLButtonDown(nFlags, point);
}

⌨️ 快捷键说明

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