Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
3-1080305451
Users
2004-03-26 15:50
2004.04.25
Фильтрация по неск-м значениям поля


3-1080548815
gedd
2004-03-29 12:26
2004.04.25
Поле "Счетчик" в MS SQL Server 2000.


7-1078326067
Ш-К
2004-03-03 18:01
2004.04.25
Захват кадров


4-1076991892
Unax
2004-02-17 07:24
2004.04.25
Запрет обработки сообщений окну


14-1080899426
Andryk
2004-04-02 13:50
2004.04.25
Народ есть вопросец!