win32开发(创建子窗口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】


    在win32中,有的时候需要创建额外的子窗口。所谓子窗口的概念,就是窗口本身不会超出母窗口的边界,所有的操作都是在母窗口里面完成的。子窗口可以用os提供的默认类型来完成,也可以自定义类型来完成,即自定义WNDCLASSEX。常用的子窗口有BUTTON、COMBOBOX、EDIT、LISTBOX、STATIC、SCROLLBAR、RichEdit等类型,注意msdn提供的另外一种MDICLIENT类型是专门为mdi程序准备的。


    那么,代码怎么编写呢?很简单,基本上就是一行代码,在WM_CREATE里面添加就可以了,

	case WM_CREATE:
		HWND hsub;
		hsub = CreateWindow( 
			"BUTTON",   // predefined class 
			"OK",       // button text 
			WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // styles  
			10,         // starting x position 
			10,         // starting y position 
			100,        // button width 
			100,        // button height 
			hWnd,       // parent window 
			NULL,       // No menu 
			hInst, 
			NULL);      // pointer not needed 

    注意,这里class类型一定要填写成"BUTTON",这也是子窗口之间的最大区别。这里只要创建了,就可以显示了。当然,如果是别的类型的子窗口,那就替换成对应的名字就可以了。比如说,如果是"SCROLLBAR",就可以这么写,

	case WM_CREATE:
		HWND hsub;
		hsub = CreateWindow( 
			"SCROLLBAR",   // predefined class 
			"OK",       // button text 
			WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // styles  
			10,         // starting x position 
			10,         // starting y position 
			100,        // button width 
			100,        // button height 
			hWnd,       // parent window 
			NULL,       // No menu 
			hInst, 
			NULL);      // pointer not needed 

    有兴趣的同学可以按照class的name,进行一个一个的尝试。不过,既然子窗口都准备好了,那么消息在什么地方处理呢?其实也不复杂。大部分子窗口的消息和母窗口共享一个WndProc函数,直接在对应的WM_COMMAND或者WM_NOTIFY里面处理就好了。如果不确定,可以在这两个地方设置调试断点,再根据wParam和lParam分别判断就可以了。

	case WM_NOTIFY:
		break;
		
	case WM_COMMAND:
		wmId    = LOWORD(wParam); 
		wmEvent = HIWORD(wParam); 
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;


你可能感兴趣的:(mfc和win32开发)