<Win32_10>子窗口的应用——翻转窗口
来源:互联网 发布:java三大框架教程 编辑:程序博客网 时间:2024/05/21 10:42
本文由BlueCoder编写 转载请说明出处:
http://blog.csdn.net/crocodile__/article/details/9902475
我的邮箱:bluecoder@yeah.net 欢迎大家和我交流编程心得
我的微博:BlueCoder_黎小华 欢迎光临^_^
在windows程序中,子窗口的应用很常见,基本上大部分窗口都有其指定的子窗口,这些子窗口统统受其父窗口的管理,各自实现相应的功能
老规矩,先简述今天的实例程序所实现的功能:
在父窗口中先绘制一张位图,然后在其之上创建36个子窗口,点击子窗口隐藏,点击改子窗口占据父窗口的区域就重新显示该子窗口。
比较好玩儿,可以拼出很多好看的图形,来看看效果吧:
OK,赏析完了,就来具体研究一下它的实现细节……
在看代码细节之前,先来学习一个函数:
BOOL MoveWindow( HWND hWnd, // handle to window int X, // horizontal position int Y, // vertical position int nWidth, // width int nHeight, // height BOOL bRepaint // repaint option);
这个函数可用于移动一个窗口,同时改变窗口的size(大小),在创建子窗口中能用到
阅读代码细节:
(1)父窗口和子窗口类的注册
wndclass.style= CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc= WndProc;wndclass.cbClsExtra= 0;wndclass.cbWndExtra= 0;wndclass.hInstance= hInstance;wndclass.hIcon= LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor= LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName= NULL;wndclass.lpszClassName= szAppName;//注册父窗口类if(!RegisterClass(&wndclass)){MessageBox(NULL, TEXT("This program requires Windows NT!"),szAppName, MB_ICONERROR);return 0;}wndclass.lpfnWndProc= ChildWndProc;wndclass.hIcon= NULL;wndclass.lpszClassName= szChildName;//注册子窗口类RegisterClass(&wndclass);
(2)由于这里的子窗口都是做同样一件事——响应鼠标左键消息,隐藏自己,因此我们只需要一个回调函数
你可能会有一个疑虑:
程序怎么知道我们点击的是哪一个子窗口呢?
问得好。不过你可能忘记了一点,windows是如何管理、定位在它上面运行的所有程序(窗口)呢?
这里子窗口的定位和其它窗口(包括父窗口)都是由windows来统一确定,无需我们的父窗口来操心
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//父窗口回调函数LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);//子窗口回调函数
(3)在父窗口的WM_CREATE消息中获取位图信息和创建子窗口
a)在WM_PAINT消息中贴位图,这个我就不再赘述了,不熟悉的朋友可以查看我之前写的关于Bitmap位图应用的博文
b)创建子窗口
用一个for循环
/* 创建子窗口 */for(i=0; i<DIVISIONS; i++)for(j=0; j<DIVISIONS; j++)hwndChild[i][j] = CreateWindow(szChildName, NULL, WS_CHILD | WS_VISIBLE,0, 0, 0, 0,hwnd, NULL, hInstance, NULL);因为在CREATE消息中我们还不能确定父窗口客户区大小,所以还需要在WM_SIZE消息中移动一下创建的子窗口
case WM_SIZE://确定父窗口客户区大小cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);//确定子窗口大小cxChild = cxClient / DIVISIONS;cyChild = cyClient / DIVISIONS;/* 移动子窗口 */for(i=0; i<DIVISIONS; i++)for(j=0; j<DIVISIONS; j++)MoveWindow(hwndChild[i][j], i * (cxChild + 1), j * (cyChild + 1),//加1是为了让子窗口之间有一个明显的间隙cxChild, cyChild, TRUE);return 0;
(4)在父窗口的左键按下消息中显示子窗口
/*因为在子窗口中通过鼠标消息隐藏,这时父窗口的该区域就可见,因此我们可以让父窗口通过鼠标消息显示子窗口*/case WM_LBUTTONDOWN:{int xMouse, yMouse;xMouse = LOWORD(lParam);yMouse = HIWORD(lParam);for(i=0; i<DIVISIONS; i++)for(j=0; j<DIVISIONS; j++)//如果鼠标点击位置在子窗口上,就显示if((xMouse >= i * cxChild && xMouse < (i+1) * cxChild)&& (yMouse >= j * cyChild && yMouse < (j+1) * cyChild)){ShowWindow(hwndChild[i][j], SW_SHOW);return 0;}}return 0;
(5)子窗口的回调函数
//子窗口回调函数LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){switch(message){//点击子窗口时隐藏case WM_LBUTTONDOWN:ShowWindow(hwnd, SW_HIDE);return 0;}return DefWindowProc (hwnd, message, wParam, lParam);}
以上就是今天的内容,欢迎各位的品读^_^……
点击下载源代码以及相关资源
- <Win32_10>子窗口的应用——翻转窗口
- 子窗口的透明
- 子窗口的调用;
- 子窗口的创建
- Win32 SDK基础(7)—— 怎样创建一个窗口的子窗口
- QT 子窗口—>主窗口 信号和槽的交互
- 子窗口刷新父窗口的问题
- 子窗口对父窗口的修改
- 父窗口与子窗口的操作
- 父窗口调用子窗口的值
- 子窗口使用父窗口的控件
- 父窗口调用子窗口的按钮
- 父窗口调用子窗口的按钮
- Iframe的应用以及父窗口和子窗口的相互访问
- 子窗口父窗口
- 子窗口传值至父窗口
- 关于模态窗口,子窗口刷新父窗口的
- jquery 获取父窗口的元素 父窗口 子窗口
- 系统调用原理
- ScriptManager的简单用法
- JAVA匿名内部类
- c++ windows下读取大文件(内存映射)
- hdu 2255 奔小康赚大钱 (KM算法 二分图最佳完美匹配 模板)
- <Win32_10>子窗口的应用——翻转窗口
- index range scan,index fast full scan,index skip scan发生的条件
- Nginx源码分析--字符串处理
- 强大的Android系统,可自由修改手机型号、SDK版本号等信息。
- <内核控制路径>
- MD5 算法实现(c++)
- Google Chrome源码下载
- Typedef与define解析
- 理解和使用蓝牙BlueZ中的FTP与PBAP协议