分类: C/C++
2008-04-23 21:50:13
定制个性化的对话框窗口类
作者:
HWND hWnd = MULL; hWnd = FindWindow( "#32770",lpszWindowName ); _ASSERT( hWnd != NULL ); //其中 lpszWindowName 是对话框的窗口标题目。这种方法也有一定的缺点,就是一个对话框的标题不确定时会怎么样,或对话框的标题在运行过程中要动态改变呢?这样根本无法保证所找到 的句柄就是所需要的句柄。我采取的方法就是在对话框的产生过程中为对话框指定一个唯一的窗口类,这样就可以找到所想要的指定句柄,而不必与其它的对话框混淆。
HWND hWnd = MULL; hWnd = FindWindow( lpszClassName, NULL ); _ASSERT( hWnd != NULL ); //其中 lpszClassName 是对话框的窗口类名。那怎么样实现自已定制的对话框类呢! 看过《深入浅出MFC》的读者一定会想到,在重载 CWinApp 的 InitInstance()函数中进行修改 ,不错,确实要在这儿修改。
// 在派生类的 InitIntace() 中 BOOL CLimitDlgInstanceApp::InitInstance() { WNDCLASS wc; // Get the info for this class。 // #32770 is the default class name for dialogs boxes。 ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc); // Change the name of the class。 wc。lpszClassName = "MyPrivateClassName"; // Register this class so that MFC can use it。 AfxRegisterClass(&wc); // ...... }这里采用的方法是在产生注册窗口时,将注册窗口的窗口类名修改。再重新注册窗口类,一切看来很顺利,也不是非常难的操作,但是一切都如你预期一样么。很不辛,你再打开 Spy 观察窗口的时候 ,仍是 "#32770(Dialog)"。
// 在派生类的 InitIntace() 中 BOOL CLimitDlgInstanceApp::InitInstance() { WNDCLASS wc; // Get the info for this class。 // #32770 is the default class name for dialogs boxes。 ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc); // Change the name of the class。 wc。lpszClassName = "MyPrivateClassName"; // Register this class so that MFC can use it。 AfxRegisterClass(&wc); // ...... }其中 ::GetClassInfo 保证了即使你的资源文件在不同的 Dll 中也能正确得到 HINSTANCE 跟着就是要修改资源文件了,用文本编辑器打开 rc 文件 ,加上" ClASS 类名 "如下图所示: