comment $
//-----------------------------------------------------------------------------------//
//  Source code                                                                      //
//                                                                                   //
//  Written      by  Chib, amdtm                     http://www.xxcontrols.com       //
//                                                                                   //
//  FileName   : Office_XP.asm                                                       //
//  Description: libraries of functions for work with menu                           //
//  Version    : 1.00.000, January 1, 2004                                           //
//-----------------------------------------------------------------------------------//
$ 

; #########################################################################
;                                                                         ;
; Процедура обработки WM_DrawItem_Menu (стиль XP)                              ;
;                                                                         ;
; #########################################################################

DrawItem_MenuXP proc uses ecx ;edx lParam:LPARAM

    LOCAL mii         :MENUITEMINFO
    LOCAl TextItemLen :DWORD
    LOCAL szBuff[128] :BYTE
    LOCAL hIcon       :HICON
    LOCAL temp        :DWORD
    LOCAL tSelect     :BYTE         ; флаг выделять запрещёный итем при выборе или нет.
    LOCAL RctText     :RECT
    LOCAL RctBorder   :RECT
    LOCAL RctSep      :RECT
    LOCAL RctShade    :RECT
    LOCAL RctCorner   :RECT
    LOCAL RctCheck    :RECT
    LOCAL RctLeftBorder:RECT

    LOCAL hBrushSel   :HBRUSH
    LOCAL hBrushSelBor:HBRUSH
    LOCAL hBrushSep   :HBRUSH  ; Хендл кисти прорисовки сепараторов и рамки запрещенного CheckItema
    LOCAL hBrushRight :HBRUSH  ; Хендл кисти прорисовки меню, когда пункт не выделен.
    LOCAL hBrushBorder:HBRUSH
    LOCAL hBrushUpItem:HBRUSH    
    
    LOCAL colorText   :COLORREF
    LOCAL colorWindow :COLORREF
    LOCAL colorMenu   :COLORREF
    LOCAL colorMenuBar:COLORREF
    LOCAL colorBorder :COLORREF
    LOCAL colorBitmap :COLORREF
    LOCAL colorSel    :COLORREF
    LOCAL colorSep    :COLORREF
    
    LOCAL fDrawState  :BYTE

    ; Кисти, перья и т.д. для прорисовки меню   

    mov colorBorder, $invoke ( GetSysColor, COLOR_HIGHLIGHT )
    mov colorMenuBar, $invoke ( GetSysColor, COLOR_MENU )
    mov colorWindow, $invoke ( GetSysColor, COLOR_WINDOW )
    mov colorBitmap, $invoke ( MixedColor, colorMenuBar, colorWindow )
    mov colorSep, $invoke ( GetSysColor, COLOR_GRAYTEXT )   
    call GetXpHighlightColor
    mov colorSel, eax

    call NumColorBits
    .if eax >= 8
        ; кисть для прорисовки итема верхнего уровня
        invoke MixedColor, colorSel, colorBorder
        invoke CreateSolidBrush, eax
        mov hBrushUpItem, eax
        ; создадим кисть для прорисовки внутреней части прямоугольника выделенного итема
        invoke MixedColor, colorSel, colorBorder
        invoke LightenColor, 64, eax
        invoke CreateSolidBrush, eax
        mov hBrushSel, eax
        invoke MixedColor, colorSel, colorBorder    
        invoke DarkenColor, 128, eax
        invoke CreateSolidBrush, eax
        mov hBrushSelBor, eax
        
        ; созадим кисть иперо для прорисовки правой стороны итема (большей - основной)
        invoke GrayColor, colorWindow
        mov edx, 255
        sub edx, eax        
        .if eax > 215
            invoke MixedColor, colorWindow, colorMenuBar        
        .else   
            invoke LightenColor, edx, colorWindow   
        .endif        
        invoke CreateSolidBrush, eax
        mov hBrushRight, eax
        
        ; создадим кисть для прорисовки бордюра слева в левой стороне итема    
        invoke GrayColor, colorMenuBar
        mov edx, 255
        sub edx, eax        
        .if eax > 215
            invoke MixedColor, colorMenuBar, colorBorder            
        .else   
            invoke LightenColor, edx, colorMenuBar  
        .endif        
        invoke CreateSolidBrush, eax
        mov hBrushBorder, eax
        
        ; цвет сепараторов
        invoke DarkenColor, 8, colorSep
        invoke CreateSolidBrush, colorSep
        mov hBrushSep, eax
        
    .else
        invoke CreateSolidBrush, colorSel
        mov hBrushUpItem, eax
        invoke CreateSolidBrush, colorSel
        mov hBrushSel, eax
        invoke CreateSolidBrush, colorBorder
        mov hBrushSelBor, eax
        invoke CreateSolidBrush, colorWindow
        mov hBrushRight, eax
        invoke CreateSolidBrush, colorMenuBar
        mov hBrushBorder, eax
        invoke CreateSolidBrush, colorSep
        mov hBrushSep, eax
    .endif

