Учебное пособие: Подклассы окон
BOOL CheckMenuItem( hMenu, idItem, nFlags );
BOOL EnableMenuItem( hMenu, idItem, nFlags );
BOOL HiliteMenuItem( hWnd, hMenu, idItem, nFlags );
С помощью этих функций можно отметить отдельный пункт меню галочкой, запретить его или пометить выделенным. Меню может не перерисовывается после изменений, поэтому Вы должны, окончив все изменения, вызвать процедуру
void DrawMenuBar( hWnd );
которая перерисует меню. Конечно, если изменения делались в невидимом пункте меню, то его можно не перерисовывать.
Диалоги
Последний, и самый сложный вид ресурсов, рассматриваемый нами - диалог. Диалог представляет собой отдельное окно, называемое панелью диалога, с размещенными на его поверхностями управляющими элементами - кнопками, списками, статическими элементами и пр. Каждый управляющий элемент диалога является дочерним окном.
При работе с диалогами надо придерживаться основных правил их описания. Все управляющие элементы составлены в список, по порядку их описания. При работе с диалогом перемещение по списку элементов осуществляется с помощью кнопок стрелка вверх и стрелка влево для перехода к ранее описанным, стрелка вниз и стрелка вправо - к позже описанным.
Обычно в диалоге выделяют несколько групп управляющих элементов и в каждой группе описывают хотя бы один элемент со стилем WS_TABSTOP (стиль дочернего окна). С помощью клавиш Tab и Shift-Tab осуществляется перемещение от одного элемента с этим стилем к другому. То есть с помощью Tab можно осуществить быстрый переход от одной группе к другой.
Для переключения состояния элементов используется клавиша Space (не Enter!). Обычно в диалоге выделяют одну из кнопок, которая описывается как DEFPUSHBUTTON и именно эта кнопка “нажимается” клавишей Enter.
Помимо этого, если диалог использует AUTORADIOBUTTON, надо выделять отдельные группы кнопок, из которых только одна может быть отмечена. Это делается с помощью стиля WS_GROUP. Управляющий элемент со стилем WS_GROUP начинает новую группу элементов, которая заканчивается на следующем элементе с этим стилем.
Для описания диалогов используется специальный ресурс - DIALOG, описывающий набор управляющих элементов, их стилей, размеров, положение на панели диалога и т.д. При описании диалога применяется совершенно специфичная система координат, которая больше нигде не используется - она основана не на физических единицах величина, а на долях величиные символа системного шрифта. Считается, что средний символ системного шрифта содержит 4 единицы диалога по оси X и 8 единиц по оси Y. Если Вам надо самим определять реальные значений координат, то Вы можете воспользоваться функциями
DWORD GetDialogBaseUnits( void );
void MapDialogRect( hWndDlg, lpRect );
Первая функция возвращает двойное слово, младшее слово которого содержит размер символа системного шрифта по оси X, а старшее - по оси Y. Разделив эти числа на 4 и 8 Вы можете узнать цену единиц диалога.
Вторая функция преобразует координаты точек прямоугольника из системы координат диалога в систему координат экрана.
Функции для создания диалогов
Для создания диалога существует 8 функций:
int DialogBox( hInstance, lpszDlgTemplate, hWndOwner, lpfnDlgProc );
int DialogBoxParam(
hInstance, lpszDlgTemplate, hWndOwner, lpfnDlgProc, lParamInit
);
int DialogBoxIndirect( hInstance, hglbDlgTemplate, hWndOwner, lpfnDlgProc );
int DialogBoxIndirectParam(
hInstance, hglbDlgTemplate, hWndOwner, lpfnDlgProc, lParamInit
);
HWND CreateDialog( hInstance, lpszDlgTemplate, hWndOwner, lpfnDlgProc );
HWND CreateDialogParam(
hInstance, lpszDlgTemplate, hWndOwner, lpfnDlgProc, lParamInit