|
|
| Посл.отвђт | Сообщен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 |
|
|
Дата: Окт 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, кстати, уже пофиксены? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071 |