• 一道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
  • 相关阅读:
    Android 红色小圆球提示气泡 BadgeView
    Android Studio .9图片的应用以及制作
    设置状态栏以及全局的颜色
    Mac 下 Git 的基础命令行操作
    [转]Android SDK下载和更新失败的解决方法
    Genymotion 常见问题Unable to configure the network adapter for the virtual device解决
    [转]eclipse的android智能提示设置
    IIS文件存在但报404问题解决
    [转]使用fdisk磁盘分区和 Linux 文件系统
    SQL Prompt 5.1使用
  • 原文地址:https://www.cnblogs.com/duxie/p/9965737.html
Copyright © 2020-2023  润新知