www.pudn.com > xxmpx_sjs.rar > xxmpxView.cpp


// xxmpxView.cpp : implementation of the CXxmpxView class 
// 
 
#include "stdafx.h" 
#include "xxmpx.h" 
 
#include "xxmpxDoc.h" 
#include "xxmpxView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define SELECT_COLOR RGB(147,211,211)  //天兰色 
#define FMRJJ        1  //发明人简介 
#define RULE         2  //概念规则 
#define ANSER        3  //问题解答 
#define ZLLX         4  //字梁练习 
#define ShowTs       5  //显示提示 
#define HideTs       6  //隐藏提示 
#define READSAY      7  //入门须知 
#define READFPGZ     8  //返朴归真 
#define ZCQW         9  //真诚期望 
int ShowFlag=READSAY; 
int TsFlag=ShowTs; 
int  TabKey=0;    //表示未按Tab键  若TabKey==1则表示按了Tab键 
int OldPos=0; 
int xPos,yPos,xBitmapStartPos,yBitmapStartPos; 
RECT OldRect,NewRect; 
CSize hzSize; 
int LargeHzWeight; 
unsigned long messageTime1,messageTime2,timeWeight; 
int ZllxLine=0,ZllxLie=0;    //字梁练习 行 列 
char ZllxStr[23][41]={"人阝月亠山石虫忄土扌日讠宀艹口尸钅木彳亻", 
"王疒氵女禾纟弓彐十入士丁饣廾心歹业毛也穴","门几田丈米夂酉灬六广水酋羽攵穴", 
"鸟小一八三片饣","廴乌久匚不甲宀酋二身", 
"人木尸酉上六石","皿四入火生丈亻", 
"乃贝戋毋于","大冂五儿非且子", 
"天未牛匕勹业午口戈斤己","了丁米七乇囗也豕巳毛正曰臼", 
"也乜门夕厂耒禾虫川乙","车豸弋虫九万爿月亠夂母卜乡", 
"申白夭甫已西辶巾","幺末寸女心夫止目田厶弓之", 
"凵立力一用丨耳十疒巛","由舟西末也十上四木文", 
"毛臼虫四几文歹亦木方广","手鱼巴水刀", 
"世马日彳亻牛戋犭一未乃山","亡纟米又氵八门亻犭末牛羽廿冖饣丁士", 
"丶冫氵灬一忄丿弋扌讠石尸纟阝夕人女木禾钅","亻宀匕臼虫十艹土王山门几口日月由四止"}; 
 
char ZllxStrZm[23][41]={"abcdefghijklmnopqrst", 
"uvwxyzbefaijlnwfhtwm","unqxyxgmddvvhrspbxym", 
"phvghsbymgdvvgghhslp","zzbxpyyeuuyqmvghsrjl", 
"pzanrpdvghhrspzvdvvf","hhrmmmbaaxqqffhxmept", 
"hhyhsrlpbaxqrnqdmjjj","vgwlbalmluqtenkhcjlb", 
"arqtebbhbqeorahssjjl","bjyytteeowvtlbaytekw", 
"wzwuubhfkarygmfhulqs","ersrgntfhcdjrqxlqehs", 
"bprqvpqsszazkclgzlep","srzrbjxtwaxhcqzbvtzy", 
"uzbsdhpfgvxchcfvqtfv","qmphssrgrtwpkfphmrxd", 
"gjdttwmgkmndfndrdwfd","aadwjymxbblpvpukpzll", 
"pnspkstqrsgrbehdmmec","duzyxwvutsrqphnmlsji", 
"dvwmghsrjlfpzbbaxryq","tkmtwgpfniueunokcqmh"}; 
 
int GetNewRect(char LineLieZm,int xPos,int yPos,RECT &NewRect); 
int GetShowStr(char LineLieZm,char ShowStr[57],char ShowStr2[71]); 
///////////////////////////////////////////////////////////////////////////// 
// CXxmpxView 
 
IMPLEMENT_DYNCREATE(CXxmpxView, CScrollView) 
 
BEGIN_MESSAGE_MAP(CXxmpxView, CScrollView) 
	//{{AFX_MSG_MAP(CXxmpxView) 
	ON_COMMAND(ID_READ_FMRJJ, OnReadFmrjj) 
	ON_COMMAND(ID_READ_RULE, OnReadRule) 
	ON_COMMAND(ID_READ_ANSER, OnReadAnser) 
	ON_COMMAND(ID_READ_ZLB, OnReadZlb) 
	ON_COMMAND(ID_TEST_DO, OnTestDo) 
	ON_WM_KEYDOWN() 
	ON_COMMAND(ID_TEST_ZLLX, OnTestZllx) 
	ON_WM_CHAR() 
	ON_COMMAND(ID_TEST_wtsZLLX, OnTESTwtsZLLX) 
	ON_COMMAND(ID_READ_COME, OnReadCome) 
	ON_COMMAND(ID_READ_FPGZ, OnReadFpgz) 
	ON_COMMAND(ID_READ_ZCQW, OnReadZcqw) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CXxmpxView construction/destruction 
 
CXxmpxView::CXxmpxView() 
{ 
	// TODO: add construction code here 
 
} 
 
CXxmpxView::~CXxmpxView() 
{ 
} 
 
BOOL CXxmpxView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CScrollView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CXxmpxView drawing 
 
void CXxmpxView::OnDraw(CDC* pDC) 
{ 
	CXxmpxDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
	CFont font; 
	CFont * oldfont; 
	font.CreateFontIndirect(&pDoc->m_font); //使font对象与Windows的一种字体相关联 见《VC教程121页》 
 
	CRect r,r1; 
	GetClientRect(&r); 
	int ScreenWidth=r.right; 
	int ScreenHigh=r.bottom; 
	r1.top=0; 
	r1.left=0; 
	r1.right=1300;   //接近21英寸屏幕宽度 
	r1.bottom=1000; 
	pDC->FillSolidRect(r1,SELECT_COLOR);  //设置底色 
//----------------初始化全局变量--------------------------------- 
	CClientDC dc(this); 
	hzSize=dc.GetTextExtent("汉");              //得到一个汉字的大小 
	LargeHzWeight=28;                           //大字宽度 
	int aHigh=hzSize.cy+hzSize.cy/2; 
	int xTextPos=(ScreenWidth-hzSize.cx*47)/2; 
	if(xTextPos<10)xTextPos=10; 
 
    xBitmapStartPos=(ScreenWidth-10*55)/2;      //每个按扭的宽度为55 
	xPos=xBitmapStartPos; 
	yBitmapStartPos=ScreenHigh/2-4*55; 
	if(yBitmapStartPos<10)yBitmapStartPos=10; 
	yPos=yBitmapStartPos; 
 
	int yTextPos=yPos-aHigh; 
	if(yTextPos<10)yTextPos=10; 
//------------------------------------------------- 
 
   if(ShowFlag==FMRJJ) 
	{ 
	CBitmap Bitmap; 
	Bitmap.LoadBitmap(IDB_BITMAP2); 
	CDC MemDC; 
	MemDC.CreateCompatibleDC(pDC);  //先放到内存中,这一句可去掉 
	MemDC.SelectObject(&Bitmap); 
	BITMAP bm; 
	Bitmap.GetObject(sizeof(BITMAP),&bm); 
	pDC->BitBlt(xTextPos+hzSize.cx*40-5,yTextPos,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); 
 
		CString str; 
   str="  孙基寿,男,湖北咸宁人,1964年5月出生,1987年湖北中医学院中药系毕业。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*0,str); 
   str="  隐隐约约地记得小时候因感觉查字典特别麻烦,曾产生过研究一种查字方法的念头。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*1,str); 
   str="当时我感觉到,一种好的方法肯定是需要学习的,而如果没有国家的支持,如果不放到小"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*2,str); 
   str="学教材中,……不知道是认为即使研究出来了也无法得到国家的支持还是什么别的原因,"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*3,str); 
   str="总之,那种研究汉字检索方法的念头不知道在什么时候没有了。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*4,str); 
   str="  1994 年9月我在深圳工作期间因学习和使用一种汉字编码输入法而感觉到脑子里乱糟"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*5,str); 
   str="糟的很不舒服,有时还绵绵作痛。只有疼痛才会引起关注和思考,对我也不例外:为什么"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*6,str); 
   str="脑子里乱糟糟的?为什么会绵绵作痛?“田”“甲”“由”“申”摆在一起整齐如一,为"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*7,str); 
   str="什么不将它们放在同一个键上?而“工”“戈”“艹”“匚”“七”摆在一起乱七八糟,为什么却偏偏将它"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*8,str); 
   str="们放在同一个键上?种种疑问引发了一种从小就有的研究汉字检索方法的念头再一次浮现,于是,我开始研"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*9,str); 
   str="究汉字编码即形象码了,我知道最好的汉字编码一定就是最好的汉字检索方法。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*10,str); 
   str="  如果得不到支持就可能陷入困境,对此我十分清楚。我曾经试图摆脱形象码的“纠缠”以安心地做好本"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*11,str); 
   str="职工作,但否定了一千遍一万遍,我无论如何也否定不了自己。除了形象码,我已经对任何事情索然无味。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*12,str); 
   str="我清楚地认识到,汉语拼音实质上是一种描述字音感觉的音感符号,而形象码则是一种描述字形感觉的形感"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*13,str); 
   str="符号。这种形感符号既具有汉语拼音的优点凭感觉不遗忘,又克服了汉语拼音的缺点拼不准重码多,因而完"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*14,str); 
   str="全可以成为一种不可替代的文字工具,用于汉字的管理和电脑打字。为了进一步完善它,我在1995 年5月初"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*15,str); 
   str="步完成形象码的研究之后又重新推敲了十年之久。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*16,str); 
   str="  多少年来,我处处碰壁,深深地感受到了一种不被理解的滋味是多么的痛苦。但只要我一想到形象码那"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*17,str); 
   str="追求真谛的思想和对于子孙后代的意义,我就信心百倍。我多么希望能早一天将它呈现在人们的面前。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*18,str); 
	} 
	else if(ShowFlag==RULE) 
	{ 
		CString str; 
   str="字 梁:即汉字最直观的组成单位,如“奋”是由“大”和“田”两个字梁组成"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*0,str); 
   str="高字梁:即构字频率较高的字梁,共26个:人阝月山石虫忄土扌日讠宀艹口尸钅木彳犭亻王疒氵女禾纟"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*1,str); 
   str="分类码:如“A:人入火贝大天夭夫”,即A就是这些字梁的分类码(请阅读字梁分类总表)"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*2,str); 
   str="识别码:即字梁的拼音首字母或相关字母,如“人”的识别码为 r,“”(无读音)的识别码为 a"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*3,str); 
   str="单梁字:由一个字梁组成的汉字,如“人”是由一个字梁组成的,即“人”是单梁字"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*4,str); 
   str="双梁字:由两个字梁组成的汉字,如“奋”是由两个字梁组成的,即“奋”是双梁字"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*5,str); 
   str="多梁字:由三个和三个以上字梁组成的汉字,如“众”“奇”“器”“藏”是多梁字"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*6,str); 
   str="三原则:汉字拆分必须遵循三个原则,即书写原则、直观原则和最少原则。书写原则就是总体上必须按照书写"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*7,str); 
   str="    顺序拆分汉字;直观原则就是拆分汉字必须直观自然;最少原则就是必须使拆分出来的字梁数目最少"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*8,str); 
   str="单梁字的编码:如“人”的分类码为 A,识别码为 r,即“人”的编码为“Ar;”(不区分大小写,下同)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*9,str); 
   str="双梁字的编码:①首尾字梁都是高字梁,如“汝”的编码为“WXv;”(v 表示首尾都是高字梁,会提前显示)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*10,str); 
   str="       ②仅仅首字梁是高字梁,如“汉”的编码为“WXy;”(y 是“又”的识别码,会提前显示)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*11,str); 
   str="       ③首字梁不是高字梁,如“奋”的编码为“AQd;”(d 是“大”的识别码,会提前显示)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*12,str); 
   str="多梁字的编码:奇:大丁口 :AJO (依次取分类码,不足四码以空格键结尾)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*13,str); 
   str="       器:口口大口:OOAO (依次取分类码,多于四码取前三码和最后一码)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*14,str); 
   str="词 组的编码:好 奇    :女子大丁:XBAJ (双字词组每字取前二码)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*15,str); 
   str="       哈尔滨    :口氵:OAbW (三字词组前一字取前二码,后二字各取前一码)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*16,str); 
   str="       中华人民共和国:口亻人囗:OTAO (多字词组取前三字和最后一字的前一码)"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*17,str); 
   str="   简 码:常用字的编码后半部分往往可以省略并且会提前显示在最前边,这时可以直接按空格键送出"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*18,str); 
   str="   选二键:为了手指移动方便,凡是能用2选择上屏的,都可以用点号键“.”代替"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*19,str); 
 
	} 
	else if(ShowFlag==ANSER)//	显示问题解答 
	{ 
		CString str; 
   str="◆ 形象码4.0版与以前的版本相比有什么不同?"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*0,str); 
   str="  ①该版本增加了6个字梁(H:;S:;P:;N:世),去掉了3个字梁(J:;M:)。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*1,str); 
   str="  ②以前版本中的“特别相像的字梁其识别码用其象形字母”的规则被废除。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*2,str); 
   str="◆ 用形象码打字时,遇到不会打的字怎么办?"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*3,str); 
   str="  如果利用该培训软件彻底学会了形象码,一般不会出现这种情况,如果万一出现有两种办法可以解决:"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*4,str); 
   str="  ① 用“[”号代替不清楚的地方,例如“躏”字只记得一个“”和一个“艹”,可以输入“pn[[”,"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*5,str); 
   str="然后按翻页键查询。键“=”、PageDown 向后翻页,“-”、PageUp 向前翻页。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*6,str); 
   str="  ② 打开形象码造词软件,用拼音输入不会编码的字,则该字的编码(形象码)就显示出来了。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*7,str); 
   str="◆ 用形象码时,希望将在一台电脑上造的个人词组转移到另一台电脑上,怎样转移?"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*8,str); 
   str="  只需将系统文件夹下的WxxmUser.mb文件复制到要转移的电脑上覆盖相应的文件即可。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*9,str); 
   str="◆ GBK字符集中有两万多个汉字,其中有一万五千多个汉字极少使用,我们把这部分汉字称为偏僻字。形象"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*10,str); 
   str="码输入法不仅能输入6763个国标汉字,还可以输入6763个字以外的偏僻字。偏僻字部分增加的字梁如下:"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*11,str); 
   str="  A:貝       b:鳥烏魚    D:     E:車   F: "; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*13,str); 
   str="  H:丱 L:訁飠     N:丗卌   P:馬"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*14,str); 
   str="  Q:釒玍毌    R:乀乁  S:     t:"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*15,str); 
   str="  U:門円丯     V:氷     X:乄卐卍   Z:糹"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*16,str); 
   str=""; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*17,str); 
   str="◆ 经常使用个别偏僻字的用户,可以打开形象码造词软件,在“形象码(偏僻字)”状态下输入偏僻字,并输"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*18,str); 
   str="入其编码,保存退出,以后就可以在“形象码(普及版)”状态下输入该偏僻字了。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*19,str); 
	} 
	else if(ShowFlag==ZCQW)//	显示真诚期望 
	{ 
 
 
		CString str; 
   str="寻求支持"; 
	    pDC->TextOut((ScreenWidth-hzSize.cx*4)/2,yTextPos+aHigh/2,str); 
   str="  虽然无论从哪一个方面来考虑,选择使用形象码都是最划算的,但很多人就是难以说服,他们没有什么"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*2,str); 
   str="值得陈述的理由──他们在观望,他们在等待,他们不愿意改变习惯,他们没有提高工作效率的压力,他们"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*3,str); 
   str="得不到正确的引导和有力的支持,他们曾经遭受过一些不良的影响,他们被各种偏见所包围……"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*4,str); 
   str="  一个人的觉醒是需要一个过程的,一个国家一个民族的觉醒同样如此。怎样唤醒人们来认识形象码?怎"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*5,str); 
   str="样唤醒国家权威机构来重视形象码?孙基寿遇到了太多的困难和阻力。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*6,str); 
   str="  但是,推广形象码乃是一项关系到子孙后代的大业,不能因为困难重重就半途而废。因此,本人真诚地"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*7,str); 
   str="希望对形象码有正确认识的广大用户能为形象码的传播尽一份力量:①向家人、朋友、同学、同事推荐形象"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*8,str); 
   str="码。②向国家相关部门写一封信,把自己使用形象码的心得体会告诉他们。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*9,str); 
   str="  一封信十封信也许起不到多少作用,一千封信一万封信就可能会引起注意。希望广大形象码用户不要忽"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*10,str); 
   str="视自己那一封信的神圣功能。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*11,str); 
   str=""; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*12,str); 
   str="  教育部语言文字信息管理司 地址:北京西单大木仓胡同37号 邮编:100816"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*13,str); 
   str="  国家语言文字工作委员会 地址:北京朝内南小街51号 邮编:100010"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*14,str); 
   str="  孙基寿 电话:027-87548431(办公室) 027-62559879(小灵通)"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*16,str); 
   str="  华中科技大学电子音像出版社 地址:湖北省武汉市珞瑜路1037号 邮编:430074"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*17,str); 
   str="  电话:027-87548431 传真:027-87556191"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*18,str); 
   str="  网址:www.hust-ep.com 或 www.hustep.com"; 
        pDC->TextOut(xTextPos,yTextPos+aHigh*19,str); 
	} 
	else if(ShowFlag==READSAY) 
	{ 
		CString str; 
   str="入门须知"; 
	    pDC->TextOut((ScreenWidth-hzSize.cx*4)/2,yTextPos+aHigh/2,str); 
        pDC->SetTextColor(RGB(0,0,255));                                //字体颜色为兰色 
      str="  一、学习形象码需要多长时间?打字速度有多快?"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*2,str); 
        pDC->SetTextColor(RGB(0,0,0));                                 //字体颜色为黑色 
   str="  如果能排除杂念,下定决心,借助该软件集中精力学习形象码,那么一般只需13~20个小时(键盘熟练"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*3,str); 
   str="者只需5~8小时)就能彻底掌握形象码,输入任何汉字,达到每分钟输入30~50字的起步速度,熟练后一般"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*4,str); 
   str="可达到每分钟100字左右的输入速度,专业打字员可达到每分钟200字以上的输入速度。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*5,str); 
 
        pDC->SetTextColor(RGB(0,0,255));                                //字体颜色为兰色 
   str="  二、学习形象码有什么好处?"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*6,str); 
        pDC->SetTextColor(RGB(0,0,0));                                 //字体颜色为黑色 
   str="  用形象码输入法打字,大多数人每天至少可节省1~2小时,50年就可节省18000~36000小时,相当于节"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*7,str); 
   str="省了 5~12 年的工作时间,这还没有把形象码“与心相应”“与神相随”“形神合一”“自然浮现”这种神"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*8,str); 
   str="奇效果给人们带来的好处计算在内。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*9,str); 
           pDC->SetTextColor(RGB(0,0,255));                                //字体颜色为兰色 
   str="  三、形象码为什么会产生“与心相应”“与神相随”“形神合一”“自然浮现”的神奇效果?"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*10,str); 
        pDC->SetTextColor(RGB(0,0,0));                                 //字体颜色为黑色 
   str="  因为形象码的编码规则无限地接近于人的自然感觉。既然形象码是一种无限接近于感觉的汉字编码,那"; 
 	    pDC->TextOut(xTextPos,yTextPos+aHigh*11,str); 
   str="为什么还是需要学习呢?虽然骑自行车是靠感觉掌握平衡的,但如果不学习,那就一辈子都不会骑自行车。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*12,str); 
   str="同样的道理,虽然形象码无限地接近于感觉,但如果不学习,这种感觉就会被其他规则压制而遭受折磨。不"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*13,str); 
   str="依靠感觉就能平稳站立的三轮车不需要学习就会骑,但很费劲不好骑。同样,与感觉无关的笔画检字法不需"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*14,str); 
   str="要学习就会使用,但查起字来很费劲,很伤神,效率低。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*15,str); 
   str="  四、怎样学习形象码?"; 
        pDC->SetTextColor(RGB(0,0,255));                                //字体颜色为兰色 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*16,str); 
        pDC->SetTextColor(RGB(0,0,0));                                 //字体颜色为黑色 
   str="  利用该培训软件进行学习。按照练习第一步、第二步、第三步循序渐进地做下去,不要急于求成。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*17,str); 
	} 
	else if(ShowFlag==READFPGZ) 
	{ 
		CString str; 
        pDC->SetTextColor(RGB(0,0,255));                                //字体颜色为兰色 
   str="形象码的技术特点"; 
	    pDC->TextOut((ScreenWidth-hzSize.cx*8)/2,yTextPos+aHigh*0+aHigh/2,str); 
        pDC->SetTextColor(RGB(0,0,0));            //字体颜色为黑色 
   str="  ① 形象码的汉字拆分是最直观的一种方式。首次学习的人凭第一感觉拆分,准确率极高。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*2,str); 
   str="  ② 从字形到编码的人脑反应,形象码的速度非常之快,感觉极为舒畅。使用形象码,你可以在不知不"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*3,str); 
   str="觉中快速地打出汉字,你的思维不会受到任何干扰。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*4,str); 
   str="  ③ 规则与感觉相一致是不遗忘的根本。形象码是一种无限接近于感觉的汉字编码。汉语拼音描述的是"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*5,str); 
   str="字音感觉,而形象码描述的则是字形感觉。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*6,str); 
   str="  ④ 学习形象码,借助形象码培训软件练习5至10个小时就可以掌握,练习1至2天时间即可运用自如。"; 
	    pDC->TextOut(xTextPos,yTextPos+aHigh*7,str); 
   str="  ⑤ 打字速度分自然速度和极限速度两种。所谓自然速度,就是学会并熟练之后平时很少打字的人的打"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*8,str); 
   str="字速度。所谓极限速度,就是通过高强度长期练习之后达到的只知道击键不知道编码时的最快打字速度。形"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*9,str); 
   str="象码的自然速度在每分钟50至100个字之间。极限速度在200字左右。比较而言,其他编码的自然速度太多在"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*10,str); 
   str="0至30个字之间,极限速度不会超过150字。"; 
  	    pDC->TextOut(xTextPos,yTextPos+aHigh*11,str); 
	} 
	else if(ShowFlag==ZLLX) 
	{ 
//######################################################################### 
 
	CBitmap Bitmap; 
	CDC MemDC; 
	BITMAP bm; 
    UINT IDstrNo; 
	UINT IDupPos=0,IDleftPos=0; 
	int i=0; 
	for(0;i<26;i++) 
	{ 
		if(i>=0 && i<=9) 
		{ 
			IDupPos=yBitmapStartPos+0*55; 
			IDleftPos=xBitmapStartPos+i*55; 
		} 
		else if(i>=10 && i<=18) 
		{ 
			IDupPos=yBitmapStartPos+1*55; 
			IDleftPos=xBitmapStartPos+(i-10)*55+25; 
		} 
		else if(i>=19 && i<=25) 
		{ 
			IDupPos=yBitmapStartPos+2*55; 
			IDleftPos=xBitmapStartPos+(i-19)*55+50; 
		} 
		if(i==0)     IDstrNo=IDB_BITMAP_Q; 
        else if(i==1)IDstrNo=IDB_BITMAP_W; 
		else if(i==2)IDstrNo=IDB_BITMAP_E; 
		else if(i==3)IDstrNo=IDB_BITMAP_R; 
		else if(i==4)IDstrNo=IDB_BITMAP_T; 
		else if(i==5)IDstrNo=IDB_BITMAP_Y; 
		else if(i==6)IDstrNo=IDB_BITMAP_U; 
		else if(i==7)IDstrNo=IDB_BITMAP_I; 
		else if(i==8)IDstrNo=IDB_BITMAP_O; 
		else if(i==9)IDstrNo=IDB_BITMAP_P; 
//-------------------------第二排-------------- 
		else if(i==10)IDstrNo=IDB_BITMAP_A; 
        else if(i==11)IDstrNo=IDB_BITMAP_S; 
		else if(i==12)IDstrNo=IDB_BITMAP_D; 
		else if(i==13)IDstrNo=IDB_BITMAP_F; 
		else if(i==14)IDstrNo=IDB_BITMAP_G; 
		else if(i==15)IDstrNo=IDB_BITMAP_H; 
		else if(i==16)IDstrNo=IDB_BITMAP_J; 
		else if(i==17)IDstrNo=IDB_BITMAP_K; 
		else if(i==18)IDstrNo=IDB_BITMAP_L; 
//-------------第三排--------------------- 
		else if(i==19)IDstrNo=IDB_BITMAP_Z; 
        else if(i==20)IDstrNo=IDB_BITMAP_X; 
		else if(i==21)IDstrNo=IDB_BITMAP_C; 
		else if(i==22)IDstrNo=IDB_BITMAP_V; 
		else if(i==23)IDstrNo=IDB_BITMAP_B; 
		else if(i==24)IDstrNo=IDB_BITMAP_N; 
		else if(i==25)IDstrNo=IDB_BITMAP_M; 
//---------------------------------------- 
	    Bitmap.LoadBitmap(IDstrNo); 
	    MemDC.CreateCompatibleDC(pDC); 
		MemDC.SelectObject(&Bitmap); 
	    Bitmap.GetObject(sizeof(BITMAP),&bm); 
	    pDC->BitBlt(IDleftPos+10,IDupPos+10,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); 
	}  //for 循环结束 
//-------------------------------反相显示一个位图-------------------------------- 
           char LineLieZm=ZllxStrZm[ZllxLine][ZllxLie];     //取得对应字母 
        GetNewRect( LineLieZm, xBitmapStartPos, yBitmapStartPos, NewRect);      //得到一个要反相显示的新矩形 
		   OldRect.left=NewRect.left; 
	       OldRect.right=NewRect.right; 
		   OldRect.top=NewRect.top; 
		   OldRect.bottom=NewRect.bottom; 
        if(TsFlag==ShowTs) 
		{ 
           pDC->InvertRect(&OldRect);        //反相显示一个矩形 
		} 
//=========================================================================== 
//-----------------------显示行数----------------------------- 
 
	char LineNumText[9]="第 00 行"; 
	char LineNumStr[3]="00"; 
	ZllxLine++; 
	_ltoa((long)ZllxLine,LineNumStr,10);  //将ZllxLine转化为字符,并存放在LineNumStr中,10表示10进制 
	if(strlen(LineNumStr)==1) 
	{ 
		LineNumText[4]=LineNumStr[0]; 
	} 
	else 
	{ 
		LineNumText[3]=LineNumStr[0]; 
		LineNumText[4]=LineNumStr[1]; 
	} 
 
 
        pDC->SetTextColor(RGB(155,155,155));               //字体颜色为灰色 
//	    pDC->TextOut(xPos,275,LineNumText);                //显示行数 
	    pDC->TextOut(xPos,yPos+275,LineNumText);                //显示行数 
        pDC->SetTextColor(RGB(0,0,0));                     //字体颜色为黑色 
		ZllxLine--; 
//-------------------------------------------------------------- 
 
           char ShowStr[57],ShowStr2[71]; 
           GetShowStr(LineLieZm,ShowStr,ShowStr2); 
	   if(TsFlag==ShowTs) 
	   { 
           pDC->TextOut(xPos,yPos+195,ShowStr);               //显示对应的文字说明 
//           pDC->SetTextColor(RGB(155,155,155));           //字体颜色为灰色 
           pDC->TextOut(xPos,yPos+220,ShowStr2);               //显示对应的文字说明 
	   } 
	   else 
	   { 
//           pDC->SetTextColor(RGB(0,0,0));           //字体颜色为黑色 
           pDC->TextOut(xPos,yPos+195,"注意:要看提示请按 Tab 键。               ");               //显示对应的文字说明 
           pDC->TextOut(xPos,yPos+220,"Tab 键就是 Q 键左侧的那个键。                   ");               //显示对应的文字说明 
	   } 
 
        pDC->SetTextColor(RGB(155,155,155));           //字体颜色为灰色 
 
 	    oldfont = pDC->SelectObject(&font);               //保存原字体大小,选择新字体大小 
		char tempbuf[3]; 
		int k; 
		for(k=0;k<20;k++)  //目的在于将每个大字汉字的位置固定 
		{ 
		tempbuf[0]=ZllxStr[ZllxLine][k*2]; 
		tempbuf[1]=ZllxStr[ZllxLine][k*2+1];  //得到要突出显示的字 
		tempbuf[2]='\0'; 
	    pDC->TextOut(xPos+LargeHzWeight*k,yPos+300,tempbuf);         //显示一行 
		} 
 
        pDC->SetTextColor(RGB(0,0,255));            //字体颜色为兰色 
		tempbuf[0]=ZllxStr[ZllxLine][ZllxLie*2+0]; 
		tempbuf[1]=ZllxStr[ZllxLine][ZllxLie*2+1];  //得到要突出显示的字 
		tempbuf[2]='\0'; 
 
	    pDC->TextOut(xPos+LargeHzWeight*ZllxLie,yPos+300,tempbuf);     //突出显示一个字 
 
           pDC->SetTextColor(RGB(0,150,150));                   //字体颜色为 
		   pDC->TextOut(xPos+LargeHzWeight*ZllxLie,yPos+330,"▲"); 
        pDC->SelectObject(oldfont);                        //恢复原字体大小 
		   OldPos = xPos+LargeHzWeight*ZllxLie; 
 
        pDC->SetTextColor(RGB(0,0,0));                  //字体颜色为黑色 
	    pDC->TextOut(xPos,yPos+375,"有效击键速度为:  键∕分钟。");                //显示行数 
	    pDC->TextOut(xPos+15*hzSize.cx,yPos+375,"占总击键的百分率为:  %。");                //显示行数 
	    pDC->TextOut(xPos,yPos+400,"操作方法:在英文输入状态下直接输入对应字母。移动或翻页可用→↑←↓键。");      //显示一行 
        pDC->SetTextColor(RGB(0,0,200));                  //字体颜色为黑色 
	    pDC->TextOut(xPos,yPos+400,"操作方法");      //显示一行 
//####################################################################### 
	} //ShowFlag==ZLLX 处理结束 
	else 
	pDC->TextOut(xTextPos,10,"显示其他"); 
 
} 
 
