您的位置:首页 > 产品设计 > UI/UE

minigui常用界面美化方法,及常用函数使用

2016-10-20 15:05 567 查看
1.获得子窗体的文字内容

char buff[100];

HWND parent = GetParent(hwnd);   //通过子控件句柄获得父窗体句柄

SendDlgItemMessage(parent,IDC_STRING,MSG_GETTEXT,99,(LPARAM)buffer);

IDC_STRING为字窗体id值,MSG_GETTEXT为获得文本的消息,99为最大接收字符串

长度,buffer为存储接收到的字符

也可通过SendMessage(hWnd,MSG_GETTEXT,99,(LPARAM)buffer);来设置控件字体

也可用封装好的GetWindowText(hWnd,buff,maxlen);来得到字体

2.给窗体控件设置文本内容

char str[100];

sprintf(str,"%s","test text");

SetDlgItemText(hWnd,IDC_SELECTED,str);  其中hWnd为窗体句柄,IDC_SELECTED

为控件的id,str为要给空间添加的文本

也可通过SendMessage(hWnd,MSG_SETEXT,0,(LPARAM)buff);来设置控件字体

也可用封装好的SetWindowText(hWnd,buff);来设置控件字体

3.使用定时器

可在MSG_CREATE中通过  SetTimer(hWnd,IDC_TIMER,10);来创建和启动定时器,其中

hWnd为接收定时器的窗体,IDC_TIMER为定时器的id,10为定时器的定时时间,单位为10ms

在hWnd的过程回调函数中可通过MSG_TIMER:来处理定时器到达事件,最后在MSG_DESTROY

中调用KillTimer(hWnd,IDC_TIMER)来注销定时器

4.通过获得图片中某个位置的颜色值,来给控件设置背景色。

gal_pixel pixel;     //存储获得的颜色值

pixel = GetPixelInBitmap(&bitmap,0,0);  //获得bitmap图片中的(0,0)像素位的颜色值

SetWindowBkColor(hWnd,pixel);  //给窗体或则控件设置背景色

InvalidateRect (hWnd, NULL, TRUE);   //启动重绘窗体

5.设置编辑框只能输入数字或只能输入字母

#define IDC_CTRL1     100

#define IDC_CTRL2     110

static WNDPROC old_edit_proc;

以下可在MSG_CREATE中设置

HWND hWnd1, hWnd2

hWnd1 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_VISIBLE | WS_BORDER, IDC_CTRL1, 

                    200, 10, 180, 24, hWnd, MY_ES_DIGIT_ONLY);

hWnd2 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_BORDER | WS_VISIBLE, IDC_CTRL2, 

                    200, 40, 180, 24, hWnd, MY_ES_ALPHA_ONLY);

 old_edit_proc = SetWindowCallbackProc (hWnd1, RestrictedEditBox);

        SetWindowCallbackProc (hWnd2, RestrictedEditBox);

以下为限制输入的回调函数

static int RestrictedEditBox (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)

{

    if (message == MSG_CHAR) {

        DWORD my_style = GetWindowAdditionalData (hwnd);

        if ((my_style & MY_ES_DIGIT_ONLY) && (wParam < '0' || wParam > '9'))

            return 0;

        else if (my_style & MY_ES_ALPHA_ONLY)

            if (!((wParam >= 'A' && wParam <= 'Z') || (wParam >= 'a' && wParam <= 'z')))

                return 0;

    }

    return (*old_edit_proc) (hwnd, message, wParam, lParam);

}

6.设置鼠标移到控件上时,显示控件提示信息

static WNDPROC old_btn_proc;    //为全局静态

static HWND g_hTooltip;         //提示框的句柄

static HWND s_hStart;           //局部静态

g_hTooltip = CreateToolTipWin (hWnd, 0, 0, 1000, "");  //hWnd为主窗体句柄,0,0为ToolTip显示的位置,1000为ToolTip显示的时间单位为ms,""为文本显示的的格式,成功返回提示框的句柄

SetWindowElementAttr (g_hTooltip, WE_LFSKIN_WND_BKGND, 0L);   //设置提示框显示属性

SetWindowBkColor (g_hTooltip, PIXEL_green);                   //设置背景提示框颜色

ShowWindow (g_hTooltip, SW_HIDE);                             //开始隐藏

