VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 708|回复: 5

[已解决]MFC主窗口类声明指针的问题

[复制链接]
16_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-3 21:16:50 | 显示全部楼层 |阅读模式
各位我这里这个主窗口类有好多问题,
首先是h头文件,为什么 "extern CMFCApplication15Dlg * dl;" 这句代码要放到最后,不应该放在最前面呢。。
这句话是代表定义了出这个变量了吗?

还有就是cpp文件里面  为什么不写CMFCApplication15Dlg * dl = NULL; 就报错呢?(我的.h文件里面不是已经写了吗)
而且窗口初始化函数明明在上面( 里面是dl = this; 这句代码),这句定义dl指针的语句为啥要放到最后,,程序不是从上往下执行吗??


各位表哥看下面代码。。
首先是主窗口CPP文件

  1. // MFCApplication15Dlg.cpp : 实现文件
  2. //

  3. #include "stdafx.h"
  4. #include "MFCApplication15.h"
  5. #include "MFCApplication15Dlg.h"
  6. #include "afxdialogex.h"
  7. #include "MTdlg.h"

  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #endif


  11. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框

  12. class CAboutDlg : public CDialog
  13. {
  14. public:
  15.         CAboutDlg();

  16. // 对话框数据
  17.         enum { IDD = IDD_ABOUTBOX };

  18.         protected:
  19.         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

  20. // 实现
  21. protected:
  22.         DECLARE_MESSAGE_MAP()
  23. };

  24. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  25. {
  26. }

  27. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  28. {
  29.         CDialog::DoDataExchange(pDX);
  30. }

  31. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  32. END_MESSAGE_MAP()


  33. // CMFCApplication15Dlg 对话框



  34. CMFCApplication15Dlg::CMFCApplication15Dlg(CWnd* pParent /*=NULL*/)
  35.         : CDialogEx(CMFCApplication15Dlg::IDD, pParent)
  36. {
  37.         m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  38. }

  39. void CMFCApplication15Dlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41.         CDialogEx::DoDataExchange(pDX);
  42. }

  43. BEGIN_MESSAGE_MAP(CMFCApplication15Dlg, CDialogEx)
  44.         ON_WM_SYSCOMMAND()
  45.         ON_WM_PAINT()
  46.         ON_WM_QUERYDRAGICON()
  47.         ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication15Dlg::OnBnClickedButton1)
  48. END_MESSAGE_MAP()


  49. // CMFCApplication15Dlg 消息处理程序

  50. BOOL CMFCApplication15Dlg::OnInitDialog()
  51. {
  52.         CDialogEx::OnInitDialog();

  53.         // 将“关于...”菜单项添加到系统菜单中。

  54.         // IDM_ABOUTBOX 必须在系统命令范围内。
  55.         ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  56.         ASSERT(IDM_ABOUTBOX < 0xF000);

  57.         CMenu* pSysMenu = GetSystemMenu(FALSE);
  58.         if (pSysMenu != NULL)
  59.         {
  60.                 BOOL bNameValid;
  61.                 CString strAboutMenu;
  62.                 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  63.                 ASSERT(bNameValid);
  64.                 if (!strAboutMenu.IsEmpty())
  65.                 {
  66.                         pSysMenu->AppendMenu(MF_SEPARATOR);
  67.                         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  68.                 }
  69.         }

  70.         // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
  71.         //  执行此操作
  72.         SetIcon(m_hIcon, TRUE);                        // 设置大图标
  73.         SetIcon(m_hIcon, FALSE);                // 设置小图标

  74.         // TODO:  在此添加额外的初始化代码
  75.         [color=Red]dl = this;[/color]

  76.         return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  77. }

  78. void CMFCApplication15Dlg::OnSysCommand(UINT nID, LPARAM lParam)
  79. {
  80.         if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  81.         {
  82.                 CAboutDlg dlgAbout;
  83.                 dlgAbout.DoModal();
  84.         }
  85.         else
  86.         {
  87.                 CDialogEx::OnSysCommand(nID, lParam);
  88.         }
  89. }

  90. // 如果向对话框添加最小化按钮,则需要下面的代码
  91. //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
  92. //  这将由框架自动完成。

  93. void CMFCApplication15Dlg::OnPaint()
  94. {
  95.         if (IsIconic())
  96.         {
  97.                 CPaintDC dc(this); // 用于绘制的设备上下文

  98.                 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  99.                 // 使图标在工作区矩形中居中
  100.                 int cxIcon = GetSystemMetrics(SM_CXICON);
  101.                 int cyIcon = GetSystemMetrics(SM_CYICON);
  102.                 CRect rect;
  103.                 GetClientRect(&rect);
  104.                 int x = (rect.Width() - cxIcon + 1) / 2;
  105.                 int y = (rect.Height() - cyIcon + 1) / 2;

  106.                 // 绘制图标
  107.                 dc.DrawIcon(x, y, m_hIcon);
  108.         }
  109.         else
  110.         {
  111.                 CDialogEx::OnPaint();
  112.         }
  113. }

  114. //当用户拖动最小化窗口时系统调用此函数取得光标
  115. //显示。
  116. HCURSOR CMFCApplication15Dlg::OnQueryDragIcon()
  117. {
  118.         return static_cast<HCURSOR>(m_hIcon);
  119. }



  120. void CMFCApplication15Dlg::OnBnClickedButton1()
  121. {
  122.         // TODO:  在此添加控件通知处理程序代码
  123.         CMTdlg * d = new CMTdlg;
  124.         if (d->Create(IDD_DIALOG1)){
  125.                 d->ShowWindow(SW_SHOW);
  126.         }

  127. }
  128. [color=Red]CMFCApplication15Dlg * dl = NULL;[/color]
复制代码


h头文件

  1. // MFCApplication15Dlg.h : 头文件
  2. //

  3. #pragma once


  4. // CMFCApplication15Dlg 对话框
  5. class CMFCApplication15Dlg : public CDialogEx
  6. {
  7. // 构造
  8. public:
  9.         CMFCApplication15Dlg(CWnd* pParent = NULL);        // 标准构造函数

  10. // 对话框数据
  11.         enum { IDD = IDD_MFCAPPLICATION15_DIALOG };

  12.         protected:
  13.         virtual void DoDataExchange(CDataExchange* pDX);        // DDX/DDV 支持


  14. // 实现
  15. protected:
  16.         HICON m_hIcon;

  17.         // 生成的消息映射函数
  18.         virtual BOOL OnInitDialog();
  19.         afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  20.         afx_msg void OnPaint();
  21.         afx_msg HCURSOR OnQueryDragIcon();
  22.         DECLARE_MESSAGE_MAP()
  23. public:
  24.         afx_msg void OnBnClickedButton1();
  25. };
  26. extern CMFCApplication15Dlg * dl;
复制代码


最佳答案
51_avatar_small
2020-4-3 22:56:49
Met32 发表于 2020-4-3 22:51
看cpp里的伪代码

窗口初始化函数(){

即使声明在 MFCApplication15Dlg.h 的最下面,但是也是在 MFCApplication15Dlg.cpp 的上面被 include 的,所以,当走到 CMFCApplication15Dlg::OnInitDialog 函数中的时候是没有问题的




上一篇:WINDOWS编程第二课案例
下一篇:看着玩转字符串第二课敲的。。
77_avatar_middle
最佳答案
31 
online_vip 发表于 2020-4-3 22:06:24 | 显示全部楼层
编译的顺序从上往下,如果放在最前面的话 CMFCApplication15Dlg 类还没有定义。所以要放在 MFCApplication15Dlg.h 的下面,这样上面的 CMFCApplication15Dlg 类已经声明了,所以编译就没问题了。

h 头文件中的 extern CMFCApplication15Dlg * dl; 只是声明变量为全局变量,cpp 文件中的 CMFCApplication15Dlg * dl = NULL; 这句才是全局变量真正的定义
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-3 22:51:58 来自手机 | 显示全部楼层
Health 发表于 2020-4-3 22:06
编译的顺序从上往下,如果放在最前面的话 CMFCApplication15Dlg 类还没有定义。所以要放在 MFCApplication1 ...

看cpp里的伪代码

窗口初始化函数(){
dl=this
}

CMFCApplication15Dlg * dlg
为什么声明的指针在最下面也没问题呀。。
51_avatar_middle
最佳答案
90 
online_admins 发表于 2020-4-3 22:56:49 | 显示全部楼层    本楼为最佳答案   
bestAnswer
Met32 发表于 2020-4-3 22:51
看cpp里的伪代码

窗口初始化函数(){

即使声明在 MFCApplication15Dlg.h 的最下面,但是也是在 MFCApplication15Dlg.cpp 的上面被 include 的,所以,当走到 CMFCApplication15Dlg::OnInitDialog 函数中的时候是没有问题的
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-3 23:06:11 来自手机 | 显示全部楼层
Syc 发表于 2020-4-3 22:56
即使声明在 MFCApplication15Dlg.h 的最下面,但是也是在 MFCApplication15Dlg.cpp 的上面被 include 的 ...

老大,这就和函数声明似的吧,先声明出来有这个东西。
51_avatar_middle
最佳答案
90 
online_admins 发表于 2020-4-3 23:07:05 | 显示全部楼层
Met32 发表于 2020-4-3 23:06
老大,这就和函数声明似的吧,先声明出来有这个东西。

对的,可以这么理解
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-6-4 23:50

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表