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()可设置按钮的点击状态

原文地址:https://www.cnblogs.com/lg804721251/p/14316849.html