zoukankan      html  css  js  c++  java
  • VC实用小知识总结 (一) (转)

    (1) 如何通过代码获得应用程序主窗口的 指针?
      主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。



     

      AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)
      //使程序最大化.

      (2) 确定应用程序的路径

     

      Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。
      Example:
      TCHAR
      exeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是
      128
      GetModuleFileName(NULL,exeFullPath,MAX_PATH)

      (3) 如何在程序中获得其他程序的 图标?
      两种方法:
      (1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle,
      (2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等.
      Example(1):
      在程序窗口左上角显示 NotePad图标.

     

      void CSampleView:
      OnDraw(CDC * pDC)
      {
      if( :: SHGetFileInfo(_T("c:\pwin95\notepad.exe"),0,
      &stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
      {
      pDC ->DrawIcon(10,10,stFileInfo.hIcon)
      }
      }
      Example(2):同样功能,Use ExtractIcon Function
      void CSampleView:: OnDraw(CDC *pDC)
      {
      HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
      ("NotePad.exe"),0)
      if (hIcon &&hIcon!=(HICON)-1)
      pDC->DrawIcon(10,10,hIcon)
      }


      说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.

      (4) 获得各种目录信息
      Windows目录: Use "GetWindowsDirectory"
      Windows下的system目录: Use "GetSystemDirectory"
      temp目录: Use "GetTempPath"
      当前目录: Use "GetCurrentDirectory"

      请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区后两个相反.

      (5) 如何自定义消息
      1) 手工定义消息,可以这么写

     

      #define WM_MY_MESSAGE(WM_USER+100),


      MS 推荐的至少是 WM_USER+100

      (2)写消息处理函数,用

     

      WPARAM,LPARAM返回LRESULT.
      LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)

      {
      temp目录: Use "GetTempPath"
      //加入你的处理函数 irectory"
      }

      (6) 如何改变窗口的图标?
      向窗口发送 WM_SECTION消息。

     

      Example:
      HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON)
      ASSERT(hIcon)
      AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM)hIcon)

      (7) 如何改变窗口的缺省风格?
      重载 CWnd:: PreCreateWindow 并修改CREATESTRUCT结构来指定窗口风格和其他创建信息.

     

      Example: Delete "Max" Button and Set Original
      Window's Position and Size

      BOOL CMainFrame:: PreCreateWindow
      (CREATESTRUCT &cs)
      {
      cs.style &=~WS_MAXINIZEMOX

      cs.x=cs.y=0
      cs.cx=GetSystemMetrics(SM_CXSCREEN/2)
      cs.cy=GetSystemMetrics(SM_CYSCREEN/2)

      return CMDIFramewnd ::PreCreateWindow(cs)
      }

    (26) 如何编程结束应用程序?
      这是个很简单又是编程中经常要遇到的问题.
      向窗口发送 WM_CLOSE消息,调用 CWnd::OnClose成员函数.允许对用户提示是否保存修改过的数据.

      
        Example: AfxGetMainWindow()->SendMessage(WM_CLOSE)

      还可以创建一个自定义的函数 Terminate Window

        void Terminate Window(LPCSTR pCaption)
      {
      CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption)

      if (pWnd)

      pWnd ->SendMessage(WM_CLOSE)
      }

      说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,这时FindWindow就无能为力了,可以通过枚举 windows任务列表的办法来实现。在机械出版社"Windows 95 API开发人员指南"一书有比较详细的介绍,这里就不再多说乐。

      (27) 如何创建和使用无模式对话框
      MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。

        void CSampleDialog : : OnOK ( )
      {
      // Retrieve and validate dialog data .
      if (! UpdateData (TRUE) )
      {
      // the UpdateData rountine
      will set focus to correct item TRACEO (" UpdateData failed during dialog termination .n")
      return
      }

      //Call DestroyWindow instead of EndDialog .
      DestroyWindow ( )
      }

      void CSampleDialog : : OnCancel ( )
      {
      //Call DestroyWindow instead of EndDialog .
      DestroyWindow ( )
      }

      其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd : : PostNcDestroy,可以重置该函数并执行清除操作,诸如删除this指针。

        void CSampleDialog : : PostNcDestroy ( )
      {
      // Declete the C++ object that represents this dialog.
      delete this

      最后,要创建无模式对话。可以调用CDialog : : DoModal创建一个模式对放,要创建一个无模式对话则要调用CDialog: : Create。下面的例子说明 了应用程序是如何创建无模式对话的: 象;无模式对话不是同步的,创建函数调用后立即返回,

        void CMainFrame : : OnSampleDialog ( )
      {
      //Allocate a modeless dialog object .
      CSampleDilog * pDialog =new CSampleDialog
      ASSERT_VALID (pDialog) Destroy ( )

      //Create the modeless dialog . represents this dialog.
      BOOL bResult = pDialog —> Creste (IDD_IDALOG)
      ASSERT (bResult )
      }

      (28) 如何防止主框窗口在其说明中显示活动的文档名
      创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位,如果不希望在说明中自动添加文档名, 必须禁止该风格位, 可以使用ClassWizard重置

        CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。
      BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)
      {
      //Turn off FWS_ADDTOTITLE in main frame .
      cs.styel & = ~FWS_ADDTOTITLE  
      return CMDIFrameWnd : : PreCreateWindow (cs )
      }


      关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。

  • 相关阅读:
    thinkphp的钩子的两种配置和两种调用方法
    php闭包实现函数的自调用,也是递归
    php的spl_autoload_register函数的一点个人见解
    详解js变量、作用域及内存
    关于js的call()和apply()两个函数的一点个人看法
    php实现斐波那契数列以及由此引起的联想
    php猴子称王或者约瑟夫难题
    Linux Bash Shell 快速入门
    Fedora14下首次搭建Samba服务器遇到的一些问题
    【JavaScript】我的JavaScript技术总结第一篇——编程细节
  • 原文地址:https://www.cnblogs.com/Fightingbirds/p/2862150.html
Copyright © 2011-2022 走看看