s_hStart = CreateWindowEx (CTRL_BUTTON, "",                   //创建一个提示框的按钮

                        WS_VISIBLE | BS_PUSHBUTTON, WS_EX_NONE, 

                        IDC_START,

                        20, 96, 24, 24, 

                        hWnd, (DWORD)"Start/Pause");                   //最后的"Start/Pause"为提示的内容

old_btn_proc = SetWindowCallbackProc (s_hStart, DefButtonProc);        //设置回到函数

//回调函数

static int DefButtonProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)

{

    if (message == MSG_ERASEBKGND) {

        return 0;

    }

    else if (message == MSG_MOUSEMOVEIN) {

        RECT rc;

        BOOL in_out = (BOOL)wParam;

        char *tip = (char *)GetWindowAdditionalData (hwnd);          //获得"Start/Pause"提示字符串

       

        if (NULL != tip && in_out) {

            GetClientRect (hwnd, &rc); 

            ClientToScreen (hwnd, &rc.right, &rc.bottom);

            ResetToolTipWin (g_hTooltip, rc.right, rc.bottom, tip);

        }

    }

    return (*old_btn_proc) (hwnd, message, wParam, lParam);

}

7.注册工程所用图片和释放工程所用图片。可在MiniGuiMain主函数中注册,在循环突出结束时释放

#define NUM_48                  "num_48.bmp"       //定义图片名

#define ARRAY_LEN(array) \      //计算数字中存放的图片张数

    (sizeof(array)/sizeof(array[0]))

static char* all_pic[] = {      //存放图片路径的数组

    NUM_48,

};

BOOL register_all_pic (void)    //注册图片资源

{

    int i;

    SetResPath ("./img/");

    for (i = 0; i < ARRAY_LEN(all_pic); i++)

    {

        if (RegisterResFromFile (HDC_SCREEN, all_pic[i]) == FALSE)

        {

            fprintf (stderr, "can't register %s\n", all_pic[i]);

            return FALSE;

        }

    }

    return TRUE;

}

SetDefaultWindowElementRenderer ("skin");        //在注册完图片后要调用这句函数来初始初始化全局图片,使其可以用

void unregister_all_pic (void)  //释放图片资源

{

    int i;

    for (i = 0; i < ARRAY_LEN(all_pic); i++)

    {

        UnregisterRes(all_pic[i]);

    }

}

8.使用自定义bmp图片字体

#define NUM_48_BMP                  "../KepBackMinigui/img/num_48.bmp"    //①数字图片

#define DOT_48_BMP                  "../KepBackMinigui/img/dot_48.bmp"    //①点图片

static BITMAP g_stBMPNumber;                                              //①黑色数字图片

static BITMAP g_stBMPInsert;                                              //①插入的黑色字符图片

static DEVFONT  *s_bmpDevFont;                                            //①bmp字体设备

static LOGFONT  *s_bmpLogFont;                                            //①bmp字体句柄

static int  s_nTMin = 12;                                                 //①显示的数字1

static int  s_nTSec = 20;                                                 //①显示的数字2

在MSG_CREATE:中
LoadBitmap (HDC_SCREEN, &g_stBMPNumber, NUM_48_BMP);               //①加载数字图片

bff6
LoadBitmap (HDC_SCREEN, &g_stBMPInsert, DOT_48_BMP);               //①加载小数点图片

s_bmpDevFont = CreateBMPDevFont ("bmp-led-rrncnn-20-48-ISO8859-1", //①创建一个BITMAP图片数字,数字像素为20*48
               &g_stBMPNumber, "0", 10, 25);                      //①"0"表示从第“0”个字符开始,取10字符,由于我们给的num_48.bmp图片
                                                                  //①像素为275*48的,里面又有11个字符,所以每个字符长度为 275/11 = 25

AddGlyphsToBMPFont (s_bmpDevFont, &g_stBMPInsert, ".", 1, 25);     //①将新的bmp图片中的字符插入到s_bmpDevFont中
                                                                  //①g_stBMPInsert为含有.字符的图片,"."代表插入
                                                                  //①插入的第一个字符,1代表只有一个,25代表字符图片
                                                                  //①像素宽度

s_bmpLogFont = CreateLogFont (FONT_TYPE_NAME_BITMAP_BMP, "led",    //①通过前两步的设置,就可创建具体的bmp图片中字符操作
       "ISO8859-1",                                               //①句柄s_bmpLogFont了
       FONT_WEIGHT_BOLD, FONT_SLANT_ITALIC,
       FONT_SETWIDTH_NORMAL, FONT_SPACING_CHARCELL,
       FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,
       48, 0);

