Форум: "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