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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2011, 23:25   #1
KOLANICH
Пользователь
 
Регистрация: 24.04.2010
Сообщений: 28
По умолчанию модальное окно в консольном приложении

как сделать модальное окно в консольном приложении?
то есть в приложении цикл обработки событий я не писал
создал окно с помощью createWindow, но оно без цикла обработки событий не пашед

Последний раз редактировалось KOLANICH; 20.07.2011 в 23:29.
KOLANICH вне форума Ответить с цитированием
Старый 20.07.2011, 23:51   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну так напишите цикл, ибо он обязателен для окон.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.07.2011, 23:57   #3
KOLANICH
Пользователь
 
Регистрация: 24.04.2010
Сообщений: 28
По умолчанию

как из него выйти?
он выполняется бесконечно, хотя события приходят заполненные нулями
Код:
LRESULT CALLBACK recWndFunc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
	RECT rcClient;
	PAINTSTRUCT ps;
	HDC hdc;
	switch(uMsg)
	{	case WM_LBUTTONDOWN:
			PostMessage(hwnd,WM_CLOSE,0,0);
		return 0;
		case WM_PAINT:
			hdc=BeginPaint(hwnd,&ps);
			TextOut(hdc,0,0,L"Close it",8);
			EndPaint(hwnd,&ps);
		return 0;
		case WM_SIZE:
			InvalidateRect(hwnd,NULL,1);
		return 0;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}



int showWindow(){
	MSG msg;
	HWND recWnd=CreateWindowEx(0,L"manRec",L"test",WS_OVERLAPPEDWINDOW,0,0,50,100,NULL,NULL,NULL,NULL);
	ShowWindow(recWnd,SW_SHOW);
	UpdateWindow(recWnd);
	
	while(GetMessage(&msg,recWnd,0,0)){//тут приходят сообщения,заполненные нулями, вместо того, чтобы выйти из цикла
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

Последний раз редактировалось KOLANICH; 21.07.2011 в 00:07.
KOLANICH вне форума Ответить с цитированием
Старый 21.07.2011, 01:16   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а кто будет обрабатывать сообщение WM_DESTROY?(в котором надо вызвать PostQuitMessage)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.07.2011, 22:15   #5
KOLANICH
Пользователь
 
Регистрация: 24.04.2010
Сообщений: 28
По умолчанию

в PostQuitMessage нельзя указать окно, ибо это выход из программы
а мне нужно закрыть окно и продолжить работу программы
а вообще, DefWindowProc должно обработать
KOLANICH вне форума Ответить с цитированием
Старый 24.07.2011, 22:24   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
в PostQuitMessage нельзя указать окно, ибо это выход из программы
вообще это обычно выход из цикла сообщений, а не из программы, кто вам это сказал то?
Цитата:
а вообще, DefWindowProc должно обработать
но не так как надо вам
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.07.2011, 23:29   #7
KOLANICH
Пользователь
 
Регистрация: 24.04.2010
Сообщений: 28
По умолчанию

Цитата:
вообще это обычно выход из цикла сообщений, а не из программы, кто вам это сказал то?
Цитата:
Indicates to the system that a thread has made a request to terminate (quit).
тут написано


мне следует написать
Код:
PostMessage(hwnd,WM_QUIT,0,0);
как обработчик WM_DESTROY?

Последний раз редактировалось KOLANICH; 24.07.2011 в 23:36.
KOLANICH вне форума Ответить с цитированием
Старый 02.08.2011, 22:53   #8
KOLANICH
Пользователь
 
Регистрация: 24.04.2010
Сообщений: 28
По умолчанию

не работает
KOLANICH вне форума Ответить с цитированием
Старый 02.08.2011, 23:00   #9
KOLANICH
Пользователь
 
Регистрация: 24.04.2010
Сообщений: 28
По умолчанию

с PostQuitMessage(0); тоже не пашед
KOLANICH вне форума Ответить с цитированием
Старый 02.08.2011, 23:46   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а почему у меня все работает?
Код:
#include <windows.h>
#include <iostream>

LRESULT CALLBACK recWndFunc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
	RECT rcClient;
	PAINTSTRUCT ps;
	HDC hdc;
	switch(uMsg)
	{	case WM_LBUTTONDOWN:
			PostMessage(hwnd,WM_CLOSE,0,0);
		return 0;
		case WM_PAINT:
			hdc=BeginPaint(hwnd,&ps);
			TextOutW(hdc,0,0,L"Close it",8);
			EndPaint(hwnd,&ps);
		           return 0;
		case WM_SIZE:
			InvalidateRect(hwnd,NULL,1);
		           return 0;
        case WM_DESTROY:
           PostQuitMessage(0);
           break;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}



int main()
{
           WNDCLASSW wc;
           ZeroMemory(&wc,sizeof(wc));
           wc.lpfnWndProc=recWndFunc;
           wc.lpszClassName=L"manRec";
           wc.hInstance=GetModuleHandle(0);
           RegisterClassW(&wc);
	MSG msg;
	HWND recWnd=CreateWindowExW(0,L"manRec",L"test",WS_OVERLAPPEDWINDOW,0,0,50,100,NULL,NULL,NULL,NULL);
	ShowWindow(recWnd,SW_SHOW);
	UpdateWindow(recWnd);
	std::cout<<"Before main cycle"<<std::endl;
	while(GetMessage(&msg,0,0,0)){//тут приходят сообщения,заполненные нулями, вместо того, чтобы выйти из цикла
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
           std::cout<<"After main cycle"<<std::endl;
	return 0;
}
Цитата:
тут написаноо
лучше б прочли дальше как оно работает
оно лишь показывает, что окна потока уничтожены, потому и должно посылаться либо главным, либо последним окном потока.

так же проблема в том что вы плохо прочли описание функции GetMessage, а именно назначение второго параметра.
изза этого вы ничего не могли получить от потока, так как вы ждали сообщение окна.(а WM_QUIT обычно сообщение потока)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
модальное окно JDialog legendary Общие вопросы по Java, Java SE, Kotlin 3 06.04.2011 03:14
Вывод в консольном приложении Акунёк Общие вопросы C/C++ 6 16.02.2011 18:01
Циклы - модальное окно aesoem Общие вопросы Delphi 3 05.11.2008 14:27
Модальное окно из Dll neo1109 Общие вопросы Delphi 0 29.06.2007 11:24