Шаг 170 - Создание дочерних окон на C

Это довольно упрощенный пример для шага "1.26.2 Создание, перечисление и изменение размеров дочерних окон". Все максимально упрощено. За основу взят шаг "1.2 Окно Рабочего стола". Вот в него мы и добавляем изменения. Итак, смотрим код.

// ChildWin.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "windows.h"
#include "windowsx.h"

// Идентификаторы окон
#define ID_FIRSTCHILD	100
#define ID_SECONDCHILD	101
#define ID_THIRDCHILD	102


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM,LPARAM);

HINSTANCE hinst;

int APIENTRY WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	HWND hwnd;
	MSG msg;
	WNDCLASS w;
	hinst=hInstance;
	memset(&w,0,sizeof(WNDCLASS));
	w.style = CS_HREDRAW | CS_VREDRAW;
	w.lpfnWndProc = WndProc;
	w.hInstance = hInstance;
	w.hbrBackground = GetStockBrush(WHITE_BRUSH);
	w.lpszClassName = "C Windows";
	w.hCursor=LoadCursor(NULL,IDC_ARROW); 
	RegisterClass(&w);
	hwnd = CreateWindow("C Windows","C Windows", WS_OVERLAPPEDWINDOW,
		10,10,600,480,NULL,NULL,hInstance,NULL);
	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
	switch(Message)
	{
	case WM_CREATE:	// создание основного окна
		for (int i = 0; i < 3; i++)	// Создание трех  дочерних окна
		{
			WNDCLASS w;
			memset(&w,0,sizeof(WNDCLASS));
			w.lpfnWndProc = ChildProc;
			w.hInstance = hinst;
			w.hbrBackground = GetStockBrush(WHITE_BRUSH);
			w.lpszClassName = "ChildWClass";
			w.hCursor=LoadCursor(NULL,IDC_CROSS); 
			RegisterClass(&w);
			HWND child;
			child=CreateWindowEx(0,"ChildWClass",(LPCTSTR) NULL,
				WS_CHILD | WS_BORDER | WS_VISIBLE ,i*10,i*10,
				50,50,hwnd,(HMENU) (int) (ID_FIRSTCHILD + i),hinst,NULL);
			ShowWindow(child,SW_NORMAL);
			UpdateWindow(child);
		}
		return 0;
	}

	if (Message == WM_DESTROY )
	{
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,Message,wparam,lparam);
}


LRESULT CALLBACK ChildProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
	if (Message == WM_DESTROY )
	{
		return 0;
	}
	return DefWindowProc(hwnd,Message,wparam,lparam);
}

В момент обработки сообщения WM_CREATE мы создаем дочерние окна, для этого нужно сделать все естественно, зарегистрировать класс окна, вызвать функцию CreateWindow. Нужно создать функцию обработки сообщений ChildProc. Все мы это сделали. И как результат окна с дочерними окнами.

Если обратили внимание, я добавил разные описания курсоров:

// родительское окно
w.hCursor=LoadCursor(NULL,IDC_ARROW);
// дочернее окно
w.hCursor=LoadCursor(NULL,IDC_CROSS);

Вы можете поводить мышкой и увидите, что курсор в дочернем окне изменяться.


Загрузить проект | Предыдущий Шаг | Оглавление
Автор Каев Артем - 04.12.2001