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来设置标题。记住自己设置标题时要遵循接口风格指南。

posted @ 2013-01-16 03:05  _**  阅读(240)  评论(0编辑  收藏  举报