; ======================================================================

assume ebx: ptr DRAWITEMSTRUCT

; выберем информацию о пункте меню    
    mov mii.cbSize, SIZEOF mii
    mov mii.fMask, MIIM_DATA or MIIM_BITMAP or MIIM_FTYPE ;or MIIM_STRING
    invoke GetMenuItemInfo, [ebx].hwndItem, [ebx].itemID, FALSE, ADDR mii
    m2m hIcon, mii.dwItemData
    
    mov eax, mii.fType
    and eax, MFT_SEPARATOR or MFT_STRING or MFT_BITMAP

    .if eax == MFT_STRING                  ; Пункт меню STRING
    
        invoke GetMenuString, [ebx].hwndItem, [ebx].itemID, ADDR szBuff, 128, MF_BYCOMMAND ; получим строку
        mov TextItemLen, eax

        invoke SetSizeBorder, ADDR szBuff, eax, hIcon

        .if fPopup              ; popup

            inc [ebx].rcItem.top
            dec [ebx].rcItem.bottom   
   
            ; ЦВЕТ ТЕКСТА ИТЕМА МЕНЮ (ЗАПРЕЩЁННЫЙ?)
        
            .if [ebx].itemState & ODS_GRAYED
                invoke GetSysColor, COLOR_GRAYTEXT
                .if fSelection                      ; выделять запрещёный итем при выборе.
                    mov tSelect, TRUE
                .else
                    mov tSelect, FALSE
                .endif
            .else
                invoke GetSysColor, COLOR_MENUTEXT
                mov tSelect, TRUE
            .endif
            invoke SetTextColor, [ebx].hdc, eax
        
            .if [ebx].itemState & ODS_SELECTED
                cmp tSelect, 0
                je @f      
                        
                invoke FillRect, [ebx].hdc, ADDR [ebx].rcItem, hBrushSel
                invoke FrameRect, [ebx].hdc, ADDR [ebx].rcItem, hBrushSelBor
                mov fDrawState, SELECT
                                        
