· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› hDC меню

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Окт 15, 2004 01:08:47

Крамольный вопрос: можно ли в принципе получить hDC меню, чтобы нарисовать на нём? И если можно, то как? И вообще применимо ли hDC к меню? MSDN по этому поводу хранит молчание :-(


Дата: Окт 15, 2004 10:05:09 · Поправил: vinnie_pooh

Наверное, не самый красивый способ, но работает (почти):
ULONG _stdcall ThreadProc(void*)
{
	HWND hMenu = FindWindowEx(NULL, NULL, "#32768", "");
	if(hMenu)
	{
		HDC hDC = ::GetDC(hMenu);
		if(hDC)
		{
			Rectangle(hDC, 0, 0, 10, 10);
			::ReleaseDC(hMenu, hDC);
		}
	}
   return 1;
}

LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	switch(message)
	{
	case WM_INITMENUPOPUP:
		{
			DWORD	ThreadId;
			HANDLE	hThread;
			hThread = CreateThread(0, 0, ThreadProc, NULL, 0, &ThreadId);
			CloseHandle(hThread);
		}
		break;
	}
	
	return CFrameWnd::WindowProc(message, wParam, lParam);
}

При первом клике на меню все функции в ThreadProc отрабатывают нормально, но на меню почему-то ничего не появляется, а если сдвинуть курсор на соседний POPUP (с File на Edit), то на нем рисуется квадратик.

PS. Работает с первого раза, если убрать у меню эффект затемнения.


Дата: Окт 15, 2004 11:08:06

cresta
Простой способ - это использовать ownerdraw menu - можно рисовать только внутри пунктов меню.
Сложный способ - ставить WH_CBT-hook, определять момент создания окна меню, подменять ему оконную процедуру, в своей реализовать обработку WM_PAINT, WM_NCPAINT и т.п.
"Крутой" способ - создать собственное меню.


Дата: Окт 15, 2004 16:09:11

cresta
Как по мне то лучше использовать ownerdraw menu.
Можешь поставить хук на класс окна меню, но там будет куча проблем. Наверно все проблемы решить можно, но терпение нужно хоорошее.
О глючности можешь посудить на примере SDI. Cтиль меню xp с помощью хука+ownerdraw, а 2000 только ownerdraw.
Там конечно ошибок немерянно, но всё же.

_1838714826__SDI.zip


Дата: Окт 15, 2004 19:37:25

Спасибо, ребята, щас всё это буду жевать :)


Дата: Окт 15, 2004 23:22:04

Chib777

Я пробовал это. Как SDI работает нормально, только вот пытался из VB вызывать ф-ции из XXMenu.dll - либо ф-ции возвращают 0 (судя по описанию-ошибка) либо возвращают 1 и прога виснет. Исходника dll нету, понять почему трудно :(

vinnie_pooh

Я вот не совсем уверен, что везде сработает CreateThread. Хочу сделать всё в dll, и если вызывать например из того же VB, CreateThread по-человечьи не работает.

q_q
„"Крутой" способ - создать собственное меню.“

Именно создавать меню, или обычное окно, дочернее к главному, замаскированое под меню? Если второе, то ничего умнее не придумал, чем создавать структуры наподобие такой

MNUITEM STRUCT
idItem DWORD ?
nEnabledIcon DWORD ?
nDisabledIcon DWORD ?
CheckedState BYTE ?
GrayedState BYTE ?
lpMenuCaption DWORD ?
ParentID DWORD ?
ChildID DWORD ?
MNUBUTTON ENDS

и передавать такие структуры в процедуру, которая будет в соответствии с тем, как заполнена структура, создавать несколько окошек, имитирующих MenuBar, размещать их вверху ClientArea главного окна (или по позиции мыши, если contextMenu) и невидимые окна - собственно сами меню, которые будут отображаться по нажатию на MenuBar'e.

Так я уже делал, но без пунктов, которые имеют child итемы. Или есть другие направления?


Дата: Окт 15, 2004 23:27:49

cresta

Вот, кажется простенький примерчик ;-)


79790382__XPMENU.ZIP


Дата: Окт 16, 2004 01:20:32

Asterix
Да, примерчик довольно простенький. Даже несколько игрушечный:) Делал такое, с прозрачностью, плавным опусканием сверху и нестандартным MenuBar'ом. Тут в аттаче лежит. Правда, только для 2000-ХР (прозрачность)

Только не придумал, как по-человечески сделать субменю.

_2100973564__CR N.zip


Дата: Окт 17, 2004 20:21:53 · Поправил: Chib777

cresta

Я пробовал это. Как SDI работает нормально, только вот пытался из VB вызывать ф-ции из XXMenu.dll - либо ф-ции возвращают 0 (судя по описанию-ошибка) либо возвращают 1 и прога виснет.

Ты наверно какието праметры неправильно передавал, я не знаю VB, но нужно очень внимательным быть с параметрами, поменяв местами хендл окна и меню, ничего работать не будет. Есть работающие примеры на C и Masm32. Там всё запускаеться в 9x,Win2000,XP.
Работает также на Delphi.
Глюков много, но тут на мой взгляд что то другое.
У меня нет примера на VB, было б интересно глянуть.

Исходника dll нету, понять почему трудно :(
На форум нельзя вфложить, архив этого размера, выкладывать обрезки и просить что бы их собирали, некрасиво как то.
Выложить в сорцы 2 месяца назад думал что рано, сейчас уже не заню, что то за последнее время толкового ничего не добавил.
Эти сорцы есть у десятка людей я думаю, половины из них я вообще не заню, никакого секрета нет. Если нужны, напиши мне или мыло дай.

Ты я вижу сделал что то грандиозное размер 111 кб, это на чём?
Я не смог увидеть что, так как в XP, этот файл у меня вообще не запустился, сразу при запуске ошибка, приложение закрываеться. XP - SP1, толко поставил, никаких унфликтующих прог не ставил.


Дата: Окт 18, 2004 00:04:45

Chib777

Добился, чтобы стиль включался :) Для всех параметров нужно передавать в dll адреса, а не сами значения. Стиль переключается, слева полоска вертикальная(где иконки должны быть), как положено, highlight тоже работает (рамочка на текущем пункте и выделение полупрозрачное). Теперь с передачей структуры MNUBUTTON повоевать надо. VB очень тяжело работает с указателями :-\ По поводу„У меня нет примера на VB, было б интересно глянуть“
- может выслать ехе-файл, а то от самого текста толку может мало будет, если VB не установлен.
Или текст, как вызывать ф-ции из dll?

„толкового ничего не добавил. “
Может, сделать чтобы текст highlighted пункта другим цветом рисовался? Это как пожелание. Видел такое - довольно симпатично.

А что касается 111 кБ, то это каркас программы (не только меню) Был написан на PowerBasic (есть такой продукт). Когда-то пользовался им, потом из-за непредсказуемых глюков забросил :( Компилера от него сейчас нету, перекомпилить, чтобы подправить - возможности нет. Увы.


Дата: Окт 18, 2004 11:27:47 · Поправил: Chib777

cresta
Добился, чтобы стиль включался :) Для всех параметров нужно передавать в dll адреса, а не сами значения...

Я думаю что для примера взял бы каркас, пришли что есть интересное - текст подключения, вызова, на chib_odessa()bk.ru или XXControls@bk.ru.

Может, сделать чтобы текст highlighted пункта другим цветом рисовался? Это как пожелание. Видел такое - довольно симпатично.

Там цвет изменяеться в зависимости от текущей установленной темы.
Как вычислять цвета настоящего стиля XP, я нигде не нашёл. Поэтому методом подбора вычислил похожие.


Дата: Окт 18, 2004 13:58:12

Chib777

Сделал маленький проектик (там и компилированный ехе). Если msvbvm60.dll есть, то в принципе должно работать. Сам код в файле .frm можно в блокноте посмотреть, если VB6 нету. Отправил на XXControls

Там же в папке рисунок другого меню. С выделением цветом (правда, рисунок исказился, когда его сохранял в файл, в деле он гораздо красивее). Это делает cPopMenu6.dll (ActiveX)+ SsubTmr.dll (тоже ActiveX). Эти две .dll весят суммарно 160 кБ. Плюс их надо регистрировать в реестре. А так вроде неплохая штука. Также может замостить бэкграунд рисунком, сделать выделение в виде градиента. Если интересно, я тогда еще тестовый сделаю с этими .dll и вышлю.


Дата: Окт 19, 2004 02:19:53

„Как вычислять цвета настоящего стиля XP, я нигде не нашёл. Поэтому методом подбора вычислил похожие.“

RTFM. Для меню есть константы типа COLOR_MENU, COLOR_MENUHILIGHT и пр. Для каждой темы они свои, велосипед не стоит выдумывать :)


Дата: Окт 19, 2004 20:10:35

cresta
Сорц получил, огромное спасибо. VB6 у меня есть (пылиться уже 2 года), я чуть позже поставлю и посмотрю.

Там же в папке рисунок другого меню.
По рисунку, я многое не увижу. Интересно было бы глянуть в работе это меню. Мог бы ты выслать, исполняемый файл + требуемые dll.

Также может замостить бэкграунд рисунком, сделать выделение в виде градиента
Да это, интересная идея + прозрачность. Но дело в том что стиль XP, нестабилен. Там пару процедур надо доделать. Процедура окна меню, сделана плоховато.

masquer

RTFM. Для меню есть константы типа COLOR_MENU, COLOR_MENUHILIGHT и пр. Для каждой темы они свои, велосипед не стоит выдумывать :)

В стиле 2000, я использую константы системных цветов, это понятно.
Но в стиле XP (под стилем XP, понимаю стиль как в VisualStudio.net) не используються чисто ситемные цвета, там из этих цветов генерируються новые. Это я проверял, методом тыка.
Даже на глаз видно что системные цвета, и цвета меню того же VisualStudio не совпадают.
Формул смеси системных цветов, что бы цвета точно совпадали я не нашёл.
В сорце NewMenu (C++), вроде неплохой вариант используеться.


Дата: Окт 20, 2004 02:13:28

Chib777
„там из этих цветов генерируються новые. Это я проверял, методом тыка.“
Мм, тогда изучай библиотеку UxTheme.dll - все это там есть, смотри в MSDN. Мне просто для меню этих констант для нормальной работы в ХР хватало.
Утечки GDI, кстати, уже пофиксены?

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071