EllipPushWndProc也不处理WM_ENABLE讯息。如上所述,对话方块程序可以使用EnableWindow函式来禁用某视窗。於是,子视窗将显示灰色文字,而不再是黑色文字,以表示它已经被禁用,并且不能再接收任何讯息了。
如果子视窗控制项的视窗讯息处理程式需要为所建立的每个视窗存放各自不同的资料,那么它可以通过使用视窗类别结构中的cbWndExtra值来做到。这样就在内部视窗结构中保留了空间,并可以用SetWindowLong和GetWindowLong来存取该资料。
非模态对话方块
在本章的开始,我曾经说过对话方块分为「模态的」和「非模态的」两种。现在我们已经研究过这两种对话方块中最常见的一种-模态对话方块。模态对话方块(不包括系统模态对话方块)。允许使用者在对话方块与其他程式之间进行切换。但是,使用者不能切换到同一程式的另一个视窗,直到模态对话方块被清除为止。非模态对话方块允许使用者在对话方块与其他程式之间进行切换,又可以在对话方块与建立对话方块的视窗之间进行切换。因此,非模态对话方块与使用者程式常见的普通弹出式视窗可能更为相似。
当使用者觉得让对话方块保留片刻会更加方便时,使用非模态对话方块是合适的。例如,文书处理程式经常使用非模态对话方块来进行「Find」和「Change」操作。如果「Find」对话方块是模态的,那么使用者必须从功能表中选择「Find」,然後输入要寻找的字串,结束对话方块,传回到档案中,接著再重复整个程序来寻找同一字串的另一次出现。允许使用者在档案与对话方块之间进行切换则会方便得多。
您已经看到,模态对话方块是用DialogBox来建立的。只有在清除对话方块之後,函式才会传回值。在对话方块程序内使用EndDialog呼叫来终止对话方块,DialogBox传回的是该呼叫的第二个参数的值。非模态对话方块是使用CreateDialog来建立的,该函式所使用的参数与DialogBox相同。