@@:
            .else
            
                dec [ebx].rcItem.top        ; отступ на 1 пиксель, в MEASUREITEM прибавили 2
                inc [ebx].rcItem.bottom     ; что бы итемы не были рядом
                
                invoke FillRect, [ebx].hdc, ADDR [ebx].rcItem, hBrushBorder   
                
                ;  ПРЯМОУГОЛЬНИК ЗАЛИВКИ БОРДЮРА В ЛЕВОЙ ЧАСТИ ИТЕМА
        
                invoke CopyRect, ADDR RctBorder, ADDR [ebx].rcItem
                mov eax, WidthBorder
                add RctBorder.left, eax                 
                invoke FillRect, [ebx].hdc, ADDR RctBorder, hBrushRight                
                
                inc [ebx].rcItem.top        ; отступ на 1 пиксель, в MEASUREITEM прибавили 2
                dec [ebx].rcItem.bottom     ; что бы итемы не были рядом
                          
                mov fDrawState, UNSELECT
            .endif
              
           .if [ebx].itemState & ODS_GRAYED
                mov fDrawState, GRAY
           .endif
            
           .if [ebx].itemState & ODS_CHECKED    ; пункт меню отмечен галочкой       
               
                .if hIcon
                
                    .if fDrawState != SELECT
                
                        mov eax, [ebx].rcItem.left        ;  прямоугольник галочки
                        mov RctCheck.left, eax
                        mov eax, [ebx].rcItem.top
                        mov RctCheck.top, eax
                        mov eax, [ebx].rcItem.left
                        add eax, WidthBorder
                        mov RctCheck.right, eax
                        mov eax, [ebx].rcItem.bottom
                        mov RctCheck.bottom, eax
                        invoke InflateRect, ADDR RctCheck, -1, -1
                
                        invoke DrawEdge, [ebx].hdc, ADDR RctCheck, BDR_SUNKENOUTER, BF_RECT               
                
                    .endif
                
                    .if fDrawState == SELECT
                        mov fDrawState, UNSELECT
                    .endif                
             
                    invoke DrawIcn, [ebx].hdc, ADDR [ebx].rcItem, hIcon, fDrawState, FALSE
                   
                .else
               
                    ; Прорисовать прямоугольник галочки и саму галочку        
                    ; Опредилим что рисовать галочку или точку        
                    mov eax, mii.fType
                    and eax, MFT_RADIOCHECK
                    .if eax == MFT_RADIOCHECK
                        mov al, TRUE
                    .else
                        mov al, FALSE
                    .endif
                    invoke DrawCheck_XP, [ebx].hdc, ADDR [ebx].rcItem, fDrawState, al
        
                .endif
        
           .else
           
                .if hIcon
                    invoke DrawIcn, [ebx].hdc, ADDR [ebx].rcItem, hIcon, fDrawState, FALSE    ; DRAW ICON
                .elseif mii.hbmpItem                    
                    invoke DrawBmp, [ebx].hdc, ADDR [ebx].rcItem, mii.hbmpItem, fDrawState                    
                .endif
                    
           .endif

           .if TextItemLen
        
                ;ТЕКСТ 
                
                ; вычислим прямоугольник текста
                invoke CopyRect, ADDR RctText, ADDR [ebx].rcItem
                mov eax, WidthBorder
                add RctText.left, eax
                add RctText.left,4        ; сместим что бы не был сразу  на краю
                sub RctText.right, 10     ; смещение от правого края если есть символ Tab
                    
                ; поиск символа табуляции в строке
                push TextItemLen
                
                cld                         ; поиск вперёд по строке
                lea edi, szBuff             ; адрес строки
                mov al, 09h                 ; искомый символ
                mov ecx, TextItemLen        ; длина строки
                repne scasb                 ; поиск символа '\t' в строке
                jne no_tab                  ; символ '\t' в строке не найден    
                
                push ecx
                invoke DrawText, [ebx].hdc, edi, ecx, ADDR RctText, DT_VCENTER + DT_SINGLELINE + DT_RIGHT + DT_NOCLIP
                pop ecx
                sub TextItemLen, ecx
                dec TextItemLen
                no_tab: 
                invoke DrawText, [ebx].hdc, ADDR szBuff, TextItemLen, ADDR RctText, DT_VCENTER + DT_SINGLELINE + DT_LEFT + DT_NOCLIP
                
                pop TextItemLen
            
           .endif
           
           dec [ebx].rcItem.top
           inc [ebx].rcItem.bottom
            
        .else           ; main

            .if [ebx].itemState & ODS_HOTLIGHT          ; SELECT
                
                sub [ebx].rcItem.right, 4 ; для тени
                invoke FillRect,[ebx].hdc,ADDR [ebx].rcItem, hBrushUpItem
                invoke FrameRect, [ebx].hdc, ADDR [ebx].rcItem, hBrushSelBor
                add [ebx].rcItem.right, 4 ; для тени                
                jmp hotlight
              
            .endif
                     
            ; ЦВЕТ ТЕКСТА ИТЕМА МЕНЮ (ЗАПРЕЩЁННЫЙ?)
        
            .if [ebx].itemState & ODS_GRAYED
                invoke GetSysColor, COLOR_GRAYTEXT
                .if fSelection                      ; выделять запрещёный итем при выборе.
                    mov tSelect, TRUE
                .else
                    mov tSelect, FALSE
                .endif
            .else
                invoke GetSysColor, COLOR_MENUTEXT
                mov tSelect, TRUE
            .endif
            invoke SetTextColor, [ebx].hdc, eax
        
            .if [ebx].itemState & ODS_SELECTED
                cmp tSelect, 0
                je @f      
                
                sub [ebx].rcItem.right, 4 ; для тени
                inc [ebx].rcItem.bottom         
                invoke FillRect,[ebx].hdc,ADDR [ebx].rcItem,COLOR_MENU+1
                dec [ebx].rcItem.bottom
                
                invoke GetSysColorBrush,COLOR_BTNSHADOW
                inc [ebx].rcItem.bottom
                invoke FrameRect, [ebx].hdc, ADDR [ebx].rcItem, eax
                dec [ebx].rcItem.bottom                
                
                ; нарисуем тень                  
                m2m RctShade.left, [ebx].rcItem.right          
                add [ebx].rcItem.right, 4
                
                m2m RctShade.top, [ebx].rcItem.top
                m2m RctShade.bottom, [ebx].rcItem.bottom
                m2m RctShade.right, [ebx].rcItem.right          
          
                ; верхняя часть тени 4 * 4, градиент справа - налево - вниз                
                invoke CopyRect, ADDR RctCorner, ADDR RctShade          
                add RctCorner.top, 4
                m2m RctCorner.bottom, RctCorner.top
                add RctCorner.bottom, 4          
                invoke DrawShade, [ebx].hdc, ADDR RctCorner, DARK_LEFT, DARK_DOWN, 6, 6
                
                invoke CopyRect, ADDR RctCorner, ADDR RctShade
                add RctCorner.top, 8  
                invoke DrawShade, [ebx].hdc, ADDR RctCorner, DARK_LEFT, DARK_NONE, 16, NULL               
                
                mov fDrawState, SELECT
                                        
