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

来源:互联网 发布:linux端口号范围 编辑:程序博客网 时间:2024/05/16 09:08
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);               //①加载数字图片
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;

测试效果图


0 0