SDL游戏之路(十六)--中文输入法



中文输入法

要实现中文拼音输入,需要有 中文拼音对照表。这个可以到网上找到。

把文件整理成如下格式:

'a'=>'啊阿呵吖嗄腌锕錒',
'ai'=>'爱矮挨哎碍癌艾唉哀蔼隘埃皑呆嗌嫒瑷暧捱砹嗳锿霭乂乃伌僾儗凒剀剴叆呃呝啀嘊噫噯堨塧壒奇娭娾嬡嵦愛懓懝敱敳昹曖欬欸毐溰溾濭烠焥璦皚皧瞹硋磑礙絠薆藹諰譪譺賹躷醷鎄鑀閡阂阨阸隑靄靉餲馤騃鯦鱫鴱崖',
'an'=>'按安暗岸俺案鞍氨胺厂广庵揞犴铵桉谙鹌埯黯侒儑匼厈咹唵啽垵垾堓婩媕屽峖干晻洝玵痷盒盦盫碪罯腤荌菴萻葊蓭裺誝諳豻貋遃鉗銨錌钳闇陰隂隌雸鞌韽頇頞顸馣鮟鴳鵪鶕',
'ang'=>'昂肮盎仰卬岇昻枊醃醠骯',
'ao'=>'袄凹傲奥熬懊敖翱澳嚣拗媪廒骜嗷坳遨聱螯獒鏊鳌鏖岙厫嗸噢嚻囂垇墺墽奡奧媼嫯岰嶅嶴慠扷抝摮擙柪梎棍泑浇滶澆澚熝爊獓璈眑磝磽礉翶翺芺蔜蝹襖謷謸軪郩鏕镺隞驁鰲鴁鴢鷔鼇',
'ba'=>'把八吧爸拔罢跋巴芭扒坝霸叭靶笆疤耙捌粑茇岜鲅钯魃菝灞仈伯叐哱哵坺垻墢壩夿妭峇弝抜抪捭朳杷柭欛湃炦犮玐癹皅矲笩紦罷羓胈茷萆蚆覇詙豝跁軷釛釟鈀颰魞鮁鮊鲃鲌鼥',
'bai'=>'百白摆败柏拜佰伯稗捭呗掰唄庍扒拝挀排擺敗栢派猈竡粨粺絔薜薭襬贁鞁鞴韛',

然后写一个字库管理类:

#ifndef SKZIKU_H_
#define SKZIKU_H_

#include "SkComm.h"
#include "SkString.h"
#include "SkFile.h"
namespace sk_park {

class SkZiku {
public:
	/**加载字库**/
	void loadFile();
	/**清除字库**/
	void clear();
private:
	SkString m_txt;
	map<string, SkString> m_map;
};

}
extern sk_park::SkZiku g_SkZiku;

#endif /* SKZIKU_H_ */

实现:

#include "pch.h"
#include "SkZiku.h"
#include <vector>
#include <string>
using namespace std;
using namespace sk_park;

void SkZiku::loadFile() {
	g_SkFile.readTxtFile("ziku.txt", m_txt);
	vector<string> vctStr;
	g_SkString.getVctStr(vctStr, m_txt.c_str(), "\n", true);
	for (int i = 0; i < (int) vctStr.size(); i++) {
		string & sTmp = vctStr.at(i);
		//'a'=>'啊阿呵吖嗄腌锕錒'
		vector<string> vctTmp;
		g_SkString.getVctStr(vctTmp, sTmp.c_str(), "=>", true);
		if (vctTmp.size() == 2) {
			string sKey = g_SkString.getNeedStr(vctTmp.at(0).c_str(), "'", "'");
			string sValue = g_SkString.getNeedStr(vctTmp.at(1).c_str(), "'",
					"'");
			SkString & sTmp = m_map[sKey];
			sTmp.clear();
			sTmp.append(sValue.c_str(), sValue.length());
			sTmp.splitUtf8ByStr("|");
		}
	}
	g_SkComm.log("[%s][%d]load zk length:%d line:%d map:%d", __FILE__, __LINE__,
			m_txt.length(), vctStr.size(), m_map.size());
	m_txt.clear();
	g_SkComm.log("[%s][%d]yuan=%s", __FILE__, __LINE__, m_map["yuan"].c_str());
}
void SkZiku::clear() {
	m_txt.clear();
	m_map.clear();
}

