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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2010, 00:44   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию Как обработать клик по границе дочернего окна?

Доброе время суток.
Продолжаю учить окошки.
Программа должна при нажатии левой кнопки мыши показывать дочернее окно там где стоит курсор, при отжатии - скрывать его.


Возникла проблема с сокрытием окна. Если курсор стоит в пределах клиентской области главного или дочернего окна, проблем нет:
Код:
case WM_LBUTTONUP:
	ShowWindow(child,SW_HIDE);
	break;
Для обеих оконных процедур. Но как обработать ситуацию, когда курсор стоит на границе клиентского окна? Существует событие соответствующее?

Ниже привожу оконные процедуры главного (hwnd) и дочернего (child) окон.

Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
	int iHeight, iWidth;
	RECT rMainWnd;
	POINT pCursorPozition;
	switch(Message)
	{
		case WM_CREATE:	// создание основного окна
			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);
			GetWindowRect(hwnd, &rMainWnd);
			iWidth = (rMainWnd.right-rMainWnd.left)/2;
			iHeight = (rMainWnd.bottom-rMainWnd.top)/2;
			child=CreateWindowEx(0,"ChildWClass",(LPCTSTR) NULL,
								WS_CHILD | WS_BORDER,1,1,
								iWidth,iHeight,hwnd,(HMENU) (int) (ID_FIRSTCHILD),hinst,NULL);
			break;
		case WM_LBUTTONDOWN:
			GetWindowRect(hwnd, &rMainWnd);
			iWidth = (rMainWnd.right-rMainWnd.left)/2;
			iHeight = (rMainWnd.bottom-rMainWnd.top)/2;
			GetCursorPos(&pCursorPozition);
			ScreenToClient(hwnd,&pCursorPozition);
			MoveWindow(child,pCursorPozition.x,pCursorPozition.y,iWidth,iHeight,FALSE);
			ShowWindow(child,SW_NORMAL);
			break;
		case WM_LBUTTONUP:
			ShowWindow(child,SW_HIDE);
			break;
		case WM_CLOSE:  
			if (MessageBox(hwnd, (LPCTSTR)"Закрыть окно?", (LPCTSTR)"Вы уверены?", 
							MB_YESNOCANCEL) == IDYES) 
							DestroyWindow(hwnd); 
			else 
				return 0; 
			break;
		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)
{
	switch(Message)
	{
	case WM_DESTROY:
		return 0;
		break;
	case WM_LBUTTONUP:
		ShowWindow(child,SW_HIDE);
		break;
	}
	return DefWindowProc(hwnd,Message,wparam,lparam);
}
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 11.09.2010, 10:45   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

WM_NC_LBUTTONDOWN
pu4koff вне форума Ответить с цитированием
Старый 12.09.2010, 07:38   #3
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

pu4koff, спасибо огромное!
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 13.09.2010, 17:08   #4
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

WM_NC_LBUTTONDOWN не получается.

Код:
error C2065: WM_NC_LBUTTONDOWN: необъявленный идентификатор
error C2051: значение выражения для варианта выбора не является константой
Возможно по тому что использую только Win API?
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 13.09.2010, 17:13   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ошибочка у Пучкова:
WM_NCLBUTTONDOWN
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2010, 11:46   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Понятно, Stilet, спасибо, теперь работает. Ещё удивился что справку по событию не нашёл)
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WM_KYEDOWN у дочернего окна. MSga Win Api 9 02.01.2010 18:09
API определение дочернего окна senia Win Api 6 25.12.2009 01:23
Изменение данных дочернего окна damned20 Win Api 1 11.08.2009 13:04
Выделение дочернего окна и пункта меню joker Win Api 7 04.02.2009 18:16
Разбиение дочернего окна на колонки... HunterMan Win Api 3 03.04.2008 23:19