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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2010, 19:07   #1
Gtx541
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 24
Радость Рисование окна в редакторе ресурсов...

Как с помощью WinAPI вывести на экран окно, нарисованное в редакторе ресурсов?
MS VC++
Gtx541 вне форума Ответить с цитированием
Старый 05.08.2010, 01:43   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

DialogBox, CreateDialog
counter вне форума Ответить с цитированием
Старый 05.08.2010, 23:13   #3
Gtx541
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 24
По умолчанию

Спасибо. Вывести получилось, только вот оно почему-то не реагирует на большинство сообщений, посмотрите, что не так:

Код:
#include <Windows.h>
#include "resource.h"

INT_PTR CALLBACK My_Dialog_Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
	HWND Dial = NULL;
	Dial = CreateDialogW(hInstance, MAKEINTRESOURCEW(IDD_MY_DIALOG), NULL, My_Dialog_Proc);

	ShowWindow(Dial, SW_SHOW); 

	MSG msg;

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}

	return msg.wParam;
}


INT_PTR CALLBACK My_Dialog_Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_INITDIALOG: 
		MessageBoxA(hwndDlg, "Инициализация...", "Prog1", MB_OK);
		break;
	case WM_LBUTTONDOWN: 
		MessageBoxA(hwndDlg, "Вы нажали левую кнопку мыши", "Prog1", MB_OK);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;

	default:
		return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
	}

	return 0;
}
Окно не перносится мышкой, не отвечает на событие WM_LBUTTONDOWN, не закрывается нажатием на красный крестик, почему?

Последний раз редактировалось Gtx541; 05.08.2010 в 23:38.
Gtx541 вне форума Ответить с цитированием
Старый 06.08.2010, 01:56   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Во первых - уберите петлю обработки сообщений и вызов DefWindowProc из процедуры диалогового окна - они здесь лишние.

Во вторых (это самое главное) -
Цитата:
Пpоцедpа диалогового окна очень похожа на пpоцедуpу окна, если не считать тип возpащаемого значения - TRUE/FALSE, вместо обычных LRESULT. Внутpенний менеджеp диалоговых окон внутpи Windows - истинная пpоцедуpа для диалоговых окон. Она вызывает нашу пpоцедуpу диалоговых окон, пеpедавая некотоpые из полученных сообщений. Поэтому главное пpавило следующее: если наша пpоцедуpа диалогового окна обpабатывает сообщение, она должна веpнуть TRUE в eax и если она не обpабатывает сообщение, тогда она должна веpнуть в eax FALSE. Заметьте, что пpоцедуpа диалогового окна не пеpедает сообщения функции DefWindowProc, так как это не настоящая пpоцедуpа окна.
(С) Iczelion
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 06.08.2010, 10:53   #5
Gtx541
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 24
По умолчанию

Спасибо. Вроде всё работает. Скажите, нет ли здесь каких-либо ошибок?

Хоть всё и работает замечательно, меня в этом коде немного смущает тот факт, что процедура диалогового окна всегда будет возвращать FALSE.
Так и должно быть или это ошибка? Пробовал вместо break-ов поставить return TRUE; вроде ничего не изменилось.


Код:
#include <Windows.h>
#include "resource.h"

INT_PTR CALLBACK My_Dialog_Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
	HWND Dial = NULL;
	Dial = CreateDialogW(hInstance, MAKEINTRESOURCEW(IDD_MY_DIALOG), NULL, My_Dialog_Proc);

	MSG msg;

	if (Dial == NULL) MessageBoxA(NULL, "Не удалось создать окно", "Prog1", MB_OK);
	else
	{
		ShowWindow(Dial, SW_SHOW);

		while (GetMessage(&msg, NULL, NULL, NULL))
		{
			if (!IsWindow(Dial) || !IsDialogMessage(Dial, &msg)) 
			{ 
				TranslateMessage(&msg); 
				DispatchMessage(&msg); 
			} 
		} 
	}


	return 0;
}