SkZiku g_SkZiku;


因为项目全部采用utf-8编码,所有,拆分字符窜也需要针对每一个utf-8编码。函数splitUtf8ByStr的实现如下:

void SkString::splitUtf8ByStr(const char * p) {
	SkString myStr;
	int sum = this->length();
	char * fulline = (char *) this->c_str();
	for (int cur = 0; cur < sum;) {
		//printf("cur:%d %s\n", cur, fulline + cur);
		char t = fulline[cur];
		if ((t & 0xE0) == 0xE0) { //3byte
			myStr.append(fulline + cur, 3);
			cur += 3;
		} else if ((t & 0xC0) == 0xC0) { //2byte
			myStr.append(fulline + cur, 2);
			cur += 2;
		} else { //1byte
			myStr.append(fulline + cur, 1);
			cur++;
		}
		myStr.append(p);
	}
	this->clear();
	this->append(myStr.c_str(), myStr.length());
}

在前面的基础上,当选择中文输入法的时候。动态生成匹配到的汉字按钮。

修改后的文件:

#ifndef SKVIEWINPUT_H_
#define SKVIEWINPUT_H_

#include "SkView.h"
#include "SkButton.h"
#include "SkWord.h"
#include "SkString.h"
#include <vector>
using namespace std;
/**键盘按钮点击事件**/
void sk_button_keyboard_pressed(void * pData, sk_park::SkButton * pButton);
namespace sk_park {

/**键盘输入展示界面**/
class SkViewInput: public SkView {
public:
	/**定义键盘布局**/
	class Keyboard {
	public:
		SkButton m_bt_zm[200];
		Sint32 m_iSize;
		Sint32 m_iShift;
		void resize();
		void init(SkFont * pFont, void (*func_pressed)(void *, SkButton *));
		void show(SkShow* pSkShow, Sint64 iCurMTime);
		bool doEvent(SkEvent & stSkEvent, Sint64 iCurMTime, SkView * pView);
	private:
		SkFont * m_pFont;
	};
	~SkViewInput();
	void init();
	void doEvent(SkEvent & stSkEvent, Sint64 iCurMTime);
	void show(SkShow* pSkShow, Sint64 iCurMTime);
	void run(Sint64 iCurMTime);
	void resize();
	/**设置shift按键切换**/
	void setShift();
	/**设置中英文输入法切换**/
	void setEnglish(bool bFlag);
	/**添加一个输入**/
	void addInput(int iId, string sIn);
	/**删除一个输入**/
	void delInput();
private:
	/**查找拼音匹配**/
	void doSearch(const char * pingyin);
	/**记录当前是否为英文输入法**/
	bool m_bEnglish;
	/**输入框内字符窜展示的最大宽度**/
	Sint32 m_strMaxLen;
	/**当前输入框内容**/
	SkWord m_curWord;
	/**输入历史**/
	vector<string> m_vctStr;
	/**返回按键**/
	SkButton m_backButton;
	/**英文字体**/
	SkFont m_font_en;
	/**中文字体**/
	SkFont m_font_ch;
	/**模拟键盘**/
	Keyboard m_keyboard;
	/**英文输入按键**/
	SkButton m_bt_english;
	/**中文输入按键**/
	SkButton m_bt_chinese;
	/**中文拼音临时存放**/
	SkString m_pingyin;
	SkWord m_pingyin_word;
	SkString m_search;
	vector<SkButton *> vctSearchButton;
};
}

extern sk_park::SkViewInput g_SkViewInput;
#endif /* SKVIEWINPUT_H_ */


#include "pch.h"

#include "SkViewInput.h"
#include "SkZiku.h"
#include "../sk_src/SkFunction.h"
using namespace sk_park;

