常见的两种类和类之间相互调用的方法。

16.1 用户权限信息在不同对话框之间共享

①在CWokerApp类中定义变量:

class CWorkerApp : public CWinApp
{public:CWorkerApp();SAdmin m_admin;//登录信息
// 重写
public:virtual BOOL InitInstance();
// 实现DECLARE_MESSAGE_MAP()
};

②在CLoginDlg类中进行赋值

BOOL CLoginDlg::CheckPass(CString szName, CString szPass)
{//TRUE代表登录成功CFile file;if (!file.Open(_T("admin.dat"), CFile::modeRead)){CreateUser();if (!file.Open(_T("admin.dat"), CFile::modeRead))return FALSE;}SAdmin a;while (file.Read(&a, sizeof(a)) == sizeof(a)){if (!szName.CompareNoCase(a.sName)){if (szPass == a.sPass){theApp.m_admin = a;return TRUE;}}}return FALSE;
}

③在CMainDlg类中进行访问应用,采用引用型变量

BOOL CMainDlg::OnInitDialog()
{CDialogEx::OnInitDialog();CString str = _T("控制面板 - ");SAdmin &a = theApp.m_admin;str += a.sName;str += _T("(");str += a.nPrior ? _T("普通") : _T("高级");str += _T(")");SetWindowText(str);if (a.nPrior)GetDlgItem(IDC_PRIOR) ->EnableWindow(FALSE);//GetDlgItem(IDC_PRIOR)->ShowWindow(SW_HIDE);//ShowWindow EnableWindowreturn TRUE;
}

16.2 其他对话框访问主对话框(AfxGetMainWnd)

①在CWorkerApp类中指定主对话框

BOOL CWorkerApp::InitInstance()
{CLoginDlg dlg;if (IDCANCEL == dlg.DoModal())return FALSE;while (true){…case IDC_INFO:{CWorkerDlg dlg;m_pMainWnd = &dlg;dlg.DoModal();break;}…}}return FALSE;
}

②在其他对话框中使用全局函数AfxGetMainWnd获取主对话框指针并访问

void CInputDlg::AddToList()
{
if (AfxMessageBox(_T(“是否添加?”), MB_YESNO) == IDNO)
return;
CString str;
GetDlgItemText(IDC_NUMB, str);

CWorkerDlg* pDlg = (CWorkerDlg*)AfxGetMainWnd();
if (pDlg ->CheckNumber(str))return;
int i = pDlg->m_list.GetItemCount();
pDlg->m_list.InsertItem(i, str);
GetDlgItemText(IDC_NAME, str);

}

16.3 其他对话框访问主对话框(m_pDlg)

思想:直接定义指针变量指向要访问的对话框,这种方法其实没有主对话框

①在CInputDlg类中定义CWorkerDlg类型的指针变量,用来指向CWorkerDlg对话框;需要CInputDlg类中包含CWorkerDlg的头文件或进行声明,然而在头文件中进行包含容易造成类与类之间相互包含的混乱错误,因此可以进行声明;这种声明其实是假声明,只适用于指针类型,不适用于对象。

这种声明可以防止类与类在头文件中相互包含、重复包含而引起的错误。

//#include "WorkerDlg.h"
class CWorkerDlg;
class CInputDlg : public CDialogEx
{DECLARE_DYNAMIC(CInputDlg)
public:CWorkerDlg *m_pDlg; //定义CWorkerDlg对象指针CInputDlg(CWnd* pParent = NULL);   // 标准构造函数virtual ~CInputDlg();
…
};
在stdafx.h中可禁用warning:
#pragma warning(disable:4005)

②在CInputDlg窗口弹出之前,将CWorkerDlg对象指针(this指针)赋值给①中定义的m_pDlg变量

void CWorkerDlg::OnBnClickedAdd()
{//排除重复工号的功能,当重复的工号禁止插入(已存在!)CInputDlg dlg;dlg.m_pDlg = this;dlg.DoModal();
}

16.4 消息反射:(控件内的消息映射到父窗口类)

a)所有子控件的内部消息都是通过WM_NOTIFY这个消息反射给父窗口;

b)不同的控件类型对应有不同的反射消息种类;

例如:BN_CLICK代表Button Notify Click`(按钮点击消息)

LVN_ITEMCHANGED代表List View Notify Item Changed(选中项变化了)

16.5 在CWnd类中常见的等价关系:

a)判断父子关系:

BOOL IsChild( const CWnd* pWnd ) const;  判断窗口是否是一个子窗口
CWnd* GetParent(); 获取父窗口对象指针
m_list.GetParent() == pWnd 等价于pWnd ->IsChild(&m_list);

b)判断是否是最大化:pWnd ->GetStyle() & WS_MAXIMIZE`

