|
发表于 2020-9-11 14:05:52
|
显示全部楼层
硫酸根离子,4上面是2,就没法显示了。建议专门写一个化学式显示的函数,使用两种不同大小的字体,用个变量记录角标位置。至于你想通过字符串打印出来,可以在字符串中穿插一些不常用字符作为标识,比如想显示硫酸根离子的化学式,字符串可以写"|SO*2-&4","|"表示后面是原子,“*”表示后面是上标,“&”表示后面字符是下标。以前写的一个函数,希望对你有帮助:- typedef enum
- {
- CHAR_MID, /* 正常字符 */
- CHAR_UP, /* 上标 */
- CHAR_DOWN, /* 下标 */
- } ChemCharType;
- /*
- ************************************************************************************************************************
- * 功能说明: 打印化学式。
- *
- * 形式参数: s: 化学式字符串:|后面是正常字符 <后面是上标 >后面是下标
- *
- * 形式参数: x: 字符串起始坐标x
- *
- * 形式参数: y: 字符串起始坐标y
- *
- * 形式参数: pFontAtom: 原子显示使用的字体
- *
- * 形式参数: pFontIon: 上标下标显示使用的字体
- *
- * 返 回 值: None
- ************************************************************************************************************************
- */
- void GUI_DispChemStrAt(const char * s, int x, int y, const GUI_FONT *pFontAtom, const GUI_FONT *pFontIon)
- {
- GUI_POINT oringinMid, oringinUp, oringinDown;
- int fontAtomSizeY, fontIonSizeY;
- ChemCharType chemChar = CHAR_MID;
- oringinMid.x = x;
- oringinMid.y = y;
- GUI_SetFont(pFontAtom);
- fontAtomSizeY = GUI_GetFontSizeY();
- GUI_SetFont(pFontIon);
- fontIonSizeY = GUI_GetFontSizeY();
-
- oringinUp.x = x;
- oringinUp.y = fontAtomSizeY/2 + y - 1 - fontIonSizeY;
- oringinDown.x = x;
- oringinDown.y = fontAtomSizeY/2 + y + 1;
-
- while (*s != '\0')
- {
- if (*s == '|') /* 正常字符 */
- {
- chemChar = CHAR_MID;
- }
- else if (*s == '<') /* 上标 */
- {
- chemChar = CHAR_UP;
- }
- else if (*s == '>') /* 下标 */
- {
- chemChar = CHAR_DOWN;
- }
- else /* 正常字符 */
- {
- switch (chemChar)
- {
- case CHAR_MID:
- GUI_SetFont(pFontAtom);
- GUI_DispCharAt(*s, oringinMid.x, oringinMid.y);
- oringinMid.x = oringinUp.x = oringinDown.x = GUI_GetDispPosX();
- break;
-
- case CHAR_UP:
- GUI_SetFont(pFontIon);
- GUI_DispCharAt(*s, oringinUp.x, oringinUp.y);
- oringinUp.x = GUI_GetDispPosX();
- oringinMid.x = (oringinUp.x >= oringinDown.x) ? oringinUp.x : oringinDown.x;
- break;
-
- case CHAR_DOWN:
- GUI_SetFont(pFontIon);
- GUI_DispCharAt(*s, oringinDown.x, oringinDown.y);
- oringinDown.x = GUI_GetDispPosX();
- oringinMid.x = (oringinUp.x >= oringinDown.x) ? oringinUp.x : oringinDown.x;
- break;
- }
- }
- s++;
- }
- }
复制代码
|
|