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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2022, 07:17   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию FlashWindow

Здравствуйте! Есть некое задание:
Задача1.png

Есть косвенное пояснение к части задачи связанное с использованием функции FlashWindow():
Задача2.png

Но, как нетрудно догадаться, что-то пошло не так. Если делать так, как предлагается в скрине выше, то у меня мигает два раза окно и всё, чтобы я не делал.

Вот код
Код:
#include<windows.h>
#include<tchar.h>


BOOL RegClass(WNDPROC, LPCTSTR, UINT);

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

TCHAR szMainClass[] = TEXT("MainClass");
TCHAR szPopupClass[] = TEXT("PopupClass");
TCHAR szChildClass[] = TEXT("ChildClass");

TCHAR title[] = TEXT("Lector app");

HINSTANCE hInstance;


int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, LPTSTR szCmdLine, int)
{
	MSG msg;
	HWND hwnd;
	hInstance = hInst;

	if (!RegClass(WndProc, szMainClass, COLOR_WINDOW))
		return FALSE;
	if (!RegClass(PopupProc, szPopupClass, COLOR_BTNFACE))
		return FALSE;
	if (!RegClass(ChildProc, szChildClass, COLOR_APPWORKSPACE))
		return FALSE;

	hwnd = CreateWindow(szMainClass, title, WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInst, NULL);

	if (!hwnd)
		return FALSE;

	while (GetMessage(&msg, 0, 0, 0))
	{
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

BOOL RegClass(WNDPROC proc, LPCTSTR szName, UINT brBackground)
{
	WNDCLASS wc;

	wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
	wc.lpfnWndProc = proc;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(brBackground + 1);
	wc.lpszMenuName = (LPCTSTR)NULL;
	wc.lpszClassName = szName;

	return (RegisterClass(&wc) != 0);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static int left, top, xStep, yStep, cxClient, cyClient;
	static int Width, Height;
	
	static HWND LeftHwnd, RightHwnd;
	RECT rc;
	//FLASHWINFO fwi;
	
	switch (msg)
	{
	case WM_CREATE:
	{
		yStep = GetSystemMetrics(SM_CYCAPTION);
		

		TCHAR title[20];
		GetWindowRect(hwnd, &rc);
		RECT Crc;
		GetClientRect(hwnd, &Crc);

		Width = rc.right / 4;
		Height = (rc.bottom - yStep) / 4;

		_stprintf_s(title, 20, TEXT("%d"), 1);
		_tcscat_s(title, 20, TEXT("-st Popup Window"));

		LeftHwnd = CreateWindow(szPopupClass, title,
			WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE,
			rc.left+8, rc.top + yStep, Width, Height,
			hwnd, 0, hInstance, NULL);
		_stprintf_s(title, 20, TEXT("%d"), 2);
		_tcscat_s(title, 20, TEXT("-st Child Window"));
		RightHwnd = CreateWindow(szChildClass, title,
			WS_CHILDWINDOW | WS_BORDER | WS_CAPTION | WS_VISIBLE,
			Crc.right-Width, Crc.bottom - Height, Width, Height,
			hwnd, 0, hInstance, NULL);

		//SetForegroundWindow(hwnd);
		//if(!BringWindowToTop(hwnd))
			//SetForegroundWindow(hwnd);
	}
		return 0;
	case WM_LBUTTONDOWN:
		//FlashWindow(LeftHwnd, TRUE);
	
		for (short i = 0; i < 4; ++i)
		{
			FlashWindow(LeftHwnd, TRUE);
                        Sleep(500);

			//SendMessage(LeftHwnd, WM_LBUTTONDOWN, (WPARAM)NULL, (LPARAM)ArrayBeeps[rand() % MBEEP::OK]);
                        FlashWindow(LeftHwnd, TRUE);
		}
		
		return 0;
	case WM_RBUTTONDOWN:
		//ShowWindow(RightHwnd, SW_SHOW);
		for (short i = 0; i < 4; ++i)
		{
			FlashWindow(RightHwnd, TRUE);
                        Sleep(500);

			//SendMessage(LeftHwnd, WM_LBUTTONDOWN, (WPARAM)NULL, (LPARAM)ArrayBeeps[rand() % MBEEP::OK]);
                      FlashWindow(RightHwnd, TRUE);
		}
		return 0;
		case WM_DESTROY:
		        PostQuitMessage(NULL);
		        return 0;
	default:
		return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}

LRESULT CALLBACK PopupProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

LRESULT CALLBACK ChildProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
Вопрос: Почему у меня не получается сделать так, как делает автор в данной книге. И возможно ли это сделать, если да, то как?
P.S.
Я решил часть задания с помощью функции FlashWindowEx(), но тогда с решением второй части возникают проблемы с выводом звукового сигнала(
apofioz вне форума Ответить с цитированием
Старый 09.08.2022, 09:57   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так у вас цикл до 4, а не до 9 как у автора.
Не стоит для счетчика цикла использовать short. Если у вас 32-х или 64-х битная программа, тогда нормальным значением переменной для этой программы будет 32-х битная переменная. Поэтому для счетчиков цикла лучше всегда использовать int. При использовании short вы не выиграете ничего.

Последний раз редактировалось macomics; 09.08.2022 в 10:00.
macomics вне форума Ответить с цитированием
Старый 10.08.2022, 03:37   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Так у вас цикл до 4, а не до 9 как у автора.
Я знаю, но автор приводил пример, как работать с функцией FlashWindow(), я же об этом писал.
А в условии сказано, при нажатии левой кнопки мыши окно должно мигнуть четыре раза исходя из этого я в цикле задал 8. По идее, если задано 8, должно мигнуть четыре раза, если я всё правильно понял. Здесь проблема в том, что на каждое мигание, должен, выдаваться разный звуковой сигнал, если, опять же, я правильно понял условие задания, то звуковой сигнал должен выдаваться мигающим окном. А как это сделать я не знаю, да и к тому же отправку сообщений(SendMessage(), PostMessage()) я ещё не проходил.
В любом случае, всё равно не работает так, как надо, мигает только два раза, и всё, даже, если увеличить счётчик цикла, именно, с этим вопросом я суда и обратился.
apofioz вне форума Ответить с цитированием
Старый 10.08.2022, 07:40   #4
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Странно, если собираю в 2008 студии, то всё нормально проходит, работает так как нужно, а если в 2019 студии, которая у меня и установлена на хосте, то работает коряво, как я описывал выше. В чём дело, если не секрет?
apofioz вне форума Ответить с цитированием
Старый 10.08.2022, 09:00   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Не по теме вопрос, но мало ли, если создавать программы через мак-файл и при создании проекта из командной строки разработчика 2019 студии, вылетает такая ошибка
Цитата:
winnt.h(2482): error C2338: Windows headers require the default packing option. Changing this can lead to memory corruption. This diagnostic can be disabled by building with WINDOWS_IGNORE_PACKING_MISMATCH defined.
Что это значит?

Вот сам мак-файл:
Код:
#----------------------------------------------------
#HELLOWN.MA; make file
#----------------------------------------------------

hellowin.exe : hellowin.obj
	$(LINKER) $(GUIFLAGS) -OUT:hellowin.exe hellowin.obj $(GUILIBS)
	
hellowin.obj : hellowin.c
	$(CC) $(CFLAGS) hellowin.c
И ещё батник:
Код:
REM -------------------------------------------------------------
REM  MSC.BAT -- Set up environment for Microsoft C/C++ 7.0 NMAKE
REM -------------------------------------------------------------
SET CC=cl
SET CFLAGS=-c -DSTRICT -G3 -Ow -W3 -Zp -Tp
SET CFLAGSMT=-c -DSTRICT -G3 -MT -Ow -W3 -Zp -Tp
SET LINKER=link
SET GUIFLAGS=-SUBSYSTEM:windows
SET DLLFLAGS=-SUBSYSTEM:windows -DLL
SET GUILIBS=-DEFAULTLIB:user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib
SET RC=rc
SET RCVARS=-r -DWIN32
Если на виртуальной машине с windows XP и 2008 студией на борту всё проходит отлично, что сие может означать и как это вылечить. Я с мак-файлами второй раз сталкиваюсь так что без претензий, если возможно.)
apofioz вне форума Ответить с цитированием
Ответ


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

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

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