BOOL IsIconic( ) const;  判断窗口是否是最小化的状态
BOOL IsZoomed( ) const;     判断窗口是否是最大化的状态

c)判断是否可见:GetStyle() & WS_VISIBLE

BOOL IsWindowVisible( ) const;   判断窗口是否是可见的
void CTestdDlg::OnBnClickedIsVisible()
{CWnd *pOK = GetDlgItem(IDOK);//if ()//pOK ->IsWindowVisible//  ;//else//   pOK->ShowWindow(SW_SHOW);pOK->ShowWindow(pOK->GetStyle()&WS_VISIBLE ? SW_HIDE : SW_SHOW);
}

d)判断是否可用:GetStyle() & WS_DISABLED

BOOL IsWindowEnabled( ) const;   判断窗口是激活的还是禁用的
void CTestdDlg::OnBnClickedDisabled()
{CWnd *pWnd = GetDlgItem(IDCANCEL);//pWnd->EnableWindow(!pWnd->IsWindowEnabled());pWnd->EnableWindow(pWnd->GetStyle() & WS_DISABLED);
}

16.6 CWnd类中常见的静态成员函数:

static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName);
根据窗口类型名或窗口标题名查找窗口;static CWnd* PASCAL GetFocus( );   获取焦点所在的窗口
CWnd* SetFocus( );  将一个窗口设置为焦点窗口
static CWnd* PASCAL GetActiveWindow( );     (进程内的)获取活动窗口
CWnd* SetActiveWindow( );   (进程内的)将一个窗口设置为活动窗口 static CWnd* PASCAL GetForegroundWindow( );    获取所有任务栏主窗口中最前端的窗口
BOOL SetForegroundWindow( );    将主窗口推到任务栏中所有窗口的最前端CWnd* GetTopWindow( ) const;  获取所有重叠窗口中最前端的窗口
void BringWindowToTop( );   将主窗口推到重叠窗口的最前端
BOOL FlashWindow( BOOL bInvert );   让窗口在任务栏中闪烁以下
void CTestdDlg::OnBnClickedGetForeGround()
{CWnd* p = CWnd::FindWindow(_T("NotePad"), NULL);if(p){p->SetForegroundWindow();p->FlashWindow(TRUE);}
}
HICON GetIcon( BOOL bBigIcon ) const;    获取窗口图标 HICON SetIcon( HICON hIcon, BOOL bBigIcon );     设置窗口图标 static CWnd* PASCAL GetDesktopWindow( );     获取Windows桌面窗口 static CWnd* PASCAL GetCapture( );    获取捕捉鼠标活动的窗口 CWnd* SetCapture( );    将窗口设置为捕捉鼠标活动的窗口 int GetWindowRgn( HRGN hRgn )const;     获取不规则窗口的区域 int SetWindowRgn( HRGN hRgn, BOOL bRedraw );     按照指定的区域将窗口设置为不规则形状 void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint=TRUE );   根据指定的位置移动窗口 void MoveWindow(LPCRECT pRect, BOOL bRepaint = TRUE );     根据指定的矩形区域移动窗口 BOOL SetWindowPos(const CWnd* pWndAfter, int x, int y, int cx, int cy, UINT nFlags );     不但移动窗口的x,y坐标位置,而且还改变窗口的Z轴次序 void CenterWindow( CWnd* pOwner = NULL );   将窗口居中,对应父窗口或者屏幕的中央 void GetWindowRect( LPRECT lpRect ) const;    获取窗口在屏幕坐标中的矩形区域 void GetClientRect( LPRECT lpRect ) const;  获取窗口的客户区的矩形区域 static CWnd* WindowFromPoint( POINT point );  获取屏幕中某个坐标点上的窗口 CWnd* ChildWindowFromPoint( POINT point ) const;     获取客户区内某个坐标点上的子窗口 static CWnd* FindWindow(LPCTSTR szClassName, LPCTSTR lpszWindowName );     根据类名或者标题名查找一个主窗口
CWnd* GetOwner( ) const;    获取拥有者窗口 void SetOwner( CWnd* pOwnerWnd );   将窗口设置为被另一个窗口拥有 CWnd* GetParent( ) const;    获取父窗口 CWnd* SetParent( CWnd* pWndNewParent );   为窗口设置一个新的父窗口 CWnd*GetNextWindow(UINTnFlag =GW_HWNDNEXT ) const;    获取z序中的前一个或后一个窗口,可以联合GetTopWindow对同等级窗口遍历 CWnd* GetWindow( UINT nCmd ) const;     全面获取窗口,包括父子窗口前后窗口等 int GetDlgCtrlID( ) const;    获取一个窗口的ID int SetDlgCtrlID( int nID );  给窗口设置一个新的ID