void SkViewInput::Keyboard::resize() {
	//SkButton m_bt_zm[39];
	int iSize = m_iSize - 10;
	for (int i = 0; i < 50; i++) {
		SkWord wordIn, wordOut, wordPressed;
		wordIn.setStr(m_bt_zm[i].m_sName.c_str(), *m_pFont, 255, 0, 0, 255);
		wordOut.setStr(m_bt_zm[i].m_sName.c_str(), *m_pFont, 0, 255, 0, 255);
		wordPressed.setStr(m_bt_zm[i].m_sName.c_str(), *m_pFont, 255, 255, 0,
				255);
		m_bt_zm[i].setShow(wordIn.m_skSurface, wordOut.m_skSurface,
				wordPressed.m_skSurface);
		m_bt_zm[i].m_area.clear();
		m_bt_zm[i].m_area.addPoint(0, 0);
		m_bt_zm[i].m_area.addPoint(iSize, 0);
		m_bt_zm[i].m_area.addPoint(iSize, iSize);
		m_bt_zm[i].m_area.addPoint(0, iSize);
	}
	for (int i = 100; i < 150; i++) {
		SkWord wordIn, wordOut, wordPressed;
		wordIn.setStr(m_bt_zm[i].m_sName.c_str(), *m_pFont, 255, 0, 0, 255);
		wordOut.setStr(m_bt_zm[i].m_sName.c_str(), *m_pFont, 0, 255, 0, 255);
		wordPressed.setStr(m_bt_zm[i].m_sName.c_str(), *m_pFont, 255, 255, 0,
				255);
		m_bt_zm[i].setShow(wordIn.m_skSurface, wordOut.m_skSurface,
				wordPressed.m_skSurface);
		m_bt_zm[i].m_area.clear();
		m_bt_zm[i].m_area.addPoint(0, 0);
		m_bt_zm[i].m_area.addPoint(iSize, 0);
		m_bt_zm[i].m_area.addPoint(iSize, iSize);
		m_bt_zm[i].m_area.addPoint(0, iSize);
	}
}
void SkViewInput::Keyboard::init(SkFont * pFont,
		void (*func_pressed)(void *, SkButton *)) {
	m_iShift = 0;
	m_iSize = 90;
	m_pFont = pFont;
	int iSize = m_iSize;
	int iPosX = 50;
	int iPosY = 300;
	int iLine1 = 12;
	int iLine2 = 13;
	int iLine3 = 13;
	int iLine4 = 12;
	for (int i = 0; i < iLine1; i++) {
		m_bt_zm[i].m_iPosX = iPosX + iSize * i;
		m_bt_zm[i].m_iPosY = iPosY;

		m_bt_zm[i + 100].m_iPosX = iPosX + iSize * i;
		m_bt_zm[i + 100].m_iPosY = iPosY;
	}
	for (int i = 0; i < iLine2; i++) {
		m_bt_zm[i + iLine1].m_iPosX = iPosX + iSize * i + iSize / 2;
		m_bt_zm[i + iLine1].m_iPosY = iPosY + iSize;

		m_bt_zm[i + 100 + iLine1].m_iPosX = iPosX + iSize * i + iSize / 2;
		m_bt_zm[i + 100 + iLine1].m_iPosY = iPosY + iSize;
	}
	for (int i = 0; i < iLine3; i++) {
		m_bt_zm[i + iLine1 + iLine2].m_iPosX = iPosX + iSize * i + iSize;
		m_bt_zm[i + iLine1 + iLine2].m_iPosY = iPosY + iSize * 2;

		m_bt_zm[i + 100 + iLine1 + iLine2].m_iPosX = iPosX + iSize * i + iSize;
		m_bt_zm[i + 100 + iLine1 + iLine2].m_iPosY = iPosY + iSize * 2;
	}
	for (int i = 0; i < iLine4; i++) {
		m_bt_zm[i + iLine1 + iLine2 + iLine3].m_iPosX = iPosX + iSize * i
				+ iSize / 2;
		m_bt_zm[i + iLine1 + iLine2 + iLine3].m_iPosY = iPosY + iSize * 3;

		m_bt_zm[i + 100 + iLine1 + iLine2 + iLine3].m_iPosX = iPosX + iSize * i
				+ iSize / 2;
		m_bt_zm[i + 100 + iLine1 + iLine2 + iLine3].m_iPosY = iPosY + iSize * 3;
	}
	for (int i = 0; i < 50; i++) {
		m_bt_zm[i].setFuncPressed(func_pressed);
		m_bt_zm[i + 100].setFuncPressed(func_pressed);
	}
	for (int i = 0; i < 150; i++) {
		m_bt_zm[i].m_iId = i;
		m_bt_zm[i].m_bWord = true;
	}
	//第一行 12
	m_bt_zm[0].m_sName = "1";
	m_bt_zm[1].m_sName = "2";
	m_bt_zm[2].m_sName = "3";
	m_bt_zm[3].m_sName = "4";
	m_bt_zm[4].m_sName = "5";
	m_bt_zm[5].m_sName = "6";
	m_bt_zm[6].m_sName = "7";
	m_bt_zm[7].m_sName = "8";
	m_bt_zm[8].m_sName = "9";
	m_bt_zm[9].m_sName = "0";
	m_bt_zm[10].m_sName = "-";
	m_bt_zm[11].m_sName = "=";
	//第二行 13
	m_bt_zm[12].m_sName = "q";
	m_bt_zm[13].m_sName = "w";
	m_bt_zm[14].m_sName = "e";
	m_bt_zm[15].m_sName = "r";
	m_bt_zm[16].m_sName = "t";
	m_bt_zm[17].m_sName = "y";
	m_bt_zm[18].m_sName = "u";
	m_bt_zm[19].m_sName = "i";
	m_bt_zm[20].m_sName = "o";
	m_bt_zm[21].m_sName = "p";
	m_bt_zm[22].m_sName = "[";
	m_bt_zm[23].m_sName = "]";
	m_bt_zm[24].m_sName = "\\";
	//第三行 13
	m_bt_zm[25].m_sName = "a";
	m_bt_zm[26].m_sName = "s";
	m_bt_zm[27].m_sName = "d";
	m_bt_zm[28].m_sName = "f";
	m_bt_zm[29].m_sName = "g";
	m_bt_zm[30].m_sName = "h";
	m_bt_zm[31].m_sName = "j";
	m_bt_zm[32].m_sName = "k";
	m_bt_zm[33].m_sName = "l";
	m_bt_zm[34].m_sName = ";";
	m_bt_zm[35].m_sName = "'";
	m_bt_zm[36].m_sName = "De";
	m_bt_zm[37].m_sName = "En";
	//第四行 12
	m_bt_zm[38].m_sName = "Sh";
	m_bt_zm[39].m_sName = "z";
	m_bt_zm[40].m_sName = "x";
	m_bt_zm[41].m_sName = "c";
	m_bt_zm[42].m_sName = "v";
	m_bt_zm[43].m_sName = "b";
	m_bt_zm[44].m_sName = "n";
	m_bt_zm[45].m_sName = "m";
	m_bt_zm[46].m_sName = ",";
	m_bt_zm[47].m_sName = ".";
	m_bt_zm[48].m_sName = "/";
	m_bt_zm[49].m_sName = "Sh";

	//第一行 12
	m_bt_zm[100].m_sName = "!";
	m_bt_zm[101].m_sName = "@";
	m_bt_zm[102].m_sName = "#";
	m_bt_zm[103].m_sName = "$";
	m_bt_zm[104].m_sName = "%";
	m_bt_zm[105].m_sName = "^";
	m_bt_zm[106].m_sName = "&";
	m_bt_zm[107].m_sName = "*";
	m_bt_zm[108].m_sName = "(";
	m_bt_zm[109].m_sName = ")";
	m_bt_zm[110].m_sName = "_";
	m_bt_zm[111].m_sName = "+";
	//第二行 13
	m_bt_zm[112].m_sName = "Q";
	m_bt_zm[113].m_sName = "W";
	m_bt_zm[114].m_sName = "E";
	m_bt_zm[115].m_sName = "R";
	m_bt_zm[116].m_sName = "T";
	m_bt_zm[117].m_sName = "Y";
	m_bt_zm[118].m_sName = "U";
	m_bt_zm[119].m_sName = "I";
	m_bt_zm[120].m_sName = "O";
	m_bt_zm[121].m_sName = "P";
	m_bt_zm[122].m_sName = "{";
	m_bt_zm[123].m_sName = "}";
	m_bt_zm[124].m_sName = "|";
	//第三行 13
	m_bt_zm[125].m_sName = "A";
	m_bt_zm[126].m_sName = "S";
	m_bt_zm[127].m_sName = "D";
	m_bt_zm[128].m_sName = "F";
	m_bt_zm[129].m_sName = "G";
	m_bt_zm[130].m_sName = "H";
	m_bt_zm[131].m_sName = "J";
	m_bt_zm[132].m_sName = "K";
	m_bt_zm[133].m_sName = "L";
	m_bt_zm[134].m_sName = ":";
	m_bt_zm[135].m_sName = "\"";
	m_bt_zm[136].m_sName = "De";
	m_bt_zm[137].m_sName = "En";
	//第四行 12
	m_bt_zm[138].m_sName = "Sh";
	m_bt_zm[139].m_sName = "Z";
	m_bt_zm[140].m_sName = "X";
	m_bt_zm[141].m_sName = "C";
	m_bt_zm[142].m_sName = "V";
	m_bt_zm[143].m_sName = "B";
	m_bt_zm[144].m_sName = "N";
	m_bt_zm[145].m_sName = "M";
	m_bt_zm[146].m_sName = "<";
	m_bt_zm[147].m_sName = ">";
	m_bt_zm[148].m_sName = "?";
	m_bt_zm[149].m_sName = "Sh";

}
void SkViewInput::Keyboard::show(SkShow* pSkShow, Sint64 iCurMTime) {
	SkRect stPos;
	for (int i = 0; i < 50; i++) {
		stPos.x = m_bt_zm[i + m_iShift].m_iPosX;
		stPos.y = m_bt_zm[i + m_iShift].m_iPosY;
		pSkShow->drawButton(NULL, &m_bt_zm[i + m_iShift], &stPos, iCurMTime);
	}
}
bool SkViewInput::Keyboard::doEvent(SkEvent & stSkEvent, Sint64 iCurMTime,
		SkView * pView) {
	bool bRet = false;
	for (int i = 0; i < 50; i++) {
		bRet = m_bt_zm[i + m_iShift].handleEvent(m_bt_zm[i + m_iShift].m_iPosX,
				m_bt_zm[i + m_iShift].m_iPosY, stSkEvent, pView);
		if (bRet) {
			return true;
		}
	}
	return false;
}
SkViewInput::~SkViewInput() {
	g_SkZiku.clear();
	for (int i = 0; i < (int) vctSearchButton.size(); i++) {
		SkButton * pBt = vctSearchButton.at(i);
		delete pBt;
	}
	vctSearchButton.clear();
}

