題目:寫一個基於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 }