void CXxmpxView::OnInitialUpdate() 
{ 
     
	CClientDC dc(this); 
	hzSize=dc.GetTextExtent("汉");    //得到一个汉字的大小 
	int aHigh=hzSize.cy+hzSize.cy/2; 
 
	CScrollView::OnInitialUpdate(); 
//	CSize sizeTotal(1000,600); 
	CSize sizeTotal(hzSize.cx*48,aHigh*20); 
// TODO: calculate the total size of this view 
	SetScrollSizes(MM_TEXT, sizeTotal); 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CXxmpxView diagnostics 
 
#ifdef _DEBUG 
void CXxmpxView::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CXxmpxView::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CXxmpxDoc* CXxmpxView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXxmpxDoc))); 
	return (CXxmpxDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CXxmpxView message handlers 
 
void CXxmpxView::OnReadCome()  
{ 
	// TODO: Add your command handler code here 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	pDoc->CSelectFontHeight(20); 
 
    ShowFlag=READSAY;	 
	Invalidate(); 
	 
} 
void CXxmpxView::OnReadFpgz()  
{ 
	// TODO: Add your command handler code here 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	pDoc->CSelectFontHeight(20); 
 
    ShowFlag=READFPGZ;	 
	Invalidate(); 
	 
} 
void CXxmpxView::OnReadFmrjj()  
{ 
	// TODO: Add your command handler code here 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	pDoc->CSelectFontHeight(20); 
 
    ShowFlag=FMRJJ;	 
	Invalidate(); 
	 
} 
 
void CXxmpxView::OnReadRule()  
{ 
	// TODO: Add your command handler code here 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	pDoc->CSelectFontHeight(20); 
 
    ShowFlag=RULE;	 
	Invalidate(); 
	 
} 
 
void CXxmpxView::OnReadAnser() //问题解答 
{ 
	// TODO: Add your command handler code here 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	pDoc->CSelectFontHeight(20); 
 
    ShowFlag=ANSER;	 
	Invalidate(); 
	 
} 
void CXxmpxView::OnReadZcqw() //问题期望 
{ 
	// TODO: Add your command handler code here 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	pDoc->CSelectFontHeight(20); 
 
    ShowFlag=ZCQW;	 
	Invalidate(); 
	 
} 
 
void CXxmpxView::OnReadZlb()  
{ 
	// TODO: Add your command handler code here 
	aZlbDlg=new ZlbDlg(this); 
    aZlbDlg->Create(IDD_DIALOG_ZLB); 
    aZlbDlg->ShowWindow(SW_RESTORE); 
 
} 
 
void CXxmpxView::OnTestDo()  
{ 
	// TODO: Add your command handler code here 
	aDoTest=new DoTest(this); 
    aDoTest->Create(IDD_DIALOG_DOTEST); 
    aDoTest->ShowWindow(SW_RESTORE); 
	 
} 
 
 
void CXxmpxView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	// TODO: Add your message handler code here and/or call default 
 
  if(ShowFlag==ZLLX) 
  { 
//    m_inputKeyNum++; 
//----------------------------- 
	CXxmpxDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	CFont font; 
	CFont * oldfont; 
	font.CreateFontIndirect(&pDoc->m_font); 
 
//---------------------------- 
	switch(nChar) 
	{ 
	case VK_HOME: 
		break; 
	case VK_END: 
		break; 
	case VK_PRIOR: 
		break; 
	case VK_NEXT: 
		break; 
	case VK_UP:  //上箭头 
		if(ZllxLine==0)ZllxLine=22; 
		else ZllxLine--; 
		break; 
	case VK_DOWN:  //下箭头 
		if(ZllxLine==22)ZllxLine=0; 
		else ZllxLine++; 
		break; 
	case VK_BACK://退格键 
		if(ZllxLie==0) 
		{ 
			if(ZllxLine==0) 
			{ 
				ZllxLine=22; 
			} 
		    else ZllxLine--; 
            ZllxLie=19; 
		} 
		else ZllxLie--; 
		break; 
	case VK_LEFT://左箭头 
		if(ZllxLie==0) 
		{ 
			if(ZllxLine==0) 
			{ 
				ZllxLine=22; 
			} 
		    else ZllxLine--; 
            ZllxLie=19; 
		} 
		else ZllxLie--; 
		break; 
	case VK_RIGHT: //右箭头 
		if(ZllxLie==19) 
		{ 
		    if(ZllxLine==22) 
			{ 
				ZllxLine=0; 
			} 
		    else ZllxLine++; 
			ZllxLie=0; 
		} 
		else ZllxLie++; 
		break; 
	default: 
		break; 
	} 
 
	CClientDC dc(this); 
	dc.SetBkColor(SELECT_COLOR);    //设置背景色 
 
//-----------------------显示行数----------------------------- 
    dc.SetTextColor(RGB(155,155,155));               //字体颜色为灰色 
	char LineNumText[9]="第 00 行"; 
	char LineNumStr[3]="00"; 
    ZllxLine++; 
	_ltoa((long)ZllxLine,LineNumStr,10); 
	if(strlen(LineNumStr)==1) 
	{ 
		LineNumText[4]=LineNumStr[0]; 
	} 
	else 
	{ 
		LineNumText[3]=LineNumStr[0]; 
		LineNumText[4]=LineNumStr[1]; 
	} 
 
	dc.TextOut(xPos,yPos+275,LineNumText);  
    ZllxLine--; 
//-------------------------------------------------------------- 
	    oldfont = dc.SelectObject(&font);           //保存原字体大小,设置新字体大小  
		char tempbuf[3]; 
		int k; 
        dc.SetTextColor(RGB(155,155,155));           //字体颜色为灰色 
		for(k=0;k<20;k++) 
		{ 
		tempbuf[0]=ZllxStr[ZllxLine][k*2]; 
		tempbuf[1]=ZllxStr[ZllxLine][k*2+1];  //得到要突出显示的字 
		tempbuf[2]='\0'; 
	    dc.TextOut(xPos+LargeHzWeight*k,yPos+300,tempbuf);         //显示一行 
		} 
		tempbuf[0]=ZllxStr[ZllxLine][ZllxLie*2+0]; 
		tempbuf[1]=ZllxStr[ZllxLine][ZllxLie*2+1]; 
		tempbuf[2]='\0'; 
        dc.SetTextColor(RGB(0,0,255));                              //字体颜色为兰色 
	    dc.TextOut(xPos+LargeHzWeight*ZllxLie,yPos+300,tempbuf);     //突出显示一个字 
		dc.TextOut(OldPos,yPos+330," ");                             //清除前一次留下的箭头 
        dc.SetTextColor(RGB(0,150,150));                                 //字体颜色为兰色 
		dc.TextOut(xPos+LargeHzWeight*ZllxLie,yPos+330,"▲"); 
		dc.SelectObject(oldfont);                                       //恢复原字体大小 
		OldPos = xPos+LargeHzWeight*ZllxLie; 
//--------------反相显示一个位图---------------------------------------- 
        if(TsFlag==ShowTs) 
        dc.InvertRect(&OldRect);                      //还原被反相显示的位图 
 
		char LineLieZm=ZllxStrZm[ZllxLine][ZllxLie];  //得到“▲”所指处对应的字母 
            
        char ShowStr[57],ShowStr2[71]; 
        GetNewRect( LineLieZm, xBitmapStartPos, yBitmapStartPos, NewRect);      //得到一个要反相显示的新矩形 
        GetShowStr(LineLieZm,ShowStr,ShowStr2); 
        dc.SetTextColor(RGB(0,0,0));           //字体颜色为黑色 
        if(TsFlag==ShowTs) 
		{ 
           dc.InvertRect(&NewRect);                       //反相显示一个矩形 
           dc.TextOut(xPos,yPos+195,ShowStr);               //显示对应的文字说明 
           dc.TextOut(xPos,yPos+220,ShowStr2);               //显示对应的文字说明 
		} 
		else 
		{ 
			 if(nChar==VK_TAB) 
			 { 
                 dc.TextOut(xPos,yPos+195,ShowStr);               //显示对应的文字说明 
                 dc.TextOut(xPos,yPos+220,ShowStr2);               //显示对应的文字说明 
                 if(TabKey==0) 
				 { 
                    dc.InvertRect(&NewRect);                       //恢复反相显示的一个矩形 
			        TabKey=1; 
				 } 
			 } 
			 else 
			 { 
                 dc.TextOut(xPos,yPos+195,"注意:要看提示请按 Tab 键。              "); //显示对应的文字说明 
                 dc.TextOut(xPos,yPos+220,"Tab 键就是 Q 键左侧的那个键。                   "); //显示对应的文字说明 
                 if(TabKey==1) 
				 { 
                    dc.InvertRect(&OldRect);                       //恢复反相显示的一个矩形 
			        TabKey=0; 
				 } 
			 } 
		} 
 
		   OldRect.left=NewRect.left; 
	       OldRect.right=NewRect.right; 
		   OldRect.top=NewRect.top; 
		   OldRect.bottom=NewRect.bottom; 
//--------------------------------------------------------------- 
		DeleteDC(dc);                      //删除DC 
  }//ShowFlag==ZllX 
	CScrollView::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
 
void CXxmpxView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	// TODO: Add your message handler code here and/or call default 
   if(ShowFlag==ZLLX ) 
  { 
		   char tempbuf[3]; 
 
	CXxmpxDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
//----------------------------- 
	CFont font; 
	CFont * oldfont; 
	font.CreateFontIndirect(&pDoc->m_font);   //创建字体关联 
//---------------------------- 
	if(nChar>='A' && nChar<='Z') 
		nChar=nChar+32;                    //大小字母转换为小写 
    CString keyChar; 
	pDoc->Text=nChar; 
    keyChar=pDoc->Text; 
 
	CClientDC dc(this); 
	dc.SetBkColor(SELECT_COLOR);                 //设置背景色 
	oldfont = dc.SelectObject(&font);   //保存原字体大小,设置新字体大小 
    if(TsFlag==ShowTs) 
            dc.InvertRect(&OldRect);                     //还原被反相显示的位图 
 
		   char tempbuffer[3]; 
		   tempbuffer[0]=ZllxStr[ZllxLine][ZllxLie*2+0]; 
		   tempbuffer[1]=ZllxStr[ZllxLine][ZllxLie*2+1];   //得到“▲”所指处对应的字 
		   tempbuffer[2]='\0'; 
        dc.SetTextColor(RGB(155,155,155));           //字体颜色为灰色 
        dc.TextOut(OldPos,yPos+300,tempbuffer);      //更新显示一个即将过去的字 
		dc.SelectObject(oldfont);                    //恢复原字体大小 
 
		char LineLieZm=ZllxStrZm[ZllxLine][ZllxLie];       //得到“▲”所指处对应的字母 
 
       if(keyChar[0]>='a' && keyChar[0]<='z') 
		 if(ZllxLie==19) 
		 { 
		   if(ZllxLine==22)ZllxLine=0; 
		   else ZllxLine++; 
		   ZllxLie=0; 
		 } 
		 else ZllxLie++; 
 
		if(ZllxLie==0) 
		{ 
	       oldfont = dc.SelectObject(&font);   //保存原字体大小,设置新字体大小 
		int k; 
		for(k=0;k<20;k++) 
		{ 
		tempbuf[0]=ZllxStr[ZllxLine][k*2]; 
		tempbuf[1]=ZllxStr[ZllxLine][k*2+1];  //得到要突出显示的字 
		tempbuf[2]='\0'; 
	    dc.TextOut(xPos+LargeHzWeight*k,yPos+300,tempbuf);         //显示一行 
		} 
		   dc.SelectObject(oldfont);          //恢复原字体大小 
//-----------------------显示行数----------------------------- 
    dc.SetTextColor(RGB(155,155,155));               //字体颜色为灰色 
	char LineNumText[9]="第 00 行"; 
	char LineNumStr[3]="00"; 
    ZllxLine++; 
	_ltoa((long)ZllxLine,LineNumStr,10); 
	if(strlen(LineNumStr)==1) 
	{ 
		LineNumText[4]=LineNumStr[0]; 
	} 
	else 
	{ 
		LineNumText[3]=LineNumStr[0]; 
		LineNumText[4]=LineNumStr[1]; 
	} 
	dc.TextOut(xPos,yPos+275,LineNumText);  
    ZllxLine--; 
//------------------------------------------------------------ 
		} 
 
           dc.SetTextColor(RGB(0,0,255));                //字体颜色为兰色 
		   tempbuf[0]=ZllxStr[ZllxLine][ZllxLie*2+0]; 
		   tempbuf[1]=ZllxStr[ZllxLine][ZllxLie*2+1];      //得到“▲”所指处对应的字母 
		   tempbuf[2]='\0'; 
	       oldfont = dc.SelectObject(&font);   //保存原字体大小,设置新字体大小 
	       dc.TextOut(xPos+LargeHzWeight*ZllxLie,yPos+300,tempbuf);  //突出显示一个字 
	 	   dc.TextOut(xPos,yPos+330,"                                   ");   //清除前一次留下的箭头 
		   dc.SelectObject(oldfont);          //恢复原字体大小 
 
//--------------------------------显示击键速度------------------ 
 
		   char HzNumStr[5],showStr[5]; 
		   int HzNumCyKeyNum;                  //有效输入键数除以总输入键数 
		   char HzNumCyKeyNumStr[5]; 
		   char showHzNumCyKeyNumStr[5]; 
 
		   if(messageTime1==0) 
		    messageTime1=GetMessageTime();     //得到系统自启动以来所经历的毫秒数 
		   else 
		   { 
		      messageTime2=GetMessageTime();     //得到系统自启动以来所经历的毫秒数 
		      timeWeight=messageTime2-messageTime1; 
 
		      if(timeWeight>=60000) 
			  { 
				  HzNumCyKeyNum=(m_inputHzNum*100)/m_inputKeyNum;  //为了更准确,多乘了10倍 
				  if(HzNumCyKeyNum<10)HzNumCyKeyNum=10; 
	              _ltoa((long)HzNumCyKeyNum,HzNumCyKeyNumStr,10); 
				  if(strlen(HzNumCyKeyNumStr)==2) 
				  { 
				     showHzNumCyKeyNumStr[0]='0'; 
				     showHzNumCyKeyNumStr[1]=HzNumCyKeyNumStr[0]; 
				     showHzNumCyKeyNumStr[2]=HzNumCyKeyNumStr[1]; 
				     showHzNumCyKeyNumStr[3]='\0'; 
				  } 
				  else //==3 
				  { 
				     showHzNumCyKeyNumStr[0]=HzNumCyKeyNumStr[0]; 
				     showHzNumCyKeyNumStr[1]=HzNumCyKeyNumStr[1]; 
				     showHzNumCyKeyNumStr[2]=HzNumCyKeyNumStr[2]; 
				     showHzNumCyKeyNumStr[3]='\0'; 
				  } 
 
	            _ltoa((long)m_inputHzNum,HzNumStr,10); 
                if(strlen(HzNumStr)==1) 
				{ 
					showStr[0]='0'; 
					showStr[1]='0'; 
					showStr[2]=HzNumStr[0]; 
					showStr[3]='\0'; 
				} 
				else if(strlen(HzNumStr)==2) 
				{ 
					showStr[0]='0'; 
					showStr[1]=HzNumStr[0]; 
					showStr[2]=HzNumStr[1]; 
					showStr[3]='\0'; 
				} 
				else 
				{ 
					showStr[0]=HzNumStr[0]; 
					showStr[1]=HzNumStr[1]; 
					showStr[2]=HzNumStr[2]; 
					showStr[3]='\0'; 
				} 
                dc.SetTextColor(RGB(0,0,0));                   //字体颜色为黑色 
	            dc.TextOut(xPos+8*hzSize.cx,yPos+375,showStr); 
	            dc.TextOut(xPos+25*hzSize.cx,yPos+375,showHzNumCyKeyNumStr); 
				 
			    m_inputKeyNum=0; 
		        m_inputHzNum=0; 
		        messageTime1=0; 
			    messageTime2=0; 
				timeWeight=0; 
 
			  } 
		   } 
 
//-----------------------速度测试结束---------------------------------------- 
 
	       oldfont = dc.SelectObject(&font);   //保存原字体大小,设置新字体大小 
		     if(keyChar[0]==LineLieZm) 
			 { 
		       dc.TextOut(OldPos,yPos+330," ");                 //清除前一次留下的箭头 
               m_inputHzNum++;                   //正确的击键数 
			   m_inputKeyNum++; 
 
			 } 
			 else  
			 { 
			   m_inputKeyNum++; 
		       dc.TextOut(OldPos,yPos+330,"×");                 //清除前一次留下的箭头 
			   if(nChar!=VK_BACK) 
//               MessageBeep(MB_ICONASTERISK);      //星号音 
              MessageBeep(MB_ICONEXCLAMATION);  //惊叹声 
 //             MessageBeep(MB_ICONHAND);         //指针声 
			 } 
           dc.SetTextColor(RGB(0,150,150));                   //字体颜色为 
		   dc.TextOut(xPos+LargeHzWeight*ZllxLie,yPos+330,"▲"); 
		   dc.SelectObject(oldfont);          //恢复原字体大小 
 
           dc.SetTextColor(RGB(0,0,0));                     //字体颜色为黑色 
		   OldPos = xPos+LargeHzWeight*ZllxLie; 
//------------------------------------------------------ 
           LineLieZm=ZllxStrZm[ZllxLine][ZllxLie];     //取得新的对应字母 
            
           char ShowStr[57],ShowStr2[71]; 
           GetShowStr(LineLieZm,ShowStr,ShowStr2); 
           GetNewRect( LineLieZm, xBitmapStartPos, yBitmapStartPos, NewRect); //得到一个要反相显示的新矩形 
         if(TsFlag==ShowTs) 
		 { 
           dc.InvertRect(&NewRect);                       //反相显示一个新矩形 
           dc.TextOut(xPos,yPos+195,ShowStr);               //显示对应的文字说明 
           dc.TextOut(xPos,yPos+220,ShowStr2);               //显示对应的文字说明 
		 } 
		 else 
		 { 
			 if(nChar==VK_TAB) 
			 { 
                 dc.TextOut(xPos,yPos+195,ShowStr);               //显示对应的文字说明 
                 dc.TextOut(xPos,yPos+220,ShowStr2);               //显示对应的文字说明 
                 if(TabKey==0) 
				 { 
                    dc.InvertRect(&NewRect);                       //恢复反相显示的一个矩形 
			        TabKey=1; 
				 } 
			 } 
			 else 
			 { 
                 dc.TextOut(xPos,yPos+195,"注意:要看提示请按 Tab 键。              "); //显示对应的文字说明 
                 dc.TextOut(xPos,yPos+220,"Tab 键就是 Q 键左侧的那个键。                   "); //显示对应的文字说明 
                 if(TabKey==1) 
				 { 
                    dc.InvertRect(&OldRect);                       //恢复反相显示的一个矩形 
			        TabKey=0; 
				 } 
			 } 
		 } 
		   OldRect.left=NewRect.left; 
	       OldRect.right=NewRect.right; 
		   OldRect.top=NewRect.top; 
		   OldRect.bottom=NewRect.bottom; 
 
  }//ShowFlag==ZLLX 
	CScrollView::OnChar(nChar, nRepCnt, nFlags); 
 
} 
 
