⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 visual c++编程小技巧之九.htm

📁 载之“阿蒙编程乐园”
💻 HTM
📖 第 1 页 / 共 2 页
字号:
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>&nbsp;&nbsp;&nbsp;&nbsp; 
</P></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -