竞赛:| 全国大学生数模竞赛 | 全国研究生数模竞赛 | 全国大学生电工数模竞赛 | 美国"MCM/ICM" 竞赛 |
 资讯:| 数学理论 | 交叉学科 | 基础教育 | 考研数学 | 学术动态 | 编程交流 | 网络安全 | 经验技巧 |
 下载:| 数 学 篇 | 算 法 篇 | 建 模 篇 | 编 程 篇 | 数 据 篇 | 软 件 篇 | 考 研 篇 | 交叉学科 |
 视频:| 大学数学 | 大学英语 | 计 算 机 | 法律课程 | 政治课程 | 经济管理 | 数学建模 | 高考数学 |
 功能:| 矩阵论坛 | 学校协会 | 挑 战 赛 | 人才招聘 | 数学问吧 | "MC"理工浏览器 | "MCQ"即时通讯 |

 
会员中心
社区论坛
加入收藏
联系我们
您现在的位置: 数学中国 >> 资讯无限 >> 计算机技术 >> 编程交流 >> 正文
【字体:           ★★
 
VC实用小知识总结
作者:佚名    文章来源:本站原创    点击数:    更新时间:2006-6-22
 

VC实用小知识总结

 

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


 

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

  (2 确定应用程序的路径

 

  Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。
  Example:
  TCHAR
  exeFullPath[MAX_PATH] // MAX_PATHAPI中定义了吧,好象是
  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成员函数.允许对用户提示是否保存修改过的数据.



  系列文章:VC实用小知识总结()

 

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

 

文章录入:lizuyi    责任编辑:madio  
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    推 荐 文 章
    更多内容
     
    热 门 文 章  
    更多内容