【MFC系列-第16天】企业信息管理软件开发相关推荐

  1. 【MFC系列-第17天】企业信息管理软件开发

    关注公号[逆向通信猿]更精彩!!! 17.1 数值型关联变量: a)在MFC中有部分控件支持数值型关联变量: 编辑控件.下拉控件.单选按钮.复选框以及日期控件: b)在类向导中为控件建立关联变量时,选 ...

  2. 【MFC系列-第18天】企业信息管理软件开发

    关注公号[逆向通信猿]更精彩!!! CWnd类中常用的成员函数 函数名称 含义 static CWnd* PASCAL GetActiveWindow( ) (进程内的)获取活动窗口 CWnd* Se ...

  3. 2014,寻找企业信息管理软件的蓝海

    Excel垄断企业信息管理软件二三十年无人撼动:OA.CRM.PM.HR软件不温不火难以普及. 已有的信息化市场红海一片.蓝海在哪里? 所谓企业信息管理软件,我把它们分为四类: 一是Excel: 二是 ...

  4. 收深圳2022年的高新技术企业(软件开发)

    ↗↗↗↗这收:深圳的2022年的高新技术企业,带软件著作,随时可配合做尽调,收:软件开发类高企. 一.核心知识产权 (1)认定条件:在中国境内(不含港澳台地区)注册的企业,近三年内通过自主研发.受让. ...

  5. 【MFC系列-第8天】小型软件项目开发

    第8天 小型软件项目开发 8.1 记事本开发 小技巧:用VC6新建工程,以资源方式打开系统自带notepad.exe中的MENU资源,加入到自己新建的工程中:然后再添加到VS工程中,即可获取现有exe ...

  6. 兴旺小企业财务软件 v2.0 官方

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  7. 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 文章汇总及学习指南...

    一.AgileEAS.NET平台简介 AgileEAS.NET平台是一套应用系统快速开发平台,用于帮助中小软件开发商快速构建自己的企业信息管理类开发团队,以达到节省开发成本.缩短开发时间,快速适应市场 ...

  8. 软件开发质量的双保险 — 2.业务设计验证与业务用例

    设计验证的第一层是检验业务设计的质量.业务设计内容是软件的核心,解决了如何用信息化手段替代原来的手工作业. 业务设计验证重点包括:业务逻辑.管控规则是否正确?数据逻辑.来源.公式是否正确?等.检验的方 ...

  9. 软件开发质量的双保险 — 1.设计验证与软件测试

    提到对软件的质量检查,马上想到的是"软件测试",软件测试的目的主要是检查"开发程序"是否符合"软件设计"的要求,程序中是否有bug等,也就是 ...

最新文章

  1. 罗格斯大学电气与计算机工程专业怎么样,美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华...
  2. Why Spring Boot
  3. deb 安装_本地安装DEB包的3种命令行工具(适合Ubuntu和Deepin )
  4. Ubuntu如何搭建Django与Flup和Nginx环境?
  5. 用c#写的一个局域网聊天客户端 类似小飞鸽
  6. Item 27 避免使用ICloneable接口
  7. 科学院计算机研究所谢教授,谢维波
  8. UEFI电脑安装Win7并激活
  9. android网络编程案例,深入理解Android网络编程pdf 完整版
  10. AndroidN多窗口支持
  11. 表空间管理——创建TABLESPACE
  12. python表达直角坐标系_在直角坐标中,x、 y 是坐标系中任意点的位置,用 x 和 y 表示第一象限或第二象限的 Python 表达式为 。_测量省赛理论答案_学小易找答案...
  13. 没什么,国内做任何大项目,不外乎人情.技术是次要的
  14. JavaEE经典试题(一)
  15. 手撸架构,MongDB 面试50问
  16. Vim用原生雅黑Consolas混合字体新方法
  17. SuSE and NLD9 user pls note
  18. 淘宝商城推广以及促销项目
  19. android aar编程,Android Studio模块化编程实践之aar
  20. hotmail手机端_hotmail app下载

热门文章

  1. 使用TestNG的弹簧测试支持
  2. Mach 微内核的命名趣闻
  3. 浅析 Linux 初始化系统(系统服务管理和控制程序/Init System) -- systemd
  4. 关于通信matlab 仿真,关于MATLAB在通信仿真系统中的运用
  5. java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用
  6. java string args_java – 语法“final String … args”是什么意思/做什么?
  7. 【人工智能初级系列(一)】科学计算库 Numpy
  8. thinkphp6企业项目实战_[MarsZ]ThinkPHP项目实战总结
  9. C语言字符串输出函数puts()的作用是什么
  10. pytorch relu函数实现_什么是pytorch?