前言

MiniGUI原来的键盘GUI已经有点不符合现在的需求,所以需要定制一套皮肤,根据我定制皮肤的过程,写一遍流程文档,做一下笔记,为以后再定制皮肤提供参考,先看一下定制好的皮肤

录制的色彩有点失真,看一下截图

1. 皮肤资源位置

在libmgi-2.0.4/src/softkeyboard/softkeyboard/分辨率,目录下有一些图片资源,里面是图片转为十六进制的c文件,总共需要替换的是以下的图片

  1. char_key_mask.c
    键盘按键按下去的效果,可以不替换
  2. func_key_mask.c
    功能按键按下去的效果,可以不替换
  3. en_kbd_bkg.c
  4. pinyin_kbd_bkg.c
  5. num_kbd_bkg.c
  6. punct_kbd_bkg.c
  7. left_arrow_disable.c
  8. left_arrow_enable.c
  9. right_arrow_disable.c
  10. right_arrow_enable.c
  11. sel_text_bkgnd.c
  12. tooltip_bk.c
  13. tooltip_mask.c
    注意红色是设置不规则窗口时候的ColorKey
  14. 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更换键盘皮肤相关推荐

  1. ubuntu系统怎么更换搜狗输入法键盘皮肤+windows系统下.ssf文件无法打开

    1.点击进入搜狗输入法官网 (小编在这里贴心得附上了官网的网址,点击就可以跳转啦!!!) 2.进入首页后,点击如下图绿色部分: 里面有各式各样的键盘皮肤,任君选择,总有一款捕获您的芳心[笔芯] 3.点 ...

  2. 华为怎么改输入法皮肤_微信和QQ个性键盘皮肤

    hello大家好,今天是2019年1月1号,祝大家新年快乐 今天是新年的第一天,所以说给大家介绍一个好玩的,微信和QQ都能设置的个性的键盘皮肤,看下图,这样的个性的键盘主题怎么设置呢?其实很简单,下面 ...

  3. 联想g510拆键盘的简单方法_联想Z500笔记本更换键盘图文简单教程

    小编使用了2年的一台联想Z500笔记本出现了部分键盘按键失灵损坏的情况,尤其是Ctrl键基本没有了反应,去店里修太贵,于是自己动手更换,因此就有了本文的联想Z500笔记本更换键盘图文教程,感兴趣的朋友 ...

  4. Elitebook 735 更换键盘

    Elitebook 735 更换键盘 起因 按多了把了A键给按掉了,所以淘宝了买了新的键盘(略微有点点不适配,但可以用,就那样吧) 教程 记得关机 拆开后盖 拧掉螺丝 切回键盘面,开始翘键盘卡扣 具体 ...

  5. 【技术贴】QQ2010更换自定义皮肤 QQ2010自定义皮肤下载 qq2010皮肤下载

    问:QQ2010 beat版本的QQ怎么更换自定义皮肤?以及精美QQ2010自定义皮肤下载.. 答:在QQ主面板[天气预报]下面也就是[消息盒子]旁边有一个五颜六色的小方块,点一下那个,会看见一个[& ...

  6. uni-app框架开发App如何更换主题皮肤?

    最近使用uni-app开发App,其中有个功能是可以一键切换App的主题皮肤.其中主题皮肤分为黑夜版和白天版.经过一番研究,终于大功告成,因此记录一下. 之前,在做web端进行更换皮肤的时候,是在页面 ...

  7. Unity3D 2018(个人版) Editor更换黑色皮肤

    看到Unity3D付费版里的黑色皮肤很酷?其实通过修改.exe文件可以在个人版中之接更换皮肤. 首先到你的 \Unity2018\Editor 目录下找到Unity.exe,然后拷贝一个副本将其重命名 ...

  8. MyEclipse更换主题皮肤

    问题描述:如果不喜欢经典皮肤,那么我们可以自己更换皮肤 操作步骤: 1.window->preferences 2.搜索框输入app,选择General下Appearance这一项,找到右边Th ...

  9. 更换Winform 皮肤(上)----使用现有皮肤

    偶然的想法,遇到了Winform更改Winform皮肤的问题. WPF没有这个问题,WPF的控件都是没有外形的,完全可以根据自己需要自由发挥,可以通过直观的编码实现各种绚丽的界面效果,网上也有很多现有 ...

最新文章

  1. MATLAB【五】———— matlab 调用C++生成exe文件,高斯核函数
  2. spring_Spring MVC控制器的单元测试:REST API
  3. 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解
  4. List、Vector、ArraryList、LinkedList
  5. 【无一时】的意思和解释
  6. Maven-Eclipse使用maven创建HelloWorld Java项目,使用Junit-4.11的注解
  7. mysql select_type
  8. 初中英语和计算机融合的教学案例,信息技术与初中英语教学整合的教学设计.doc...
  9. 【历史上的今天】5 月 10 日:淘宝网上线;机器感知之父出生;英国首批计算机投入运行
  10. css 3D 旋转 - Demo
  11. 过滤器(Filter)应用:全站压缩----Gzip网页压缩输出
  12. android屏幕刷新显示机制 前肩 后肩的解释
  13. 如何在CSDN上删除博客、删除自己上传的资源
  14. PROC SUMMARY
  15. 十六、Swift 可选值链条 Optional Chaining
  16. 【python掩膜及多子图colorbar】
  17. 电脑wifi通过中继器上网频繁掉线问题分析及问题解决方案(DHCP NAK)
  18. 从光耦到数字隔离器的“国产替代”之路
  19. LeetCode 617. 合并二叉树
  20. 关于如何在sublime text3中添加字体问题解决,保姆级教程

热门文章

  1. 煤矿电子封条智能监管系统 TensorFlow
  2. shell,给你一个目录,里面有很多文件,把他们改成 1.txt 2.txt 3.txt ....以此类推、盗墓者是个丑奴儿
  3. 2022施工员-土建方向-岗位技能(施工员)操作证考试题库及答案
  4. 商会机构源码模板系统包含了信息管理、新闻管理、广告管理、系统管理等功能 v3.9
  5. javascript 月份日期 取两位保留
  6. OpenCv中的cv::Mat::create()函数,cvRound(),cvFloor(),cvCeil()函数的详解l
  7. 为什么我们要学go语言?go语言的优势
  8. Apache ECharts下载安装(以GitHub下载源为例) |以及第一个echart图表快速上手
  9. 检测SIM卡 sim1 或sim2 是有效卡
  10. 使用gdb分析coredump文件排查流媒体服务srs偶发内存泄漏问题