void SkViewInput::init() {
	m_strMaxLen = 900;
	m_bEnglish = true;
	m_pingyin = "";
	m_font_en.init("font/adobe2.otf", 50);
	m_font_ch.init("font/simhei.ttf", 35);
	m_keyboard.init(&m_font_en, sk_button_keyboard_pressed);
	m_curWord.setStr("", m_font_ch, 0x00, 0x00, 0x00, 0xff);
	m_pingyin_word.setStr("", m_font_ch, 0xff, 0x00, 0x00, 0xff);
	g_SkZiku.loadFile();

	m_bt_english.m_sName = "Eng";
	m_bt_english.m_iId = 1001;
	m_bt_chinese.m_sName = "中文";
	m_bt_chinese.m_iId = 1002;
	m_bt_english.m_bWord = true;
	m_bt_chinese.m_bWord = true;
	{
		SkWord wordIn, wordOut, wordPressed;
		wordIn.setStr(m_bt_english.m_sName.c_str(), m_font_ch, 255, 0, 0, 255);
		wordOut.setStr(m_bt_english.m_sName.c_str(), m_font_ch, 0, 255, 0, 255);
		wordPressed.setStr(m_bt_english.m_sName.c_str(), m_font_ch, 255, 255, 0,
				255);
		m_bt_english.setShow(wordIn.m_skSurface, wordOut.m_skSurface,
				wordPressed.m_skSurface);
		m_bt_english.m_area.clear();
		m_bt_english.m_area.addPoint(0, 0);
		m_bt_english.m_area.addPoint(wordIn.getWidth(), 0);
		m_bt_english.m_area.addPoint(wordIn.getWidth(), wordIn.getHeight());
		m_bt_english.m_area.addPoint(0, wordIn.getHeight());
	}
	{
		SkWord wordIn, wordOut, wordPressed;
		wordIn.setStr(m_bt_chinese.m_sName.c_str(), m_font_ch, 255, 0, 0, 255);
		wordOut.setStr(m_bt_chinese.m_sName.c_str(), m_font_ch, 0, 255, 0, 255);
		wordPressed.setStr(m_bt_chinese.m_sName.c_str(), m_font_ch, 255, 255, 0,
				255);
		m_bt_chinese.setShow(wordIn.m_skSurface, wordOut.m_skSurface,
				wordPressed.m_skSurface);
		m_bt_chinese.m_area.clear();
		m_bt_chinese.m_area.addPoint(0, 0);
		m_bt_chinese.m_area.addPoint(wordIn.getWidth(), 0);
		m_bt_chinese.m_area.addPoint(wordIn.getWidth(), wordIn.getHeight());
		m_bt_chinese.m_area.addPoint(0, wordIn.getHeight());
	}
	m_bt_english.setPosition(1050, 140);
	m_bt_chinese.setPosition(1150, 140);
	m_bt_english.setFuncPressed(sk_button_keyboard_pressed);
	m_bt_chinese.setFuncPressed(sk_button_keyboard_pressed);

	SkImage pic_ch_1;
	SkImage pic_ch_2;

	pic_ch_1.load("pic/ch1.png");
	pic_ch_2.load("pic/ch2.png");
	m_backButton.setShow(pic_ch_1.m_skSurface, pic_ch_1.m_skSurface,
			pic_ch_2.m_skSurface);
	m_backButton.m_area.addPoint(0, 0);
	m_backButton.m_area.addPoint(0, pic_ch_1.m_iHeight);
	m_backButton.m_area.addPoint(pic_ch_1.m_iWidth, pic_ch_1.m_iHeight);
	m_backButton.m_area.addPoint(pic_ch_1.m_iWidth, 0);
	m_backButton.setPosition(600, 20);
	m_backButton.setFuncPressed(button_back_to_first);

	resize();
}
void SkViewInput::doEvent(SkEvent & stSkEvent, Sint64 iCurMTime) {
	bool bRet = m_backButton.handleEvent(m_backButton.m_iPosX,
			m_backButton.m_iPosY, stSkEvent, NULL);
	if (bRet) {
		return;
	}
	bRet = m_keyboard.doEvent(stSkEvent, iCurMTime, this);
	if (bRet) {
		return;
	}
	bRet = m_bt_english.handleEvent(m_bt_english.m_iPosX, m_bt_english.m_iPosY,
			stSkEvent, this);
	if (bRet) {
		return;
	}
	bRet = m_bt_chinese.handleEvent(m_bt_chinese.m_iPosX, m_bt_chinese.m_iPosY,
			stSkEvent, this);
	if (bRet) {
		return;
	}
	for (int i = 0; i < (int) vctSearchButton.size(); i++) {
		SkButton & bt = *(vctSearchButton.at(i));
		bRet = bt.handleEvent(bt.m_iPosX, bt.m_iPosY, stSkEvent, this);
		if (bRet) {
			return;
		}
	}
}
void SkViewInput::show(SkShow* pSkShow, Sint64 iCurMTime) {
	/**清空屏幕背景为黑色矩形**/
	pSkShow->clear(0x00, 0x00, 0x00, 0xff);
	/**游戏区域背景为蓝色矩形**/
	SkRect backRect;
	backRect.x = 0;
	backRect.y = 0;
	backRect.w = g_SP.m_iBaseWidth;
	backRect.h = g_SP.m_iBaseHeight;
	pSkShow->fillRec(&backRect, 0x00, 0x00, 0xff, 0xff);
	/**返回按钮**/
	pSkShow->drawButton(NULL, &m_backButton, NULL, iCurMTime);

	/**绘制一个白矩形-文字输入区域**/
	SkRect stSkRect;
	stSkRect.x = 50;
	stSkRect.y = 120;
	stSkRect.w = m_strMaxLen + 10;
	stSkRect.h = 80;
	pSkShow->fillRec(&stSkRect, 0xff, 0xff, 0xff, 0xff);
	/**绘制一个红色光标-每秒闪烁一次**/
	if ((iCurMTime / 500) % 2 == 0) {
		stSkRect.x = 50 + m_curWord.getWidth() + 5;
		stSkRect.y = 120 + 5;
		stSkRect.w = 4;
		stSkRect.h = 80 - 10;
		pSkShow->fillRec(&stSkRect, 0xff, 0x00, 0x00, 0xff);
	}
	/**绘制输入**/
	stSkRect.x = 50 + 2;
	stSkRect.y = 120 + 5;
	pSkShow->drawWord(NULL, &m_curWord, &stSkRect, iCurMTime);
	stSkRect.x = 50;
	stSkRect.y = 210;
	pSkShow->drawWord(NULL, &m_pingyin_word, &stSkRect, iCurMTime);
	for (int i = 0; i < (int) vctSearchButton.size(); i++) {
		pSkShow->drawButton(NULL, vctSearchButton.at(i), NULL, iCurMTime);
	}

	if (m_bEnglish) {
		stSkRect.x = m_bt_english.m_iPosX;
		stSkRect.y = m_bt_english.m_iPosY;
		stSkRect.w = m_bt_english.getWidth();
		stSkRect.h = m_bt_english.getHeight();
		pSkShow->fillRec(&stSkRect, 0xff, 0x00, 0xff, 0xff);
	} else {
		stSkRect.x = m_bt_chinese.m_iPosX;
		stSkRect.y = m_bt_chinese.m_iPosY;
		stSkRect.w = m_bt_chinese.getWidth();
		stSkRect.h = m_bt_chinese.getHeight();
		pSkShow->fillRec(&stSkRect, 0xff, 0x00, 0xff, 0xff);
	}
	pSkShow->drawButton(NULL, &m_bt_english, NULL, iCurMTime);
	pSkShow->drawButton(NULL, &m_bt_chinese, NULL, iCurMTime);

	m_keyboard.show(pSkShow, iCurMTime);
}
void SkViewInput::setShift() {
	m_keyboard.m_iShift = 100 - m_keyboard.m_iShift;
}
void SkViewInput::run(Sint64 iCurMTime) {

}
void SkViewInput::resize() {
	m_keyboard.resize();
}
void SkViewInput::setEnglish(bool bFlag) {
	m_bEnglish = bFlag;
}
void SkViewInput::addInput(int iId, string sIn) {
	if (m_bEnglish || iId == 999) {
		m_pingyin.clear();
		m_pingyin_word.setStr(string(m_pingyin.c_str()), m_font_ch, 0xff, 0x00,
				0x00, 0xff);
		if (m_vctStr.size() > 0) {
			string sOld = m_vctStr.back();
			sOld.append(sIn);
			m_vctStr.push_back(sOld);
		} else {
			m_vctStr.push_back(sIn);
		}
		m_curWord.setStr(m_vctStr.back(), m_font_ch, 0x00, 0x00, 0x00, 0xff);
		if (m_curWord.getWidth() >= m_strMaxLen) {
			delInput();
		}
	} else {
		char c = sIn.at(0);
		if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
			if (m_pingyin.length() < 7) {
				m_pingyin.append(sIn.c_str());
				m_pingyin_word.setStr(string(m_pingyin.c_str()), m_font_ch,
						0xff, 0x00, 0x00, 0xff);
				doSearch(m_pingyin.c_str());
			}
		}
	}
}
void SkViewInput::delInput() {
	if (m_pingyin.length() == 0) {
		if (m_vctStr.size() > 0) {
			m_vctStr.pop_back();
		}
		if (m_vctStr.size() > 0) {
			m_curWord.setStr(m_vctStr.back(), m_font_ch, 0x00, 0x00, 0x00,
					0xff);
		} else {
			m_curWord.setStr("", m_font_ch, 0x00, 0x00, 0x00, 0xff);
		}
	} else {
		m_pingyin.setlen(m_pingyin.length() - 1);
		m_pingyin_word.setStr(string(m_pingyin.c_str()), m_font_ch, 0xff, 0x00,
				0x00, 0xff);
		doSearch(m_pingyin.c_str());
	}
}
void SkViewInput::doSearch(const char * pingyin) {
	for (int i = 0; i < (int) vctSearchButton.size(); i++) {
		SkButton * pBt = vctSearchButton.at(i);
		delete pBt;
	}
	vctSearchButton.clear();
	m_search.clear();
	g_SkZiku.doSearch(pingyin, m_search);
	vector<string> vctStr;
	g_SkString.getVctStr(vctStr, m_search.c_str(), "|", true);
	for (int i = 0; i < 15; i++) {
		if (i < (int) vctStr.size()) {
			SkButton * pBt = new SkButton;
			{
				pBt->m_iId = 999;
				pBt->m_sName = vctStr.at(i);
				SkWord wordIn, wordOut, wordPressed;
				wordIn.setStr(vctStr.at(i).c_str(), m_font_ch, 255, 0, 0, 255);
				wordOut.setStr(vctStr.at(i).c_str(), m_font_ch, 0, 255, 0, 255);
				wordPressed.setStr(vctStr.at(i).c_str(), m_font_ch, 255, 255, 0,
						255);
				pBt->setShow(wordIn.m_skSurface, wordOut.m_skSurface,
						wordPressed.m_skSurface);
				pBt->m_area.clear();
				pBt->m_area.addPoint(0, 0);
				pBt->m_area.addPoint(wordIn.getWidth(), 0);
				pBt->m_area.addPoint(wordIn.getWidth(), wordIn.getHeight());
				pBt->m_area.addPoint(0, wordIn.getHeight());

				pBt->m_bWord = true;
				pBt->setPosition(50 + 150 + 70 * i, 210);
				pBt->setFuncPressed(sk_button_keyboard_pressed);
			}
			vctSearchButton.push_back(pBt);
		}
	}
}

void sk_button_keyboard_pressed(void * pData, SkButton * pButton) {
	SkViewInput * pView = (SkViewInput *) pData;
	g_SkComm.log("[%s][%d]key %d:%s", __FILE__, __LINE__, pButton->m_iId,
			pButton->m_sName.c_str());
	if (pButton->m_iId == 38 || pButton->m_iId == 49 || pButton->m_iId == 138
			|| pButton->m_iId == 149) {
		pView->setShift();
	} else if (pButton->m_iId == 1001) {
		pView->setEnglish(true);
	} else if (pButton->m_iId == 1002) {
		pView->setEnglish(false);
	} else if (pButton->m_iId == 36 || pButton->m_iId == 136) {
		pView->delInput();
	} else if (pButton->m_iId == 37 || pButton->m_iId == 137) {

	} else {
		pView->addInput(pButton->m_iId, pButton->m_sName);
	}
}
SkViewInput g_SkViewInput;


效果:




截至此时,整个项目的代码(window下可以编译,其他环境还没测试,如果有问题,稍作修改即可)

http://download.csdn.net/detail/ycg01/6861155



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值