XXControls.

---------------------------------------------------
ОС:         Windows 98/Me/2k/XP
Использование: FREEWARE
Авторы:     Александр М. и Александр Чеботарёв
e-mail:     "Chib" <XXControls@bk.ru>
            "Alexm" <amdtm@mail.ru>
---------------------------------------------------


XXControls - библиотека функций для управления интерфейсом.
   * изменение стиля меню,
        *> Office XP,
        *> Office 2000,
        *> XNET.
        *> Default.
   * поддержка иконок меню,
        *> 16*16.
        *> 32*32
        *> 48*48
        *> любые размеры...
	Примечание: в одном подменю, иконки должны быть 
		        одинакового размера (условие не являеться обязательным).
   * поддержка всех типов меню.
        *> главное,
        *> системное,
        *> всплывающие.
   * способ подключения к проекту.
        *> статический,
             *> XXСontrols.lib,
             *> XXСontrols.inc.
        *> динамический,
             *> XXСontrols.dll,
             *> XXСontrols.lib,
             *> XXСontrols.inc.
             
FUNCTION:

//-------------------------------------------------------------//
//

Имя функции: RedrawMenu.

Прототип:    RedrawMenu PROTO :HWND, :HMENU, :DWORD.

Параметры:  
             HWND   - хендл окна владельца меню.
             HMENU  - хендл меню (главного, всплывающего, системного).
             DWORD  - стиль который вы хотите установить для данного меню:
                         STYLE_XNET         - стиль меню c применением градиентных заливок.
                         STYLE_OFFICE_XP    - стиль меню похожий как в OFFICE XP.
                         STYLE_OFFICE_2000  - стиль меню похожий как в OFFICE 2000.                      
                         STYLE_DEFAULT      - стандартный стиль меню Windows (без иконок, без стилей).
                         
Описание:    Функция RedrawMenu служит для установки стиля меню.
             Её нужно вызывать, после того как вы добавили новые пункты в меню. 
             (ОБРАТИЕ ВНИМАНИЕ!). 
             Её не следует вызывать после того как вы изменили или установили иконку для пункта меню.
                 
Возвращаемое значение: 
             TRUE - в случае успешного выполнения, 
             FALSE - в случае ошибки.

//-------------------------------------------------------------//

Имя функции: GetStyleMenu

Прототип:    GetStyleMenu PROTO :HMENU

Параметры:   
             HMENU  - хендл меню (главного, всплывающего, системного), стиль которого
             нужно выбрать.
             
Описание:    Функция GetStyleMenu возвращает текущий стиль меню.

Возвращаемое значение: Текущий стиль меню, (STYLE_XNET, STYLE_OFFICE_XP и т.д.)

//-------------------------------------------------------------//

Имя функции: SetMenuItemIcon

Прототип:    SetMenuItemIcon PROTO :HMENU,:DWORD, :HICON

Параметры:   HMENU  - хендл меню (главного, всплывающего…).
             DWORD  - идентификатор пункта меню.
             HICON  - хендл иконки, либо NULL если нужно убрать иконку.
             
Описание:    Функция SetMenuItemIcon устанавливает иконку для пункта меню.

Примечание:  Если пункт меню отмечен галочкой и ему присвоена иконка ф - ей
             SetMenuItemIcon, то вместо галочки будет использоваться 
             текущая установленая иконка.

Возвращаемое значение: нет…

//-------------------------------------------------------------//
             
Имя функции: SetDisableSelect

Прототип:    SetMenuItemIcon PROTO :BYTE

Параметры:   BYTE   - TRUE выделять при выборе запрещённые пункты меню,
                      FALSE не выделять запрещённые пункты меню. 
             
Описание:    Функция SetDisableSelect устанавливает способ отображения
             запрещённых пункто меню в вашей программе (для всех меню),
             т.е. выделять их при выборе или нет.
             

Возвращаемое значение: 
             предыдущий способ отображения (TRUE или FALSE).
             
Примечание:  По умолчанию для ваших меню будет TRUE.             

//-------------------------------------------------------------//

Имя функции: SetMenuIcon

Прототип:    SetMenuIcon PROTO :HMENU, :HIMAGELIST, :DWORD, :DWORD

