题目:写一个基于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 }