MiniGUI更换键盘皮肤
前言
MiniGUI原来的键盘GUI已经有点不符合现在的需求,所以需要定制一套皮肤,根据我定制皮肤的过程,写一遍流程文档,做一下笔记,为以后再定制皮肤提供参考,先看一下定制好的皮肤
录制的色彩有点失真,看一下截图
1. 皮肤资源位置
在libmgi-2.0.4/src/softkeyboard/softkeyboard/分辨率,目录下有一些图片资源,里面是图片转为十六进制的c文件,总共需要替换的是以下的图片
- char_key_mask.c
键盘按键按下去的效果,可以不替换 - func_key_mask.c
功能按键按下去的效果,可以不替换 - en_kbd_bkg.c
- pinyin_kbd_bkg.c
- num_kbd_bkg.c
- punct_kbd_bkg.c
- left_arrow_disable.c
- left_arrow_enable.c
- right_arrow_disable.c
- right_arrow_enable.c
- sel_text_bkgnd.c
- tooltip_bk.c
- tooltip_mask.c
注意红色是设置不规则窗口时候的ColorKey
- bitmapfont.c
这两张图片是连在一起的,太长不好截图,即A连在@后面
2. 按键对应宏
2.1 键盘宽高
要先设置好这些,不然先设置每个按键的范围也是点击不了的
宏 | 含义 |
---|---|
SCREEN_W/SCREEN_H | 屏幕的宽高 |
SKB_WIN_W/SKB_WIN_H | 键盘的宽高 |
SKB_CLOSE_L/SKB_CLOSE_T/SKB_CLOSE_R/SKB_CLOSE_B | 关闭键盘按钮的左上和右下坐标 |
SKB_VW_L/SKB_VW_T/SKB_VW_R/SKB_VW_B | 文字候选词的左上和右下坐标,需要注意,文字候选下一页按钮需要在该宽度和高度内 |
SKB_VW_PU_L/SKB_VW_PU_T/SKB_VW_PU_R/SKB_VW_PU_B | 文字候选上一页按钮的左上和右下坐标 |
SKB_VW_PD_L/SKB_VW_PD_T/SKB_VW_PD_R/SKB_VW_PD_B | 文字候选下一页按钮的左上和右下坐标 |
SKB_SW_L/SKB_SW_T/SKB_SW_R/SKB_SW_B | 输入字符显示区域 |
SKB_KW_L/SKB_KW_T/SKB_KW_R/SKB_KW_B | 键盘按键区域的左上和右下坐标 |
2.2 英文与中文按键
按钮范围宏 | 按钮 | 描述宏 |
---|---|---|
RECT_EN_KEY_1 | q | SCANCODE_Q |
RECT_EN_KEY_2 | w | SCANCODE_W |
RECT_EN_KEY_3 | e | SCANCODE_E |
RECT_EN_KEY_4 | r | SCANCODE_R |
RECT_EN_KEY_5 | t | SCANCODE_T |
RECT_EN_KEY_6 | y | SCANCODE_Y |
RECT_EN_KEY_7 | u | SCANCODE_U |
RECT_EN_KEY_8 | i | SCANCODE_I |
RECT_EN_KEY_9 | o | SCANCODE_O |
RECT_EN_KEY_10 | p | SCANCODE_P |
RECT_EN_KEY_11 | a | SCANCODE_A |
RECT_EN_KEY_12 | s | SCANCODE_S |
RECT_EN_KEY_13 | d | SCANCODE_D |
RECT_EN_KEY_14 | f | SCANCODE_F |
RECT_EN_KEY_15 | g | SCANCODE_G |
RECT_EN_KEY_16 | h | SCANCODE_H |
RECT_EN_KEY_17 | j | SCANCODE_J |
RECT_EN_KEY_18 | k | SCANCODE_K |
RECT_EN_KEY_19 | l | SCANCODE_L |
RECT_EN_KEY_20 | SCANCODE_LEFTSHIFT | |
RECT_EN_KEY_21 | z | SCANCODE_Z |
RECT_EN_KEY_22 | x | SCANCODE_X |
RECT_EN_KEY_23 | c | SCANCODE_C |
RECT_EN_KEY_24 | v | SCANCODE_V |
RECT_EN_KEY_25 | b | SCANCODE_B |
RECT_EN_KEY_26 | n | SCANCODE_N |
RECT_EN_KEY_27 | m | SCANCODE_M |
RECT_EN_KEY_28 | SCANCODE_BACKSPACE | |
RECT_EN_KEY_29 | SCANCODE_TONUM | |
RECT_EN_KEY_30 | SCANCODE_TOPY | |
RECT_EN_KEY_31 | SCANCODE_SPACE | |
RECT_EN_KEY_32 | SCANCODE_ENTER |
2.3 特殊符号按键
按钮范围宏 | 按钮 | 描述宏 |
---|---|---|
RECT_NUM_KEY_1 | 1 | SCANCODE_1 |
RECT_NUM_KEY_2 | 2 | SCANCODE_2 |
RECT_NUM_KEY_3 | 3 | SCANCODE_3 |
RECT_NUM_KEY_4 | 4 | SCANCODE_4 |
RECT_NUM_KEY_5 | 5 | SCANCODE_5 |
RECT_NUM_KEY_6 | 6 | SCANCODE_6 |
RECT_NUM_KEY_7 | 7 | SCANCODE_7 |
RECT_NUM_KEY_8 | 8 | SCANCODE_8 |
RECT_NUM_KEY_9 | 9 | SCANCODE_9 |
RECT_NUM_KEY_10 | 0 | SCANCODE_0 |
RECT_NUM_KEY_11 | - | SCANCODE_MINUS |
RECT_NUM_KEY_12 | / | SCANCODE_SLASH |
RECT_NUM_KEY_13 | : | SCANCODE_SEMICOLON |
RECT_NUM_KEY_14 | ; | SCANCODE_SEMICOLON |
RECT_NUM_KEY_15 | ( | SCANCODE_9 |
RECT_NUM_KEY_16 | ) | SCANCODE_0 |
RECT_NUM_KEY_17 | $ | SCANCODE_4 |
RECT_NUM_KEY_18 | & | SCANCODE_7 |
RECT_NUM_KEY_19 | @ | SCANCODE_2 |
RECT_NUM_KEY_20 | " | SCANCODE_APOSTROPHE |
RECT_NUM_KEY_21 | SCANCODE_TOOP | |
RECT_NUM_KEY_22 | . | SCANCODE_PERIOD |
RECT_NUM_KEY_23 | , | SCANCODE_COMMA |
RECT_NUM_KEY_24 | ? | SCANCODE_SLASH |
RECT_NUM_KEY_25 | ! | SCANCODE_1 |
RECT_NUM_KEY_26 | ’ | SCANCODE_APOSTROPHE |
RECT_NUM_KEY_27 | SCANCODE_BACKSPACE | |
RECT_NUM_KEY_28 | SCANCODE_TOEN | |
RECT_NUM_KEY_29 | SCANCODE_TOPY | |
RECT_NUM_KEY_30 | SCANCODE_SPACE | |
RECT_NUM_KEY_31 | SCANCODE_ENTER |
2.4 一些限制宏
libmgi-2.0.4/src/softkeyboard/softkeyboard/softkeyboard.h
宏 | 默认值 | 说明 |
---|---|---|
VW_ELMT_LEN | 18 | 单个候选词最大长度,如safety是6 |
VW_BUFFER_LEN | 128 | 一页候选词最大长度 |
VW_ELMENT_NR | 18 | 一页候选词最多能有多少个候选词 |
SW_STR_LEN | 32 | 输出字符最大长度 |
3. 图片皮肤制作
把图片制作成depth为8bit的,节省内存
类型 | 值 |
---|---|
Format | PNG |
Format/Info | Portable Network Graphic |
Width | 800 pixels |
Height | 260 pixels |
Bit depth | 8 bits |
Compression mode | Lossless |
Stream size | 18.8 KiB (100%) |
用JAVA写一个转换工具PicBytesToC,可以把指定目录下的全部图片或者指定的一张图片转换成十六进制的C源文件表示
目前支持png,bmp,jpeg,jpg
请指定目录或者文件路径,例如
java -jar PicBytesToC.jar /home/xxx/Pictures/
java -jar PicBytesToC.jar /home/xxx/Pictures/1.png
源码如下
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;/*** 图片转成十六进制*/
public class PicBytesToC {public static void main(String[] args) throws Exception {if (args.length > 0) {File file = new File(args[0]);if (file.exists()) {if (file.isFile()) {pic2Txt(file);} else {File[] tempList = file.listFiles();if (tempList.length > 0)System.out.println("该目录下文件个数:" + tempList.length);for (int i = 0; i < tempList.length; i++) {if (tempList[i].isFile()) {System.out.println("文件:" + tempList[i]);}if (tempList[i].isDirectory()) {System.out.println("文件夹:" + tempList[i]);}}for (int i = 0; i < tempList.length; i++) {if (tempList[i].isFile()) {pic2Txt(tempList[i]);}}if (tempList.length > 0)System.out.println("全部图片转换完成\n");}}} else {System.out.println("本程序可以把指定目录下的全部图片或者指定的一张图片转换成十六进制的C源文件表示");System.out.println("目前支持png,bmp,jpeg,jpg");System.out.println("请指定目录或者文件路径,例如");System.out.println("java -jar PicBytesToC.jar /home/xxx/Pictures/");System.out.println("java -jar PicBytesToC.jar /home/xxx/Pictures/1.png");}}private static void pic2Txt(File file) {String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1);if (ext.equals("png") || ext.equals("bmp") || ext.equals("jpeg") || ext.equals("jpg")) {try {FileInputStream fis = new FileInputStream(file);String fileName = file.getName().substring(0, file.getName().lastIndexOf("."));String fileNameData = fileName;if (fileNameData.contains("_bkg")) {fileNameData = fileNameData.replace("_bkg", "");}fileNameData = fileNameData + "_data";java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();byte[] buff = new byte[1024];int len = 0;while ((len = fis.read(buff)) != -1) {bos.write(buff, 0, len);}// 得到图片的字节数组byte[] result = bos.toByteArray();System.out.println(file.getName() + " 字节长度:" + result.length + " 正在解析中...");if (null != file.getParent())byte2HexStr(file.getParent(), fileName, fileNameData, result);elsebyte2HexStr(".", fileName, fileNameData, result);fis.close();bos.close();} catch (Exception e) {e.printStackTrace();}}}/*** 实现字节数组向十六进制转换并保存* * @param b* 字节数组* @return 十六进制字符串*/private static void byte2HexStr(String filePatch, String fileName, String fileNameData, byte[] b) {String hs = "\t";String stmp = "";FileWriter fwriter = null;try {fwriter = new FileWriter(filePatch + "/" + fileName + ".c");fwriter.write("static const unsigned char " + fileNameData + "[] = {\n");for (int n = 0; n < b.length; n++) {System.out.print(n + "/" + b.length + "\r");stmp = (Integer.toHexString(b[n] & 0XFF));if (stmp.length() == 1) {hs = hs + "0x0" + stmp;} else {hs = hs + "0x" + stmp;}if (n == b.length - 1) {hs += "\n";} else if (n != 0 && (n + 1) % 16 == 0) {hs += ",\n\t";} else {hs += ", ";}fwriter.write(hs);hs = "";}fwriter.write("};");} catch (IOException ex) {ex.printStackTrace();} finally {try {fwriter.flush();fwriter.close();System.out.println(filePatch + "/" + fileName + ".c 保存完成\n");} catch (IOException ex) {ex.printStackTrace();}}}
}
4. 显示调整
4.1 Tooltip相关
4.1.1 Tooltip图片宽高和mask
libmgi-2.0.4/src/softkeyboard/tooltip.h
宏 | 含义 |
---|---|
TTW_W | 宽度 |
TTW_H | 高度 |
TTW_MASK_R | MASK红颜色值 |
TTW_MASK_G | MASK绿颜色值 |
TTW_MASK_B | MASK蓝颜色值 |
4.1.2 Tooltip显示位置
libmgi-2.0.4/src/softkeyboard/softkeyboard/common.c
//share_key_update函数,计算X,Y的坐标
#if defined (SOFTKBD_1280_480)x = mk->bound.left + RECTW(mk->bound)/2 - TTW_W/2;y = mk->bound.top + RECTH(mk->bound)/2 - TTW_H - TTW_H/2;
#elsex = mk->bound.left + RECTW(mk->bound)/2 - TTW_W/2;y = mk->bound.top + RECTH(mk->bound)/2 - TTW_H;
#endif
4.1.3 Tooltip文字居中
libmgi-2.0.4/src/softkeyboard/tooltip.c
//init_ttw_data函数,初始化不使用图片文字
#if defined (SOFTKBD_1280_480)padd->pfont = CreateLogFont("ttf", "fzcircle", "UTF-8",FONT_WEIGHT_BOOK, FONT_SLANT_ROMAN,FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE,FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 48, 0);
#else//if (LoadBitmap (HDC_SCREEN, &bmp_f, "bitmap_font.png")) {if (get_kbd_bitmap (HDC_SCREEN, &bmp_f, TTW_FONT_BMP)) {fprintf (stderr, "Fail to load bitmap for tooltip window font. \n");return 1;}dev_font = CreateBMPDevFont("bmp-iphone-rrncnn-30-33-ISO8859-1", &bmp_f, "!", 94, 30);padd->pfont = CreateLogFont(FONT_TYPE_NAME_BITMAP_BMP, "iphone", "ISO8859-1",FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL, FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 10, 0);
#endif//TTWinProc MSG_PAINT居中并大写显示
#if defined (SOFTKBD_1280_480)if (str[0] >= 'a' && str[0] <= 'z')str[0] += 'A' - 'a';SetTextColor(hdc, PIXEL_darkgray);DrawText(hdc, str, -1, &rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
#endif
4.2 键盘初始化相关
libmgi-2.0.4/src/softkeyboard/softkeyboard/softkeyboard.h
//头文件导入
#elif defined (SOFTKBD_1280_480)
#include "1280-480/size_1280x480.h"
libmgi-2.0.4/src/softkeyboard/softkeyboard/resource.c
//图片C源文件导入
#elif defined (SOFTKBD_1280_480)
#include "1280-480/en_kbd_bkg.c"
#include "1280-480/num_kbd_bkg.c"
#include "1280-480/punct_kbd_bkg.c"
#include "1280-480/pinyin_kbd_bkg.c"
#include "1280-480/char_key_mask.c"
#include "1280-480/func_key_mask.c"
#include "1280-480/left_arrow_enable.c"
#include "1280-480/left_arrow_disable.c"
#include "1280-480/right_arrow_enable.c"
#include "1280-480/right_arrow_disable.c"
#ifdef KBD_TOOLTIP
#include "1280-480/tooltip_bk.c"
#include "1280-480/tooltip_mask.c"
#include "1280-480/bitmapfont.c"
#endif
libmgi-2.0.4/src/softkeyboard/softkeyboard/en_kbd.c
//init_en_view_window函数,英文键盘候选词最大长度
#ifdef SOFTKBD_320_240vw->max_str_len = 22;
#elif defined (SOFTKBD_480_272)vw->max_str_len = 40;
#elif defined (SOFTKBD_240_320)vw->max_str_len = 20;
#elif defined (SOFTKBD_800_260)vw->max_str_len = 38;
#elif defined (SOFTKBD_1280_480)vw->max_str_len = 62;
#elif defined (SOFTKBD_480_1280_CW)vw->max_str_len = 62;
#elif defined (SOFTKBD_480_1280_CCW)vw->max_str_len = 62;
#endif//init_en_view_window函数,英文候选词使用TTF字体
#if defined (SOFTKBD_1280_480)vw->view_font = CreateLogFont("ttf", "fzcircle", "UTF-8",FONT_WEIGHT_BOOK, FONT_SLANT_ROMAN,FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE,FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 24, 0);
#elsevw->view_font = CreateLogFontByName ("*-fixed-rrncnn-*-24-GB2312");
#endif//init_en_stroke_window函数,输出字符使用TTF字体
#elif defined (SOFTKBD_800_260)sw->stroke_font = CreateLogFont("ttf", "fzcircle", "UTF-8",FONT_WEIGHT_BOOK, FONT_SLANT_ROMAN,FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE,FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 14, 0);
#elsesw->stroke_font = CreateLogFontByName ("*-fixed-rrncnn-*-16-GB2312");
#endif
libmgi-2.0.4/src/softkeyboard/softkeyboard/pinyin_kbd.c
//init_en_view_window函数,中文键盘候选词最大长度
#ifdef SOFTKBD_320_240vw->max_str_len = 22;
#elif defined (SOFTKBD_480_272)vw->max_str_len = 40;
#elif defined (SOFTKBD_240_320)vw->max_str_len = 20;
#elif defined (SOFTKBD_800_260)vw->max_str_len = 32;
#elif defined (SOFTKBD_1280_480)vw->max_str_len = 50;
#elif defined (SOFTKBD_480_1280_CW)vw->max_str_len = 50;
#elif defined (SOFTKBD_480_1280_CCW)vw->max_str_len = 50;
#endif//init_py_view_window函数,中文候选词使用TTF字体
//注意需要是GB2312编码的,目前MiniGUI键盘不支持其他编码格式的字体
#if defined (SOFTKBD_1280_480)vw->view_font = CreateLogFont("ttf", "fzcircle", "GB2312-0",FONT_WEIGHT_BOOK, FONT_SLANT_ROMAN,FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE,FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 24, 0);
#elsevw->view_font = CreateLogFontByName ("*-fixed-rrncnn-*-24-GB2312");
#endif//init_py_stroke_window函数,输出字符使用TTF字体
#if defined (SOFTKBD_1280_480)sw->stroke_font = CreateLogFont("ttf", "fzcircle", "UTF-8",FONT_WEIGHT_BOOK, FONT_SLANT_ROMAN,FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE,FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 16, 0);
#elsesw->stroke_font = CreateLogFontByName ("*-fixed-rrncnn-*-16-GB2312");
#endif
4.3 文字输出相关
4.3.1 输出字符显示区域
libmgi-2.0.4/src/softkeyboard/softkeyboard/en_kbd.c
//sw_update函数,英文键盘显示已经点击的按键的字符在键盘上,设置文字颜色与区域
#if defined (SOFTKBD_1280_480)old_tecolor = SetTextColor (hdc, PIXEL_black);
#elseold_tecolor = SetTextColor (hdc, PIXEL_lightwhite);
#endifold_font = SelectFont(hdc, sw->stroke_font);
#if defined (SKB_VERTICAL_CW)RECT rcClient;rcClient = sw->bound;rcClient.right += 4;DrawText(hdc, sw->str, -1, &rcClient, DT_VERTICAL_CW | DT_SINGLELINE);
#elif defined (SKB_VERTICAL_CCW)DrawText(hdc, sw->str, -1, &(sw->bound), DT_RIGHT | DT_VERTICAL_CCW | DT_SINGLELINE);
#elseDrawText(hdc, sw->str, -1, &(sw->bound), DT_LEFT);
#endif
libmgi-2.0.4/src/softkeyboard/softkeyboard/pinyin_kbd.c
//sw_update函数,中文键盘显示已经点击的按键的字符在键盘上,设置文字颜色与区域
#if defined (SOFTKBD_1280_480)old_tecolor = SetTextColor (hdc, PIXEL_black);
#elseold_tecolor = SetTextColor (hdc, PIXEL_lightwhite);
#endifold_font = SelectFont(hdc, sw->stroke_font);
#if defined (SKB_VERTICAL_CW)RECT rcClient;rcClient = sw->bound;rcClient.right += 4;DrawText(hdc, sw->str, -1, &rcClient, DT_VERTICAL_CW | DT_SINGLELINE);
#elif defined (SKB_VERTICAL_CCW)DrawText(hdc, sw->str, -1, &(sw->bound), DT_RIGHT | DT_VERTICAL_CCW | DT_SINGLELINE);
#elseDrawText(hdc, sw->str, -1, &(sw->bound), DT_LEFT);
#endif
4.3.2 候选词显示区域
libmgi-2.0.4/src/softkeyboard/softkeyboard/common.c
//vw_set_element函数,获取每一个词的输出区域
#if defined (SKB_VERTICAL_CW)r.bottom = view_window->key_pg_up.bottom;
#elif defined (SKB_VERTICAL_CCW)r.top = view_window->key_pg_up.top;
#elser.left = view_window->key_pg_up.right;
#endif//get_substr_pos_ex函数,根据文字长度,计算输出区域
#if defined (SKB_VERTICAL_CW)SetRect(rc, off->left, off->bottom + textsize.cx,off->right, off->bottom + textsize.cx + cur_size.cx);
#elif defined (SKB_VERTICAL_CCW)SetRect(rc, off->left, off->top - textsize.cx - cur_size.cx,off->right, off->top - textsize.cx );
#elseSetRect(rc, textsize.cx + off->left, off->top,off->left + textsize.cx + cur_size.cx + 1, off->bottom);
#endif
libmgi-2.0.4/src/softkeyboard/softkeyboard/en_kbd.c
//vw_update,英文键盘候选词显示区域,for循环里显示所有候选词,适当调整显示位置
#if defined (SKB_VERTICAL_CW)rcClient.right -= 4;DrawText(hdc, element[i].string, -1, &rcClient,DT_NOCLIP | DT_VERTICAL_CW | DT_SINGLELINE);
#elif defined (SKB_VERTICAL_CCW)rcClient.left += 8;DrawText(hdc, element[i].string, -1, &rcClient,DT_NOCLIP | DT_VERTICAL_CCW | DT_SINGLELINE | DT_RIGHT);
#elif defined (SOFTKBD_1280_480)DrawText(hdc, element[i].string, -1, &element[i].bound, DT_VCENTER | DT_SINGLELINE);
#elseDrawText(hdc, element[i].string, -1, &element[i].bound, 0);
#endif//按下选择某个候选词的时候,输出位置上移,有一个动态效果
#if defined (SKB_VERTICAL_CW)rcClient = element->bound;rcClient.right += 6;DrawText(hdc, element->string, -1, &rcClient,DT_NOCLIP | DT_VERTICAL_CW | DT_SINGLELINE);
#elif defined (SKB_VERTICAL_CCW)DrawText(hdc, element->string, -1, &element->bound,DT_NOCLIP | DT_VERTICAL_CCW | DT_SINGLELINE | DT_RIGHT);
#elseDrawText(hdc, element->string, -1, &element->bound, 0);
#endif
libmgi-2.0.4/src/softkeyboard/softkeyboard/pinyin_kbd.c
//vw_update,中文键盘候选词显示区域,for循环里显示所有候选词,适当调整显示位置
#if defined (SKB_VERTICAL_CW)rcClient.right -= 6;DrawText(hdc, element[i].string, -1, &rcClient,DT_NOCLIP | DT_VERTICAL_CW | DT_SINGLELINE);
#elif defined (SKB_VERTICAL_CCW)rcClient.left += 8;DrawText(hdc, element[i].string, -1, &rcClient,DT_NOCLIP | DT_VERTICAL_CCW | DT_SINGLELINE | DT_RIGHT);
#elif defined (SOFTKBD_1280_480) || defined (SOFTKBD_800_260)DrawText(hdc, element[i].string, -1, &element[i].bound, DT_VCENTER | DT_SINGLELINE);
#elseDrawText(hdc, element[i].string, -1, &element[i].bound, 0);
#endif//按下选择某个候选词的时候,输出位置上移,有一个动态效果
#if defined (SKB_VERTICAL_CW)rcClient = element->bound;rcClient.right += 4;DrawText(hdc, element->string, -1, &rcClient,DT_NOCLIP | DT_VERTICAL_CW | DT_SINGLELINE);
#elif defined (SKB_VERTICAL_CCW)DrawText(hdc, element->string, -1, &element->bound,DT_NOCLIP | DT_VERTICAL_CCW | DT_SINGLELINE | DT_RIGHT);
#elseDrawText(hdc, element->string, -1, &element->bound, 0);
#endif
5. 注意点
因为MiniGUI中文键盘,只支持GB2312编码的字体,但是应用一般用的是UTF-8编码的字体,有冲突,只想用一个字体文件解决这个问题,修改MiniGUI.cfg即可
[truetypefonts]
font_number=2
name0=ttf-fzcircle-rrncnn-0-0-GB2312-0
fontfile0=/usr/local/share/minigui/res/font/fzcircle.ttf
name1=ttf-fzcircle-rrncnn-0-0-UTF-8
fontfile1=/usr/local/share/minigui/res/font/fzcircle.ttf
MiniGUI更换键盘皮肤相关推荐
- ubuntu系统怎么更换搜狗输入法键盘皮肤+windows系统下.ssf文件无法打开
1.点击进入搜狗输入法官网 (小编在这里贴心得附上了官网的网址,点击就可以跳转啦!!!) 2.进入首页后,点击如下图绿色部分: 里面有各式各样的键盘皮肤,任君选择,总有一款捕获您的芳心[笔芯] 3.点 ...
- 华为怎么改输入法皮肤_微信和QQ个性键盘皮肤
hello大家好,今天是2019年1月1号,祝大家新年快乐 今天是新年的第一天,所以说给大家介绍一个好玩的,微信和QQ都能设置的个性的键盘皮肤,看下图,这样的个性的键盘主题怎么设置呢?其实很简单,下面 ...
- 联想g510拆键盘的简单方法_联想Z500笔记本更换键盘图文简单教程
小编使用了2年的一台联想Z500笔记本出现了部分键盘按键失灵损坏的情况,尤其是Ctrl键基本没有了反应,去店里修太贵,于是自己动手更换,因此就有了本文的联想Z500笔记本更换键盘图文教程,感兴趣的朋友 ...
- Elitebook 735 更换键盘
Elitebook 735 更换键盘 起因 按多了把了A键给按掉了,所以淘宝了买了新的键盘(略微有点点不适配,但可以用,就那样吧) 教程 记得关机 拆开后盖 拧掉螺丝 切回键盘面,开始翘键盘卡扣 具体 ...
- 【技术贴】QQ2010更换自定义皮肤 QQ2010自定义皮肤下载 qq2010皮肤下载
问:QQ2010 beat版本的QQ怎么更换自定义皮肤?以及精美QQ2010自定义皮肤下载.. 答:在QQ主面板[天气预报]下面也就是[消息盒子]旁边有一个五颜六色的小方块,点一下那个,会看见一个[& ...
- uni-app框架开发App如何更换主题皮肤?
最近使用uni-app开发App,其中有个功能是可以一键切换App的主题皮肤.其中主题皮肤分为黑夜版和白天版.经过一番研究,终于大功告成,因此记录一下. 之前,在做web端进行更换皮肤的时候,是在页面 ...
- Unity3D 2018(个人版) Editor更换黑色皮肤
看到Unity3D付费版里的黑色皮肤很酷?其实通过修改.exe文件可以在个人版中之接更换皮肤. 首先到你的 \Unity2018\Editor 目录下找到Unity.exe,然后拷贝一个副本将其重命名 ...
- MyEclipse更换主题皮肤
问题描述:如果不喜欢经典皮肤,那么我们可以自己更换皮肤 操作步骤: 1.window->preferences 2.搜索框输入app,选择General下Appearance这一项,找到右边Th ...
- 更换Winform 皮肤(上)----使用现有皮肤
偶然的想法,遇到了Winform更改Winform皮肤的问题. WPF没有这个问题,WPF的控件都是没有外形的,完全可以根据自己需要自由发挥,可以通过直观的编码实现各种绚丽的界面效果,网上也有很多现有 ...
最新文章
- MATLAB【五】———— matlab 调用C++生成exe文件,高斯核函数
- spring_Spring MVC控制器的单元测试:REST API
- 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解
- List、Vector、ArraryList、LinkedList
- 【无一时】的意思和解释
- Maven-Eclipse使用maven创建HelloWorld Java项目,使用Junit-4.11的注解
- mysql select_type
- 初中英语和计算机融合的教学案例,信息技术与初中英语教学整合的教学设计.doc...
- 【历史上的今天】5 月 10 日:淘宝网上线;机器感知之父出生;英国首批计算机投入运行
- css 3D 旋转 - Demo
- 过滤器(Filter)应用:全站压缩----Gzip网页压缩输出
- android屏幕刷新显示机制 前肩 后肩的解释
- 如何在CSDN上删除博客、删除自己上传的资源
- PROC SUMMARY
- 十六、Swift 可选值链条 Optional Chaining
- 【python掩膜及多子图colorbar】
- 电脑wifi通过中继器上网频繁掉线问题分析及问题解决方案(DHCP NAK)
- 从光耦到数字隔离器的“国产替代”之路
- LeetCode 617. 合并二叉树
- 关于如何在sublime text3中添加字体问题解决,保姆级教程
热门文章
- 煤矿电子封条智能监管系统 TensorFlow
- shell,给你一个目录,里面有很多文件,把他们改成 1.txt 2.txt 3.txt ....以此类推、盗墓者是个丑奴儿
- 2022施工员-土建方向-岗位技能(施工员)操作证考试题库及答案
- 商会机构源码模板系统包含了信息管理、新闻管理、广告管理、系统管理等功能 v3.9
- javascript 月份日期 取两位保留
- OpenCv中的cv::Mat::create()函数,cvRound(),cvFloor(),cvCeil()函数的详解l
- 为什么我们要学go语言?go语言的优势
- Apache ECharts下载安装(以GitHub下载源为例) |以及第一个echart图表快速上手
- 检测SIM卡 sim1 或sim2 是有效卡
- 使用gdb分析coredump文件排查流媒体服务srs偶发内存泄漏问题