Win32简单的子窗口创建与参数传递

来源:互联网 发布:人类灭亡 知乎 编辑:程序博客网 时间:2024/05/18 02:38

Win32简单的子窗口创建与参数传递


环境


VS2012  win32项目

需求

设计一个窗口程序,包含两个窗口类:主窗口和子窗口,主窗口有一个,子窗口有5个,在主窗口中中间显示一个整数,显示的整数是子窗口发送过来的;子窗口显示在主窗口的客户区内的左上角,依次排开,子窗口大小为100*100,在子窗口中显示一个整数。

思路

1、使用TEXTOUTDRAWTEXT输出字符串,使用sprintfitoa将整数转换为字符数组;

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

运行截图


感谢浏览,若存在不正确或本人理解有无误的地方还请大家指正 再次感谢。