Visual C++编程技巧之九

jingjing Post at 2006/3/10 17:49:00

68. VC1.5下如何跳到第一事例?

69.为什么VC++2.0中使用文件对话框会死机?

70.VC++1.5中如何new一个大数组?

71.VC1.5中,如何得到子窗口在主窗口中的相对坐标?

72. VC1.5如何调用进程?

73. VC++1.5Win3.1程序能否实现全局跳转?

74.如何在DLL用自定义窗口?

75.如何让TOOLTIP的字体变大?

 

68.VC1.5下如何跳到第一事例?

各位大虾: CWinApp::InitInstance()中可知是第二事例,但如何在return FALSE;

之前FindWindow()到第一事例呢?主要困难是:

1).主窗口类名可否得到(主窗口==MainFrame ?若是,怎知MainFrame类名?

2).Title因含有文档名,是一不确定串.

1.类名是动态的,所以应该不易得到。(不知是否如此?)

类名不是动态的,如果不作处理,MFC总是使用AfxFrameOrView 为类名,

只有MainFrame,View等等才会用AfxFrameOrView,

我刚用spy看了我的一个程序,主窗口的ClassAfx:b:13ce:6:3be7

至于如何注册自己定义的类,我还没有学会,望高手指教。

AfxRegisterWndClass()

2.我用的方法是只查Title中前半部分和你的要求串一致即可,忽略后面的文档?

FindWindow()函数需要给定窗口类名和窗口标题(Title),不知你是怎样做到只查前半部分的?

EnumWindows()一个窗口一个窗口查,不能用 FindWindow()

这里我有另外一个问题:

找到第一事例的窗口后,如何激活它,使它成为当前窗口?

极小状态时,才能把它激活出来,否则也是没有动静,不知何故?

if (IsIconic(hwndMain))

ShowWindow(hwndMain, SW_RESTORE);

else

SetActiveWindow(hwndMain);

 

69.关于VC++2.0中使用文件对话框的求助

VC++2.0中使用了标准文件对话框以后,编译联接都能正常通过,而且使用Ctrl+F5执行EXE文件也完全正常,但是一旦用F5调试进入, 使用该对话框的代码时,Win95就会异常中止,请问各位高手,为什么?

文件对话框,改变了执行程序的当前路径,从而干扰了调试系统。如果是为了调试,可以使文件对话框定位在当前目录,并且运行时不要在其中改变目录。

 

70.如何用VC2.0编写能Edit超过64K的类

我要用VC2.0编写一个Editor,要求能编辑超过64K 的文本.我的Edit 类从CEdit类派生出来,但编辑超过64K的文本就显示不出来.原知道在VC1.5CEdit类只能编辑小于64K的文本,不知VC2.0是否也一样?

.

自己从CWnd类派生,管理内存、输入、显示等(其实不累)。至于从CEdit中派生,我也没有头绪。

VC2.0会有这事?我没试过,但我不相信。VC2.0是运行在Win95WindowsNT上的开发工具,是Win32的开发工具。Windows 95NT对应用程序在内存上没有段的限制,应用程序最多可利用高达4G的内存(包括系统占用)。你所说的限制大概是VC1.5的限制吧。盖因VC1.5运行于Win16上,每个段不能超过64K

的确如此,VC2.0有两个例子 samples\mfc\multipadsamples\mfc\superpad 也是如此。不信你看看。

 

71.在VC++1.5中如何new一个大数组

我想在用VC++1.5编程时,new一个[512][512]的大数组,却总是不行.

哪位专家可以指点一下.

选用Larger and Huger模式的库编译

我用过Large模式,好象不行呀!我用Huge模式,头文件编译时就出错了!

VC++ 1.5毕竟是16, 512*512是多少?做链表好了否则就用VC++2.0,32位就不该有这问题了

这样的做法并不十分好,要分配如此大的内存最好用全局的内存分配函数.直接用指针操作,效率也会提高.

MFC类不行吗?CObArray

请用GlobalAllocPtrGlobalFreePtr这一对函数,如下:

DWORD dwSize ;;

hpsStr =(char huge *)GlobalAllocPtr( GMEM_MOVEABLE , dwSize ) ;

...

GlobalFreePtr( hpsStr ) ;

不管多大数组,都保证没有问题。

VC1.5中,如何得到子窗口在主窗口中的相对坐标?

比较笨的方法是先ClientToScreen转成屏幕坐标,然后ScreenToClient转成主窗口坐标,不知有没有更方便的方法.