在MSG_PAINT:中
HDC hdc;
char cBuff[6];
hdc = BeginPaint (hWnd);
sprintf (cBuff, "%.2d.%.2d", s_nTMin, s_nTSec);                   //①②
cBuff [5] = '\0';                                                 //①②
SelectFont (hdc, s_bmpLogFont);                                   //①②设置hdc字体格式
TextOut (hdc, TIME_POS_X, TIME_POS_Y, cBuff);                     //①②显示出自定义的字体
EndPaint (hWnd, hdc);
return 0;

最后在MSG_DESTROY:中 
UnloadBitmap(&g_stBMPNumber);                                      //①卸载数字图片
UnloadBitmap(&g_stBMPInsert);                                      //①卸载小数点图片
DestroyBMPFont (s_bmpDevFont);                                     //①bmp字体资源回收

9.使按钮实现三态背景,即常态,鼠标悬停态,鼠标按下态

//图片要求,图片像素的宽要和按钮宽一样,图片竖值高度要为按钮高度的五倍,且竖值排放五种状态的按钮,第一张为正常状态的图片,第二张为鼠标悬停是的图片,第三张为按钮按下时的图片,第四五张不知干什么的,但位置要保留出来

#define LFSKIN_VOLUME               "lfskin_Volume.gif"                   //②声音图片

#define LFSKIN_DISVOLUME            "lfskin_DisVolume.gif"                //②静音图片

#define IDC_VOLUME                  100                                   //②声音按钮ID

#define MSG_CHANGE_SKINS            (MSG_USER + 10)                       //②自定义消息

#define ARRAY_LEN(array) \

    (sizeof(array)/sizeof(array[0]))                                      //②计算数组长度的宏

static char* all_pic[] = {                                                //②④图片数组

    LFSKIN_VOLUME,

    LFSKIN_DISVOLUME,

    LFSKIN_MAIN,

};

static HWND s_hVolume;                                                    //②声音按钮句柄

static BOOL s_bVolume;                                                    //②声音按键按下弹起标志

在主函数内注册图片和销毁图片

register_all_pic();                                                      //②④注册背景图片

SetDefaultWindowElementRenderer ("skin");                                //②④默认背景风格

unregister_all_pic();                                                   //②④注销背景图片

在MSG_CREATE中:
s_bVolume   = TRUE;                                                //②声音按键标志初始化为真
s_hVolume = CreateWindowEx (CTRL_BUTTON, "",                       //②创建测试的按钮
       WS_VISIBLE | BS_PUSHBUTTON, WS_EX_NONE,
       IDC_VOLUME,
       150, 20, 40, 42,
       hWnd, 0L);
SendMessage (hWnd, MSG_CHANGE_SKINS, 0, 0);                        //②发送自定义的消息设置按钮背景图片

在MSG_CHANGE_SKINS消息处理中

  if (s_bVolume)                                                     //②
   SetWindowElementAttr (s_hVolume,                               //②设置可用声音按钮背景,通过改参数WE_LFSKIN_PUSHBUTTON确定是可以三态选择的按钮
           WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_VOLUME);           //②
else
   SetWindowElementAttr (s_hVolume,                               //②
           WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_DISVOLUME);        //②设置不可用声音按钮背景,通过改参数WE_LFSKIN_PUSHBUTTON确定是可以三态选择的按钮
InvalidateRect (s_hVolume, NULL, FALSE);                           //②只刷新声音按钮
UpdateWindow (hWnd, TRUE);

在MSG_COMMAD:中
int id = LOWORD(wParam);

  switch(id)

  {

  case IDC_VOLUME:                                                  //②声音按钮处理

      if (!s_bVolume) {

          s_bVolume = TRUE;                                         //②

          SetWindowElementAttr (s_hVolume,                          //②

                      WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_VOLUME);  //②设置三态背景图片

          InvalidateRect (s_hVolume, NULL, FALSE);                  //②

      }

      else {

          s_bVolume = FALSE;                                        //②

          SetWindowElementAttr (s_hVolume,                          //②

                      WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_DISVOLUME);//②设置三态背景图片

          InvalidateRect (s_hVolume, NULL, FALSE);                   //②

      }
      break;

测试效果图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  minigui界面美化