基于对话框配置工具框架简单分析(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17017545/article/details/79242498

对话框类头文件基本结构(Integrity Mobile ConfiguratorDlg.h)

// (1)#pragma once + 各种包含(afxwin.h + 后续的各种类的头文件);
//(2)XXXXDlg类定义(关联的对话框ID + HICON m_hIcon +构造+ DoDataExchange +声明消息映射函数(OnInitDialog+OnSysCommand+OnPaint+OnQueryDragIcon)+ 声明消息映射表);
对话框类的定义中主要内容:类中各种函数的声明(包括消息映射函数),各种变量的声明,还有各种类的对象(包括Tab控件类,菜单栏类,工具栏类,组合框类)

对话框类实现文件的基本结构,并对部分代码分析(Integrity Mobile ConfiguratorDlg.cpp)

// (1)各种包含头文件(stdafx.h + afxdialogex.h + XXXX.h + XXXXDlg.h) + 活动预处理;
// (2)CAboutDlg类的定义(关联的对话框ID + 构造 + DoDataExchange + 声明消息映射表)+实现(构造 + DoDataExchange + 消息映射表BEGIN~END);
// (3)XXXXDlg类的实现(构造 + DoDataExchange + 消息映射表BEGIN~END);
// (4)CTestDlg消息处理程序:(消息处理程序对应消息映射表中的消息)OnInitDialog + OnSysCommand + OnPaint + OnQueryDragIcon。
初始化程序中主要是:设置对话框图标,设置菜单栏,设置工具栏,在工具栏的某个按钮上设置组合框(显示串口号),设置Tab控件等等.

BOOL CIntegrityMobileConfiguratorDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // 将“关于...”菜单项添加到系统菜单中。
    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }
    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码
    m_pcfgProcess = new CfgProcess((DWORD)this,CallBackDisplay);
    menu.LoadMenu(IDR_MENU);  //IDR_MENU为菜单栏ID号  
    SetMenu(&menu);
    //定时器 (这里的定时器名称代表定时从串口接收数据)
    SetTimer(COM_RECV_PROC_TIMER,150,NULL); 
    //这里的三个参数意思(定时器名称,定时时间(周期性触发),填NULL调用系统回调函数) 
    //最后一个参数为NULL,使用系统默认的回调函数,系统默认的是OnTimer函数。
    m_bSerialConnected = FALSE;
    m_bFirstAck = FALSE;
    m_bConnInd = FALSE;
    m_wBackupStatus = BACKUP_NONE;

    //添加一个平面工具栏
    if (!m_wndtoolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(0, 3, 0, 0)) || !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR))
    {
        TRACE0("failed to create toolbar\n");
        return FALSE;
    }
     // Create the zoom combo box in the toolbar.
    //在按钮上创建组合框,按钮位置决定了组合框的位置
    int index1 = m_wndtoolbar.CommandToIndex(IDC_COMBO_COM_PORT);   //获取要设置为组合框的按钮的位置
    m_wndtoolbar.SetButtonInfo(index1, IDC_COMBO_COM_PORT, TBBS_SEPARATOR, 100);//(对空白按钮进行设置)设置组合框的ID,类型(这里是分隔栏),100是指分隔栏宽度
    // 根据分隔符的尺寸rect建立组合框
    CRect rect1;
    m_wndtoolbar.GetItemRect(index1, &rect1);    //将组合框的矩形区域数据存入rect1中
    rect1.bottom += 100;
    m_cZoomCombo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rect1,&m_wndtoolbar, IDC_COMBO_COM_PORT); //创建组合框  四个参数(样式,位置和大小,父窗口,组合控件ID)  

    //选中第1条记录
    m_cZoomCombo.SetCurSel(0);   
    m_wndtoolbar.ShowWindow(SW_SHOW);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

    //使工具栏图标显示256色
    HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
        MAKEINTRESOURCE(IDR_TOOLBAR), //加载IDB_TOOLBAR
        IMAGE_BITMAP, //按位图格式
        0, 0, // cx,cy
        LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
    CBitmap bm;
    bm.Attach(hbm);
    m_ilToolBar.Create(24, 24, ILC_COLOR8, 6, 6);
    m_ilToolBar.SetBkColor(::GetSysColor(COLOR_BTNFACE)); //将系统色设置为当前背景色
    m_ilToolBar.Add(AfxGetApp()->LoadIcon(IDI_ICON_CONNECT)); //按顺序加载图标
    m_ilToolBar.Add(AfxGetApp()->LoadIcon(IDI_ICON_READ));
    m_ilToolBar.Add(AfxGetApp()->LoadIcon(IDI_ICON_CLEAR));
    m_ilToolBar.Add(AfxGetApp()->LoadIcon(IDI_ICON_WRITE));
    m_ilToolBar.Add(AfxGetApp()->LoadIcon(IDI_ICON_DISCONNECT));
    m_wndtoolbar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

    //创建页面窗口,以及页面名称
    m_tab.InsertItem(0, _T("Device Address"));
    m_tab.InsertItem(1, _T("Setting"));
    //设置父窗口
    page1.Create(IDD_PAGE1, GetDlgItem(IDC_TAB));
    page2.Create(IDD_PAGE2, GetDlgItem(IDC_TAB));
    //定义窗口大小
    CRect rect;
    m_tab.GetClientRect(&rect);
    rect.top += 20;
    rect.bottom -= 5;
    rect.left += 5;
    rect.right -= 5;
    //设置窗口位置
    page1.MoveWindow(&rect);
    page2.MoveWindow(&rect);
    //设置程序的首页,即启动程序后首先显示的页面
    page1.ShowWindow(TRUE);
    m_tab.SetCurSel(0);

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

猜你喜欢

转载自blog.csdn.net/qq_17017545/article/details/79242498