Параметры:   HMENU      - хендл меню (главного, всплывающего…).
             HIMAGELIST - хендл списка изображений, из которого будут
                  из которого будут извлекаться иконки.
             DWORD  - число структур MNUBUTTON в массиве структур.
             DWORD  - указатель на массив структур MNUBUTTON.
             Описание структуры MNUBUTTON:
             MNUBUTTON STRUCT
              idItem            DWORD      ?
              nIcon             DWORD      ?
             MNUBUTTON ENDS
             idItem - идентификатор пункта меню.
             nIcon  - номер иконки в списке изображений, 
                 которая будет использоваться для 
                 данного пункта меню.
             
Описание:    Функция SetMenuIcon позволяет установить иконки из списка изображений,
             срузу для группы пунктов одного меню, через массив структур MNUBUTTON (см.выше).

Возвращаемое значение:  нет…

Примечание:  Эта функция позволяет перевести процесс установки иконок, для пунктов меню,
             в более удобную, компактную форму.             
             
//-------------------------------------------------------------//             

Имя функции: AddLeftBorder

Прототип:    AddLeftBorder PROTO :HMENU, :DWORD, :BOOLEAN

Параметры:   HMENU  - хендл меню ( только всплывающего.).
             DWORD  - указатель на процедуру обратного вызова.
             
                CALLBACK DrawBorderProc (hMenu:HMENU, hDC:HDC, lpRect:DWORD)
                Параметры функции обратного вызова:
                hMenu:HMENU - хендл меню, бордюр которого должен отрисовываться.
                hDC:HDC - контекст в котором вы можете выводить информацию, 
                        для отрисовки бордюра. Если этот праметр равен null значит,
                        вы не можете выводить информацию, а должны вернуть - установить
                        желаемую ширину бордюра (по умолчанию, ширина бордюра 8 пикселов).
                        Если вы не устанавливаете ширину бордюра, то при отрисовке учтите,
                        что этот праметр может быть равен (в некоторых вызовах) null, т.е.
                        если hDC == 0, ничего в контекст не пытайтесь вывести, иначе может
                        может быть зависание программы. 
                lpRect - указатель на структуру RECT, которая содержит координаты
                        бордюра в данном контексте. Если lpRect == null, и hDC == null, значит 
                        требуеться установить ширину бордюра вернув в регистре eax, ширину бордюра.       
             
             BOOLEAN - если этот праметр равен TRUE, то бордюр от списка итемов отделяет, 
                       вертикальная линия, иначе её нет.
                          
Описание:    Функция AddLeftBorder позволяет установить бордюр в левой части всплывающего меню,
             при помощи функции обратного вызова.

Возвращаемое значение: TRUE - в случае успешного выполнения, 
                       FALSE - в случае ошибки.

Примечание:  Механизм функция обратного вызова сделан для улучшения отображения бордюра.
             Вы можете установить 2...n бордюров подряд, только учтите что для удаления 
             кадого из них вам придёться вызывать функцию RemoveLeftBorder.
             Установка бордюра считаеться за вставку дополнительного пункта меню, т.е. 
             число пунктов в вашем меню увеличиваеться на число бордюров. 
             Нумерация пунктов меню начинаеться от бордюра, т.е. первый бордюр 0, 2 - й
             пункт меню (бордюр) 1,..., это нужно учитывать при использовании динамических меню,
             где добовляються пункты меню, а так же при вызове некоторых функций Windows API,
             которые требуют передать передать в качестве праметра номер итема меню. 

//-------------------------------------------------------------//

Имя функции: RemoveLeftBorder

Прототип:    RemoveLeftBorder PROTO :HMENU

Параметры:   HMENU      - хендл меню (только всплывающего…).
                          
Описание:    Функция RemoveLeftBorder позволяет удалить первый по счёту, последний по созданию,
             бордюр в левой части меню.

Возвращаемое значение: TRUE - в случае успешного выполнения, 
                       FALSE - в случае ошибки.

Примечание:  Для удаления n - го числа бордюров требуеться n раз вызвать
             функцию удаления бордюра.
             
             
//-------------------------------------------------------------//

Имя функции: RedrawButton

Прототип:    RedrawButton PROTO :HWND, :DWORD 

