📄 myimm.h
字号:
/* ==================================================== */
/* */
/* 学生宿舍管理系统Ver 1.00.1 源代码 */
/* 文件名: MyImm.h */
/* 作用: 实现字符的输入,包括中文的输入.其主要思路是二 */
/* 分查找的算法查找汉字库中的拼音,然后进行匹配. */
/* 版权所有 (c) 2007 张元龙 保留所有权利 */
/* */
/* ==================================================== */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#include <bios.h>
#include <graphics.h>
#include <io.h>
#include <ctype.h>
#include "MyIco.h"
#include "MyChn.h"
#include "MyMouse.h"
#ifndef ImmDefined
#define ImmDefined
FILE *ImmFile;
long FileSize;
char ImmBuf[50]; /*中文输出缓冲区*/
char SelectBuf[30]; /*选择的目标缓冲区*/
char InBuf[30]; /*按键输入缓冲区*/
int Pages; /*翻页数目*/
bool ImmIsChn=false; /*当前输入法是否是中文*/
typedef void (*InputCharFunc)(char *Text);
InputCharFunc OnInputChar;
int DelChar(char *Text,int Index=-1){ /*返回删除几个字节*/
int i,last;
if (Index==-1) Index=0x7FFF;
for (i=0;Text[i] && i<Index;){
last=i;
if (Text[i]<0) i+=2;
else i++;
}
if (i==0) return 0;
char buf[50];
strcpy(buf,Text+i);
i=Text[last] & 128?2:1;
Text[last]=0;
strcat(Text,buf);
return i;
}
/* ================================ */
/* 使用二分查找算法查找拼音位置 */
/* ================================ */
long GetLast(long v){
fseek(ImmFile,v,0);
while (getc(ImmFile))
v++;
if (getc(ImmFile) & 128){
v++;
while (getc(ImmFile))
v++;
}
return v;
}
long GetFirst(long v){
if (v==0) return 0;
v--;
fseek(ImmFile,v,0);
while (getc(ImmFile) && v>0){
v--;
fseek(ImmFile,v,0);
}
if (getc(ImmFile) & 128){
v--;
fseek(ImmFile,v,0);
while (getc(ImmFile) && v>0){
v--;
fseek(ImmFile,v,0);
}
}
return v?v+1:v;
}
char *GetText(long v, char *buf){
v=GetFirst(v);
fseek(ImmFile,v,0);
fread(buf,20,1,ImmFile);
return buf;
}
/* ================================ */
/* 二分查找开始 */
/* ================================ */
long Location(char *PinYin){
long head=0;
long tail=FileSize-1;
long middle;
char buf[20];
int i;
while (head<tail){
middle = (head+tail)/2;
GetText(middle,buf);
if (strcmp(PinYin,buf)<=0)
tail=GetFirst(middle);
else
head=GetLast(GetLast(middle)+1);
}
return GetFirst(tail);
}
long ImmStack[30];
int pImmStack=0;
void UpdateImm(long v=-1){
if (v==-1) {
if (InBuf[0]==0) {
ImmBuf[0]=0;
return;
}
if (strcmp("zuzubeibei",InBuf)<0) {
ImmBuf[0]=0;
return;
}
v=Location(InBuf);
pImmStack=0;
ImmStack[0]=v;
}
char tempbuf[50],buf[50];
int i,j,t;
int len=0;
ImmBuf[0]=0;
for (i=1;i<=9;i++){
if (v>=FileSize) break;
fseek(ImmFile,v,0);
fread(buf,30,1,ImmFile);
v+=strlen(buf)+1;
fseek(ImmFile,v,0);
fread(buf,30,1,ImmFile);
t=strlen(buf);
if (t+len+3>45) {
v=GetFirst(v);
break;
}
v+=t+1;
ImmBuf[len++]=' ';
ImmBuf[len++]=i+'0';
ImmBuf[len++]='.';
ImmBuf[len]=0;
strcat(ImmBuf,buf);
len+=t;
}
ImmStack[++pImmStack]=v;
}
void PgDown(){ /*输入法翻页(下翻)*/
if (pImmStack<29)
UpdateImm(ImmStack[pImmStack]);
}
void PgUp(){ /*输入法翻页(上翻)*/
if (pImmStack-2>=0){
pImmStack-=2;
UpdateImm(ImmStack[pImmStack]);
}
}
char *Select(int value){
if (pImmStack==0 || InBuf[0]==0) return "";
long v=ImmStack[pImmStack-1];
char buf[32];
fseek(ImmFile,v,0);
fread(buf,30,1,ImmFile);
v+=strlen(buf)+1;
for (;value>1;value--){
fseek(ImmFile,v,0);
fread(buf,30,1,ImmFile);
v+=strlen(buf)+1;
fseek(ImmFile,v,0);
fread(buf,30,1,ImmFile);
v+=strlen(buf)+1;
}
fseek(ImmFile,v,0);
fread(SelectBuf,30,1,ImmFile);
InBuf[0]=0;
ImmBuf[0]=0;
pImmStack=0;
if (OnInputChar!=NULL) OnInputChar(SelectBuf);
return SelectBuf;
}
void AddKey(int key){
key=key & 0xFF;
if (!key) return;
if (!ImmIsChn){
if (isprint(key) || key==8) OnInputChar((char *)&key);
return ;
}
if ('A'<=key && key<='Z') key-='A'-'a'; /*转化成小写*/
int len=strlen(InBuf);
if (len==0 && !('a'<=key && key<='z')) {
if (isprint(key) || key==8) OnInputChar((char *)&key);
return ;
}
if (key==8){
InBuf[len-1]=0;
UpdateImm();
} else if ('a'<=key && key<='z'){
if (len>12) return;
InBuf[len]=key;
InBuf[len+1]=0;
UpdateImm();
} else if (key=='=' || key=='+') PgDown();
else if (key=='-') PgUp();
else if ('1'<=key && key<='9') Select(key-'0');
else if (key==' ') Select(1);
else if (isprint(key)) OnInputChar((char *)&key);
}
void ImmInit(InputCharFunc Func){
static AlreadyInit=false; /*确保初始化工作只执行一次*/
if (AlreadyInit) return;
AlreadyInit=true;
ImmFile=fopen("Dat\\imm.dat","r");
if (ImmFile==NULL){
printf("Cannot open the \"imm.dat\" file!");
getch();
exit(0);
}
OnInputChar=Func;
FileSize=filelength(fileno(ImmFile));
memset(ImmBuf,0,sizeof ImmBuf);
memset(InBuf,0,sizeof InBuf);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -