MFC按钮点击切换对话框

我是按照老师给的示例程序改的。

  1. 资源视图,右键“插入Dialog”,改一下ID,比如说IDD_DLG_DB。
    这个对话框的属性是:Style-Child,Border-None。
  2. 在对话框上右击,新建类。
    基类:CDialog,声明和定义自己起好风格统一的名字,比如说CDlgDatabase,DlgDatabase.h/.cpp。
  3. 为了实现按钮切换对话框,就要在主对话框上加四个按钮,刚刚新建的IDD_DLG_DB不是主对话框。
    找到主对话框对应的头文件:
// 因为我有很多个要切换的对话框……
#include "resource.h"
#include "DlgImage.h"
#include "DlgCheck.h"
#include "DlgSystem.h"
#include "DlgDatabase.h"
#include "TabControler.h"

#define SHEET_IMAGE 0
#define SHEET_CHECK 1
#define SHEET_SYSTEM 2
#define SHEET_DATABASE 3

// CAreaScanProjectDlg 对话框
class CAreaScanProjectDlg : public CDialogEx
{
// 构造
public:
    CAreaScanProjectDlg(CWnd* pParent = NULL);  // 标准构造函数

// 对话框数据
    enum { IDD = IDD_AREASCANPROJECT_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 实现
protected:
    HICON m_hIcon;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()