Параметры:   HWND      - хендл кнопки.
             DWORD     - указатель на структутру XXBUTTON.
             
             Описание структуры XXBUTTON: 
                XXBUTTON STRUCT
                    dwStyle           DWORD      ?
                    hIcon_normal      HICON      ?
                    hIcon_hover       HICON      ?
                    m_flat            DWORD      ?
                    m_IconAlign       DWORD      ?
                    m_border          DWORD      ?
                    hover_clr         COLORREF   ?
                    push_clr          COLORREF   ?
                    normal_clr        COLORREF   ?
                    hFont_normal      HFONT      ?
                    hFont_hover       HFONT      ?
                    hCursor_normal    HCURSOR    ?
                    hCursor_hover     HCURSOR    ?
                    Sound_hover       HGLOBAL    ?                    
                XXBUTTON ENDS
             
             dwStyle - стиль кнопки, пока что толко один: 
             BTN_NORMAL equ 1
             
             hIcon_normal - хендл иконки которая отображаеться на кнопке.
             
             hIcon_hover - хендл иконки которая отображаеться когда мышь находиться над
             кнопкой, если ненужно устанавливайте в NULL.
             Если hIcon_hover содержит хендл иконки, а m_border == FALSE, то иконка
             приподнимаеться вверх-влево на два пиксела.             
             
             m_flat - если TRUE тогда бордюр кнопки прорисовываеться только когда мышь
             находиться над кнопкой.
             
             m_IconAlign - выравнивание иконки, может быть:
                        BS_LEFT - по левому краю,
                        BS_RIGHT - по правому краю,             
                        BS_TOP - иконка по центру, над текстом.
                        (комбинации недопустимы).
                        
             m_border - если TRUE, бордюры кнопки прорисовываються. 
                        FALSE - бордюры кнопки в любом случае не прорисовываються.
                        (если m_border == FALSE, тогда занчение поля m_flat неважно).
                        
             hover_clr - цвет текста кнопки, когда мышь находиться над ней.
             
             push_clr  - цвет текста кнопки, когда кнопка нажата.
             
             normal_clr - цвет текста кнопки в обычном состоянии.
             
             hFont_normal - шрифт текста кнопки в нормальном состоянии.
                         
             hFont_hover - шрифт текста кнопки когда мышь находиться над кнопкой.
             
             hCursor_hover - хендл курсора когда мышь находиться над кнопкой.
                              
             Sound_hover - дескриптор глобального блока памяти, который содержит
                           загруженный ресурс *.wav файла. (звук должен быть очень коротким).
  	     hBitmap_normal - хендл DDB растра, который отображаеться когда кнопка в нормальном
			      состоянии (не нажата, мышь не над кнопкой).
             hBitmap_hover - хендл DDB растра, который отображаеться когда мышь находиться
		             над кнопкой.
             hBitmap_push - хендл DDB растра, который отображаеться когда кнопка нажата.
                          
Описание:    Функция RedrawButton изменяет внешний вид кнокпки, в соответствии с данными 
             из структуры XXBUTTON.    
             

Возвращаемое значение: TRUE - в случае успешного выполнения, 
                       FALSE - в случае ошибки.

Примечание:  Функции не нужно передавать каждый раз новый экземпляр структуры для
             каждой кнопки индивидульно. После вызова функции RedrawButton, память
             занимаемую структурой XXBUTTON можно осводить, либо использовать повторно
             для других кнопок.
             Для изменения свойств кнопки нужно повторно вызвать функцию RedrawButton, с
             изменённой структурой XXBUTTON.             
             Если вы не используете 3 состояния растра, а используете один hBitmap_normal,
	     и у вас неправильно отображаеться кнопка при наведении и др., тогда перед 
	     вызовом функции RedrawButton, заполните поля hBitmap_hover, hBitmap_push
	     растром который вы устанавливаете для нормального состояния кнопки, 
	     т.е..hBitmap_normal.
//
//-------------------------------------------------------------//
Общие примечания: Возвращаемые занчение функций относительны, это находиться
                  на этапе доработки. Если что не работает проверьте первым делом 
		          параметры функций. 
                  
                  На данном этапе меню являеться стабильным.
                  Ваши программы при использовании данной библиотеки, будут
                  отлично работать во всех цветовых режимах (также 256 и ниже).    
----------------------------------------------------------