项目学习(一)

位操作表示法:

背景:设置某一位 为 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])  
//采用这种方式 来使用通用的宏

猜你喜欢

转载自blog.csdn.net/qq_1335857320/article/details/81292147