简介:
所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口。子窗口也是窗口,它有自己的回调函数、自己的窗口类、自己的创建。它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性。子窗口与主窗口之间是相联系的,它们通过句柄和消息等访问彼此的。

特别提醒:
后面所讲的子窗口控件是一种特殊的子窗口。子窗口控件不需要我们来定义窗口类,系统已经帮我们定义好了,我们自己引用就好。

这里我们先介绍普通子窗口。


一、子窗口的创建

创建过程:
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_OVERLAPPEDWINDOW WS_CHILDWINDOWWS_VISIBLE
水平位置 CW_USEDEFAULT 0(后面可通过MoveWindow函数修改)
垂直位置 CW_USEDEFAULT 0(后面可通过MoveWindow函数修改)
宽度 CW_USEDEFAULT 0(后面可通过MoveWindow函数修改)
高度 CW_USEDEFAULT 0(后面可通过MoveWindow函数修改)
父窗口句柄 NULL hwnd
菜单句柄/子ID NULL `(HMENU) (y << 8
实体句柄 hInstance (HINSTANCE)GetWindowLong (hwnd, GWL_HINSTANCE)(LPCREATESTRUCT)lParam->hInstance
额外参数lParam NULL NULL

子窗口是否显示可调用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
  • 将指定的消息发送到一个或多个窗口:SendMessage

GetWindowLongPrt函数:获取窗口信息

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可以实现。子窗口显示时就看不到图片,子窗口不显示能看到图片。子窗口隐藏状态时,子窗口就消失了,不能接受鼠标按下消息了。这里需要注意的是,当我们点击子窗口时,主窗口是收不到按键消息的,子窗口通过自己的回调函数处理消息。


代码如下:有注释的

#include <windows.h>
#include"strsafe.h"    // 安全字符串操作
// 定义回调函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);HINSTANCE hInst;   // 用来保存实例句柄,在下面创建子窗口CreateWindow用到
#define NUM 5    // 宏定义int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {WNDCLASSEX wc;HWND hwnd;MSG msg;//  注册主窗口类memset(&wc, 0, sizeof(wc));wc.style = CS_HREDRAW | CS_VREDRAW;wc.cbSize = sizeof(WNDCLASSEX);wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.lpszClassName = TEXT("WindowClass");wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);if (!RegisterClassEx(&wc)) {MessageBox(NULL, TEXT("Window Registration Failed!"), TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK);return 0;}// 注册子窗口类wc.cbClsExtra = sizeof(long);wc.hIcon = NULL;wc.lpfnWndProc = ChildWndProc;wc.lpszClassName = TEXT("ChildWindow");RegisterClassEx(&wc);// 创建主窗口hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("WindowClass"), TEXT("Caption"), WS_CAPTION|WS_SYSMENU,CW_USEDEFAULT, /* x */CW_USEDEFAULT, /* y */520, /* width */542, /* height */NULL, NULL, hInstance, NULL);hInst = hInstance;   // 保存实例句柄ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);if (hwnd == NULL) {MessageBox(NULL, TEXT("Window Creation Failed!"), TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK);return 0;}while (GetMessage(&msg, NULL, 0, 0) > 0) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}// 主函数回调函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc,mdc;static int cxClient, cyClient,x=0,cx,cy;static HWND childhwnd[NUM][NUM];HBITMAP bmp;int i, j;WCHAR str[100];switch (Message){// 创建25个子窗口case WM_CREATE:{for (i = 0; i < NUM; i++){for (j = 0; j < NUM; j++){childhwnd[i][j]=CreateWindowEx(0,TEXT("ChildWindow"), NULL, WS_CHILD|WS_VISIBLE,100*i, /* x */100*j, /* y */98, /* width */98, /* height */hwnd, (HMENU)(x++), hInst, NULL);}}break;}// 将赵丽颖美图贴上去,前面博客有讲case WM_PAINT:{hdc = BeginPaint(hwnd, &ps);mdc = CreateCompatibleDC(hdc);bmp = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCEW(101), IMAGE_BITMAP, 500, 500, LR_CREATEDIBSECTION);SelectObject(mdc, bmp);BitBlt(hdc, 0, 0, 500, 500, mdc, 0, 0, SRCCOPY);EndPaint(hwnd, &ps);break;}// 主窗口响应左键,显示子窗口case WM_LBUTTONDOWN:{cx = LOWORD(lParam);cy = HIWORD(lParam);i = cx/100;j =  cy/100;ShowWindow(childhwnd[i][j], SW_SHOW);  // 显示子窗口break;}case WM_DESTROY:{PostQuitMessage(0);break;}default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}// 子窗口回调函数
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;
}

作者说:
这世道真的是人善被人欺!你越不反抗,别人越没有什么畏惧,就喜欢来惹事欺负,她总以为自己有多么了不起。妈的,你们一家子是看着我妈好欺负是吧,有事没事就对我妈发脾气骂人,我妈这才上去几天,都到我妈住的地方故意来找事了,骂的话还那么难听,真的,要是我不在,不然我真想冲上去,我妈本来就身体不好,不能着急的,心疼我妈。这人真的是,自己人品有问题还说我妈,要是你人好,怎么会和自己婆婆一见面就吵架,都呆在娘家二十几年了吧,你有本事咋不回去,在厂里干个活,三天两天不是和这个吵就是和那个吵,和我妈还是娘家的表姐妹,有这样做姐妹的呀,我是天底下没见过,既然你们一家子也说了,亲戚能走就走,不能走就不走,我也觉得这样最好,我以后也不希望能沾你们的光,大路朝天各走一边。别人骂我妈心里不好受,在这里吐槽一下,希望大家理解。

Win32子窗口及其创建应用相关推荐

  1. mysql怎么创建窗口应用程序,Win32子窗口及其创建应用

    简介: 所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口.子窗口也是窗口,它有自己的回调函数.自己的窗口类.自己的创建.它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性.子 ...

  2. 中年人学C语言Windows程序设计,20子窗口的创建

    今天, 我们要学习的就是 子窗口控件 的使用. 在其他一些 Windows应用软件上我们经常能够看到一些大致相同的按钮.复选框.组合框.列表框等控件, 这些控件很有可能就是使用 标准子窗口控件 来实现 ...

  3. win32程序窗口的创建

    尽管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键. 如果你以前是C程序员或是MFC的忠实用户,只要你学习过C语言 ...

  4. 【转】Win32子窗口控件(按钮、编辑框、静态框、滚动条等)!!

    前言: 子窗口控件是特殊的子窗口,不需要我们注册窗口类,系统已经注册好了,我们只需要在创建时选择相应的窗口类名.常用的子窗口控件有按钮BUTTON.组合框COMBOBOX.编辑框EDIT.列表框LIS ...

  5. API之子窗口创建 (转)

    子窗口的创建非常非常重要 步骤:1.新建窗口类,在窗口类中指名对应的自定义的窗口过程.窗口类类名要唯一,它 是各窗口类相互区别的标识.注意,类名或为静态变量,或为全局变量,因为程 序随时都用他们. 2 ...

  6. System.InvalidOperationException:“寄宿 HWND 必须是子窗口。”

    当试图在 WPF 窗口中嵌套显示 Win32 子窗口的时候,你有可能出现错误:"System.InvalidOperationException:"寄宿 HWND 必须是子窗口.& ...

  7. 窗口的创建CreateWindow/CreateWindowEx函数使用说明

    CreateWindow/CreateWindowEx      HWND CreateWindowEx(   DWORD dwExStyle,      // 窗口的扩展风格.   LPCTSTR ...

  8. System.InvalidOperationException:“寄宿的 HWND 必须是指定父级的子窗口。”

    当试图在 WPF 窗口中嵌套显示 Win32 子窗口的时候,你有可能出现错误:"寄宿的 HWND 必须是指定父级的子窗口.". 这是很典型的 Win32 错误,本文介绍如何修复此错 ...

  9. win32开发(创建子窗口)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在win32中,有的时候需要创建额外的子窗口.所谓子窗口的概念,就是窗口本身不会超出母窗口的边界 ...

最新文章

  1. vc6静态库的生成和调用
  2. 第九课.Python文件操作
  3. 服务器挖chia用什么系统,Chia是什么?Chia挖矿服務器配置
  4. java中顺式和链式_Java单链表顺序和链式实现(数据结构五)
  5. 设计模式学习—Strategy(策略)
  6. Rails开发细节《七》ActiveRecord Associations关联
  7. NeurIPS 2019 | 用于弱监督图像语义分割的新型损失函数
  8. mysql的limit有什么缺陷_mysql中使用limit时,explain带来的问题分析
  9. 线性表9 - 数据结构和算法14
  10. eps提取高程点在哪里_Eps总结(3)——Eps使用点云生成等高线及高程点
  11. 《大型网站技术架构》阅读笔记
  12. cholesky分解_FM因子分解机的原理、公式推导、Python实现和应用
  13. WiFi 802.11可调参数说明---信标间隔(Beacon Interval)
  14. linux系统文件颜色所代表的意思
  15. ISM无需授权使用的无线频率
  16. 十进制、八进制和十六进制,各种进制存在的意义,为什么要设计出来?
  17. 春招进行时:简历信息安全危机
  18. 单相电枢绕组产生的磁通势
  19. SAP 采购申请、采购订单的审批策略
  20. 24点计算器问题[C++实现]

热门文章

  1. 台湾联咏对标海思AI+IPC芯片规格对比列表
  2. 联咏(Novatek)NT98562M/NT98566M成像处理器Datasheet、SDK工具包下载
  3. 深入IAT HOOK
  4. 基于activex插件的海康大华网页版的播放(一)
  5. 【原创】线性代数学习笔记——剑桥食谱
  6. #css动画# 【四】如何实现鼠标经过盒子,盒子向上移动且有阴影?
  7. 编码字体与阅读字体推荐
  8. php 安装SG11扩展教程
  9. Python九九乘法表(矩形、上三角、下三角)
  10. XML和XSL生成类PowerPoint组织结构图