一道C++、MFC上机面试题

题目:写一个基于MFC对话框的程序,界面输入整型a和b,点击计算,开启线程计算a+b,并把结果返回给对话框。(1)不能用结构体和类(2)用到自定义消息(3)鼠标移到【计算】按钮上变为收尸图标。参考界面如下。

题目非常基础了,我下面直接贴代码了,算是做一个总结。

 1 // 计算器Dlg.h : 头文件
 2 //
 3 
 4 #pragma once
 5 #include "afxwin.h"
 6 #include "MyButton.h"
 7 #define WM_UPDATEDATA WM_USER + 5
 8 
 9 
10 // C计算器Dlg 对话框
11 class C计算器Dlg : public CDialogEx
12 {
13 // 构造
14 public:
15     C计算器Dlg(CWnd* pParent = NULL);    // 标准构造函数
16 
17 // 对话框数据
18     enum { IDD = IDD_MY_DIALOG };
19 
20     protected:
21     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
22 
23 
24 // 实现
25 protected:
26     HICON m_hIcon;
27 
28     // 生成的消息映射函数
29     virtual BOOL OnInitDialog();
30     afx_msg void OnPaint();
31     afx_msg HCURSOR OnQueryDragIcon();
32     DECLARE_MESSAGE_MAP()
33 public:
34     CString m_EditA;
35     CString m_EditB;
36     CEdit m_EditC;
37     afx_msg void OnBnClickedButton1();
38     CString m_Result;
39     HANDLE m_hThread;
40     static DWORD WINAPI ThreadProc(LPVOID lpThreadParameter);
41     LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);
42     CMyButton m_button;
43 };
  1 // 计算器Dlg.cpp : 实现文件
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "计算器.h"
  6 #include "计算器Dlg.h"
  7 #include "afxdialogex.h"
  8 
  9 #ifdef _DEBUG
 10 #define new DEBUG_NEW
 11 #endif
 12 
 13 
 14 // C计算器Dlg 对话框
 15 
 16 
 17 
 18 C计算器Dlg::C计算器Dlg(CWnd* pParent /*=NULL*/)
 19     : CDialogEx(C计算器Dlg::IDD, pParent)
 20     , m_EditA(_T(""))
 21     , m_EditB(_T(""))
 22     , m_Result(_T(""))
 23 {
 24     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 25 }
 26 
 27 void C计算器Dlg::DoDataExchange(CDataExchange* pDX)
 28 {
 29     CDialogEx::DoDataExchange(pDX);
 30     DDX_Text(pDX, IDC_EDIT1, m_EditA);
 31     DDX_Text(pDX, IDC_EDIT2, m_EditB);
 32     DDX_Control(pDX, IDC_EDIT3, m_EditC);
 33     DDX_Text(pDX, IDC_EDIT3, m_Result);
 34     DDX_Control(pDX, IDC_BUTTON1, m_button);
 35 }
 36 
 37 BEGIN_MESSAGE_MAP(C计算器Dlg, CDialogEx)
 38     ON_WM_PAINT()
 39     ON_WM_QUERYDRAGICON()
 40     ON_BN_CLICKED(IDC_BUTTON1, &C计算器Dlg::OnBnClickedButton1)
 41     ON_MESSAGE(WM_UPDATEDATA, OnUpdateData)
 42 END_MESSAGE_MAP()
 43 
 44 
 45 // C计算器Dlg 消息处理程序
 46 
 47 BOOL C计算器Dlg::OnInitDialog()
 48 {
 49     CDialogEx::OnInitDialog();
 50 
 51     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
 52     //  执行此操作
 53     SetIcon(m_hIcon, TRUE);            // 设置大图标
 54     SetIcon(m_hIcon, FALSE);        // 设置小图标
 55 
 56     // TODO:  在此添加额外的初始化代码
 57 
 58     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
 59 }
 60 
 61 // 如果向对话框添加最小化按钮,则需要下面的代码
 62 //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
 63 //  这将由框架自动完成。
 64 
 65 void C计算器Dlg::OnPaint()
 66 {
 67     if (IsIconic())
 68     {
 69         CPaintDC dc(this); // 用于绘制的设备上下文
 70 
 71         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 72 
 73         // 使图标在工作区矩形中居中
 74         int cxIcon = GetSystemMetrics(SM_CXICON);
 75         int cyIcon = GetSystemMetrics(SM_CYICON);
 76         CRect rect;
 77         GetClientRect(&rect);
 78         int x = (rect.Width() - cxIcon + 1) / 2;
 79         int y = (rect.Height() - cyIcon + 1) / 2;
 80 
 81         // 绘制图标
 82         dc.DrawIcon(x, y, m_hIcon);
 83     }
 84     else
 85     {
 86         CDialogEx::OnPaint();
 87     }
 88 }
 89 
 90 LRESULT C计算器Dlg::OnUpdateData(WPARAM wParam, LPARAM lParam)
 91 {
 92     UpdateData(wParam);
 93     return 0;
 94 }
 95 
 96 //当用户拖动最小化窗口时系统调用此函数取得光标
 97 //显示。
 98 HCURSOR C计算器Dlg::OnQueryDragIcon()
 99 {
100     return static_cast<HCURSOR>(m_hIcon);
101 }
102 
103 DWORD WINAPI C计算器Dlg::ThreadProc(LPVOID lpThreadParameter)
104 {
105     C计算器Dlg* pThis = (C计算器Dlg*)lpThreadParameter;
106     int Numa, Numb;
107     pThis->SendMessage(WM_UPDATEDATA, TRUE);
108     swscanf_s(pThis->m_EditA, L"%d", &Numa);
109     swscanf_s(pThis->m_EditB, L"%d", &Numb);
110     pThis->m_Result.Format(L"%d", Numa + Numb);
111     pThis->SendMessage(WM_UPDATEDATA, FALSE);
112     return TRUE;
113 }
114 
115 void C计算器Dlg::OnBnClickedButton1()
116 {
117     // TODO:  在此添加控件通知处理程序代码
// 创建线程函数,注意参数穿this指针 118 m_hThread = CreateThread(NULL, 0, ThreadProc, this, 0, 0); 119 }
 // 创建一个MFC类,继承CButton类,当鼠标悬停在按钮上时,用于改变鼠标图标  
1
#pragma once 2 3 4 // CMyButton.h 头文件 5 6 class CMyButton : public CButton 7 { 8 DECLARE_DYNAMIC(CMyButton) 9 10 public: 11 CMyButton(); 12 virtual ~CMyButton(); 13 14 protected: 15 DECLARE_MESSAGE_MAP() 16 public: 17 afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); // 处理WM_SETCURSOR消息 18 };
 1 // MyButton.cpp : 实现文件
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "MyButton.h"
 6 #include "resource.h"
 7 
 8 
 9 // CMyButton
10 
11 IMPLEMENT_DYNAMIC(CMyButton, CButton)
12 
13 CMyButton::CMyButton()
14 {
15 
16 }
17 
18 CMyButton::~CMyButton()
19 {
20 }
21 
22 
23 BEGIN_MESSAGE_MAP(CMyButton, CButton)
24     ON_WM_SETCURSOR()
25 END_MESSAGE_MAP()
26 
27 
28 
29 // CMyButton 消息处理程序
30 
31 
32 
33 
34 BOOL CMyButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
35 {
36     // TODO:  在此添加消息处理程序代码和/或调用默认值
37 
38     ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));
39     return TRUE;
40

猜你喜欢

转载自www.cnblogs.com/duxie/p/9965737.html