《Windows核心编程》第一章创建对话框使用类名#32770的探讨

Windows核心编程在创建Error Show对话框的时候,Main函数是这样写的:

   HWND hwnd = FindWindow(TEXT("#32770"), TEXT("Error Show"));
   if (IsWindow(hwnd)) {
      // An instance is already running, activate it and send it the new #
      SendMessage(hwnd, ESM_POKECODEANDLOOKUP, _ttoi(pszCmdLine), 0);
   } else {
      DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_ERRORSHOW), 
         NULL, Dlg_Proc, _ttoi(pszCmdLine));
   }

我不明白这个#32770到底是什么,上网找了资料。然后自己又做了小实验了,终于搞清楚了。

这个#32770是对话框的默认类名,新建一个MFC对话框,通过Spy ++看下新创建的对话框的类名.

可以看到类名是#32770(对话框),无论以创建几个都是这样.#32770是对话框的默认类名.

但是通过

HWND hwnd = FindWindow(TEXT("#32770"), TEXT("Error Show"));

这个函数FindWindow还需要指定窗口名字,但是如果窗口名字不固定或者在创建中才决定,这样

HWND hwnd = FindWindow(TEXT("#32770"), NULL);

这个函数就找不到窗口类了,现在要做的就是创建唯一类名的窗口类,创建唯一类的步骤:

  1. 在重载的CWinApp中InitInstance()函数中修改,

  2. BOOL CMy32770App::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 = "Hello";
        
        // Register this class so that MFC can use it。
        AfxRegisterClass(&wc);
        
        //..............
    
    }

2.在资源中修改类名

IDD_MY32770_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Hello"
CLASS "Hello" //这个地方是重点,这个CLASS和上面的初始化中名字必须相同
FONT 9, "宋体"
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,260,7,50,14
    PUSHBUTTON      "取消",IDCANCEL,260,23,50,14
    LTEXT           "TODO: 在这里设置对话控制。",IDC_STATIC,51,152,200,8
    CONTROL         "List1",IDC_LIST1,"SysListView32",LVS_REPORT | 
                    LVS_OWNERDRAWFIXED | LVS_OWNERDATA | WS_BORDER | 
                    WS_TABSTOP,23,15,194,108
END

然后编译运行,最后通过Spy++可以看到

类名已经更改.

可以参开下面的文章:

http://www.vckbase.com/index.php/wv/910.html

你可能感兴趣的:(《Windows核心编程》第一章创建对话框使用类名#32770的探讨)