Win32子窗口及其创建应用 |
您所在的位置:网站首页 › windows窗口程序 › Win32子窗口及其创建应用 |
简介: 所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口。子窗口也是窗口,它有自己的回调函数、自己的窗口类、自己的创建。它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性。子窗口与主窗口之间是相联系的,它们通过句柄和消息等访问彼此的。 特别提醒: 后面所讲的子窗口控件是一种特殊的子窗口。子窗口控件不需要我们来定义窗口类,系统已经帮我们定义好了,我们自己引用就好。 这里我们先介绍普通子窗口。 一、子窗口的创建创建过程: 1.注册窗口类(我们在主窗口注册后面接着注册子窗口) 2.创建子窗口(一般在WS_CREATE消息处理中创建,和创建主窗口一样使用CreateWindow函数,参数不同哦,需加上WS_CHILD和WS_VISIBLE风格) 3.定义子窗口的回调函数(子窗口回调函数和主窗口回调函数大致一样,改下函数名) 1.注册窗口类子窗口类参数基本和主窗口一样,一般只需修改一下四个参数即可。 // 注册主窗口后面,修改四个参数 wc.cbClsExtra = sizeof(long); // 预留空间 wc.hIcon = NULL; // 图标设为空 wc.lpfnWndProc = ChildWndProc; // 回调函数 wc.lpszClassName = TEXT("ChildWindow"); // 子窗口类名 // 注册子窗口类 RegisterClassEx(&wc); 2.创建子窗口CreateWindow参数的比较: 参数主窗口子窗口窗口类名自己定义自己定义窗口标题自己定义NULL窗口样式WS_OVERLAPPEDWINDOWWS_CHILDWINDOW 和 WS_VISIBLE水平位置CW_USEDEFAULT0(后面可通过MoveWindow函数修改)垂直位置CW_USEDEFAULT0(后面可通过MoveWindow函数修改)宽度CW_USEDEFAULT0(后面可通过MoveWindow函数修改)高度CW_USEDEFAULT0(后面可通过MoveWindow函数修改)父窗口句柄NULLhwnd菜单句柄/子IDNULL`(HMENU) (y hInstance额外参数lParamNULLNULL子窗口是否显示可调用ShowWindow函数进行修改,窗口的大小、位置可以通过MoveWindow函数进行修改。 // 创建25个子窗口 case WM_CREATE: { for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { childhwnd[i][j]=CreateWindow(TEXT("ChildWindow"), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0 ,0, hwnd, (HMENU)(x++), (HINSTANCE)GetWindowLong (hwnd, GWL_HINSTANCE), NULL); } } break; } 3.定义子窗口回调函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); // 主窗口回调函数 LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); // 子窗口回调函数 LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_LBUTTONDOWN: { ShowWindow(hwnd, SW_HIDE); break; } default: return DefWindowProc(hwnd, Message, wParam, lParam); //让系统处理消息,这条语句一定要加上 } return 0; } 二、子窗口与主窗口的联系 1.主窗口访问子窗口(发送消息) 获取窗口信息:GetWindowLongPrt获取指定控件的ID号: GetDlgCtrlID获取指定ID的句柄:GetDlgItem改变指定窗口的位置和大小: MoveWindow将指定的消息发送到一个或多个窗口:SendMessageGetWindowLongPrt函数:获取窗口信息 LONG_PTR GetWindowLongPtr(HWND hWnd, // 窗口句柄 int nIndex); // 获取的信息指定值 参数含义GWL_EXSTYLE获取扩展窗口样式。更多信息,查阅CreateWindowEx.GWL_STYLE获取窗口样式(window styles)GWLP_WNDPROC获取窗口程序指示器,或描述指示器的句柄 。如果使用此参数,必须使用CallWindowProc回调函数。GWLP_HINSTANCE获取一个应用程序实例的句柄 。GWLP_HWNDPARENT如果只有一个父窗口,获取父窗口的句柄 。GWLP_ID获取窗口标识符。GWLP_USERDATA获取窗口关联的数据,是应用程序创建窗口时留给用户的数据。初始值是0。DWLP_DLGPROC获取一个对话框的指示器,或描述指示器的句柄 。如果使用此参数,必须使用CallWindowProc回调函数。DWLP_MSGRESULT获取一个对话框中的被处理的信息的值。DWLP_USER作为指示器或句柄来获取私有应用程序的额外的信息。GetDlgCtrlID函数:获取指定控件的ID号 ID是针对子窗体而言的,窗体时把这个ID号传递给hMenu参数。 int GetDlgCtrlID(HWND hwndCtl); // 子窗口句柄GetDlgItem函数:获取指定ID的句柄 HWND childhwnd = GetDlgItem(Parenthwnd,ID);MoveWindow函数:改变指定窗口的位置和大小 对基窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.对于Owned窗口,位置和大小取决于屏幕左上角. BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint ); // TRUE重画,FALSE不重画SendMessage函数:将指定的消息发送到一个或多个窗口 SendMessage函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。 PostMessage函数是将一个消息寄送到一个线程的消息队列后就立即返回。 LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam) 2.子窗口访问主窗口(发送消息) 获得一个指定子窗口的父窗口句柄:GetParent将指定的消息发送到一个或多个窗口:SendMessage HWND GetParent(HWND hWnd); 三、子窗口的应用:翻牌简介: 这里创建了25个子窗口,开始设置25个子窗口都可见,后面主窗口和子窗口分别相应鼠标左键按下的消息,主窗口收到消息显示子窗口,子窗口收到消息隐藏子窗口,ShowWindow可以实现。子窗口显示时就看不到图片,子窗口不显示能看到图片。子窗口隐藏状态时,子窗口就消失了,不能接受鼠标按下消息了。这里需要注意的是,当我们点击子窗口时,主窗口是收不到按键消息的,子窗口通过自己的回调函数处理消息。
作者说: 这世道真的是人善被人欺!你越不反抗,别人越没有什么畏惧,就喜欢来惹事欺负,她总以为自己有多么了不起。妈的,你们一家子是看着我妈好欺负是吧,有事没事就对我妈发脾气骂人,我妈这才上去几天,都到我妈住的地方故意来找事了,骂的话还那么难听,真的,要是我不在,不然我真想冲上去,我妈本来就身体不好,不能着急的,心疼我妈。这人真的是,自己人品有问题还说我妈,要是你人好,怎么会和自己婆婆一见面就吵架,都呆在娘家二十几年了吧,你有本事咋不回去,在厂里干个活,三天两天不是和这个吵就是和那个吵,和我妈还是娘家的表姐妹,有这样做姐妹的呀,我是天底下没见过,既然你们一家子也说了,亲戚能走就走,不能走就不走,我也觉得这样最好,我以后也不希望能沾你们的光,大路朝天各走一边。别人骂我妈心里不好受,在这里吐槽一下,希望大家理解。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |