GetModuleFileName:API函数用于获取执行文件或者DLL模块的具体路径和文件名
=========================================================================================
前面已经介绍过CWinApp类,现在实现以下成员变量和成员函数的使用:
除了窗口显示的几个功能外,还有两个功能,关闭窗口时候保存窗口位置和不同位置不同按钮显示的光标不同。
成员变量比较简单,就直接看后面代码吧,两个功能简单说明一下。
MFC关闭窗口时候保存窗口位置:
1:保存到注册表:
关于CWinApp::SetRegistryKey方法
如果在Inistance当中执行了 SetRegisterKey()方法
那么在调用 WriteProfileInt的时候,写入的数据将会保存到注册表当中
如果没有执行SetRegisterKey()方法,则写入的数据将会保存到INI文件当中
2、窗口摧毁时候保存窗口的位置3、初始化窗口的位置,上次关闭时候所在的位置
4、记得在InitDialog中加入InitRect()函数的调用
不同位置不同按钮显示的光标不同:
通过加载不同的ID显示不同的光标。
详细代码:
// MFCmemberDlg.cpp : 实现文件 // #include "stdafx.h" #include "MFCmember.h" #include "MFCmemberDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CMFCmemberDlg 对话框 CMFCmemberDlg::CMFCmemberDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMFCmemberDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1); } void CMFCmemberDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCmemberDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_MOUSEMOVE() ON_WM_SETCURSOR() ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CMFCmemberDlg::OnInitDialog() { CDialogEx::OnInitDialog(); //int nLeft=theApp.GetProfileIntW(L"WindowRect", L"left",10); InitRect(); /* CString str; str.Format(_T("m_nCndShow=%d"), theApp.m_nCmdShow); SetWindowText(str); */ CString str; str.Format(_T("left=%d,right=%d,top=%d,bottom=%d"), theApp.GetProfileInt(L"SETTING", L"left", -1), theApp.GetProfileInt(L"SETTING", L"right", -1), theApp.GetProfileInt(L"SETTING", L"top", -1), theApp.GetProfileInt(L"SETTING", L"bottom", -1)); SetWindowText(str); SetDlgItemText(IDC_APPNAME,theApp.m_pszAppName); SetDlgItemText(IDC_EXENAME, theApp.m_pszExeName); SetDlgItemText(IDC_HELPNAME, theApp.m_pszHelpFilePath); SetDlgItemText(IDC_REGISTKEY, theApp.m_pszRegistryKey); SetDlgItemText(IDC_PROFILE, theApp.m_pszProfileName); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } //HICON hIcon=theApp.LoadIconW(IDI_ICON1); //HICON hIcon = AfxGetApp()->LoadIconW(IDI_ICON1); //HICON hIcon = ::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1)); //HICON hIcon = ::LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON1)); //HICON hIcon = ::LoadIcon(NULL, MAKEINTRESOURCE(IDI_QUESTION)); //系统图标 /* #define IDI_APPLICATION MAKEINTRESOURCE(32512) #define IDI_HAND MAKEINTRESOURCE(32513) #define IDI_QUESTION MAKEINTRESOURCE(32514) #define IDI_EXCLAMATION MAKEINTRESOURCE(32515) #define IDI_ASTERISK MAKEINTRESOURCE(32516) */ HICON hIcon = ::LoadIcon(NULL, MAKEINTRESOURCE(IDI_QUESTION)); SetIcon(hIcon, TRUE); // 设置大图标 SetIcon(hIcon, FALSE); // 设置小图标 //AfxMessageBox(_T("测试AppName"));//调试查看theApp CWnd* pWnd = AfxGetMainWnd(); HINSTANCE hInst = AfxGetInstanceHandle(); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCmemberDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCmemberDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect, RGB(0, 255, 0)); CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMFCmemberDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFCmemberDlg::OnMouseMove(UINT nFlags, CPoint point) { HCURSOR hCur = theApp.LoadCursorW(IDC_CURSOR1); SetCursor(hCur); CDialogEx::OnMouseMove(nFlags, point); } extern CMFCmemberApp theApp; #ifndef IDC_HAND #define IDC_HAND MAKEINTRESOURCE(32649) #endif BOOL CMFCmemberDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { if (pWnd == this) { HCURSOR hCur = theApp.LoadStandardCursor(IDC_CROSS); SetCursor(hCur); return TRUE; } switch (pWnd->GetDlgCtrlID()) { case IDOK: case IDCANCEL: { HCURSOR hCur = theApp.LoadStandardCursor(IDC_HAND); SetCursor(hCur); return TRUE; } } return CDialogEx::OnSetCursor(pWnd, nHitTest, message);//设置系统缺省光标 } void CMFCmemberDlg::OnDestroy() { CDialogEx::OnDestroy(); //theApp.WriteProfileInt(L"WindowRect",L"left",100); CRect rect; GetWindowRect(rect); theApp.WriteProfileInt(L"SETTING", L"left", rect.left); theApp.WriteProfileInt(L"SETTING", L"right", rect.right); theApp.WriteProfileInt(L"SETTING", L"top", rect.top); theApp.WriteProfileInt(L"SETTING", L"bottom", rect.bottom); } void CMFCmemberDlg::InitRect() { int nLeft = theApp.GetProfileInt(L"SETTING", L"left", -1); if (nLeft < 0) return; int nRight = theApp.GetProfileInt(L"SETTING", L"right", -1); if (nRight < 0) return; int nTop = theApp.GetProfileInt(L"SETTING", L"top", -1); if (nTop < 0) return; int nBottom = theApp.GetProfileInt(L"SETTING", L"bottom", -1); if (nBottom < 0) return; MoveWindow(nLeft, nTop, nRight - nLeft, nBottom - nTop); }
// MFCmember.cpp : 定义应用程序的类行为。 #include "stdafx.h" #include "MFCmember.h" #include "MFCmemberDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMFCmemberApp BEGIN_MESSAGE_MAP(CMFCmemberApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // CMFCmemberApp 构造 CMFCmemberApp::CMFCmemberApp() :CWinApp(_T("初始化设置")) { } // 唯一的一个 CMFCmemberApp 对象 CMFCmemberApp theApp; // CMFCmemberApp 初始化 BOOL CMFCmemberApp::InitInstance() { CWinApp::InitInstance(); // 创建 shell 管理器,以防对话框包含 // 任何 shell 树视图控件或 shell 列表视图控件。 CShellManager *pShellManager = new CShellManager; // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); SetRegistryKey(_T("250杀毒")); CMFCmemberDlg dlg; m_pMainWnd = &dlg; SetDialogBkColor(RGB(0, 0, 255), RGB(255, 0, 0)); INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码 } else if (nResponse == -1) { TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n"); TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n"); } // 删除上面创建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; } // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }