Win32简单的子窗口创建与参数传递
来源:互联网 发布:人类灭亡 知乎 编辑:程序博客网 时间:2024/05/18 02:38
Win32简单的子窗口创建与参数传递
环境
VS2012 win32项目
需求
设计一个窗口程序,包含两个窗口类:主窗口和子窗口,主窗口有一个,子窗口有5个,在主窗口中中间显示一个整数,显示的整数是子窗口发送过来的;子窗口显示在主窗口的客户区内的左上角,依次排开,子窗口大小为100*100,在子窗口中显示一个整数。
思路
1、使用TEXTOUT或DRAWTEXT输出字符串,使用sprintf或itoa将整数转换为字符数组;
2、在主窗口中定义一个静态的整型变量,和一个长度为5的静态整型数组,用一个循环生成子窗,并将数组中的第i个整数传递给子窗口过程,在子窗口的WM_CREATE中接收参数并存储到窗口的扩展空间中(使用SetWindowLong),在WM_PAINT中取出所存储变量(使用GetWindowLong)并输出,当鼠标左键落下时取出所存储变量并使用SendMessage发送自定义消息;当主窗口接收到自定义消息时,将收到的数据存储到自己的变量中并刷新客户区。
代码实现
创建项目名为
Test_Child_Mes
代码段中
//@Dawei
//End 是本人填写的内容 其他为自动生成
以下为全部代码:
// Test_Child_Mes.cpp : 定义应用程序的入口点。//#include "stdafx.h"#include "Test_Child_Mes.h"#define MAX_LOADSTRING 100//@Dawei#define WM_CHANGE_NUM WM_USER+1 //添加自己建立的WM//End// 全局变量:HINSTANCE hInst;// 当前实例TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名//@DaweiTCHAR szNumBtnClass[]=TEXT("NumBtn"); //子窗口类名//End// 此代码模块中包含的函数的前向声明:ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);//@DaweiLRESULT CALLBACK WndNumBtnProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //子窗口回调函数声明//Endint APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。MSG msg;HACCEL hAccelTable;// 初始化全局字符串LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_TEST_CHILD_MES, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST_CHILD_MES));// 主消息循环:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;}//// 函数: MyRegisterClass()//// 目的: 注册窗口类。//ATOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST_CHILD_MES));wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= MAKEINTRESOURCE(IDC_TEST_CHILD_MES);wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));if(!RegisterClassEx(&wcex)) //判断主窗口是否注册成功return FALSE;//@Daweiwcex.lpszClassName=szNumBtnClass;wcex.lpszMenuName=NULL;wcex.lpfnWndProc=WndNumBtnProc;wcex.cbWndExtra=8;if(!RegisterClassEx(&wcex)) //判断子窗口是否注册成功return FALSE;//Endreturn TRUE;}//// 函数: InitInstance(HINSTANCE, int)//// 目的: 保存实例句柄并创建主窗口//// 注释://// 在此函数中,我们在全局变量中保存实例句柄并// 创建和显示主程序窗口。//BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE;}//// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)//// 目的: 处理主窗口的消息。//// WM_COMMAND- 处理应用程序菜单// WM_PAINT- 绘制主窗口// WM_DESTROY- 发送退出消息并返回////LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;//@DaweiRECT rt;HWND hWndChildNum;int i;static INT numTrans;char numTemp[10];static INT aNum[5]={1,2,3,4,5};//Endswitch (message){case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// 分析菜单选择:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;//@Daweicase WM_CREATE:for(i=0;i<5;i++){//创建五个子窗口hWndChildNum=CreateWindow(szNumBtnClass,NULL,WS_CHILD|WS_BORDER,i*100,0,100,100,hWnd,NULL,hInst,(LPVOID)aNum[i]);ShowWindow(hWndChildNum,SW_NORMAL);}numTrans=aNum[0]; // 设置初始值为aNun[0]break;case WM_CHANGE_NUM:numTrans=(INT)lParam;InvalidateRect(hWnd,NULL,TRUE);break;//Endcase WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...//@DaweiGetClientRect(hWnd,&rt);wchar_t str[10];_itow_s(numTrans,str,10); //将原本int类型转为char 留作显示TextOut(hdc,200,200,str,1);//EndEndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// “关于”框的消息处理程序。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;}//@DaweiLRESULT CALLBACK WndNumBtnProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;INT numTrans;RECT rt;switch (message){case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);case WM_CREATE:numTrans=(INT)((LPCREATESTRUCT)lParam)->lpCreateParams;SetWindowLong(hWnd,0,numTrans);break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...GetClientRect(hWnd,&rt);numTrans=(INT)GetWindowLong(hWnd,0); //获取子窗口中的数字wchar_t str[10];_itow_s(numTrans,str,10); //将原本int类型转为char 留作显示TextOut(hdc,30,30,str,1);EndPaint(hWnd, &ps);break;case WM_LBUTTONDOWN:numTrans=(INT)GetWindowLong(hWnd,0);SendMessage(GetParent(hWnd),WM_CHANGE_NUM,(WPARAM)0,(LPARAM)numTrans);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}//End
运行截图
感谢浏览,若存在不正确或本人理解有无误的地方还请大家指正 再次感谢。
阅读全文
0 0
- Win32简单的子窗口创建与参数传递
- 子窗口与父窗口的控制及参数传递
- win32 简单窗口的创建及参数介绍
- 窗体传递参数给有BPL包创建的MDI子窗口中的参数
- WIN32汇编: 3.创建简单的窗口
- Win32汇编:创建简单的窗口
- Win32创建一个简单的窗口
- 关于父,子窗口的传递参数的试验
- 父窗口与子窗口的数据传递问题
- 子窗口与父窗口的消息传递
- 子窗口与父窗口的消息传递
- JS 子窗口与父窗口间的数据传递
- JS 子窗口与父窗口间的数据传递
- win32开发(创建子窗口)
- win32窗口的创建,GDI简单的绘图操作
- Win32 dll 的简单创建与使用
- win32 api 创建窗口的一个简单例子
- Win32汇编教程3 - 创建简单的窗口
- Ubuntu 16.04 LTS安装Qt Creator
- windows提权的几种姿势
- jQuery Mobile 列表视图
- ZKFC(Zookeeper Failover Controller)原理【详细版】
- 用户体验和印象分
- Win32简单的子窗口创建与参数传递
- 利用数组找出100以内的奇数、偶数将它们分别输出
- Redis
- Html助手和Request组件 [ 2.0 版本 ]
- 有序广播和无序广播
- 微服务,微架构[十三]springboot集成RabbitMQ
- 理解OAuth 2.0
- Windows 0day成功验证之ETERNALBLUE 本帖由春秋首发~作者:神风 @春秋文阁负责人 方程式又一波0day【该贴有工具】:https://bbs.ichunqiu.com/thr
- 子查询相关问题