win32开发(创建子窗口)
2017-12-22 08:43
295 查看
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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;
在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;
相关文章推荐
- 学习win32 API开发3-一个窗口创建的经典步骤
- OpenGL1-创建窗口(建立Win32的OpenGL开发环境 )(代码上传)
- OpenGL1-创建窗口(建立Win32的OpenGL开发环境 )(代码上传)
- Win32简单的子窗口创建与参数传递
- [Win32]创建模态窗口
- win32程序窗口的创建
- 建立一个win32窗口(用于开发游戏)
- C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口
- firefox扩展开发(二):用XUL创建窗口控件
- 用Win32 API创建不规则窗口
- win32sdk学习-创建一个对话框窗口
- win32窗口创建 之 CreateDialog和DialogBox
- java开发系统内核:实现窗口创建API,由DOS进入windows
- 跟我一起玩Win32开发(6):创建右键菜单
- win32 api 创建窗口的一个简单例子
- Win32创建一个简单的窗口
- Win32 SDK基础(3)—— 从零开始创建windows窗口(一)
- MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定)
- C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口
- MFC(一):win32创建一个最简单的窗口