Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

Menu а-ля Office XP. Ownerdraw.   Найти похожие ветки 

 
Nick Denry ©   (2004-02-22 23:51) [0]

Задался я старым добрым вопросом, как бы это мне написать меню в стиле Office XP (или почти в стиле Office XP :)). Но как всегда это бывает, не обходится без вопросов, которые необходимо задавать на DelphiMaster"e.

Главный вопрос такой, я окрашиваю меню в белый цвет при обработке сообщения WM_DRWAITEM, как положнно рисую все картинки, изменяю их при наведении (пока нет, но 100% знаю как это сделать) и т.д., все что присуще XP-шному меню. Но уменю есть несколько Separator"ов , которые я не знаю как окрасить. Они ведь не могут быть OWNERDRAW !?

Т.е. вопрос звучит так : можно ли окрасит сепараторы в унжный цвет (получит их hDC) или лучше (проще или единственно возможно) - самому рисовать линии и отрисовывать их на обычном OWNERDRAW"овом ITEM"е?

По ходу последней мысли второй вопрос: как тогда верно изменять размер отдельных ITEM"ов на WM_MEASUREITEM.

И последний вопрос такой. Возможно - ли (точнее, вроде возможно - но как? "Запихнуть в меню свой контрол - окно)?

К моему сожалению в данный момент - мой код - на МАСМе, но я выложу его - на всякий случай:


.data?
dis              DRAWITEMSTRUCT    <?>  
MENUBMPH   HBITMAP ?
;"Кисти и краски" для меню
MColor_Brush      HBRUSH ?      
MColor_Menu_Brush   HBRUSH ?
MNull_Pen     HPEN   ?
MColor_Pen   HPEN   ?
MColor_Menu_Pen  HPEN   ?

.code
..............................
..............................
;Create menu pens and brushes for menu           ***********************************************
CreateMenuPensAndBrushes proc
invoke CreatePen, PS_NULL,0,0
mov MNull_Pen, eax
invoke CreatePen, PS_SOLID,0,0
mov MColor_Pen, eax  
RGB 177,185,207
invoke CreateSolidBrush, eax
mov MColor_Brush, eax
RGB 255,255,255
invoke CreateSolidBrush, eax
mov MColor_Menu_Brush, eax
invoke GetSysColor,COLOR_MENU
invoke CreatePen,PS_SOLID,0,eax
mov MColor_Menu_Pen, eax
ret
CreateMenuPensAndBrushes endp
; Delete menu pens and brushes *****************************************
DeleteMenuPensAndBrushes proc

;Deleting Menu brushs and pens
invoke DeleteObject, MNull_Pen;
invoke DeleteObject, MColor_Pen
invoke DeleteObject, MColor_Menu_Pen
invoke DeleteObject, MColor_Brush;
invoke DeleteObject, MColor_Menu_Brush;

ret

DeleteMenuPensAndBrushes endp

;Owner Draw menu functions *******************************************************************

;Function for drawing menu item (any one) *****************************************************
;This use as program core  function. If you need to add some element into the your menu you ***********
;just need invoke this function in the WM_DRAWITEM message. Use the menu identificator  ***********
DrawMenuItem proc  MDRWITSTR : DRAWITEMSTRUCT
LOCAL TDC    : HDC
LOCAL SelectedObj  : HGDIOBJ;
LOCAL TextLen   : DWORD
LOCAL need_jmp    : BYTE
LOCAL TextToDraw : DWORD

mov need_jmp, 0
item_draw:
;Getting device contex             ***********************************************
invoke CreateCompatibleDC, 0;
mov TDC, eax
;Get vitmap handle q            ***********************************************
invoke SelectObject,  TDC,  MENUBMPH

;Biltig (Getting bitmaps)            ************************************************
;Get menu position
mov ebx, MDRWITSTR.itemID
sub ebx, IDDM_PREVIOUS
;Gettting text for the enu
push ebx
mov ecx, ebx
mov eax, StrMaxSize
mul ecx
lea ebx, szMenuStr[eax]
mov TextToDraw, ebx
invoke lstrlen, TextToDraw
mov TextLen, eax
;invoke MessageBox,0, TextToDraw, addr szCaption, MB_OK
pop ebx

;Getting Bitmaps
mov eax, 16
mul ebx

 
;tamerlan bitblt
push SRCCOPY
push NULL
push eax
push TDC
push side_bmp
push side_bmp
mov  eax,MDRWITSTR.rcItem.top
inc  eax
push eax
mov  eax,MDRWITSTR.rcItem.left
add  eax,2
push eax
push MDRWITSTR.hdc
call BitBlt
;Fill TextRect from the DrawItem structure rcItem ***********************************************
add MDRWITSTR.rcItem.left, 22
.if need_jmp == 0
RGB 255,255,255
invoke SetBkColor, MDRWITSTR.hdc, eax
.endif  
;In next line we draw the text ******************************************************************
invoke DrawText,MDRWITSTR.hdc, TextToDraw, TextLen , addr MDRWITSTR.rcItem,\
DT_SINGLELINE or DT_VCENTER or DT_LEFT;

;Restore rect
sub MDRWITSTR.rcItem.left, 22

;Release Device Context        ******************************************************************
invoke DeleteDC, TDC

cmp need_jmp ,1
jz ret_back
;Change items state            ******************************************************************
.if MDRWITSTR.itemAction==ODA_SELECT
 invoke SelectObject,MDRWITSTR.hdc, MNull_Pen
 mov eax, MDRWITSTR.itemState
 mov edx, ODS_SELECTED
 and eax, edx
 .if eax != 0
  ;invoke GetSysColor, COLOR_HIGHLIGHTTEXT
 
  invoke SetTextColor ,MDRWITSTR.hdc, 0
  ;invoke GetSysColor, COLOR_HIGHLIGHT
  RGB 177,185,207
  invoke SetBkColor, MDRWITSTR.hdc, eax
 
  invoke SelectObject, MDRWITSTR.hdc,MColor_Brush
 .else
  RGB 255,255,255
  invoke SetBkColor, MDRWITSTR.hdc, eax  
  invoke SelectObject,MDRWITSTR.hdc, MColor_Menu_Brush
 .endif
  invoke Rectangle, MDRWITSTR.hdc, MDRWITSTR.rcItem.left, \
  MDRWITSTR.rcItem.top,\
  MDRWITSTR.rcItem.right,\
  MDRWITSTR.rcItem.bottom
 mov need_jmp, 1
 jmp item_draw
ret_back:
.endif

ret
DrawMenuItem endp



 
Nick Denry ©   (2004-02-23 00:28) [1]

Удалено модератором
Примечание: Создание пустых сообщений


 
Nick Denry ©   (2004-02-23 12:16) [2]

Удалено модератором
Примечание: Создание пустых сообщений.


 
Игорь Шевченко ©   (2004-02-24 16:07) [3]

Форум все-таки по Delphi...


 
Nick Demry   (2004-02-24 16:12) [4]

2>Игорь Шевченко ©   (24.02.04 16:07) [3]
Выложить тот-же код, но на Дельфи?

Я просто подумал, что форум все0таки по WinApi?  :)