void CXxmpxView::OnTestZllx()  
{ 
	// TODO: Add your command handler code here 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	CClientDC dc(this); 
	pDoc->CSelectFontHeight(32); 
    messageTime1=0; 
	messageTime2=0; 
	timeWeight=0; 
	m_inputHzNum=0;        //表示输入的正确的字数 
	m_inputKeyNum=0; 
    ShowFlag=ZLLX;	 
	TsFlag=ShowTs; 
	Invalidate(); 
/*	CString str; 
	 str="  该练习在输入之前显示相关信息,使用者既可以看着 \r\n\r\n"; 
	str+="提示输入字母,也可以通过移动“▲”来进行阅读理解。 \r\n\r\n"; 
	str+="  一个一个地理解,踏踏实实地做练习。按照练习第一 \r\n\r\n"; 
	str+="步2小时,第二步4小时,第三步8小时的学习计划循序 \r\n\r\n"; 
	str+="渐进地做下去,甜美的享受就会水到渠成。\r\n\r\n"; 
	str+="  忠告:千万不要急于求成!"; 
	MessageBox(str,"提醒",MB_ICONINFORMATION); 
*/ 
} 
void CXxmpxView::OnTESTwtsZLLX()  
{ 
	// TODO: Add your command handler code here 
//    ZllxLine=0;ZllxLie=0;    //字梁练习 行 列 
    CXxmpxDoc *pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	pDoc->CSelectFontHeight(32); 
 
    messageTime1=0; 
	messageTime2=0; 
	timeWeight=0; 
	m_inputHzNum=0;        //表示输入的正确的字数 
	m_inputKeyNum=0; 
    ShowFlag=ZLLX; 
	TsFlag=HideTs; 
	Invalidate(); 
	 
} 
 
int GetNewRect(char LineLieZm,int xPos,int yPos,RECT &NewRect) 
{ 
//--------------------------第一排------------------------------ 
		if( LineLieZm=='q' || LineLieZm=='w' || LineLieZm=='e' || LineLieZm=='r' || LineLieZm=='t' 
		 || LineLieZm=='y' || LineLieZm=='u' || LineLieZm=='i' || LineLieZm=='o' || LineLieZm=='p') 
		{ 
		   if(LineLieZm=='q') 
		   { 
		      NewRect.left  = xPos+0*55+10;         
		      NewRect.right = xPos+1*55+4; 
		   } 
		   else if(LineLieZm=='w') 
		   { 
		      NewRect.left  = xPos+1*55+10;        
		      NewRect.right = xPos+2*55+4; 
		   } 
		   else if(LineLieZm=='e') 
		   { 
		   NewRect.left  = xPos+2*55+10;              
		   NewRect.right = xPos+3*55+4; 
		   } 
		   else if(LineLieZm=='r') 
		   { 
		   NewRect.left  = xPos+3*55+10;   
		   NewRect.right = xPos+4*55+4; 
		   } 
		   else if(LineLieZm=='t') 
		   { 
		   NewRect.left  = xPos+4*55+10;    
		   NewRect.right = xPos+5*55+4; 
		   } 
		   else if(LineLieZm=='y') 
		   { 
		   NewRect.left  = xPos+5*55+10;    
		   NewRect.right = xPos+6*55+4; 
		   } 
		   else if(LineLieZm=='u') 
		   { 
		   NewRect.left  = xPos+6*55+10;      
		   NewRect.right = xPos+7*55+4; 
		   } 
		   else if(LineLieZm=='i') 
		   { 
		   NewRect.left  = xPos+7*55+10;           
		   NewRect.right = xPos+8*55+4; 
		   } 
		   else if(LineLieZm=='o') 
		   { 
		   NewRect.left  = xPos+8*55+10;          
		   NewRect.right = xPos+9*55+4; 
		   } 
		   else if(LineLieZm=='p') 
		   { 
		   NewRect.left  = xPos+9*55+10;             
		   NewRect.right = xPos+10*55+4; 
		   } 
		   NewRect.top=yPos+10;                               
		   NewRect.bottom=yPos+55+4; 
		} 
//-------------------------第二排------------------------------------ 
		else if( LineLieZm=='a' || LineLieZm=='s' || LineLieZm=='d' || LineLieZm=='f' || LineLieZm=='g' 
		 || LineLieZm=='h' || LineLieZm=='j' || LineLieZm=='k' || LineLieZm=='l') 
		{ 
		   if(LineLieZm=='a') 
		   { 
		      NewRect.left  = xPos+0*55+10+25;             
		      NewRect.right = xPos+1*55+4 +25; 
		   } 
		   else if(LineLieZm=='s') 
		   { 
		      NewRect.left  = xPos+1*55+10+25;             
		      NewRect.right = xPos+2*55+4 +25; 
		   } 
		   else if(LineLieZm=='d') 
		   { 
		   NewRect.left  = xPos+2*55+10+25;             
		   NewRect.right = xPos+3*55+4 +25; 
		   } 
		   else if(LineLieZm=='f') 
		   { 
		   NewRect.left  = xPos+3*55+10+25;            
		   NewRect.right = xPos+4*55+4 +25; 
		   } 
		   else if(LineLieZm=='g') 
		   { 
		   NewRect.left  = xPos+4*55+10+25;             
		   NewRect.right = xPos+5*55+4 +25; 
		   } 
		   else if(LineLieZm=='h') 
		   { 
		   NewRect.left  = xPos+5*55+10+25;            
		   NewRect.right = xPos+6*55+4 +25; 
		   } 
		   else if(LineLieZm=='j') 
		   { 
		   NewRect.left  = xPos+6*55+10+25;         
		   NewRect.right = xPos+7*55+4 +25; 
		   } 
		   else if(LineLieZm=='k') 
		   { 
		   NewRect.left  = xPos+7*55+10+25;              
		   NewRect.right = xPos+8*55+4 +25; 
		   } 
		   else if(LineLieZm=='l') 
		   { 
		   NewRect.left  = xPos+8*55+10+25;             
		   NewRect.right = xPos+9*55+4 +25; 
		   } 
		   NewRect.top=yPos+10+55;                           
		   NewRect.bottom=yPos+55+55+4; 
		} 
//---------------------------第三排------------------------------ 
 
		else if( LineLieZm=='z' || LineLieZm=='x' || LineLieZm=='c' || LineLieZm=='v' || LineLieZm=='b' 
		 || LineLieZm=='n' || LineLieZm=='m') 
		{ 
		   if(LineLieZm=='z') 
		   { 
		      NewRect.left  = xPos+0*55+10+50;               
		      NewRect.right = xPos+1*55+4 +50; 
		   } 
		   else if(LineLieZm=='x') 
		   { 
		      NewRect.left  = xPos+1*55+10+50;               
		      NewRect.right = xPos+2*55+4 +50; 
		   } 
		   else if(LineLieZm=='c') 
		   { 
		   NewRect.left  = xPos+2*55+10+50;            
		   NewRect.right = xPos+3*55+4 +50; 
		   } 
		   else if(LineLieZm=='v') 
		   { 
		   NewRect.left  = xPos+3*55+10+50;         
		   NewRect.right = xPos+4*55+4 +50; 
		   } 
		   else if(LineLieZm=='b') 
		   { 
		   NewRect.left  = xPos+4*55+10+50;      
		   NewRect.right = xPos+5*55+4 +50; 
		   } 
		   else if(LineLieZm=='n') 
		   { 
		   NewRect.left  = xPos+5*55+10+50;       
		   NewRect.right = xPos+6*55+4 +50; 
		   } 
		   else if(LineLieZm=='m') 
		   { 
		   NewRect.left  = xPos+6*55+10+50;      
		   NewRect.right = xPos+7*55+4 +50; 
		   } 
		   NewRect.top=yPos+10+110;                   
		   NewRect.bottom=yPos+110+55+4; 
		} 
   return TRUE; 
} 
int GetShowStr(char LineLieZm,char ShowStr[57],char ShowStr2[71]) 
{ 
   if(LineLieZm=='a') 
   { 
	   strcpy(ShowStr,"A:人入火贝大天夭夫             "); 
	   strcpy(ShowStr2,"注解:从上往下向两边分,如字母A。                "); 
   } 
   else if(LineLieZm=='b') 
   { 
       strcpy(ShowStr,"B:弓乃子了 b:勹夕鱼鸟乌    "); 
	   strcpy(ShowStr2,"注解:首次二笔所构成的弯曲与大B或小b的弯曲相一致        "); 
   } 
   else if(LineLieZm=='c') 
   { 
       strcpy(ShowStr,"C:月用甫耳且目                   "); 
	   strcpy(ShowStr2,"特征:框内有二横。助记:C是半园,月亮和耳朵也是半园。      "); 
   } 
   else if(LineLieZm=='d') 
   { 
       strcpy(ShowStr,"D:亠亡立六文亦方广             "); 
	   strcpy(ShowStr2,"注解:凡是一点一横开始的都用D表示,D就是一个空心的点。     "); 
   } 
   else if(LineLieZm=='e') 
   { 
       strcpy(ShowStr,"E:山巾彐五正车            "); 
	   strcpy(ShowStr2,"注解:旋转E形。                         "); 
   } 
   else if(LineLieZm=='f') 
   { 
       strcpy(ShowStr,"F:石歹万厂 f:十           "); 
	   strcpy(ShowStr2,"F:横下垂吊向左飘,好象风吹过来一样。f:将小f的头纠正就是十字。"); 
   } 
   else if(LineLieZm=='g') 
   { 
       strcpy(ShowStr,"G:酉西三二一 虫                "); 
	   strcpy(ShowStr2,"注解:横的感觉,对应G中的一横。字母G与“虫”有点像。      "); 
   } 
   else if(LineLieZm=='h') 
   { 
       strcpy(ShowStr,"H:非片卜爿川丨业止上"); 
	   strcpy(ShowStr2,"注解:竖的感觉H。                        "); 
   } 
   else if(LineLieZm=='i') 
   { 
       strcpy(ShowStr,"I:土士工干千               "); 
	   strcpy(ShowStr2,"注解:两横一竖,两横竖I。                    "); 
   } 
   else if(LineLieZm=='j') 
   { 
       strcpy(ShowStr,"J:手寸于丁               "); 
	   strcpy(ShowStr2,"注解:向左钩起,左钩起J。                    "); 
   } 
   else if(LineLieZm=='k') 
   { 
       strcpy(ShowStr,"K: 日曰                   "); 
	   strcpy(ShowStr2,"注解:,如倾斜的K。日曰,框内一横用K表示。       "); 
   } 
   else if(LineLieZm=='l') 
   { 
       strcpy(ShowStr,"L:饣乙己已巳巴          "); 
	   strcpy(ShowStr2,"注解:向右弯曲提起,右弯提L。                  "); 
   } 
   else if(LineLieZm=='m') 
   { 
       strcpy(ShowStr,"M:宀穴 皿四           "); 
	   strcpy(ShowStr2,"注解:像锅盖,锅盖M。M上下各加一横即为“四”字。        "); 
   } 
   else if(LineLieZm=='n') 
   { 
       strcpy(ShowStr,"N:艹廾甘廿井卅世 n:几九儿   "); 
	   strcpy(ShowStr2,"注解:像羊肉串,羊肉串N。像小n,其特征是边裙向外翻起。     "); 
   } 
   else if(LineLieZm=='o') 
   { 
       strcpy(ShowStr,"O:口囗                        "); 
	   strcpy(ShowStr2,"注解:像O。                           "); 
   } 
   else if(LineLieZm=='p') 
   { 
       strcpy(ShowStr,"P: 尸羽马力刀        "); 
	   strcpy(ShowStr2,"注解:站立一旁如P。横折起笔向左下飘即横折飘P,P的半园是横折。 "); 
   } 
   else if(LineLieZm=='q') 
   { 
       strcpy(ShowStr,"Q:生牛午 甲由申田母毋         "); 
	   strcpy(ShowStr2,"注解:均含有“”(变化:Q)。“田”字向四个方向出头。 "); 
   } 
   else if(LineLieZm=='r') 
   { 
       strcpy(ShowStr,"R:木未末耒 戋戈弋        "); 
	   strcpy(ShowStr2,"注解:木字伸展之形,用R表示。捺的感觉,对应R中的一捺。    "); 
   } 
   else if(LineLieZm=='s') 
   { 
       strcpy(ShowStr,"S:豸身舟白乡斤        "); 
	   strcpy(ShowStr2,"注解:撇的感觉,S拉直就是撇(S丿)。           "); 
   } 
   else if(LineLieZm=='t') 
   { 
       strcpy(ShowStr,"T: t:匕七乇毛             "); 
	   strcpy(ShowStr2,"注解:一撇一竖,一撇竖T。像小t。                "); 
   } 
   else if(LineLieZm=='u') 
   { 
       strcpy(ShowStr,"U:王壬丰 门冂凵匚    "); 
	   strcpy(ShowStr2,"注解:三横或四横一竖,三横竖U。旋转U形。            "); 
   } 
   else if(LineLieZm=='v') 
   { 
       strcpy(ShowStr,"V:疒豕乑水氺巛八酋       "); 
	   strcpy(ShowStr2,"注解:两点延长即为V,共四个方向,是一个小标记。         "); 
   } 
   else if(LineLieZm=='w') 
   { 
       strcpy(ShowStr,"W:心 臼也乜                  "); 
	   strcpy(ShowStr2,"注解:三点对应W的三个顶点。W也可以看成是双手合抱。       "); 
   } 
   else if(LineLieZm=='x') 
   { 
       strcpy(ShowStr,"X:女丈夂攵久又               "); 
	   strcpy(ShowStr2,"注解:撇捺交叉,交叉X。                     "); 
   } 
   else if(LineLieZm=='y') 
   { 
       strcpy(ShowStr,"Y:禾米不小              "); 
	   strcpy(ShowStr2,"注解:像鸡爪,鸡爪Y,Y的一竖向上伸出即为鸡爪。         "); 
   } 
   else if(LineLieZm=='z') 
   { 
       strcpy(ShowStr,"Z:幺厶之辶廴             "); 
	   strcpy(ShowStr2,"注解:笔画向左下伸出,然后向右折回,撇折团Z。          "); 
   } 
   else  
   { 
       strcpy(ShowStr,"请用输入小写字母                    "); 
	   strcpy(ShowStr2,"                   。             "); 
   } 
 
   return TRUE; 
}