@@:
            .else
            
                ;sub [ebx].rcItem.right, 4 ; для тени    
                inc [ebx].rcItem.bottom             ; закрасим тень
                invoke FillRect,[ebx].hdc,ADDR [ebx].rcItem,COLOR_BTNFACE+1;COLOR_MENU+1
                dec [ebx].rcItem.bottom
                ;add [ebx].rcItem.right, 4               
                mov fDrawState, UNSELECT
            .endif

hotlight:
            
            invoke CopyRect, ADDR RctText, ADDR [ebx].rcItem   
              
           .if [ebx].itemState & ODS_GRAYED
                mov fDrawState, GRAY
           .endif
            
           .if [ebx].itemState & ODS_CHECKED    ; пункт меню отмечен галочкой       
               
        ;        .if hIcon
        ;        
        ;            .if fDrawState == SELECT
        ;                mov fDrawState, UNSELECT
        ;            .endif 
        ;        
        ;            invoke DrawIcn, [ebx].hdc, ADDR [ebx].rcItem, hIcon, fDrawState
        ;        .else
               
                    ; Прорисовать прямоугольник галочки и саму галочку        
                    ; Опредилим что рисовать галочку или точку        
                    mov eax, mii.fType
                    and eax, MFT_RADIOCHECK
                    .if eax == MFT_RADIOCHECK
                        mov al, TRUE
                    .else
                        mov al, FALSE
                    .endif
                    invoke DrawCheck_XP, [ebx].hdc, ADDR [ebx].rcItem, fDrawState, al
        
        ;        .endif
                 mov eax, WidthBorder
                 add RctText.left, eax
        
           .else
           
                .if hIcon
                    invoke DrawIcn, [ebx].hdc, ADDR [ebx].rcItem, hIcon, fDrawState , FALSE   ; DRAW ICON
                    mov eax, WidthBorder
                    add RctText.left, eax
                .elseif mii.hbmpItem                    
                    invoke DrawBmp, [ebx].hdc, ADDR [ebx].rcItem, mii.hbmpItem, fDrawState
                    mov eax, WidthBorder
                    add RctText.left, eax                   
                .endif
                    
           .endif            

           .if TextItemLen

                ;ТЕКСТ 
                ;
                sub RctText.right, 4        ; для тени, чтобы текст был ровно по средине
                ; поиск символа табуляции в строке
                push TextItemLen
                
                cld                         ; поиск вперёд по строке
                lea edi, szBuff             ; адрес строки
                mov al, 09h                 ; искомый символ
                mov ecx, TextItemLen        ; длина строки
                repne scasb                 ; поиск символа '\t' в строке
                jne no_tab2                 ; символ '\t' в строке не найден    
                
                push ecx
                
                ;add RctText.left, 4            
                
                invoke DrawText, [ebx].hdc, edi, ecx, ADDR RctText, DT_VCENTER + DT_SINGLELINE + DT_RIGHT + DT_NOCLIP
                pop ecx
                sub TextItemLen, ecx
                dec TextItemLen
                invoke DrawText, [ebx].hdc, ADDR szBuff, TextItemLen, ADDR RctText, DT_VCENTER + DT_SINGLELINE + DT_LEFT + DT_NOCLIP        
                pop TextItemLen
                jmp @f
                no_tab2:
                
                invoke DrawText, [ebx].hdc, ADDR szBuff, TextItemLen,ADDR RctText, DT_VCENTER + DT_SINGLELINE + DT_CENTER + DT_NOCLIP
                @@:        
                add RctText.right, 4        ; для тени, чтобы текст был ровно по средине
            
           .endif
            
        .endif  
    
    .elseif eax == MFT_SEPARATOR           ; Пункт меню SEPARATOR

        .if hIcon
    
            invoke GetClipBox, [ebx].hdc, ADDR RctLeftBorder
            m2m RctLeftBorder.left, [ebx].rcItem.left
            m2m RctLeftBorder.right, [ebx].rcItem.right