Вопрос относится к Апи, а не к МАСМу или дельфи. Но могу выложить.


 
Игорь Шевченко ©   (2004-02-24 16:46) [5]

Nick Demry   (24.02.04 16:12)


> Выложить тот-же код, но на Дельфи?
>
> Я просто подумал, что форум все0таки по WinApi?  :)


Фортран, Кобол, Ада и APL тоже не приветствуются.

Выложи на Delphi


 
Nick Denry ©   (2004-02-24 17:25) [6]

2> Игорь Шевченко ©   (24.02.04 16:46) [5]

Фортран, Кобол, Ада и APL тоже не приветствуются. :)))))))))))))

Ладно.  Подправлю заготовку и выложу вечером...



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.032 c
6-1078207354
mip
2004-03-02 09:02
2004.04.25
Подскажите плз. как написать свой Chat на D7?


1-1081431437
besen-ok
2004-04-08 17:37
2004.04.25
TImage после изменения (програмного) размеров, Canvas остается


14-1080393610
Knight
2004-03-27 16:20
2004.04.25
Прикиньте...


14-1080619470
Dmitriy O.
2004-03-30 08:04
2004.04.25
Если ты лежишь больной, если завтра выходной..."


4-1077785537
@ac
2004-02-26 11:52
2004.04.25
Как закрыть какое-либо стороннее приложение, зная его имя и папку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский