📄 visual c++编程技巧之一.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0038)http://www.vchome.net/tech/vctip1.html -->
<HTML><HEAD><TITLE>Visual C++编程技巧之一</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 5.50.4134.100" name=GENERATOR>
<META content=sss name=doccomm>
<META content=C:\MSOffice\Template\Sl_BOOK.dot name=Template>
<META content="Cheng Jinxing" name=Author></HEAD>
<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ccffff>
<P align=center><BR><FONT face=楷体_GB2312 size=+3>Visual C++编程技巧之一</FONT> </P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip1"><FONT
face="Times New Roman" size=+0>1. </FONT><FONT size=+0>如何获取应用程序的实例句柄</FONT><FONT
face="Times New Roman" size=+0>?</FONT></A> </P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip2"><FONT
face="Times New Roman" size=+0>2. </FONT><FONT
size=+0>如何通过代码获得应用程序主窗口的指针</FONT><FONT face="Times New Roman"
size=+0>?</FONT></A> </P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip3"><FONT
face="Times New Roman" size=+0>3.</FONT><FONT size=+0>如何在程序中获得其他程序的
图标</FONT><FONT face="Times New Roman" size=+0>?</FONT></A> </P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip4"><FONT
face="Times New Roman" size=+0>4.</FONT><FONT size=+0>如何编程结束应用程序</FONT><FONT
face="Times New Roman" size=+0>?</FONT><FONT size=+0>如何编程控制</FONT><FONT
face="Times New Roman" size=+0>windows</FONT><FONT size=+0>的重新引导</FONT><FONT
face="Times New Roman" size=+0>?</FONT></A> </P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip5"><FONT
face="Times New Roman" size=+0>5.</FONT><FONT size=+0>怎样加栽其他的应用程序</FONT><FONT
face="Times New Roman" size=+0>?</FONT></A> </P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip6"><FONT
face="Times New Roman" size=+0>6. </FONT><FONT size=+0>确定应用程序的 路径</FONT></A>
</P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip7"><FONT
face="Times New Roman" size=+0>7. </FONT><FONT size=+0>获得各种目录信息</FONT></A> </P>
<P><A href="http://www.vchome.net/tech/vctip1.html#tip8"><FONT
face="Times New Roman" size=+0>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><FONT face=黑体>如何获取应用程序的实例句柄</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>获得句柄<FONT
face="Times New Roman">.</FONT></FONT> </P>
<P><FONT face="Times New Roman" size=+0>Example: HANDLE
hInstance=AfxGetInstanceHandle();</FONT> </P>
<P><A name=tip2></A><B><FONT size=+2><FONT face="Times New Roman">2.
</FONT><FONT face=黑体>如何通过代码获得应用程序主窗口的指针</FONT><FONT
face="Times New Roman">?</FONT></FONT></B> </P>
<P><FONT size=+0>主窗口的 指针保存在<FONT
face="Times New Roman">CWinThread::m_pMainWnd</FONT>中<FONT
face="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><FONT
face=黑体>如何在程序中获得其他程序的</FONT> <FONT face=黑体>图标</FONT><FONT
face="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>函数 <FONT
face="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>函数 <FONT
face="Times New Roman">SHGetFileInfo</FONT>获得有关文件的 很多信息<FONT
face="Times New Roman">,</FONT>如大小图标<FONT face="Times New Roman">,</FONT>属性<FONT
face="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 face="Times New Roman" size=+0>void CSampleView: OnDraw(CDC *
pDC)</FONT> </P>
<P><FONT face="Times New Roman" size=+0>{</FONT> </P>
<P><FONT face="Times New Roman" size=+0>if( ::
SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,</FONT> </P>
<P><FONT face="Times New Roman"
size=+0>&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))</FONT> </P>
<P><FONT face="Times New Roman" size=+0>{</FONT> </P>
<P><FONT face="Times New Roman" size=+0>pDC
->DrawIcon(10,10,stFileInfo.hIcon);</FONT> </P>
<P><FONT face="Times New Roman" size=+0>}</FONT> </P>
<P><FONT face="Times New Roman" size=+0>}</FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">Example(2):</FONT>同样功能<FONT
face="Times New Roman">,Use ExtractIcon Function</FONT></FONT> </P>
<P><FONT face="Times New Roman" size=+0>void CSampleView:: OnDraw(CDC
*pDC)</FONT> </P>
<P><FONT face="Times New Roman" size=+0>{</FONT> </P>
<P><FONT face="Times New Roman" size=+0>HICON hIcon=::
ExtractIcon(AfxGetInstanceHandle(),_T</FONT> </P>
<P><FONT face="Times New Roman" size=+0>("NotePad.exe"),0);</FONT> </P>
<P><FONT face="Times New Roman" size=+0>if (hIcon
&&hIcon!=(HICON)-1)</FONT> </P>
<P><FONT face="Times New Roman" size=+0>pDC->DrawIcon(10,10,hIcon);</FONT>
</P>
<P><FONT face="Times New Roman" size=+0>}</FONT> </P>
<P><FONT size=+0>说明<FONT face="Times New Roman">: </FONT>获得<FONT
face="Times New Roman">notepad.exe</FONT>的路径正规上来说用<FONT
face="Times New Roman">GetWindowsDirectory </FONT>函数得到<FONT
face="Times New Roman">,</FONT>如果是调用 <FONT
face="Times New Roman">win95</FONT>下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点<FONT
face="Times New Roman">.</FONT></FONT> </P>
<P><A name=tip4></A><B><FONT size=+2><FONT face="Times New Roman">4.</FONT><FONT
face=黑体>如何编程结束应用程序</FONT><FONT face="Times New Roman">?</FONT><FONT
face=黑体>如何编程控制</FONT><FONT face="Times New Roman">windows</FONT><FONT
face=黑体>的重新引导</FONT><FONT face="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">,</FONT>向窗口发送 <FONT
face="Times New Roman">WM_CLOSE</FONT>消息<FONT face="Times New Roman">,</FONT>调用
<FONT face="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 face="Times New Roman" size=+0>Example:
AfxGetMainWindow()->SendMessage(WM_CLOSE);</FONT> </P>
<P><FONT size=+0>还可以创建一个自定义的函数 <FONT face="Times New Roman">Terminate
Window</FONT></FONT> </P>
<P><FONT face="Times New Roman" size=+0>void Terminate Window(LPCSTR
pCaption)</FONT> </P>
<P><FONT face="Times New Roman" size=+0>{</FONT> </P>
<P><FONT face="Times New Roman" size=+0>CWnd
*pWnd=Cwnd::FindWindow(NULL,pCaption);</FONT> </P>
<P><FONT face="Times New Roman" size=+0>if (pWnd)</FONT> </P>
<P><FONT face="Times New Roman" size=+0>pWnd ->SendMessage(WM_CLOSE);</FONT>
</P>
<P><FONT face="Times New Roman" size=+0>}</FONT> </P>
<P><FONT size=+0>说明<FONT face="Times New Roman">:
FindWindow</FONT>函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 <FONT
face="Times New Roman">Notepad</FONT>是不是已运行而事先不知道<FONT
face="Times New Roman">Notepad</FONT>的标题栏<FONT face="Times New Roman">,</FONT>这时
<FONT face="Times New Roman">FindWindow</FONT>就无能为力了,可以通过枚举 <FONT
face="Times New Roman">windows</FONT>任务列表的办法来实现。 在 机械出版社<FONT
face="Times New Roman">"Windows 95 API</FONT>开发人员指南<FONT
face="Times New Roman">"</FONT>一书有比较详细的介绍<FONT
face="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><FONT
face=黑体>怎样加栽其他的应用程序</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>函数 <FONT
face="Times New Roman">winexec, shellexecute,createprocess</FONT>可以使用。</FONT>
</P>
<P><FONT size=+0><FONT
face="Times New Roman">WinExec</FONT>最简单,两个参数,前一个指定路径,后一个指定显示方式<FONT
face="Times New Roman">.</FONT>后一个参数值得说一下,比如泥用 <FONT
face="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>灵活一点,可以指定工作目录<FONT
face="Times New Roman">,</FONT>下面的 <FONT
face="Times New Roman">Example</FONT>就是直接打开 <FONT
face="Times New Roman">c:\temp\1.txt,</FONT>而不用加栽与 <FONT
face="Times New Roman">txt</FONT>文件关联的应用程序<FONT
face="Times New Roman">,</FONT>很多安装程序完成后都会打开一个窗口,来显示<FONT
face="Times New Roman">Readme or Faq,</FONT>偶猜就是这么作的啦<FONT
face="Times New Roman">.</FONT></FONT> </P>
<P><FONT face="Times New Roman"
size=+0>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>最复杂,一共有十个参数,不过大部分都可以用<FONT
face="Times New Roman">NULL</FONT>代替,它可以指定进程的安全属性,继承信息,类的优先级等等<FONT
face="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 face="Times New Roman"
size=+0>CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,
NORMAL_PRIORITY_</FONT> </P>
<P><FONT face="Times New Roman" size=+0>CLASS,NULL,NULL,
&stinfo,&procinfo);</FONT> </P>
<P><A name=tip6></A><B><FONT size=+2><FONT face="Times New Roman">6.
</FONT><FONT face=黑体>确定应用程序的</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 face="Times New Roman" size=+0>Example:</FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">TCHAR exeFullPath[MAX_PATH]; //
MAX_PATH</FONT>在<FONT face="Times New Roman">API</FONT>中定义了吧,好象是<FONT
face="Times New Roman">128</FONT></FONT> </P>
<P><FONT face="Times New Roman"
size=+0>GetModuleFileName(NULL,exeFullPath,MAX_PATH)</FONT> </P>
<P><A name=tip7></A><B><FONT size=+2><FONT face="Times New Roman">7.
</FONT><FONT face=黑体>获得各种目录信息</FONT></FONT></B> </P>
<P><FONT size=+0><FONT face="Times New Roman">Windows</FONT>目录<FONT
face="Times New Roman">: Use "GetWindowsDirectory</FONT>“</FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">Windows</FONT>下的<FONT
face="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>目录<FONT
face="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>后两个相反<FONT face="Times New Roman">.</FONT></FONT> </P>
<P><A name=tip8></A><B><FONT size=+2><FONT face="Times New Roman">8.
</FONT><FONT face=黑体>如何自定义消息</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>推荐的至少是 <FONT
face="Times New Roman">WM_USER+100;</FONT></FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">(2)</FONT>写消息处理函数<FONT
face="Times New Roman">,</FONT>用 <FONT
face="Times New Roman">WPARAM,LPARAM</FONT>返回<FONT
face="Times New Roman">LRESULT.</FONT></FONT> </P>
<P><FONT face="Times New Roman" size=+0>LRESULT CMainFrame::OnMyMessage(WPARAM
wparam,LPARAM lParam)</FONT> </P>
<P><FONT face="Times New Roman" size=+0>{</FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">//</FONT>加入你的处理函数</FONT> </P>
<P><FONT face="Times New Roman" size=+0>}</FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">(3) </FONT>在类的 <FONT
face="Times New Roman">AFX_MSG</FONT>处进行声明,也就是常说的<FONT
face="Times New Roman">"</FONT>宏映射<FONT face="Times New Roman">"</FONT></FONT>
</P>
<P><FONT size=+0> </FONT> </P>
<HR>
<P> <A
href="http://www.vchome.net/tech/skill.htm">返回上页</A>
</P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -