|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
Ну честно в меню Tray иконки я б добавил картинок. Поверхностно пока просмотрел: SetMenuItemBitmaps function] http://msdn.microsoft.com/en-us/library/windows/desktop/ms647998(v=vs.85).aspx SetMenuItemInfo function] http://msdn.microsoft.com/en-us/library/windows/desktop/ms648001(v=vs.85).aspx MENUITEMINFO structure] http://msdn.microsoft.com/en-us/library/windows/desktop/ms647578(v=vs.85).aspx Или есть подводные камни? Предполагаю что один из камней связан с тем что при разных разрешениях экрана требуются картинки разных размеров (размер меню меняется). Про монохромность что то тоже не очень понимаю. The selected and clear bitmaps should be monochrome. The system uses the Boolean AND operator to combine bitmaps with the menu so that the white part becomes transparent and the black part becomes the menu-item color. If you use color bitmaps, the results may be undesirable. Use the GetSystemMetrics function with the CXMENUCHECK and CYMENUCHECK values to retrieve the bitmap dimensions. Потом, hbmpItem Type: HBITMAP A handle to the bitmap to be displayed, or it can be one of the values in the following table. It is used when the MIIM_BITMAP flag is set in the fMask member. В чем мне аккумулировать картинки. Для Listview/Treeview я испольльзую 32-битные иконки (подменяя vb-шные в exe-шнике) + API-ImageList. Как здесь быть? Нет ли где каких (незаумных, без дурацких контролов) примеров простых? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 05:59 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
В принципе вот это работает, Код: vbnet 1. 2. 3. 4. 5.
Сразу вопросы: 1. Мне естественно нужен API-imagelist Я его создаю Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
За основу естественно берутся 32-битные полноцветные иконки(нижний код), ибо с битмэпами (верхний код) нормально не получается. Т.е. как мне вытащить из API-ImageList HBITMAP ? Который мне нужен для SetMenuItemBitmaps? Через длинные GDI-махинации только? 2. Я еще не разбирался с GetSystemMetrics но в лоб я вижу следующее: На Висте иконка 16х16 рисуется нормально в плане размеров. На классике 16х16 явно много - она обрезается. А хочется естественно как в меню Start -а там очевидно 16х16. Куда копать? Ощущение, что от иконок на XP придется отказываться. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 14:58 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
Вот так вот рисует Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Но фон картинки черный, а не прозрачный. Ну, в принципе интуитивно понятно, с mask-color новоявленного битмапа я ничего не делал. Может их сразу на hdc итема как-то рисовать через DrawIconEx? И на XP чего делать чтоб 16х16 помещались? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 17:23 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
Visual Style Menus but Windows Vista® uses alpha-blended bitmaps instead Для Висты вот так вот все получилось в лучшем виде: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
Для XP видимо придется попотеть или забить: In Windows XP, owner-draw menus show icons, Здесь вот люди рассуждают об этом. Что я должен сделать чтоб превратить VB6-меню в "owner-draw"? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 19:07 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
Ну в принципе и на XP все достаточно просто. И че говорят что в VB-шное меню картинки не добавишь. Задача в общем так себе по сложности оказалась. Owner-draw как таковой даже не нужен. Достаточно забабахать в итем .hbmpItem = HBMMENU_CALLBACK Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
и это автосгенерирует WM_MEASUREITEM и WM_DRAWITEM первое сообщение позволяет подготовить пространсво под картинку, второе нарисовать картинку через DrawIconEx: Как то так (я сделал для popup меню) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102.
Ну, разве что для enabled=false надо допилить (видимо в градациях серого). Но мне это кажется для меню трея сейчас не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2013, 04:00 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2013, 04:02 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
Дмитрий77Ну, разве что для enabled=false надо допилить (видимо в градациях серого). Вот решил все-таки допилить для Item=Disabled. Пораспихивать картинки по менюшкам. Ну так, не все подряд итемы, а местами - как Microsoft учит, а иначе дурной тон (как во многих программах сделано, действительно дурно это смотрится, особенно когда в 16х16 иконке пытаются довести полное описание проги) На "Вистах" все замечательно. Код: vbnet 1.
где hBitmap_BW - картинка в градациях серого даже можно Код: vbnet 1.
Она сама сделает GrayScale и заретуширует в лучшем виде. Полная автоматика, душа радуется. А вот на XP честно немного Ж. Если делать: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
То 1) Если пункт меню Form1.menu_EditDelete.Enabled = false и при этом не выделен , то lngIcon будет преобразовано в "контуры", чтоб это выглядело нормально, надо очень аккуратно рисовать иконку контурами с применением только белый/черный (а не Grayscale). Но при этом 2) Если пункт меню Form1.menu_EditDelete.Enabled = false и при этом выделен , то код выше будет рисовать именно "GrayScale" на фоне выделения. Посоветуйте: 1. Самый простой вариант решения (и не самый худший): при .Enabled = false вообще иконку не рисовать Но что-то он далек от "стандартов". 2. Есть вариант (он используется в VB6 студии) - отменять выделение итемов кот. .Enabled = false Будут всегда "контуры". Но опять же, хочу чтоб они-таки подсвечивались при выделении. 3. Наилучшим мне кажется вариант: надо сделать чтоб и при выделенном, и при невыделенном итеме был Grascale. Какой-то флаг структуры DRAWITEMSTRUCT structure ? itemState Type: UINT The visual state of the item after the current drawing action takes place. This member can be a combination of the values shown in the following table. Надо поиграться и попробовать чего нибудь поменять. Кстати интересно - обратил внимание В IE8 (на XP) - меню "Избранное" (с картинками) имеет совершенно другой стиль чем соседние (другая высота итемов - чтоб поместились картинки ) и пункты которые "Disabled" - выглядят серыми, а не вдавленными, как в соседних меню. Т.е. такой гибрид считается нормальным. Видимо если для подменю с картинками сделать также как в "Избранное", то будет GrayScale (без контурных картинок). Попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2013, 20:37 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 05:00 |
|
А вообще иконки в VB6 меню тяжело добавить?
|
|||
---|---|---|---|
#18+
Вот еще вариант с использованием API ImageList Хотя я от него отказался из-за избыточности (картинка туда-сюда гоняется) и из-за вероятности появления нек. глючок в связи с двойным преобразованием иконки. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 22:58 |
|
|
start [/forum/topic.php?fid=60&msg=38265439&tid=2156956]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 271ms |
total: | 420ms |
0 / 0 |