⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skindemo.c

📁 基于minigui1.6.10的皮肤窗体应用开发框架
💻 C
字号:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <minigui/mgext.h>
#include <minigui/skin.h>

#include "DVRCommon.h"
#include "gFunction.h"
#include "skindemo.h"


#ifdef _EXT_SKIN

//定义可以聚焦的皮肤控件ID,依次从1~n,顺序定义
#define IDC_SERVERADR_EDT 1
#define IDC_USERNAME_EDT 2
#define IDC_PASSWORD_EDT 3

#define BTN_PLAY 4
#define BTN_STOP 5
#define BTN_CLOSE 6

#define BMP_COUNT 4 //图片个数

static MAX_FOCUS_OBJECT = 3; //最大可聚焦的控件对象

static CURRENT_FOCUSOBJECT_ID = 1; //当前聚焦对象ID

/*编辑框数组*/
static CTRLDATA EditArray[] =
{
		{CTRL_SLEDIT,
			WS_CHILD|WS_VISIBLE|WS_BORDER |ES_LEFT|ES_AUTOSELECT | ES_BASELINE,
			200, 100, 150, 30, 
			IDC_SERVERADR_EDT, 
			NULL,
			0
		},

		{CTRL_COMBOBOX,
			WS_CHILD | WS_VISIBLE | WS_BORDER| CBS_AUTOSPIN,
			200, 150, 150, 30,
			IDC_USERNAME_EDT,
			NULL,
			0
		},

		{CTRL_SLEDIT,
			WS_CHILD | WS_VISIBLE | WS_BORDER|ES_PASSWORD|ES_LEFT|ES_AUTOSELECT, 
			200, 200, 150, 30,
			IDC_PASSWORD_EDT, 
			NULL,
			0
		}
};


/*定义标签*/
static si_nrmlabel_t si_livelabel_items[] = 
{
	{"服务器地址:",0xDD0000, 0x00FF00, 0xFF0000, 0	},
	{"用  户  名:",0xDD0000, 0x00FF00, 0xFF0000, 0	},
	{"密      码:",0xDD0000, 0x00FF00, 0xFF0000, 0	}
};
	
/* 定义皮肤元素数组 */
static skin_item_t skin_control_items [] =
{
	{BTN_PLAY, SI_TYPE_CMDBUTTON | SI_TEST_SHAPE_RECT | SI_STATUS_VISIBLE  , 10,  300, {},1},
	{BTN_STOP, SI_TYPE_CMDBUTTON | SI_TEST_SHAPE_RECT | SI_STATUS_VISIBLE  , 150, 300, {},2},
	{BTN_CLOSE, SI_TYPE_CMDBUTTON | SI_TEST_SHAPE_RECT | SI_STATUS_VISIBLE , 350, 300, {},3},
	
	//编辑控件 服务器地址输入框
	{0,  SI_TYPE_CONTROL   | SI_TEST_SHAPE_RECT  | SI_STATUS_VISIBLE,
		200, 100, {}, -1, "c",0,EditArray},
	//用户名输入框 
	{0,  SI_TYPE_CONTROL   | SI_TEST_SHAPE_RECT  | SI_STATUS_VISIBLE,
		200, 160, {}, -1, "c",0,EditArray+1},
	//密码输入框
	{0,  SI_TYPE_CONTROL   | SI_TEST_SHAPE_RECT  | SI_STATUS_VISIBLE,
		200, 220, {}, -1, "c",0,EditArray+2},

	{0,  SI_TYPE_NRMLABEL   | SI_TEST_SHAPE_RECT  | SI_STATUS_VISIBLE,
		100, 102, {}, -1, "b",0,si_livelabel_items},
	//用户名
	{0,  SI_TYPE_NRMLABEL   | SI_TEST_SHAPE_RECT  | SI_STATUS_VISIBLE,
		100, 152, {}, -1, "c",0,si_livelabel_items+1},
	//密码
	{0,  SI_TYPE_NRMLABEL   | SI_TEST_SHAPE_RECT  | SI_STATUS_VISIBLE,
		100, 202, {}, -1, "c",0,si_livelabel_items+2}			
				
};

/* 定义皮肤,主窗口使用的皮肤控件 */
skin_head_t MyWinForm_skin =
														{
														    "测试皮肤窗口",
														    SKIN_STYLE_TOOLTIP, NULL, NULL, 
														    0, 9, skin_control_items, TRUE
														};

/* 位图文件名数组 */
const char *bmp_name[BMP_COUNT] = 
                         {
														"./image/main.png", 
														"./image/msn.png", 
														"./image/xray.png", 
														"./image/aol.png"
												 };


	

/* 皮肤事件回调函数 */
static int DVRForm_Event_Cb(HWND hwnd, skin_item_t* item, int event, void* data)
{
	PDVRWndClass pSkinFormObject = NULL;
	  //点击按钮回调事件
    if (event == SIE_BUTTON_CLICKED)
    { 
        switch (item->id)
        {
	        case BTN_PLAY:        /* 皮肤元素SIID_PLAY的SIE_BUTTON_CLICKED事件在这里进行处理 */
	            //这里添加按钮点击事件处理代码
	            MessageBox (hwnd, "点击播放按钮", "提示", MB_OK | MB_ICONINFORMATION);
	            
	            break;
	        case BTN_STOP:
	
	            break;
	        case BTN_CLOSE:
	            MessageBox (hwnd, "关闭窗体事件", "提示", MB_OK | MB_ICONINFORMATION);
	            //DVRDestroyWindow(hwnd);
	            break;
        }
    }
    return MSG_CB_DEF_GOON;
}

