shurufaview.cpp

来自「这是一个提供给使用遥控器的嵌入式设备开发的一个中文拼音输入法」· C++ 代码 · 共 267 行

CPP
267
字号
// shurufaView.cpp : implementation of the CShurufaView class
//

#include "stdafx.h"
#include "shurufa.h"
#include "SYDBManip.h"
#include "shurufaDoc.h"
#include "shurufaView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CShurufaView
CSYDBManip sydb;
IMPLEMENT_DYNCREATE(CShurufaView, CView)

BEGIN_MESSAGE_MAP(CShurufaView, CView)
	//{{AFX_MSG_MAP(CShurufaView)
	ON_COMMAND(ID_SHURUFA, OnShurufa)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShurufaView construction/destruction

CShurufaView::CShurufaView()
{
	// TODO: add construction code here
	m_pIME = 0;
	m_showhanzi=_T("");
	RegisterWindowMessage("WM_GETHANZI");
	RegisterWindowMessage("WM_GETSY");
	m_lfStr.lfHeight=20;
	m_lfStr.lfWidth=8;
	m_lfStr.lfEscapement=0;
	m_lfStr.lfOrientation=0;
	//m_lfStr.lfWeight=FW_BOLD;
	m_lfStr.lfItalic=FALSE;
	m_lfStr.lfUnderline=FALSE;
	m_lfStr.lfStrikeOut=FALSE;
	m_lfStr.lfCharSet=GB2312_CHARSET;
	m_lfStr.lfOutPrecision=OUT_STROKE_PRECIS;
	m_lfStr.lfClipPrecision=CLIP_STROKE_PRECIS;
	m_lfStr.lfQuality=DRAFT_QUALITY;
	m_lfStr.lfPitchAndFamily=VARIABLE_PITCH|FF_MODERN;
	strcpy(m_lfStr.lfFaceName,"楷体_GB2312");
	m_pFontStr.CreateFontIndirect(&m_lfStr);
	//LoadSYDB();
	m_lfNum.lfHeight=20;
	m_lfNum.lfWidth=8;
	m_lfNum.lfEscapement=0;
	m_lfNum.lfOrientation=0;
	//m_lfNum.lfWeight=FW_BOLD;
	m_lfNum.lfItalic=TRUE;
	m_lfNum.lfUnderline=FALSE;
	m_lfNum.lfStrikeOut=FALSE;
	m_lfNum.lfCharSet=GB2312_CHARSET;
	m_lfNum.lfOutPrecision=OUT_STROKE_PRECIS;
	m_lfNum.lfClipPrecision=CLIP_STROKE_PRECIS;
	m_lfNum.lfQuality=DRAFT_QUALITY;
	m_lfNum.lfPitchAndFamily=VARIABLE_PITCH|FF_MODERN;
	strcpy(m_lfNum.lfFaceName,"Times New Roman");
	m_pFontNum.CreateFontIndirect(&m_lfNum);
	m_nNumHi=25;
	m_clrBand[0]=RGB(255,0,0);
	m_clrBand[1]=RGB(255,128,64);
	m_clrBand[2]=RGB(0,128,0);
	m_clrBand[3]=RGB(0,64,64);
	m_clrBand[4]=RGB(0,0,64);
	m_clrBand[5]=RGB(0,0,255);
	m_clrBand[6]=RGB(255,0,255);
	m_clrBand[7]=RGB(0,64,64);
	m_clrBand[8]=RGB(64,64,64);
}

CShurufaView::~CShurufaView()
{
	//FreeSYDB();
}

BOOL CShurufaView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CShurufaView drawing

void CShurufaView::OnDraw(CDC* pDC)
{
	CShurufaDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDC->SelectObject(&m_pFontStr);

	// TODO: add draw code for native data here
	pDC->TextOut(1,1,m_showhanzi);
	
}

/////////////////////////////////////////////////////////////////////////////
// CShurufaView diagnostics

#ifdef _DEBUG
void CShurufaView::AssertValid() const
{
	CView::AssertValid();
}

void CShurufaView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CShurufaDoc* CShurufaView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShurufaDoc)));
	return (CShurufaDoc*)m_pDocument;
}
#endif //_DEBUG


void CShurufaView::OnShurufa() 
{
	if ( m_pIME != 0 )
		return;

	m_pIME = new CRCIMEView;
	CRect rPos,cPos;
	GetClientRect(rPos);
	cPos.top=(rPos.bottom-(rPos.bottom-rPos.top)/2);
	cPos.bottom=(rPos.bottom-rPos.top)*3/4+m_nNumHi;
	cPos.left=rPos.left;
	cPos.right=rPos.right;
	COLORREF clrStr;
	COLORREF clrNum;
	clrStr=RGB(0,0,100);
	clrNum=RGB(255,255,255);
	//////////////////////////////////////////////////////////
	//get the file name of "sydb.bin "
	///////////////////////////////////////////////////////////
	CString m_path;
 	GetModuleFileName(NULL,m_path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
 	m_path.ReleaseBuffer();
 	int pos=m_path.ReverseFind('\\');
 	m_path=m_path.Left(pos);
 	pos=m_path.ReverseFind('\\');
 	m_path=m_path.Left(pos);
 	m_path+="\\resource\\sydb.bin";
	
	m_pIME->MyCreate(this,cPos,WM_GETSY, WM_GETHANZI,&m_pFontNum,&m_pFontStr,clrStr,clrNum,m_clrBand,m_nNumHi);
	
}

void CShurufaView::LoadSYDB()
{
	CString m_path;
 	GetModuleFileName(NULL,m_path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
 	m_path.ReleaseBuffer();
 	int pos=m_path.ReverseFind('\\');
 	m_path=m_path.Left(pos);
 	pos=m_path.ReverseFind('\\');
 	m_path=m_path.Left(pos);
 	sydb.sDBfilename=m_path+"\\resource\\sydb.bin";
 	sydb.Load(m_path+"\\resource\\operatesydb.dll",sydb.sDBfilename);
 	sydb.LoadSYDB(sydb.sDBfilename);
}

void CShurufaView::FreeSYDB()
{
	sydb.FreeSYDB();
 	sydb.FreeDll();
}


LRESULT CShurufaView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(message==WM_GETHANZI) 
	{
			if (wParam!=0)
			{
	          int nShengMuInx,yunsum,nYunMu[30];
		      int nYunMuInx,yunindex,actualsize;
	          nShengMuInx=(int)(wParam & 0x00ff);
		      yunindex=(int)((wParam & 0xff00) >>8);
		      LoadSYDB();
			  yunsum=sydb.GetAllCombinationYunMu(nShengMuInx,nYunMu,30);
			  nYunMuInx=nYunMu[yunindex-1];
		      actualsize=sydb.GetAllCombinationHZ(nShengMuInx,nYunMuInx,(WCHAR*)lParam,BUFFER_SIZE);
	          FreeSYDB();
	          return(actualsize);
			};
	       if(wParam==0)
		   {
	          m_hanzi=(WCHAR)lParam;
			  HanZiIntoString(m_hanzi,m_showhanzi);	
			  InvalidateRect(NULL,FALSE);
		      return(m_hanzi);
		   };
	}
	else if(message==WM_GETSY)
	{
		if(wParam==(WPARAM)-1)
		{
			int i,j,shengsum,shengmulen;
			WCHAR desc[4];
			LoadSYDB();
			shengsum=sydb.ShengMuSum();
			for(i=1;i<=shengsum;i++)
			{
				shengmulen=sydb.GetShengMuDesc(i,desc,4);
				((WCHAR*)lParam)[(i-1)*SHENGMULEN+0]=shengmulen;
				for(j=1;j<5;j++)
				{
					((WCHAR*)lParam)[(i-1)*SHENGMULEN+j]=desc[j-1];
					desc[j-1]=0;
				}
				
			};
			FreeSYDB();
			return(shengsum);
		}
		else
		{
			int shengindex,yunmusum,i,j,nYunMu[30];
			int yunmulen;
			WCHAR desc[7];
			shengindex=(int)wParam;
			LoadSYDB();
			yunmusum=sydb.GetAllCombinationYunMu(shengindex,nYunMu,30);
			for(i=0;i<yunmusum;i++)
			{
				yunmulen=sydb.GetYunMuDescByInx(nYunMu[i],desc,7);
				((WCHAR*)lParam)[i*YUNMULEN+0]=yunmulen;
				for(j=0;j<7;j++)
				{
					((WCHAR*)lParam)[i*YUNMULEN+j+1]=desc[j];
					desc[j]=0;
				}
			};
			FreeSYDB();
			return(yunmusum);
		}
	};
	return CView::DefWindowProc(message, wParam, lParam);
}
int CShurufaView::HanZiIntoString(WCHAR hanzi,CString &str)
{
	int len;
	char *temp=new char[2];
	len=str.GetLength();
	WideCharToMultiByte(CP_ACP,0,&hanzi,1,temp,2,NULL,NULL);
	str.Insert(len+1,temp[0]);
	str.Insert(len+2,temp[1]);
	delete [] temp;
	return(1);
}


⌨️ 快捷键说明

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