;            mov eax, offset RctLeftBorder
            lea eax, RctLeftBorder
            push eax
            push [ebx].hdc
            push [ebx].hwndItem
            call hIcon
           
        .else    
    
            invoke FillRect, [ebx].hdc, ADDR [ebx].rcItem, hBrushBorder        
            invoke CopyRect, ADDR RctBorder, ADDR [ebx].rcItem
            mov eax, WidthBorder
            add RctBorder.left, eax                     
            invoke FillRect, [ebx].hdc, ADDR RctBorder, hBrushRight
            
            ; Draw the seperator
             
            invoke CopyRect, ADDR RctSep, ADDR [ebx].rcItem
            mov eax, WidthBorder        
            add RctSep.left, eax
            add RctSep.left, 5          ; 5 - отступ линии сепартора от бордюра слева
            mov eax, RctSep.bottom
            sub eax, RctSep.top
            shr eax, 1
            add RctSep.top, eax
            m2m RctSep.bottom, RctSep.top
            dec RctSep.top
            ;inc RctSep.bottom            
            invoke FillRect, [ebx].hdc, ADDR RctSep, hBrushSep
        
        .endif 
    
    .elseif eax == MFT_BITMAP              ; Пункт меню BITMAP
    
    
    
    .endif

    invoke DeleteObject, hBrushSel
    invoke DeleteObject, hBrushSelBor
    invoke DeleteObject, hBrushSep      ; Хендл кисти прорисовки сепараторов и рамки запрещенного CheckItema
    invoke DeleteObject, hBrushRight    ; Хендл кисти прорисовки меню, когда пункт не выделен.
    invoke DeleteObject, hBrushBorder
    invoke DeleteObject, hBrushUpItem

assume ebx: nothing        
   ret
DrawItem_MenuXP endp

; #########################################################################
;                                                                         ;
; Процедура рисования пункта отметки в меню Стиль XP                      ;                           ;
;                                                                         ;
; #########################################################################

DrawCheck_XP proc uses ebx hDC:HDC, lpRect:DWORD, State:BYTE, CheckMark:BYTE

LOCAL RctCheck              :RECT
LOCAL hPen                  :HPEN
LOCAL hBrush                :HBRUSH    ; Кисть заливки CheckItema
LOCAL OldPen                :HPEN      ; перо и кисть по умолчанию
LOCAL OldBrush              :HBRUSH
LOCAL hGlyphFont            :HFONT
LOCAL OldFont               :HFONT     ; шрифт по умолчанию 
LOCAL colorSel              :COLORREF
LOCAL colorBorder           :COLORREF
LOCAL GlyphArray[2]         :BYTE
LOCAL ncinfo                :NONCLIENTMETRICS

    mov colorBorder, $invoke ( GetSysColor, COLOR_HIGHLIGHT )
    call GetXpHighlightColor
    mov colorSel, eax
    
   ; Шрифт для прорисовки галочки CheckItema.   
   
    mov ncinfo.cbSize, sizeof(NONCLIENTMETRICS)           ; обязательно размер структуры
    invoke SystemParametersInfo,SPI_GETNONCLIENTMETRICS,\
                              sizeof(NONCLIENTMETRICS),\
                              addr ncinfo, 0                                      ; взять параметры, в том числе Фонта
    
 
    .if ncinfo.lfMenuFont.lfHeight > -15
        mov ncinfo.lfMenuFont.lfHeight, -15
    .endif

;   mov ncinfo.lfMenuFont.lfWidth, 14
    
    mov ncinfo.lfMenuFont.lfCharSet, DEFAULT_CHARSET
    
    invoke memfill, ADDR ncinfo.lfMenuFont.lfFaceName, LF_FACESIZE, 0
    invoke szCopy, ADDR szGlyphFont, ADDR ncinfo.lfMenuFont.lfFaceName                             
    invoke CreateFontIndirect,  ADDR ncinfo.lfMenuFont
       
    mov hGlyphFont, eax             ; дескриптор  шрифта

    mov ebx, lpRect

    mov eax, [ebx].RECT.left        ;  прямоугольник галочки
    mov RctCheck.left, eax
    mov eax, [ebx].RECT.top
    mov RctCheck.top, eax
    mov eax, [ebx].RECT.left
    add eax, WidthBorder
    mov RctCheck.right, eax
    mov eax, [ebx].RECT.bottom
    mov RctCheck.bottom, eax
    invoke InflateRect, ADDR RctCheck, -2, -2

;--------------Выберем кисть в соответствии с соостоянием итема------------------
    
    xor eax, eax                    ; состояние вывода
    mov al, State 
    and al, GRAY or SELECT or UNSELECT

    .if al == GRAY    
        call NumColorBits
        .if eax >= 8
            ; создадим кисть и перо для прорисовки запрещённого CheckItema    
            invoke LightenColor, 128, $invoke ( GetSysColor, COLOR_GRAYTEXT )
            invoke CreateSolidBrush, eax
            mov hBrush, eax    
            invoke DarkenColor, 8, $invoke ( GetSysColor, COLOR_GRAYTEXT )
            invoke CreatePen,PS_SOLID,1,eax
            mov hPen, eax
        .else
            invoke CreateSolidBrush, $invoke ( GetSysColor, COLOR_MENU )
            mov hBrush, eax
            invoke CreatePen,PS_SOLID,1, $invoke ( GetSysColor, COLOR_GRAYTEXT )
            mov hPen, eax             
        .endif
        
    .elseif al == SELECT
    
        call NumColorBits
        .if eax >= 8
            ; создадим кисть и перо для прорисовки CheckItema имеющего фокус ввода
            invoke MixedColor, colorSel, colorBorder
            invoke CreateSolidBrush, eax
            mov hBrush, eax
            invoke MixedColor, colorSel, colorBorder
            invoke DarkenColor, 128, eax
            invoke CreatePen,PS_SOLID,1,eax
            mov hPen, eax
        .else
            invoke CreateSolidBrush, colorSel
            mov hBrush, eax
            invoke CreatePen,PS_SOLID,1, colorBorder
            mov hPen, eax  
        .endif
     
    .elseif al == UNSELECT

        call NumColorBits
        .if eax >= 8
            ; создадим кисть для прорисовки CheckItema потерявшего фокус ввода.
            invoke MixedColor, colorSel, colorBorder
            invoke LightenColor, 128, eax
            invoke CreateSolidBrush, eax
            mov hBrush, eax        
            invoke MixedColor, colorSel, colorBorder
            invoke DarkenColor, 128, eax
            invoke CreatePen,PS_SOLID,1,eax
            mov hPen, eax
        .else
            invoke CreateSolidBrush, $invoke ( GetSysColor, COLOR_MENU )
            mov hBrush, eax
            invoke CreatePen,PS_SOLID,1, colorSel
            mov hPen, eax  
        .endif
    
    .endif

;--------------Прорисуем рамку CheckItema----------------------------------------

    mov OldPen, $invoke ( SelectObject, hDC, hPen )
    mov OldBrush, $invoke ( SelectObject, hDC, hBrush )

    invoke Rectangle,hDC,RctCheck.left,RctCheck.top,
                     RctCheck.right,RctCheck.bottom

    invoke SelectObject, hDC, OldPen
    invoke SelectObject, hDC, OldBrush
    invoke DeleteObject, hBrush
    invoke DeleteObject, hPen
    
;--------------Прорисуем галочку-------------------------------------------------
    
    invoke SetBkMode,hDC,TRANSPARENT
    invoke SelectObject, hDC, hGlyphFont
    mov OldFont, eax
    
    .if CheckMark               
        mov GlyphArray, 69h         ; Bullet
    .else
        add RctCheck.top, 1  
        mov GlyphArray, 62h         ; Checkmark
    .endif 
                               
    invoke DrawText, hDC,ADDR GlyphArray, 1, ADDR RctCheck, DT_CENTER or DT_VCENTER or DT_SINGLELINE   
    
    invoke SelectObject, hDC, OldFont   ; востановим прежний шрифт    
    invoke DeleteObject, hGlyphFont
    
    ret
DrawCheck_XP endp