    public:
        void InitTabParameters();
        void ReduceTabRect( CRect* rect, int left, int right, int top, int bottom );
    public:
        //主要是改这个地方:定义变量
        CTabControler m_TabControler;
        CRect m_Rect_Parameters;
        CStatic m_Tab_Parameters;
        CDlgImage m_Dlg_Image;
        CDlgCheck m_Dlg_Check;
        CDlgSystem m_Dlg_System;
        CDlgDatabase m_Dlg_Database;
        afx_msg void OnBnClickedButtonImage();
        afx_msg void OnBnClickedButtonCheck();
        afx_msg void OnBnClickedButtonSystem();
        afx_msg void OnBnClickedButtonDatabase();
};

// AreaScanProjectDlg.cpp : 实现文件
BEGIN_MESSAGE_MAP(CAreaScanProjectDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON_IMAGE, &CAreaScanProjectDlg::OnBnClickedButtonImage)
    ON_BN_CLICKED(IDC_BUTTON_CHECK, &CAreaScanProjectDlg::OnBnClickedButtonCheck)
    ON_BN_CLICKED(IDC_BUTTON_SYSTEM, &CAreaScanProjectDlg::OnBnClickedButtonSystem)
    ON_BN_CLICKED(IDC_BUTTON_DATABASE, &CAreaScanProjectDlg::OnBnClickedButtonDatabase)
END_MESSAGE_MAP()

void CAreaScanProjectDlg::InitTabParameters()
{
    m_Tab_Parameters.GetClientRect(&m_Rect_Parameters);
    ReduceTabRect(&m_Rect_Parameters,1,-1,1,-1);

    m_Dlg_Image.Create(IDD_DLG_IMAGE,&m_Tab_Parameters);
    m_Dlg_Check.Create(IDD_DLG_CHECK,&m_Tab_Parameters);
    m_Dlg_System.Create(IDD_DLG_SYSTEM,&m_Tab_Parameters);
    m_Dlg_Database.Create(IDD_DLG_DB, &m_Tab_Parameters);
    m_TabControler.Show_Parameters_Tab(SHEET_IMAGE);
}
//对于按钮响应函数:
void CAreaScanProjectDlg::OnBnClickedButtonDatabase()
{
    // TODO: 在此添加控件通知处理程序代码
    m_TabControler.Show_Parameters_Tab(SHEET_DATABASE);
}
//TavControler.cpp
#include "StdAfx.h"
#include "TabControler.h"
#include "AreaScanProjectDlg.h"

extern CAreaScanProjectDlg* g_pMainDlg;
CTabControler::CTabControler(void)
{
}


CTabControler::~CTabControler(void)
{
}

void CTabControler::Hide_All_Parameters()
{
    g_pMainDlg->m_Dlg_Image.SetWindowPos(NULL,g_pMainDlg->m_Rect_Parameters.left,g_pMainDlg->m_Rect_Parameters.top,g_pMainDlg->m_Rect_Parameters.Width(),g_pMainDlg->m_Rect_Parameters.Height(),SWP_HIDEWINDOW);
    g_pMainDlg->m_Dlg_Check.SetWindowPos(NULL,g_pMainDlg->m_Rect_Parameters.left,g_pMainDlg->m_Rect_Parameters.top,g_pMainDlg->m_Rect_Parameters.Width(),g_pMainDlg->m_Rect_Parameters.Height(),SWP_HIDEWINDOW);
    g_pMainDlg->m_Dlg_System.SetWindowPos(NULL,g_pMainDlg->m_Rect_Parameters.left,g_pMainDlg->m_Rect_Parameters.top,g_pMainDlg->m_Rect_Parameters.Width(),g_pMainDlg->m_Rect_Parameters.Height(),SWP_HIDEWINDOW);
    g_pMainDlg->m_Dlg_Database.SetWindowPos(NULL, g_pMainDlg->m_Rect_Parameters.left, g_pMainDlg->m_Rect_Parameters.top, g_pMainDlg->m_Rect_Parameters.Width(), g_pMainDlg->m_Rect_Parameters.Height(), SWP_HIDEWINDOW);

}

void CTabControler::Show_Parameters_Tab( int index )
{
    Hide_All_Parameters();
    switch(index)
    {
    case SHEET_IMAGE:
        g_pMainDlg->m_Dlg_Image.SetWindowPos(NULL,g_pMainDlg->m_Rect_Parameters.left,g_pMainDlg->m_Rect_Parameters.top,g_pMainDlg->m_Rect_Parameters.Width(),g_pMainDlg->m_Rect_Parameters.Height(),SWP_SHOWWINDOW);
        break;
    case SHEET_CHECK:
        g_pMainDlg->m_Dlg_Check.SetWindowPos(NULL,g_pMainDlg->m_Rect_Parameters.left,g_pMainDlg->m_Rect_Parameters.top,g_pMainDlg->m_Rect_Parameters.Width(),g_pMainDlg->m_Rect_Parameters.Height(),SWP_SHOWWINDOW);
        break;
    case SHEET_SYSTEM:
        g_pMainDlg->m_Dlg_System.SetWindowPos(NULL,g_pMainDlg->m_Rect_Parameters.left,g_pMainDlg->m_Rect_Parameters.top,g_pMainDlg->m_Rect_Parameters.Width(),g_pMainDlg->m_Rect_Parameters.Height(),SWP_SHOWWINDOW);
        break;
    case SHEET_DATABASE:
        g_pMainDlg->m_Dlg_Database.SetWindowPos(NULL, g_pMainDlg->m_Rect_Parameters.left, g_pMainDlg->m_Rect_Parameters.top, g_pMainDlg->m_Rect_Parameters.Width(), g_pMainDlg->m_Rect_Parameters.Height(), SWP_SHOWWINDOW);
        break;
    default:
        g_pMainDlg->m_Dlg_Image.SetWindowPos(NULL,g_pMainDlg->m_Rect_Parameters.left,g_pMainDlg->m_Rect_Parameters.top,g_pMainDlg->m_Rect_Parameters.Width(),g_pMainDlg->m_Rect_Parameters.Height(),SWP_SHOWWINDOW);
    }
}

这边挺蠢的一个问题就是,我有时候忘记加break;这个语句了,然后子对话框里面的控件全都不能响应。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,204评论 0 17
  • 对话框 对话框是提示用户作出决定或输入额外信息的小窗口。 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行...
    牧童遥指2000阅读 3,728评论 6 11
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 搬运自CSDN博客:向MFC嵌入OpenGL 本人上计算机图形学课时要做的大作业是基于MFC框架用OpenGL实现...
    hmta_dhs阅读 4,705评论 0 5
  • Spring Boot 的 Actuator 提供了很多生产级的特性,比如监控和度量Spring Boot 应用程...
    FlySheep_ly阅读 58,897评论 5 22