【MFC系列-第16天】企业信息管理软件开发
生活随笔
收集整理的這篇文章主要介紹了
【MFC系列-第16天】企业信息管理软件开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
常見的兩種類和類之間相互調用的方法。
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);
}
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天】企业信息管理软件开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dell游戏笔记本电脑推荐2015(de
- 下一篇: 爱聊app怎么注销