PDVRWndClass DVRRegWindowClassBySkinForm(PDVRWndClass pParentWnd)
{
	PDVRWndClass pWndObject;
	pWndObject = (PDVRWndClass)malloc(sizeof(tagDVRWndClass));
	memset(pWndObject,0,sizeof(tagDVRWndClass));
  pWndObject->pParent                 = pParentWnd;
	pWndObject->DVRCreateAndInitWindow  = DVRCreateAndInitWindow;
	pWndObject->DVRDestroyWindow        = DVRDestroyWindow;
	pWndObject->DVRHideWindow           = DVRHideWindow;
	pWndObject->DVRLoadLanguageToWindow = DVRLoadLanguageToWindow;
	pWndObject->DVRShowWindow           = DVRShowWindow;
	return pWndObject;
}

static HWND DVRCreateAndInitWindow(PDVRWndClass pWndObject)
{
	  MSG msg;
	  
    g_Load_Skin_Bmps(&MyWinForm_skin, TRUE , bmp_name,BMP_COUNT);    /* 装载位图资源 */
    
	  g_load_skin_fonts(&MyWinForm_skin,TRUE);/*装载字体*/		   

    if (MyWinForm_skin.bmps == NULL) {
        printf ("Could not load skin bitmaps!\n");
        return 0;
    }
        				
    if ( !skin_init (&MyWinForm_skin, DVRForm_Event_Cb, DVRProccessMessage) ){    /* 初始化皮肤 */
        printf ("skin init fail!\n");
    }
    else
    {
			  if (pWndObject->pParent)
			  {
		    		pWndObject->hWnd = create_skin_main_window (&MyWinForm_skin,
		                    		pWndObject->pParent->hWnd, WINDOWLEFT, WINDOWTOP, 
		                    		WINDOWWIDTH + WINDOWLEFT, WINDOWHEIGHT + WINDOWTOP,
		                    		TRUE);	
				}
				else
				{
		    		pWndObject->hWnd = create_skin_main_window (&MyWinForm_skin,
		                    		HWND_DESKTOP, WINDOWLEFT, WINDOWTOP,
		                    		WINDOWWIDTH + WINDOWLEFT, WINDOWHEIGHT + WINDOWTOP,
		                    		TRUE);					
				}    	
				
				//进入窗体消息循环
        while (GetMessage (&msg, pWndObject->hWnd))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    }
}

static void DVRShowWindow(HWND hWnd,int iShowType)
{
	
}

static void DVRHideWindow(HWND hWnd)
{

}

static void DVRDestroyWindow(HWND hWnd)
{
    MainWindowCleanup (hWnd);
    skin_deinit(&MyWinForm_skin);        			                /* 撤销皮肤 */	  
	  g_Load_Skin_Bmps(&MyWinForm_skin, FALSE , bmp_name,BMP_COUNT);    /* 卸载位图资源 */
	  g_load_skin_fonts(&MyWinForm_skin,FALSE);/*装载字体*/
}

static void DVRLoadLanguageToWindow(PDVRWndClass pWndObject)
{

}

/* 皮肤窗口消息回调函数 */
static int DVRProccessMessage(HWND hwnd, int message, WPARAM wparam, LPARAM lparam, int* result)
{
	switch (message)
	{
		case MSG_KEYDOWN: //键盘按下消息
		  switch(wparam)
		  {
		  	  case 103://向上按键
		  			CURRENT_FOCUSOBJECT_ID = SetPreFocusObject(hwnd,CURRENT_FOCUSOBJECT_ID);
		  			break;
		  		case 108://向下按键 
		  		  CURRENT_FOCUSOBJECT_ID = SetNextFocusObject(hwnd,CURRENT_FOCUSOBJECT_ID);
		  		  break;
		  		case 105://向右按键
		  			break;
					case 106://向左按键
						break;						
		  }
		  break;
		case MSG_CLOSE:
			MessageBox (hwnd, "关闭窗体消息执行!", "提示", MB_OK | MB_ICONINFORMATION);
			break;
	}
	return 1;
}

//设置下一个聚焦对象
static int SetNextFocusObject(HWND hParent,int iCurObjectID)
{
	int iCurID = iCurObjectID;
	HWND hCtrObject;
	hCtrObject = GetDlgItem(hParent,iCurID);
	SetWindowBkColor(hCtrObject,PIXEL_lightwhite);	
	UpdateWindow(hCtrObject,TRUE);
	
	if (iCurID == MAX_FOCUS_OBJECT)
	{
		iCurID = 1;
	}	
	else
	{
		iCurID++;
	}
	hCtrObject = GetDlgItem(hParent,iCurID);
	SetWindowBkColor(hCtrObject,PIXEL_blue);	
	UpdateWindow(hCtrObject,TRUE);	
	return iCurID;
}

//设置前一个聚焦对象
static int SetPreFocusObject(HWND hParent,int iCurObjectID)
{	
	int iCurID = iCurObjectID;
	HWND hCtrObject;
	hCtrObject = GetDlgItem(hParent,iCurID);
	SetWindowBkColor(hCtrObject,PIXEL_lightwhite);	
	UpdateWindow(hCtrObject,TRUE);
	
  if (iCurID == 1)
	{
		iCurID = MAX_FOCUS_OBJECT;
	}
	else
	{
		iCurID--;
	}
	hCtrObject = GetDlgItem(hParent,iCurID);
	SetWindowBkColor(hCtrObject,PIXEL_blue);	
	UpdateWindow(hCtrObject,TRUE);	
	return iCurID;
}

//确定当前对象的编辑
static int SetStatusOfFocusObject(HWND hParent,int iCurObjectID)
{
	
	return 0;
}

#else

#error "Lack of SKIN support in MiniGUIExt library."

#endif /* _EXT_SKIN */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -