C++ MFC学习 (四)
对话框
创建MFC应用程序时,选择对话框
可使用向导创建对应的对话框的类
1 // MFC_Demo2Dlg.cpp : 实现文件 2 // 3 4 #include "stdafx.h" 5 #include "MFC_Demo2.h" 6 #include "MFC_Demo2Dlg.h" 7 #include "afxdialogex.h" 8 #include "DlgExec.h" 9 #include "DlgShow.h" 10 11 #ifdef _DEBUG 12 #define new DEBUG_NEW 13 #endif 14 15 16 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 17 18 class CAboutDlg : public CDialogEx 19 { 20 public: 21 CAboutDlg(); 22 23 // 对话框数据 24 #ifdef AFX_DESIGN_TIME 25 enum { IDD = IDD_ABOUTBOX }; 26 #endif 27 28 protected: 29 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 30 31 // 实现 32 protected: 33 DECLARE_MESSAGE_MAP() 34 }; 35 36 CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) 37 { 38 } 39 40 void CAboutDlg::DoDataExchange(CDataExchange* pDX) 41 { 42 CDialogEx::DoDataExchange(pDX); 43 } 44 45 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) 46 END_MESSAGE_MAP() 47 48 49 // CMFC_Demo2Dlg 对话框 50 51 52 53 CMFC_Demo2Dlg::CMFC_Demo2Dlg(CWnd* pParent /*=NULL*/) 54 : CDialogEx(IDD_MFC_DEMO2_DIALOG, pParent) 55 { 56 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 57 } 58 59 void CMFC_Demo2Dlg::DoDataExchange(CDataExchange* pDX) 60 { 61 CDialogEx::DoDataExchange(pDX); 62 } 63 64 BEGIN_MESSAGE_MAP(CMFC_Demo2Dlg, CDialogEx) 65 ON_WM_SYSCOMMAND() 66 ON_WM_PAINT() 67 ON_WM_QUERYDRAGICON() 68 ON_BN_CLICKED(IDC_BUTTON1, &CMFC_Demo2Dlg::OnBnClickedButton1) 69 ON_BN_CLICKED(IDC_BUTTON2, &CMFC_Demo2Dlg::OnBnClickedButton2) 70 END_MESSAGE_MAP() 71 72 73 // CMFC_Demo2Dlg 消息处理程序 74 75 BOOL CMFC_Demo2Dlg::OnInitDialog() 76 { 77 CDialogEx::OnInitDialog(); 78 79 // 将“关于...”菜单项添加到系统菜单中。 80 81 // IDM_ABOUTBOX 必须在系统命令范围内。 82 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 83 ASSERT(IDM_ABOUTBOX < 0xF000); 84 85 CMenu* pSysMenu = GetSystemMenu(FALSE); 86 if (pSysMenu != NULL) 87 { 88 BOOL bNameValid; 89 CString strAboutMenu; 90 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 91 ASSERT(bNameValid); 92 if (!strAboutMenu.IsEmpty()) 93 { 94 pSysMenu->AppendMenu(MF_SEPARATOR); 95 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 96 } 97 } 98 99 // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 100 // 执行此操作 101 SetIcon(m_hIcon, TRUE); // 设置大图标 102 SetIcon(m_hIcon, FALSE); // 设置小图标 103 104 // TODO: 在此添加额外的初始化代码 105 dlg.Create(IDD_SHOW); 106 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE 107 } 108 109 void CMFC_Demo2Dlg::OnSysCommand(UINT nID, LPARAM lParam) 110 { 111 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 112 { 113 CAboutDlg dlgAbout; 114 dlgAbout.DoModal(); 115 } 116 else 117 { 118 CDialogEx::OnSysCommand(nID, lParam); 119 } 120 } 121 122 // 如果向对话框添加最小化按钮,则需要下面的代码 123 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, 124 // 这将由框架自动完成。 125 126 void CMFC_Demo2Dlg::OnPaint() 127 { 128 if (IsIconic()) 129 { 130 CPaintDC dc(this); // 用于绘制的设备上下文 131 132 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 133 134 // 使图标在工作区矩形中居中 135 int cxIcon = GetSystemMetrics(SM_CXICON); 136 int cyIcon = GetSystemMetrics(SM_CYICON); 137 CRect rect; 138 GetClientRect(&rect); 139 int x = (rect.Width() - cxIcon + 1) / 2; 140 int y = (rect.Height() - cyIcon + 1) / 2; 141 142 // 绘制图标 143 dc.DrawIcon(x, y, m_hIcon); 144 } 145 else 146 { 147 CDialogEx::OnPaint(); 148 } 149 } 150 151 //当用户拖动最小化窗口时系统调用此函数取得光标 152 //显示。 153 HCURSOR CMFC_Demo2Dlg::OnQueryDragIcon() 154 { 155 return static_cast<HCURSOR>(m_hIcon); 156 } 157 158 /* 159 模态与非模态 模态就是只能操作当前对话框,非模态反之 160 */ 161 162 //模态对话框的点击事件 163 void CMFC_Demo2Dlg::OnBnClickedButton1() 164 { 165 // TODO: 在此添加控件通知处理程序代码 166 167 //弹出对话框 阻塞 168 CDlgExec dlg; 169 dlg.DoModal(); 170 } 171 172 //非模态对话框的点击事件 173 void CMFC_Demo2Dlg::OnBnClickedButton2() 174 { 175 // TODO: 在此添加控件通知处理程序代码 176 177 //弹出非模态对话框 178 //CDlgShow dlg; 179 180 //1.创建 181 //dlg.Create(IDD_SHOW); //创建窗口只能创建一次,多次就会崩掉 建议创建放在初始化函数中 182 //2.显示 183 dlg.ShowWindow(SW_SHOWNORMAL); 184 }
按钮消息,可通过设计界面双击,自动会产生单击消息,也可在属性中添加
在使用其他控件时,需要给其它控件绑定相应的变量,控件变量的类别为Control
static_text 添加变量时,会出现 以static为结尾的ID是不可以添加变量,需要修改ID
1 //用static_text显示图片,需要使用到bitmap图片 2 //① 设置静态控件窗口风格为位图居中显示 3 m_pic.ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE); 4 //② 通过路径获取bitmap句柄 5 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION) 6 //宽高设置 应该按照 控件的大小去设置 7 CRect rect; 8 m_pic.GetWindowRect(rect); 9 10 //③ 静态控件设置bitmap 11 m_pic.SetBitmap(HBMP(TEXT("./1.bmp"), rect.Width, rect.Height));
EnableWindow()可设置按钮的点击状态