位操作表示法:
背景:设置某一位 为 1
unsigned int m_dwPreview[2]; //0表示本地 1表示外地
bRemote //取1 或者0 分别表示本地 和 外地
nChannel //表示通道
bEnable //表示是否使能该通道
m_dwPreview[bRemote] = ((m_dwPreview[bRemote] & (~(1 << nChannel))) | (bEnable << nChannel));
操作方法:
m_dwPreview[bRemote] & (~(1 << nChannel) 把该通道清零
bEnable << nChannel 确定该通道是否需要 置一或者清零
2:用来判断第nChannel位清零
nResult = (m_dwPreview[bRemote] >> nChannel) & 1;
3:把第nChannelCount前面位置1
const static unsigned long dwChMask = ((1 << nChannelCount) - 1);
4:统一的原则:(UI设计)
每一个界面的控件 和 主界面的位置大小都可以用 几个宏和全局变量来表示,这样一旦更改了全局变量,那么相应的界面大小和控件大小就会发生改变。
例如:
#define STDDLG_Y1 (STDDLG_Y_BASE+3)//(STDDLG_DY) //4
#define STDDLG_Y2 (STDDLG_Y1+STDDLG_CTRL_H+STDDLG_DY) //4+32
#define STDDLG_Y3 (STDDLG_Y2+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y4 (STDDLG_Y3+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y5 (STDDLG_Y4+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y6 (STDDLG_Y5+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y7 (STDDLG_Y6+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y8 (STDDLG_Y7+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y9 (STDDLG_Y8+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y10 (STDDLG_Y9+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y11 (STDDLG_Y10+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y12 (STDDLG_Y11+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y13 (STDDLG_Y12+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y14 (STDDLG_Y13+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y15 (STDDLG_Y14+STDDLG_CTRL_H+STDDLG_DY)
#define STDDLG_Y(n) (STDDLG_Y1 + ((STDDLG_CTRL_H+STDDLG_DY) * ((n) - 1)))
//结构性的代码
#define STDDLG_CTRL1_W 140 //!< 第一列控件宽度【可容纳7个汉字对应tagGUIBMP::config_col1】
#define STDDLG_CTRL2_W 320 //!< 第二列控件宽度【可容纳16个汉字对应tagGUIBMP::config_col2】
#define STDDLG_CTRL3_W 80 //!< 第三列控件宽度【可容纳4个汉字对应tagGUIBMP::config_col3】
#define STDDLG_CTRL2_TV_W 270 //!< 第二列控件宽度【可容纳16个汉字对应tagGUIBMP::config_col2】
#define STDDLG_CTRL3_TV_W 50 //!< 第三列控件宽度【可容纳2个汉字对应tagGUIBMP::config_col3】
#define STDDLG_BTN_W1 80 //!< 提示栏中按钮的宽度【一般是确定取消之类的,仅限4个汉字】
#define STDDLG_BTN_W2 100 //!< 提示栏中按钮的宽度【一般是确定取消之类的,仅限5个汉字】
#define STDDLG_BTN_W3 120 //!< 提示栏中按钮的宽度【一般是确定取消之类的,仅限6个汉字】
//定义的全局变量来改屏幕各个页面的尺寸问题
void GUI_InitDlgData(int bFix)
{
//这个到时要修改成区分两种模式的计算位置
if (FIXED_MODE == bFix)//固定模式
{
BORDER_W = g_GuiMode.stMenuSizeParam.sFixedSize.Width;
BORDER_H = g_GuiMode.stMenuSizeParam.sFixedSize.Height;
PROP_TITLE_W2 = STDDLG_MAINWND_LEFT_1W;
PROP_TITLE_W1 = 40;//待定值。
PROP_TITLE_H1 = 40;
// 3级范围宽度-->最右边的点
FORM_RIGHT_X = BORDER_W -PROP_TITLE_W2 - WINDOW_BORD_LEFT - \
WINDOW_BORD_RIGHT- FORM_LEFT_X ;////FORM_LEFT 距离左边父控件的距离
FORM_RIGHT_Y = BORDER_H - WINDOW_BORD_TOP - WINDOW_BORD_BOT- PROP_TITLE_H3;
}
else if (VAR_MODE == bFix)//自定义
{
//选择哪种屏幕分辨率下的数据。
int temp_w = 0;
int temp_h = 0;
GUI_GetVarMenuSizeData(&temp_w, &temp_h);
BORDER_W = temp_w - CONFIG_WINDOW_LEFT - CONFIG_WINDOW_RIGHT; //配置窗口的宽
BORDER_H = temp_h - CONFIG_WINDOW_TOP - CONFIG_WINDOW_BOTTOM;//配置窗口的高
if (temp_h == 1024 )
{//(高度足够,不需缩放,1024 高度时也使用1080 _hd 图片)
PROP_TITLE_H1 = g_tGuiBmp.menu_camera_normal_hd.bmHeight;//一级栏高度
}
else
{
PROP_TITLE_H1 = PROP_TITLE_H1_BASE *temp_h/768;
}
PROP_TITLE_W1 = PROP_TITLE_H1 *PROP_TITLE_W1_BASE/PROP_TITLE_H1_BASE;//一级宽度
PROP_TITLE_W2 = temp_w*PROP_TITLE_W2_BASE/1024;//二级宽度
// 3级范围宽度-->最右边的点
FORM_RIGHT_X = BORDER_W- PROP_TITLE_W1 -PROP_TITLE_W2 - WINDOW_BORD_LEFT - \
WINDOW_BORD_RIGHT- FORM_LEFT_X ;////FORM_LEFT 距离左边父控件的距离
FORM_RIGHT_Y = BORDER_H - WINDOW_BORD_TOP - WINDOW_BORD_BOT- PROP_TITLE_H3;
}
else if (PRO_MODE == bFix)
{
int temp_w = 0;
int temp_h = 0;
GetCurrentResolve(&temp_w, &temp_h); //获取分辨率
BORDER_W = temp_w * BOARDWND_W / 1024;
BORDER_H = temp_h * BOARDWND_H /768+80;
PROP_TITLE_H1 = 64;//一级栏高度
PROP_TITLE_W1 = 140;//一级宽度
//二级菜单的范围
PROP_TITLE_W2 = (CTRL_STATIC_BMP_W * temp_w / 1024+5);
//三级菜单的范围
// 3级范围宽度-->最右边的点
FORM_RIGHT_X = BORDER_W -PROP_TITLE_W2 - FORM_LEFT_X;////FORM_LEFT 距离左边父控件的距离
FORM_RIGHT_Y = BORDER_H - WINDOW_BORD_TOP - PROP_TITLE_H3-WINDOW_BORD_BOTTOM-5;// 三级范围高度
}
PROP_TITLE_W3 = (FORM_RIGHT_X+WINDOW_BORD_RIGHT+FORM_LEFT_X)/CTRL_3_PAYE_MANNUM;
CTRL_2_X = FORM_LEFT_X + FORM_FIRST_W + GAP_X;//第二列起点
CTRL_2_W = FORM_RIGHT_X - GAP_X -CTRL_2_X;//第二列的宽度
CTRL_3_X = FORM_RIGHT_X -GAP_X - CTRL_3_W;//最右边按钮起点
return ;
}
5:统一的结构体的设计 : 来自minigui控件 设计方式
PCONTROL pCtrl = Control(hwnd); //这个是所有窗口 所共有的结构体
PCOMBOBOXDATA pData = (PCOMBOBOXDATA) pCtrl->dwAddData2; //这个参数表示所有的不同
pCtrl->dwAddData2 pCtrl用一个void 类型 (或者unsigned int)类型 用来表示不同的窗体
(例如:static propsheet combobox控件这些特殊的不一样的控件)
理解:设计方法
6.通用数组的使用方式
在a.c中定义数组:
int WinMainMetrics[MWM_ITEM_NUMBER] = {50, 50,1, 2, 1,
17, 16, 16,
12, 8, 5, 12,
12, 2, 18, 10, 4,
4, 4, 64, 4, 4, 14,
16, 2, 9, 9, 9, 9, 8,
18
};
在common.h使用数组
#define MWM_MINWIDTH 0
#define MWM_MINHEIGHT 1
#define MWM_BORDER 2
#define MWM_THICKFRAME 3
#define MWM_THINFRAME 4
#define MWM_CAPTIONY 5
#define MWM_ICONX 6
#define MWM_ICONY 7
#define MWM_MENUBARY 8
#define MWM_MENUBAROFFX 9
#define MWM_MENUBAROFFY 10
#define MWM_MENUITEMY 11
#define MWM_INTERMENUITEMX 12
#define MWM_INTERMENUITEMY 13
#define MWM_MENUITEMOFFX 14
#define MWM_MENUTOPMARGIN 15
#define MWM_MENUBOTTOMMARGIN 16
#define MWM_MENULEFTMARGIN 17
#define MWM_MENURIGHTMARGIN 18
#define MWM_MENUITEMMINX 19
#define MWM_MENUSEPARATORY 20
#define MWM_MENUSEPARATORX 21
#define MWM_SB_HEIGHT 22
#define MWM_SB_WIDTH 23
#define MWM_SB_INTERX 24
#define MWM_CXVSCROLL 25
#define MWM_CYVSCROLL 26
#define MWM_CXHSCROLL 27
#define MWM_CYHSCROLL 28
#define MWM_MINBARLEN 29
#define MWM_DEFBARLEN 30
#define MWM_ITEM_NUMBER 31
extern int WinMainMetrics[];
#define GetMainWinMetrics(iItem) (WinMainMetrics[iItem])
//采用这种方式 来使用通用的宏