📄 vctip1.html
字号:
<html><head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"><meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0"><meta NAME="doccomm" CONTENT="sss"><meta NAME="Template" CONTENT="C:\MSOffice\Template\Sl_BOOK.dot"><meta NAME="Author" CONTENT="Cheng Jinxing"><title>Visual C++编程技巧之一</title></head><body TEXT="#000000" BGCOLOR="#CCFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"><p align="center"><br><font SIZE="+3" FACE="楷体_GB2312">Visual C++编程技巧之一</font> </p><p><a HREF="#tip1"><font SIZE="+0" FACE="Times New Roman">1. </font><font SIZE="+0">如何获取应用程序的实例句柄</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip2"><font SIZE="+0" FACE="Times New Roman">2. </font><font SIZE="+0">如何通过代码获得应用程序主窗口的指针</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip3"><font SIZE="+0" FACE="Times New Roman">3.</font><font SIZE="+0">如何在程序中获得其他程序的 图标</font><font SIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip4"><font SIZE="+0" FACE="Times New Roman">4.</font><font SIZE="+0">如何编程结束应用程序</font><fontSIZE="+0" FACE="Times New Roman">?</font><font SIZE="+0">如何编程控制</font><fontSIZE="+0" FACE="Times New Roman">windows</font><font SIZE="+0">的重新引导</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip5"><font SIZE="+0" FACE="Times New Roman">5.</font><font SIZE="+0">怎样加栽其他的应用程序</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip6"><font SIZE="+0" FACE="Times New Roman">6. </font><font SIZE="+0">确定应用程序的 路径</font></a> </p><p><a HREF="#tip7"><font SIZE="+0" FACE="Times New Roman">7. </font><font SIZE="+0">获得各种目录信息</font></a> </p><p><a HREF="#tip8"><font SIZE="+0" FACE="Times New Roman">8. </font><font SIZE="+0">如何自定义消息</font></a> </p><p><font SIZE="+2"><b> </b></font> </p><p><a NAME="tip1"></a><b><font SIZE="+2"><font FACE="Times New Roman">1. </font><fontFACE="黑体">如何获取应用程序的实例句柄</font><font FACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">应用程序的 实例句柄保存在<font FACE="Times New Roman">CWinAppIm_hInstance </font>中<font FACE="Times New Roman">,</font>可以这么调用</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">AfxGetInstancdHandle</font>获得句柄<fontFACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">Example: HANDLE hInstance=AfxGetInstanceHandle();</font> </p><p><a NAME="tip2"></a><b><font SIZE="+2"><font FACE="Times New Roman">2. </font><fontFACE="黑体">如何通过代码获得应用程序主窗口的指针</font><fontFACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">主窗口的 指针保存在<font FACE="Times New Roman">CWinThread::m_pMainWnd</font>中<fontFACE="Times New Roman">,</font>调用 <font FACE="Times New Roman">AfxGetMainWnd</font>实现。</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //</font>使程序最大化<font FACE="Times New Roman">.</font></font> </p><p><a NAME="tip3"></a><b><font SIZE="+2"><font FACE="Times New Roman">3.</font><fontFACE="黑体">如何在程序中获得其他程序的</font> <font FACE="黑体">图标</font><fontFACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">两种方法<font FACE="Times New Roman">:</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(1) SDK</font>函数 <fontFACE="Times New Roman">SHGetFileInfo </font>或使用 <font FACE="Times New Roman">ExtractIcon</font>获得图标资源的 <font FACE="Times New Roman">handle,</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(2) SDK</font>函数 <fontFACE="Times New Roman">SHGetFileInfo</font>获得有关文件的 很多信息<fontFACE="Times New Roman">,</font>如大小图标<font FACE="Times New Roman">,</font>属性<fontFACE="Times New Roman">,</font>类型等<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Example(1): </font>在程序窗口左上角显示 <font FACE="Times New Roman">NotePad</font>图标<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">void CSampleView: OnDraw(CDC * pDC)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,</font> </p><p><font SIZE="+0" FACE="Times New Roman">&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC ->DrawIcon(10,10,stFileInfo.hIcon);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Example(2):</font>同样功能<fontFACE="Times New Roman">,Use ExtractIcon Function</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">void CSampleView:: OnDraw(CDC *pDC)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T</font> </p><p><font SIZE="+0" FACE="Times New Roman">("NotePad.exe"),0);</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (hIcon &&hIcon!=(HICON)-1)</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC->DrawIcon(10,10,hIcon);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">说明<font FACE="Times New Roman">: </font>获得<fontFACE="Times New Roman">notepad.exe</font>的路径正规上来说用<fontFACE="Times New Roman">GetWindowsDirectory </font>函数得到<font FACE="Times New Roman">,</font>如果是调用 <font FACE="Times New Roman">win95</font>下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点<fontFACE="Times New Roman">.</font></font> </p><p><a NAME="tip4"></a><b><font SIZE="+2"><font FACE="Times New Roman">4.</font><fontFACE="黑体">如何编程结束应用程序</font><font FACE="Times New Roman">?</font><fontFACE="黑体">如何编程控制</font><font FACE="Times New Roman">windows</font><fontFACE="黑体">的重新引导</font><font FACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">这是个很简单又是编程中经常要遇到的问题<fontFACE="Times New Roman">.</font></font> </p><p><font SIZE="+0">第一问<font FACE="Times New Roman">,</font>向窗口发送 <fontFACE="Times New Roman">WM_CLOSE</font>消息<font FACE="Times New Roman">,</font>调用 <fontFACE="Times New Roman">CWnd::OnClose</font>成员函数<font FACE="Times New Roman">.</font>允许对用户提示</font> </p><p><font SIZE="+0">是否保存修改过的数据<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);</font> </p><p><font SIZE="+0">还可以创建一个自定义的函数 <font FACE="Times New Roman">Terminate Window</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">void Terminate Window(LPCSTR pCaption)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (pWnd)</font> </p><p><font SIZE="+0" FACE="Times New Roman">pWnd ->SendMessage(WM_CLOSE);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">说明<font FACE="Times New Roman">: FindWindow</font>函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 <font FACE="Times New Roman">Notepad</font>是不是已运行而事先不知道<fontFACE="Times New Roman">Notepad</font>的标题栏<font FACE="Times New Roman">,</font>这时 <font FACE="Times New Roman">FindWindow</font>就无能为力了,可以通过枚举 <fontFACE="Times New Roman">windows</font>任务列表的办法来实现。 在 机械出版社<fontFACE="Times New Roman">"Windows 95 API</font>开发人员指南<fontFACE="Times New Roman">"</font>一书有比较详细的介绍<fontFACE="Times New Roman">,</font>这里就不再多说乐。</font> </p><p><font SIZE="+0">第二问<font FACE="Times New Roman">,Use ExitWindowsEx Function</font>函数控制系统是重新引导,还是重启 <font FACE="Times New Roman">windows.</font>前面已经有人讲过乐,就不再提了。</font> </p><p><a NAME="tip5"></a><b><font SIZE="+2"><font FACE="Times New Roman">5.</font><fontFACE="黑体">怎样加栽其他的应用程序</font><font FACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">我记得这好象是出场频度很高的问题。</font> </p><p><font SIZE="+0">三个<font FACE="Times New Roman">SDK</font>函数 <fontFACE="Times New Roman">winexec, shellexecute,createprocess</font>可以使用。</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">WinExec</font>最简单,两个参数,前一个指定路径,后一个指定显示方式<fontFACE="Times New Roman">.</font>后一个参数值得说一下,比如泥用 <fontFACE="Times New Roman">SW_SHOWMAXMIZED</font>方式去加栽一个无最大化按钮的 程序,呵呵就是<font FACE="Times New Roman">Neterm,calc</font>等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。<font FACE="Times New Roman">ShellExecute</font>较 <font FACE="Times New Roman">WinExex</font>灵活一点,可以指定工作目录<fontFACE="Times New Roman">,</font>下面的 <font FACE="Times New Roman">Example</font>就是直接打开 <font FACE="Times New Roman">c:\temp\1.txt,</font>而不用加栽与 <fontFACE="Times New Roman">txt</font>文件关联的应用程序<font FACE="Times New Roman">,</font>很多安装程序完成后都会打开一个窗口,来显示<fontFACE="Times New Roman">Readme or Faq,</font>偶猜就是这么作的啦<fontFACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">CreateProcess</font>最复杂,一共有十个参数,不过大部分都可以用<fontFACE="Times New Roman">NULL</font>代替,它可以指定进程的安全属性,继承信息,类的优先级等等<fontFACE="Times New Roman">.</font>来看个很简单的 <font FACE="Times New Roman">Example:</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">STARTUPINFO stinfo; //</font>启动窗口的信息</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">PROCESSINFO procinfo; //</font>进程的信息</font> </p><p><font SIZE="+0" FACE="Times New Roman">CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_</font> </p><p><font SIZE="+0" FACE="Times New Roman">CLASS,NULL,NULL, &stinfo,&procinfo);</font> </p><p><a NAME="tip6"></a><b><font SIZE="+2"><font FACE="Times New Roman">6. </font><fontFACE="黑体">确定应用程序的</font> <font FACE="黑体">路径</font></font></b> </p><p><font SIZE="+0">前些天好象有人问过这个问题<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Use GetModuleFileName </font>获得应用程序的路径,然后去掉可执行文件名。</font> </p><p><font SIZE="+0" FACE="Times New Roman">Example:</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">TCHAR exeFullPath[MAX_PATH]; // MAX_PATH</font>在<fontFACE="Times New Roman">API</font>中定义了吧,好象是<font FACE="Times New Roman">128</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">GetModuleFileName(NULL,exeFullPath,MAX_PATH)</font> </p><p><a NAME="tip7"></a><b><font SIZE="+2"><font FACE="Times New Roman">7. </font><fontFACE="黑体">获得各种目录信息</font></font></b> </p><p><font SIZE="+0"><font FACE="Times New Roman">Windows</font>目录<fontFACE="Times New Roman">: Use "GetWindowsDirectory</font>“</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Windows</font>下的<fontFACE="Times New Roman">system</font>目录<font FACE="Times New Roman">: Use "GetSystemDirectory"</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">temp</font>目录<fontFACE="Times New Roman">: Use "GetTempPath "</font></font> </p><p><font SIZE="+0">当前目录<font FACE="Times New Roman">: Use "GetCurrentDirectory"</font></font> </p><p><font SIZE="+0">请注意前两个函数的第一个参数为 目录变量名,后一个为缓冲区<font FACE="Times New Roman">; </font>后两个相反<fontFACE="Times New Roman">.</font></font> </p><p><a NAME="tip8"></a><b><font SIZE="+2"><font FACE="Times New Roman">8. </font><fontFACE="黑体">如何自定义消息</font></font></b> </p><p><font SIZE="+0">也有人问过的,其实不难。</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(1) </font>手工定义消息,可以这么写 <font FACE="Times New Roman">#define WM_MY_MESSAGE(WM_USER+100),</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">MS </font>推荐的至少是 <fontFACE="Times New Roman">WM_USER+100;</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(2)</font>写消息处理函数<fontFACE="Times New Roman">,</font>用 <font FACE="Times New Roman">WPARAM,LPARAM</font>返回<fontFACE="Times New Roman">LRESULT.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">//</font>加入你的处理函数</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(3) </font>在类的 <fontFACE="Times New Roman">AFX_MSG</font>处进行声明,也就是常说的<fontFACE="Times New Roman">"</font>宏映射<font FACE="Times New Roman">"</font></font> </p><p><font SIZE="+0"> </font> </p><hr><p> <a HREF="skill.htm">返回上页</a> </p></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -