📄 visual c++编程小技巧之九.htm
字号:
face="Times New Roman">VC1.5</FONT>中,如何得到子窗口在主窗口中的相对坐标?</FONT> </P>
<P><FONT size=+0>比较笨的方法是先<FONT
face="Times New Roman">ClientToScreen</FONT>转成屏幕坐标<FONT
face="Times New Roman">,</FONT>然后<FONT
face="Times New Roman">ScreenToClient</FONT>转成主窗口坐标<FONT
face="Times New Roman">,</FONT>不知有没有更方便的方法<FONT
face="Times New Roman">.</FONT></FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">MapWindowPoints(hwndChild,
hwndParent, (POINT FAR *)lprc, 2)lprc </FONT>设成子窗口内的坐标<FONT
face="Times New Roman">(0,0, width, height)</FONT></FONT> </P>
<P><FONT size=+0> </FONT> </P>
<P><A name=tip72></A><B><FONT size=+2><FONT face="Times New Roman">72.VC1.5
</FONT><FONT face=黑体>如何调用进程</FONT><FONT
face="Times New Roman">?</FONT></FONT></B> </P>
<P><FONT size=+0>我用<FONT face="Times New Roman">VC1.52</FONT>编<FONT
face="Times New Roman">Windows</FONT>程序,中间想执行一个其他<FONT
face="Times New Roman">Windows</FONT>应用程序,并且让我的程序挂起等应用程序执行完后再继续,请问如何实现?</FONT>
</P>
<P><FONT size=+0><FONT face="Times New Roman">exec( ) </FONT>和 <FONT
face="Times New Roman">spawn( )</FONT>与<FONT
face="Times New Roman">Windows</FONT>不兼容,所以它们肯定不行了.</FONT> </P>
<P><FONT face="Times New Roman" size=+0>WinExec()</FONT> </P>
<P><FONT size=+0>挂起的一个简单方法是得到新进程的主窗口句柄,然后进入死循环,直到此句柄变为无效。</FONT> </P>
<P><FONT size=+0>不知道还有什么更漂亮一些的手法。</FONT> </P>
<P><FONT size=+0>请问,怎么得到进程的主窗口句柄呢?</FONT> </P>
<P><FONT size=+0>是呀,我也正想问呢.例如我执行的是<FONT face="Times New Roman">PSpice for
Windows.</FONT>用<FONT face="Times New Roman">WinExec()</FONT></FONT> </P>
<P><FONT size=+0>可以如下<FONT face="Times New Roman">:</FONT></FONT> </P>
<P><FONT face="Times New Roman" size=+0>int nWinRun = WinExec("wpspice
test.cir", SW_SHOWNORMAL);</FONT> </P>
<P><FONT size=+0>可是如何得到新进程的主窗口句柄呢?能不能截取新进程的消息呢</FONT> </P>
<P><FONT size=+0>紧接着用 <FONT face="Times New Roman">GetActiveWindow()
</FONT>就可以<FONT face="Times New Roman">.</FONT></FONT> </P>
<P><FONT size=+0>当然还是在<FONT face="Times New Roman">win3.1 </FONT>下才有用<FONT
face="Times New Roman">....</FONT></FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">win95 </FONT>下由于有输入的局部化问题<FONT
face="Times New Roman">,</FONT>所以只能得到本线程的<FONT face="Times New Roman">Activate
Window</FONT>或<FONT face="Times New Roman">Focus Window,</FONT>对于其他情况返回都是<FONT
face="Times New Roman">NULL.</FONT>这问题还是不知道怎么办<FONT
face="Times New Roman">,alas...</FONT></FONT> </P>
<P><FONT size=+0>所 以 最 根 本 的 办 法 是 如 何 读 写 <FONT face="Times New Roman">Windows
</FONT>消 息 总 库 <FONT face="Times New Roman">.</FONT></FONT> </P>
<P><FONT size=+0>哪 位 高 手 看 得 懂 <FONT face="Times New Roman">SPY </FONT>的 源 程 序
<FONT face="Times New Roman">(</FONT>在 <FONT face="Times New Roman">C++ </FONT>或
<FONT face="Times New Roman">Delphi </FONT>之 类 的 <FONT
face="Times New Roman">Sample </FONT>中 有 <FONT
face="Times New Roman">).</FONT></FONT> </P>
<P><FONT face="Times New Roman" size=+0>Use "FindWindow()". according to window
title, get window handle.</FONT> </P>
<P><FONT face="Times New Roman" size=+0>then use Window Declassing method. that
is write your own procedure</FONT> </P>
<P><FONT face="Times New Roman" size=+0>to process the message you want to
capture. "CallWindowProc() is</FONT> </P>
<P><FONT face="Times New Roman" size=+0>executed before DefWindowProc()". (sorry
can not type chinese now.)</FONT> </P>
<P><FONT size=+0>我在<FONT face="Times New Roman">Vc 4.0 </FONT>下用<FONT
face="Times New Roman">_exec, _spawn, </FONT>以及<FONT
face="Times New Roman">WinExec</FONT>都没问题的!</FONT> </P>
<P><FONT size=+0> </FONT> </P>
<P><A name=tip73></A><B><FONT size=+2><FONT
face="Times New Roman">73.VC++1.5</FONT><FONT face=黑体>编</FONT><FONT
face="Times New Roman">Win3.1</FONT><FONT face=黑体>程序能否实现全局跳转</FONT><FONT
face="Times New Roman">?</FONT></FONT></B> </P>
<P><FONT size=+0><FONT face="Times New Roman">setjmp</FONT>即可,和<FONT
face="Times New Roman">DOS</FONT>下一样。</FONT> </P>
<P><FONT size=+0>用<FONT face="Times New Roman">Windows API </FONT>中的 <FONT
face="Times New Roman">Catch() </FONT>和 <FONT face="Times New Roman">Throw()
</FONT>可能会更好些。不过我也不知道和<FONT face="Times New Roman">setjmp</FONT>有些什么区别。</FONT>
</P>
<P><FONT size=+0><FONT face="Times New Roman">setjmp </FONT>恐怕不行<FONT
face="Times New Roman">, </FONT>它好象只能用来编写 <FONT face="Times New Roman">C
</FONT>程序,而不能用来编写 <FONT face="Times New Roman">C++ </FONT>程序<FONT
face="Times New Roman">!</FONT></FONT> </P>
<P><FONT size=+0>我的感觉是,只要是代码段,可以不受函数和应用的限制,随便乱跳的。其实是数据段,也可以跳过去的。换句话说,在<FONT
face="Times New Roman">WINDOW</FONT>中,可以跳到任何地方,只要我乐意。</FONT> </P>
<P><B><FONT size=+2> </FONT></B> </P>
<P><A name=tip74></A><B><FONT size=+2><FONT face=黑体>74.在</FONT><FONT
face="Times New Roman">DLL</FONT><FONT face=黑体>用自定义窗口</FONT></FONT></B> </P>
<P><FONT size=+0>我在<FONT face="Times New Roman">DLL</FONT>中用如下窗口,</FONT> </P>
<P><FONT face="Times New Roman" size=+0>class CMyWin:public CWnd</FONT> </P>
<P><FONT face="Times New Roman" size=+0>{</FONT> </P>
<P><FONT face="Times New Roman" size=+0>public:</FONT> </P>
<P><FONT face="Times New Roman" size=+0>CMyWin() ;</FONT> </P>
<P><FONT face="Times New Roman" size=+0>} ;</FONT> </P>
<P><FONT face="Times New Roman" size=+0>CMyWin::CMyWin()</FONT> </P>
<P><FONT face="Times New Roman" size=+0>{</FONT> </P>
<P><FONT face="Times New Roman" size=+0>if( !CreateEx( WS_EX_TOPMOST ,</FONT>
</P>
<P><FONT face="Times New Roman" size=+0>AfxRegisterWndClass( CS_SAVEBITS )
,</FONT> </P>
<P><FONT face="Times New Roman" size=+0>"mywin" , WS_POPUP ,</FONT> </P>
<P><FONT face="Times New Roman" size=+0>0 , 0 , 100 , 100 , NULL , NULL )
)</FONT> </P>
<P><FONT face="Times New Roman" size=+0>AfxMessageBox( "CreateEx error" )
;</FONT> </P>
<P><FONT face="Times New Roman" size=+0>}</FONT> </P>
<P><FONT size=+0>请问有谁知道是什么原因?谁在<FONT
face="Times New Roman">DLL</FONT>中做过类似工作,望赐教。<FONT
face="Times New Roman">ror</FONT>”,</FONT> </P>
<P><FONT size=+0>我记得<FONT
face="Times New Roman">AfxRegisterWndClass</FONT>好象应该在<FONT
face="Times New Roman">PreCreateWindow</FONT>中调用<FONT
face="Times New Roman">,</FONT></FONT> </P>
<P><FONT size=+0>在构造函数中用这个函数似乎有问题<FONT face="Times New Roman">,</FONT>你再试试吧<FONT
face="Times New Roman">!</FONT></FONT> </P>
<P><FONT size=+0>用<FONT face="Times New Roman">C++</FONT>作<FONT
face="Times New Roman">DLL</FONT>可以吗<FONT
face="Times New Roman">?</FONT>好象名字分裂回有些负作用吧<FONT
face="Times New Roman">?</FONT></FONT> </P>
<P><FONT size=+0>用<FONT face="Times New Roman">MFC C</FONT>++是可以做传统的<FONT
face="Times New Roman">DLL</FONT>的。只要将回调函数定义成如下格式就行了:</FONT> </P>
<P><FONT face="Times New Roman" size=+0>#ifdef __cplusplus</FONT> </P>
<P><FONT face="Times New Roman" size=+0>extern "C" {</FONT> </P>
<P><FONT face="Times New Roman" size=+0>#endif</FONT> </P>
<P><FONT face="Times New Roman" size=+0>void __export FAR PASCAL fun() ;</FONT>
</P>
<P><FONT face="Times New Roman" size=+0>#ifdef __cplusplus</FONT> </P>
<P><FONT face="Times New Roman" size=+0>}</FONT> </P>
<P><FONT face="Times New Roman" size=+0>#endif</FONT> </P>
<P><FONT size=+0>其它与普通<FONT
face="Times New Roman">MFC</FONT>程序一样。当然,在例程类的定义上也有点特别的地方</FONT> </P>
<P><FONT size=+0>我如果在正常的执行程序中这样用<FONT
face="Times New Roman">CreateEx</FONT>就没有任何问题,而在<FONT
face="Times New Roman">DLL</FONT>中</FONT> </P>
<P><FONT size=+0>就有问题。并且这问题也只发生在<FONT
face="Times New Roman">WIN3.1</FONT>上,在<FONT
face="Times New Roman">WIN95</FONT>上却可以正常执行。</FONT> </P>
<P><FONT face="Times New Roman" size=+0>-</FONT> </P>
<P><A name=tip75></A><B><FONT size=+2><FONT face=黑体>75.如何让</FONT><FONT
face="Times New Roman">TOOLTIP</FONT><FONT face=黑体>的字体变大</FONT></FONT></B> </P>
<P><FONT size=+0>前几天有个虫虫问如何让<FONT face="Times New Roman">vc4.0</FONT>的<FONT
face="Times New Roman">Tooltip</FONT>的字体变大<FONT
face="Times New Roman">,</FONT>可现在文章没有了<FONT
face="Times New Roman">.</FONT>不过现在我</FONT> </P>
<P><FONT size=+0>有个方法<FONT face="Times New Roman">:</FONT>在<FONT
face="Times New Roman">Windows 95 Desktop </FONT>属性中有<FONT
face="Times New Roman">desktop scheme</FONT>中有<FONT
face="Times New Roman">Tooltip</FONT>一项<FONT
face="Times New Roman">,</FONT>可以该变</FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">TOOLTIP</FONT>的字体和大小<FONT
face="Times New Roman">.</FONT>不过这样做所有程序的<FONT
face="Times New Roman">Tooltip</FONT>都变大了<FONT
face="Times New Roman">.</FONT>这可能不是你的本意<FONT
face="Times New Roman">.</FONT></FONT> </P>
<P><FONT size=+0>但<FONT face="Times New Roman">Tooltip</FONT>是<FONT
face="Times New Roman">Windows 95 Common Control,</FONT>由<FONT
face="Times New Roman">Windows</FONT></FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">95</FONT>内部实现<FONT
face="Times New Roman">,VC4.0</FONT>的<FONT
face="Times New Roman">CTooltip</FONT>类并不实现<FONT
face="Times New Roman">Tips</FONT>的显示<FONT
face="Times New Roman">,</FONT>所以要实现针对某个程序的</FONT> </P>
<P><FONT size=+0><FONT face="Times New Roman">Tooltip</FONT>的特殊显示<FONT
face="Times New Roman">,</FONT>有一定难度<FONT
face="Times New Roman">.</FONT>我以前曾经试图实现<FONT
face="Times New Roman">Tooltip</FONT>的多行显示<FONT
face="Times New Roman">,</FONT>做到了当<FONT
face="Times New Roman">Toolt.</FONT></FONT> </P>
<P><FONT size=+0>显示时触发我的函数<FONT face="Times New Roman">,</FONT>消失时触发我的函数<FONT
face="Times New Roman">,</FONT>但在显示时却出<FONT
face="Times New Roman">GP</FONT>错误<FONT
face="Times New Roman">.</FONT>现在我认为最简</FONT> </P>
<P><FONT size=+0>单的方法是从头自己实现<FONT face="Times New Roman">Tooltip</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 + -