Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2015, 22:42   #1
justfor
Пользователь
 
Регистрация: 09.02.2015
Сообщений: 12
По умолчанию Проблема с созданием второго окна

Здравствуйте, только начинаю изучать WinApi.
У меня есть основное окно, и несколько остальных - нужно чтобы по нажатию на кнопку закрытия (крестик) из главного окна прога закрывалась, а из других - просто закрывалось текущее окно. Поэтому, я создал 2 класса.
Проблема в самом создании. У меня получается так, что второе окно полностью идентично первому.

Вот winmain:

Код:
int 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_WIN32PROJECT4, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);
	LoadString(hInstance, IDC_WIN32PROJECT4, szWindowClassDemo, MAX_LOADSTRING);
	MyRegisterClassDemo(hInstance);

	// Выполнить инициализацию приложения:
	if (!InitInstance (hInstance, nCmdShow)) return FALSE;

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT4));

	// Цикл основного сообщения:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int) msg.wParam;

}
Создаю классы так:

Код:
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_WIN32PROJECT4));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT + 11);
	wcex.lpszMenuName	= 0;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

ATOM MyRegisterClassDemo(HINSTANCE hInstance) {
	WNDCLASSEX childwcex;

	childwcex.cbSize = sizeof(WNDCLASSEX);

	childwcex.style = CS_HREDRAW | CS_VREDRAW;
	childwcex.lpfnWndProc = WndProcDemo;
	childwcex.cbClsExtra = 0;
	childwcex.cbWndExtra = 0;
	childwcex.hInstance = hInstance;
	childwcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT4));
	childwcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	childwcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 8);
	childwcex.lpszMenuName = 0;
	childwcex.lpszClassName = szWindowClassDemo;
	childwcex.hIconSm = LoadIcon(childwcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&childwcex);
}
Далее:

Код:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;
	HWND hBarrierWnd;
    hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

    const int w = 790, h = 560;
    int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2;
    int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2;

    hWnd = CreateWindowEx(0x00000100, szWindowClass, L"Алгоритмы поиска",
		WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, x, y, w, h,
	    NULL, NULL, hInstance, NULL);

    hBarrierWnd = CreateWindowEx(0x00000100, szWindowClassDemo, L"Поиск с барьером",
	   WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, x, y, w, h,
	   NULL, NULL, hInstance, NULL);

	if (!hWnd || !hBarrierWnd) return FALSE;

    ShowWindow(hWnd, nCmdShow);
	ShowWindow(hBarrierWnd, nCmdShow);
    UpdateWindow(hWnd);
	UpdateWindow(hBarrierWnd);

    return TRUE;
}
После чего я создаю две функции:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
И
LRESULT CALLBACK WndProcDemo(HWND hBarrierWnd, UINT message, WPARAM wParam, LPARAM lParam)

Но второе окно полностью повторяет первое.

Подскажите, пожалуйста, в чем ошибка.
justfor вне форума Ответить с цитированием
Старый 11.02.2015, 06:52   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Процитируйте WndProcDemo
В оконной процедуре дочернего окна WndProcDemo, код которой вы не процитировали, при получении сообщения WM_DESTROY вызывать функцию PostQuitMessage(NULL); не нужно. М.б. поэтому закрывается вся программа.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 11.02.2015, 12:04   #3
justfor
Пользователь
 
Регистрация: 09.02.2015
Сообщений: 12
По умолчанию

Код:
LRESULT CALLBACK WndProcDemo(HWND hBarrierWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;
 
        switch (message) {
        case WM_COMMAND:
 
                break;
        case WM_PAINT:

                break;
        case WM_DESTROY:
 
                break;
        default:
                return DefWindowProc(hBarrierWnd, message, wParam, lParam);
        }
        return 0;
}
Даже так - всё равно закрывается вся программа.
justfor вне форума Ответить с цитированием
Старый 11.02.2015, 12:16   #4
justfor
Пользователь
 
Регистрация: 09.02.2015
Сообщений: 12
По умолчанию

При чем у меня hbrBackground для обеих двух разное, но после запуска в обеих окнах это значение одинаковое (как у первого класса основного окна)

Последний раз редактировалось justfor; 11.02.2015 в 12:27.
justfor вне форума Ответить с цитированием
Старый 11.02.2015, 15:37   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А szWindowClassDemo и szWindowClass точно разные строки?
Выложили бы весь код, а то так кусками гадать...

Кстати, все сообщения лучше передавать в DefWindowProc, если нет веской причины этого не делать.
Цвета какието странные - (COLOR_WINDOW + 8)... зачем +8?

Последний раз редактировалось waleri; 11.02.2015 в 15:40.
waleri вне форума Ответить с цитированием
Старый 11.02.2015, 15:52   #6
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Пример создания MDI приложения во вложении
Вложения
Тип файла: zip mdil.zip (32.7 Кб, 9 просмотров)
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 11.02.2015, 16:02   #7
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Если поменять
Код:
 hBarrierWnd = CreateWindowEx(0x00000100, szWindowClassDemo, L"Поиск с барьером",
WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, x, y, w, h,
	   NULL, NULL, hInstance, NULL);
на
Код:
 hBarrierWnd = CreateWindowEx(0x00000100, szWindowClassDemo, L"Поиск с барьером",
WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, x, y, w, h,
	   hWnd, NULL, hInstance, NULL);
то это устранило проблему?
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 11.02.2015, 19:18   #8
justfor
Пользователь
 
Регистрация: 09.02.2015
Сообщений: 12
По умолчанию

challengerr, нет, не решает.

Привожу весь код

Код:
#include "stdafx.h"
#include "Win32Project4.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst;								// текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];					// Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];			// имя класса главного окна
TCHAR szWindowClassDemo[MAX_LOADSTRING];	    // имя класса окон демонстрации

// Отправить объявления функций, включенных в этот модуль кода:
ATOM				MyRegisterClass(HINSTANCE hInstance);
ATOM				MyRegisterClassDemo(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	WndProcDemo(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    ShowTheory(HWND, UINT, WPARAM, LPARAM);

int 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_WIN32PROJECT4, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);
	LoadString(hInstance, IDC_WIN32PROJECT4, szWindowClassDemo, MAX_LOADSTRING);
	MyRegisterClassDemo(hInstance);

	// Выполнить инициализацию приложения:
	if (!InitInstance (hInstance, nCmdShow)) return FALSE;

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT4));

	// Цикл основного сообщения:
	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_WIN32PROJECT4));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT + 11);
	wcex.lpszMenuName	= 0;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

ATOM MyRegisterClassDemo(HINSTANCE hInstance) {
	WNDCLASSEX childwcex;

	childwcex.cbSize = sizeof(WNDCLASSEX);

	childwcex.style = CS_HREDRAW | CS_VREDRAW;
	childwcex.lpfnWndProc = WndProcDemo;
	childwcex.cbClsExtra = 0;
	childwcex.cbWndExtra = 0;
	childwcex.hInstance = hInstance;
	childwcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT4));
	childwcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	childwcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 8);
	childwcex.lpszMenuName = 0;
	childwcex.lpszClassName = szWindowClassDemo;
	childwcex.hIconSm = LoadIcon(childwcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&childwcex);
}

//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;
	HWND hBarrierWnd;
    hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

    const int w = 790, h = 560;
    int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2;
    int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2;

    hWnd = CreateWindowEx(0x00000100, szWindowClass, L"Алгоритмы поиска",
		WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, x, y, w, h,
	    NULL, NULL, hInstance, NULL);

	hBarrierWnd = CreateWindowEx(0x00000100, szWindowClassDemo, L"Поиск с барьером",
		WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, x, y, w, h,
		hWnd, NULL, hInstance, NULL);

	if (!hWnd || !hBarrierWnd) return FALSE;

    ShowWindow(hWnd, nCmdShow);
    ShowWindow(hBarrierWnd, nCmdShow);
    UpdateWindow(hWnd);
    UpdateWindow(hBarrierWnd);

    return TRUE;
}

//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND	- обработка меню приложения
//  WM_PAINT	-Закрасить главное окно
//  WM_DESTROY	 - ввести сообщение о выходе и вернуться.
//
//
justfor вне форума Ответить с цитированием
Старый 11.02.2015, 19:18   #9
justfor
Пользователь
 
Регистрация: 09.02.2015
Сообщений: 12
По умолчанию

Далее: (не вместилось)
Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message) {
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);

		switch (wmId) {
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);

		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

LRESULT CALLBACK WndProcDemo(HWND hBarrierWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message) {
	case WM_COMMAND:

		break;
	case WM_PAINT:

		break;
	case WM_DESTROY:

		break;
	default:
		return DefWindowProc(hBarrierWnd, message, wParam, lParam);
	}
	return 0;
}
justfor вне форума Ответить с цитированием
Старый 11.02.2015, 20:40   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

LoadString(hInstance, IDC_WIN32PROJECT4, szWindowClass, MAX_LOADSTRING);
LoadString(hInstance, IDC_WIN32PROJECT4, szWindowClassDemo, MAX_LOADSTRING);

Имена одинаковые!
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод на экран второго окна quakush Общие вопросы Delphi 5 17.09.2013 11:18
Проблема с созданием дочернего окна в WinApi в VS2005 RomanGorbunov Win Api 4 15.03.2011 20:55
Проблема с созданием окна в Win32 Magnuse Win Api 7 16.02.2011 16:13
Создание второго окна zotox Win Api 0 30.12.2010 17:09
Проблема с созданием окна(CreateWindow) в отдельном потоке Sc0rp Win Api 4 26.03.2009 22:49