MapWindowPoints(hwndChild, hwndParent, (POINT FAR *)lprc, 2)lprc设成子窗口内的坐标(0,0, width, height)

 

72.VC1.5如何调用进程?

我用VC1.52Windows程序,中间想执行一个其他Windows应用程序,并且让我的程序挂起等应用程序执行完后再继续,请问如何实现?

exec( )spawn( )Windows不兼容,所以它们肯定不行了.

WinExec()

挂起的一个简单方法是得到新进程的主窗口句柄,然后进入死循环,直到此句柄变为无效。

不知道还有什么更漂亮一些的手法。

请问,怎么得到进程的主窗口句柄呢?

是呀,我也正想问呢.例如我执行的是PSpice for Windows.WinExec()

可以如下:

int nWinRun = WinExec("wpspice test.cir", SW_SHOWNORMAL);

可是如何得到新进程的主窗口句柄呢?能不能截取新进程的消息呢

紧接着用GetActiveWindow()就可以.

当然还是在win3.1下才有用....

win95下由于有输入的局部化问题,所以只能得到本线程的Activate WindowFocus Window,对于其他情况返回都是NULL.这问题还是不知道怎么办,alas...

所 以 最 根 本 的 办 法 是 如 何 读 写Windows消 息 总 库.

哪 位 高 手 看 得 懂SPY的 源 程 序(C++Delphi之 类 的Sample 中 有).

Use "FindWindow()". according to window title, get window handle.

then use Window Declassing method. that is write your own procedure

to process the message you want to capture. "CallWindowProc() is

executed before DefWindowProc()". (sorry can not type chinese now.)

我在Vc 4.0下用_exec, _spawn,以及WinExec都没问题的!

 

73.VC++1.5Win3.1程序能否实现全局跳转?

setjmp即可,和DOS下一样。

Windows API中的Catch()Throw()可能会更好些。不过我也不知道和setjmp有些什么区别。

setjmp恐怕不行,它好象只能用来编写C 程序,而不能用来编写C++程序!

我的感觉是,只要是代码段,可以不受函数和应用的限制,随便乱跳的。其实是数据段,也可以跳过去的。换句话说,在WINDOW中,可以跳到任何地方,只要我乐意。

 

74.在DLL用自定义窗口

我在DLL中用如下窗口,

class CMyWin:public CWnd

{

public:

CMyWin() ;

} ;

CMyWin::CMyWin()

{

if( !CreateEx( WS_EX_TOPMOST ,

AfxRegisterWndClass( CS_SAVEBITS ) ,

"mywin" , WS_POPUP ,

0 , 0 , 100 , 100 , NULL , NULL ) )

AfxMessageBox( "CreateEx error" ) ;

}

请问有谁知道是什么原因?谁在DLL中做过类似工作,望赐教。ror”,

我记得AfxRegisterWndClass好象应该在PreCreateWindow中调用,

在构造函数中用这个函数似乎有问题,你再试试吧!

C++DLL可以吗?好象名字分裂回有些负作用吧?

MFC C++是可以做传统的DLL的。只要将回调函数定义成如下格式就行了:

#ifdef __cplusplus

extern "C" {

#endif

void __export FAR PASCAL fun() ;

#ifdef __cplusplus

}

#endif

其它与普通MFC程序一样。当然,在例程类的定义上也有点特别的地方

我如果在正常的执行程序中这样用CreateEx就没有任何问题,而在DLL

就有问题。并且这问题也只发生在WIN3.1上,在WIN95上却可以正常执行。

-

75.如何让TOOLTIP的字体变大

前几天有个虫虫问如何让vc4.0Tooltip的字体变大,可现在文章没有了.不过现在我

有个方法:Windows 95 Desktop属性中有desktop scheme中有Tooltip一项,可以该变

TOOLTIP的字体和大小.不过这样做所有程序的Tooltip都变大了.这可能不是你的本意.

TooltipWindows 95 Common Control,Windows

95内部实现,VC4.0CTooltip类并不实现Tips的显示,所以要实现针对某个程序的

Tooltip的特殊显示,有一定难度.我以前曾经试图实现Tooltip的多行显示,做到了当Toolt.

显示时触发我的函数,消失时触发我的函数,但在显示时却出GP错误.现在我认为最简

单的方法是从头自己实现Tooltip.一切随心所欲.*

已有 0 位网友发表了看法