// Процедура диалогового окна
BOOL CALLBACK My_Dialog_Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_COMMAND: 
		switch (LOWORD(wParam)) 
		{ 
		case IDOK: 
				MessageBoxA(hwndDlg, "Нажата кнопка OK", "Prog1", MB_OK);
				break;

		case IDCANCEL: 
			MessageBoxA(hwndDlg, "Нажата кнопка Cancel", "Prog1", MB_OK);
			DestroyWindow(hwndDlg); 
			hwndDlg = NULL; 
			break;
		}
		break;

	case WM_LBUTTONDOWN: 
		MessageBoxA(hwndDlg, "Вы нажали левую кнопку мыши", "Prog1", MB_OK);
		break;

	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}

	return FALSE;
}
Gtx541 вне форума Ответить с цитированием
Старый 06.08.2010, 20:54   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Ну а петлю то всё-таки уберите (хотя бы ради эксперимента):
Код:
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
 HWND Dial = NULL;
 Dial = CreateDialogW(hInstance, MAKEINTRESOURCEW(IDD_MY_DIALOG), NULL, My_Dialog_Proc);
 ExitProcess(Dial);
 return 0;
}
Я сейчас тоже поэкспериментировал насчёт TRUE/FALSE - получается, главное, если процедура не обрабатывает сообщение - вернуть FALSE.

Ну и вот ещё парочка выдержек из нетленки:

Цитата:
Когда вы хотите уничтожить диалоговое окно, единственный путь - это вызов функции EndDialog. Hе пpобуйте DestroyWindow! EndDialog не уничтожает диалоговое окно немедленно. Она только устанавливает флаг для внутpеннего менеджеpа диалогового окна и пpодолжает выполнять следующие инстpукции.
(С) Iczelion
Цитата:
Внутpенний менеджеp диалогового окна не посывает нашего пpоцедуpе сообщение WM_DESTROY, а вот WM_CLOSE шлет. Поэтому если мы хотим отpеагиpовать на то, что юзеp нажимает кнопку закpытия на нашем диалоговом окне, мы должны обpаботать сообщение WM_CLOSE.
(С) Iczelion
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 22.08.2010, 00:26   #7
Likaantidoq
 
Аватар для Likaantidoq
 
Регистрация: 27.07.2010
Сообщений: 5
По умолчанию Рисование окна в редакторе ресурсов

Конечно можно =
только чтобы окно работало надо чтобы и поток его породивший работал. Точнее надо создать локальный для потока цикл обработки сообщений в функции потока -

DWORD WINAPI ThreadProc LPVOID lpParameter

...
hWnd = CreateWindow...; //создаем окно
...
while GetMessage... // крутим цико сообщений пока окно не вызовет PostQuitMessage

TranslateMessage...;
DispatchMessage...;

return 0;
анекдот я думаю для поднятия настрояния не повредит никаму
Вовочка говорит маме:
- Мам, а кто мой папа?
- Дед Мороз.
- Как это? - удивляется Вовочка.
- Как, как... пришел ночью, сделал подарок и больше его никто
не видел.
Likaantidoq вне форума Ответить с цитированием
Старый 29.08.2010, 07:11   #8
Likaantidoq
 
Аватар для Likaantidoq
 
Регистрация: 27.07.2010
Сообщений: 5
По умолчанию Рисование окна в редакторе ресурсов

Конечно можно =
только чтобы окно работало надо чтобы и поток его породивший работал. Точнее надо создать локальный для потока цикл обработки сообщений в функции потока -

DWORD WINAPI ThreadProc LPVOID lpParameter

...
hWnd = CreateWindow...; //создаем окно
...
while GetMessage... // крутим цико сообщений пока окно не вызовет PostQuitMessage

TranslateMessage...;
DispatchMessage...;

return 0;
Likaantidoq вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка прерывания и рисование окна Sparky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.12.2009 13:56
Компиляция в текстовом редакторе hard-t Общие вопросы C/C++ 2 12.12.2009 03:12
Ошибка в редакторе карт apromix Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 11.12.2009 18:01
Отображение пробелов в редакторе VBA AVTS Microsoft Office Excel 4 30.04.2009 02:58
Замена слова в текстовом редакторе Славный Общие вопросы Delphi 6 06.06.2008 14:19