Использование ClassExpert

ClassExpert позволяет вам создавать новые классы, редактировать и обновлять реализацию классов, а также перемещаться по классам в исходном коде приложений AppExpert. Чтобы связать классы с ресурсами, вы можете использовать ClassExpert с Resource Workshop.

Запуск ClassExpert

Для запуска ClassExpert сделайте следующее:

ClassExpert имеет три области, размер которых вы можете изменять с помощью буксировки границ.

Область классов

Здесь перечисляются классы, найденные ClassExpert в текущем приложении. Информация в областях событий и редактирования зависит от выбранных здесь классов. Чтобы перейти к конструктору класса в исходном коде, вы можете дважды щелкнуть на классе "мышью". При этом выводится область редактирования. Используя оперативное меню, вы можете добавить классы, связать классы документов с классами отображаемых элементов, получить информацию о классе, перейти к исходному коду класса или файла заголовка и запустить Resource Workshop.

Область событий

В области событий (Events) перечисляются события и виртуальные функции базового класса в классе, выбранном в области классов (Classes). Информация в области событий зависит от типа базового класса. Используя оперативное меню этой области, вы можете добавить или удалить обработчики сообщений и экземпляры переменных.

Область редактирования

Это редактор, в котором выводится исходный код элементов, выбранных в области классов и области событий. Это окно имеет те же функциональные возможности, что и окно редактирования IDE.

Добавление класса

ClassExpert позволяет вам добавить основанные на ObjectWindows классы и поддерживает один уровень наследования (вручную можно увеличить число уровней. Чтобы добавить класс, сделайте следующее:

Создание типов документа

При создании приложения AppExpert, поддерживающего модуль Doc/View, вы можете использовать ClassExpert создания классов отображаемых документов и типов документов. Чтобы создать тип документа, сделайте следующее:

Стиль Описание
dtAutoDelete Удалять объект документа при закрытии последнего отображаемого элемента.
dtNoAutoView Не создавать автоматически заданный по умолчанию тип отображаемого элемента.
dtSingleView Обеспечивать только один отображаемый элемент на каждый документ.
dtAutoOpen Открывает документ при его создании.
dtUpdateDir Обновляет каталог диалога.
dtHidden Скрывает шаблон в списке выбираемых пользователем шаблонов.
dtSelected Указывает последний выбранный шаблон.
dtReadOnly Выбирает при создании диалогового окна доступную только по чтению кнопку с независимой фиксацией.
dtOverWritePrompt Запрашивает пользователя, можно ли перезаписать существующий файл (в диалоге Save As).
dtHideReadOnly Скрывает кнопки с независимой фиксацией, доступные только по чтению.
dtPathMustExist Позволяет пользователю набирать только существующие маршруты.
dtFileMusttExist Позволяет пользователю набирать имена только существующих файлов.
dtCreatePrompt Перед созданием нового документа выводит пользователю подсказку.
dtNoReadOnly Возвращает заданный файл как доступный для записи.

Добавление и удаление обработчиков событий

Чтобы добавить для события обработчик событий, сделайте следующее:

Удаляется обработчик событий следующим образом:

Добавление и удаление экземпляров переменной

Экземпляры переменных позволяют легко обрабатывать множество управляющих элементов. При создании экземпляра переменных ClassExpert добавляет в ваш код буфер передачи. Во время выполнения в этом буфере собирается информация, и вы можете использовать ее вместо проверки кода с независимой фиксацией. Чтобы связать экземпляр переменной с управляющим элементом (добавить его), сделайте следующее:

Чтобы удалить экземпляр переменной:

Оставшаяся пустая структура и вызов буфера передачи на программный код не влияют, и удалять их не нужно.

Просмотр исходного кода класса

Чтобы просмотреть исходный код класса, выберите класс в области классов. Исходный код выводится в области редактирования. Чтобы переместить курсор на конструктор, дважды щелкните "мышью" на имени в области классов. Для перехода на обрабатываемое события дважды щелкните "мышью" на событии в области событий.

Использование с ClassExpert Resource Workshop

Resource Workshop используется как заданное по умолчанию средство просмотра сценария ресурсов (.RC). При запуске Resource Workshop из ClassExpert (щелчком правой кнопкой "мыши" или выбором Edit dialog или Edit menu) Resource Workshop автоматически загружает для данного приложения файл .RC.

При использовании Resource Workshop с исходным кодом, сгенерированным AppsExpert, запускайте Resource Workshop из ClassExpert, так как Resource Workshop и ClassExpert при внесении изменений в проект обновляют другу друга. При запуске Resource Workshop он проверяет исходный код ресурса на наличие изменений и посылает обновления в ClassExpert.

Запуск из IDE

При запуске Resource Workshop как средства просмотра приложения AppsExpert (с помощью администратора проекта в IDE или ClassExpert) его поведение отличается от автономного запуска следующим:

Использование Rescan

Rescan - это специальное инструментальное средство работы с проектом, которое проверяет весь перечисленный в проекте исходный код и обновляет или перестраивает базу данных проекта (файл .APX). Rescan просматривает в исходном коде специальные маркеры и перестраивает информацию о ресурсах проекта. Если сканирование было успешным, то файл базы данных проекта переименовывается в *.~AP, и создается новый файл базы данных. В противном случае сохраняется файл *.APX.

Rescan можно использовать для удаления класса, перемещения класса из одного исходного класса в другой, удаления класса, обработчика, экземпляра переменной или идентификатора диалога, импорта класса из другого объекта AppsExpert или переформирования запорченного файла базы данных проекта (*.APX).

Удаление класса

Перемещение класса

Чтобы переместить класс из одного исходного файла в другой, сделайте следующее:

Переименование элемента AppExpert

Чтобы переименовать класс, функцию обработки события, экземпляр переменной или идентификатор диалога, сделайте следующее:

Импорт класса

Чтобы импортировать класс из одного проекта AppsExpert в другой, сделайте следующее:

Перестроение файла базы данных .APX

Чтобы перестроить потерянный или запорченный файл .APX, сделайте следующее:


Утилита WinSight

Утилита WinSight - это средство отладки, которое дает информацию об окнах, классах окон и сообщениях. Вы можете использовать ее для изучения прикладной программы Windows (вашей или написанной кем-то еще), и увидеть, сколько и каких создается и используется окон, и какие сообщения получает Windows. Вы можете настроить WinSight, чтобы отслеживать сообщения:

Нужно помнить, что Winsight - это "пассивный наблюдатель". Она перехватывает и выводит информацию о сообщениях, но не сохраняет сообщения, получаемые от других прикладных программ.

Начало работы

При двойном нажатии кнопки "мыши" на пиктограмме WinSight выводится основное окно с используемой по умолчанию конфигурацией, что представляет собой список всех окон, активных в данный момент в оперативной области. В окне WinSignt выводится дерево окон, в котором перечислены все активные в оперативной области окна.

WinSignt позволяет просматривать список классов, дерево окон и трассировку сообщений.

Когда в основном окне у вас выводится два или более окон, вы можете расположить их в виде стека (одно за другим) или в виде массива (одно рядом с другим). Данные конфигурации переключаются с помощью команды меню View Split Vertical (Вертикальное разбиение) и Split Horizontal (Горизонтальное разбиение).

Запуск и приостановка обновления экрана

Трассировка сообщений отключается при выборе команды Messages Trace Off (Сообщения Выключение трассировки). Область трассировки сообщений остается видимой на экране, а трассировка возобновляется, когда вы выбираете одну из команд меню трассировки сообщений: Selected Classes (Выделенные классы), Selected Windows (Выбранные окна) или All Windows (Все окна).

Команда Stop! строки основного меню отключает все обновления в реальном времени, выполняемые WinSight. Обычно для областей поддерживается текущее состояние при регистрации классов, создании и уничтожении окон и поступлении сообщений. Выбор команды Stop! приостанавливает все эти изменения и изменяет команду меню на Start!. Выбор команды Start! возобновляет нормальную работу.

Использование команды Stop! имеет две основных цели:

Для отключения трассировки типов сообщений выберите команду Messages Trace Off. Область трассировки сообщений остается видимой, и трассировка возобновляется при выборе Messages Selected Classes, Selected Windows или All Windows.

Выбор области просмотра

WinSignt имеет три области (окна) просмотра, которые выводятся в ее основном окне: область списка классов, область дерева окон и область трассировки сообщений. Вы можете просматривать любую из них. WinSignt автоматически располагает эти области в основном окне с перекрытием.

Чтобы получить более подробную информацию об элементе в области дерева окон или списка классов, выберите окно или класс, а затем дайте команду Spy Open Detail, или дважды щелкните "мышью" на окне или классе. В окне Details выводится имя класса, выполняемого модуля и другая информация о классе или окне.

Область списка классов

Иногда вместо выбора для трассировки конкретных окон может потребоваться просматривать сообщения для всего класса окон. Это можно сделать с помощью области списка классов.

Использование области списка классов

В этой области выводятся все зарегистрированные классы окон. Чтобы просмотреть детальную информацию о классе, выделите его и нажмите Enter или дважды щелкните на нем кнопкой "мыши".

Формат вывода:


            Класс (Модуль) Функции Стили

Ромбы после классов при получении окном любого сообщения становятся черными. Это позволяет видеть, какие окна получают в данный момент сообщения. Если дочерние окна данного окна в дереве убраны, то будет инвертироваться ромб данного окна, что указывает на активность дочерних окон.

"Класс" - это имя класса. Некоторые предопределенные классы Windows имеют числовые номера. Например, в качестве имени класса всплывающего меню используется число 32768. Для таких классов показывается как номер, так и имя, например, #32768:PopupMenu. Однако фактическое имя класса состоит только из числа. В формате MAKEINTRESOURCE используется также идентификатор ресурса.

"Модуль" - это имя выполняемого модуля (.EXE или .DLL), который зарегистрировал класс.

"Функция" - это адрес функции класса окна.

"Стили" представляют собой стили cs_ класса. Их имена совпадают с определениями cs_ в файле windows.h, но cs_ удаляется, и имя указывается с различным регистром символов.

Наблюдение за классами

Чтобы трассировать сообщения для одного или более классов, выберите эти классы в области списка классов (используя Shift или Ctrl и щелчок кнопкой "мыши"), затем выберите Messages Selected Classes. Трассировка сообщений позволяет видеть все сообщения для окон данного класса, включая сообщения создания.

Область дерева окон

В этой области выводятся все существующие окна (в виде иерархической схемы) с указанием их родства. Эта область позволяет вам:

Формат вывода:


            Описатель {Класс} Модуль Позиция "Заголовок"

Линии слева показывают структуру дерева. С помощью этих линий каждое окно соединяется с его предком, "братскими" окнами и потомками. Линии рисуются таким же образом, как в администраторе файлов. Ромб после каждого окна показывает, имеет ли окно дочерние окна. Если он пустой, то дочерних окон нет. Если он содержит символ +, то дочерние окна имеются, но они не показаны. Если он содержит символ -, то имеются дочерние окна, и они выведены в древовидной схеме (видим по крайней мере один уровень дочерних окон, другие уровни могут быть скрыты).

"Описатель" - это описатель окна, возвращаемый CreateWindow.

"Класс" - это имя класса окна, описанного в области списка классов.

"Модуль" - это имя выполняемого модуля (.EXE или .DLL), который создал окно. Строго говоря, это имя модуля, являющегося владельцем сегмента данных, переданного как параметр hInstance функции CreateWindow.

"Позиция" может либо не указываться, если окно скрыто, либо это (x_Begin,y_Begin)-(x_End,y_End), если окно является видимым. Для окон верхнего уровня это координаты экрана. Для порожденных окон это координаты в области пользователя родительского окна, которое используется в CreateWindow для создания порожденного окна.

"Заголовок" - это заголовок окна или текст, возвращаемый функцией GetWindowText или сообщением WM_GETTEXT. Если заголовок - это нулевая строка, то кавычки опускаются.

Поиск окна

Утилита WinSight имеет специальный режим для поиска окон. Она может работать двумя способами: идентифицируя строку в области дерева, соответствующую окну, на которое вы указываете, или подсвечивая окно, выбираемое вами в дереве окон.

В любом случае режим поиска окна Find Window задается путем выбора команды Spy Find Window. В данном режиме, когда "мышь" попадает на границы окна, вокруг окна появляется жирная рамка, и окно в области дерева окон становится выделенным. Когда вы находитесь в режиме Find Window, все другие прикладных программы приостанавливаются.

Либо, находясь в режиме поиска окна, вы можете с помощью "мыши" или клавиш управления курсором выбрать окно в области дерева окон, и утилита WinSight изобразит жирную рамку вокруг выбранного окна (или окон).

Выход из режима поиска окна

После того, как вы нашли нужное окно, можно выйти из режима поиска окна, нажав кнопку "мыши" или клавиши Esc или Enter. При этом рамка будет удалена с экрана, а окно останется выделенным в дереве окон.

Наблюдение за окнами

После выбора окна из дерева окон с помощью команды Messages Selected Windows вы можете выполнить трассировку сообщений, приходящих в это окно. Изменение выбора в дереве окна немедленно сменит окно, для которого должны трассироваться сообщения.

С помощью команды Messages All Windows вы можете также выбрать наблюдение за всеми окнами, независимо от того, что выбрано в области списка классов или в области дерева окон.

Выбор команды Messages Selected Windows или Windows All Windows, когда область трассировки сообщений является скрытой, приводит в выводу области трассировки сообщений.

Выбор команды Messages Trace запрещает трассировку сообщений, не убирая с экрана область трассировки сообщений.

Подробная информация об окне

Двойное нажатие кнопки "мыши" или нажатие клавиши Enter на элементе дерева окон приводит к выводу окна Window Detail (Подробная информация об окне), в котором кроме информации о классе окна показана полная информация об окне.

Выбор трассируемых сообщений

Утилита WinSight предоставляет вам несколько способов ограничения трассировки сообщений. Независимо от того, за какими окнами вы наблюдаете, можно задавать конкретный тип сообщений, которые вы хотите трассировать. Сообщения, посылаемые через SendMessage показываются дважды, а диспетчеризуемые сообщения - один раз.

Использование области трассировки сообщений

По умолчанию WinSignt трассирует все сообщения и выводит их в области трассировки сообщений. Ограничить число трассируемых сообщений можно несколькими способами:

Другие параметры трассировки сообщений

Две других полезных возможности предоставляет диалоговое окно параметров трассировки сообщений Message Trace Options, одна из которых позволяет задать формат области трассировки сообщений, а другая - зарегистрировать трассируемые сообщения в файле.

Чтобы остановить регистрацию сообщений, отмените Log File.

Формат вывода:


            Описатель ["Заголовок"   {Класс}] Сообщение Статус





"Описатель" - это описатель окна, получающего сообщение.

"Заголовок" - это заголовок окна. Если заголовок - это нулевая строка, то вместо него выводится имя класса (в фигурных скобках).

"Сообщение" - это имя сообщения, определенное в файле WINDOWS.H. Существуют также неописанные сообщения Windows, показанные символами в нижнем регистре. Номера неизвестных сообщений (определенных пользователем) показываются как WM_USER+OxXXXX, если они больше или равны WM_USER, или WM_OxXXXX, если они меньше WM_USER. Номера зарегистрированных сообщений (из RegisterWindowsMessage) показываются вместе с их зарегистрированными именами в одиночных кавычках.

"Статус" представляет собой следующее:

Сообщения от "мыши"

WM_HSCROLL WM_MOUSEACTIVATE
WM_LBUTTONDCLICK WM_MOUSEMOVE
WM_LBUTTONDOWN WM_RBUTTONDBLCLK
WM_LBUTTONUP WM_RBUTTONDOWN
WM_MBUTTONDCLICK WM_RBUTTONUP
WM_MBUTTONDOWN WM_SETCURSOR
WM_MBUTTONUP WM_VSCROLL
WM_BUTTONUP WM_MOUSEFIRST
WM_MOUSELAST

Сообщения Windows

WM_ACTIVATE WM_KILLFOCUS
WM_ACTIVATEAPP WM_MOVE
WM_CANCELMODE WM_PAINT
WM_CLOSE WM_PAINTICON
WM_CREATE WM_Q

Сообщения ввода

WM_CHAR WM_MENUSELECT
WM_CHARTOITEM WM_PARENTNOTIFY
WM_COMMAND WM_SYSCHAR
WM_DEADCHAR WM_SYSDEADCHAR
WM_KEYDOWN WM_SYSKEYDOWN
WM_KEYLAST WM_SYSKEYUP
WM_KEYUP WM_TIMER
WM_MENUCHAR WM_VKEYTOITM

Системные сообщения

WM_COMPACTING WM_QUEUESYNC
WM_DEVMODECHANGE WM_SPOOLERSTATUS
WM_ENTERIDLE WM_SYSCOLORCHANGE
WM_FONTCHANGE WM_SYSCOMMAND
WM_NULL WM_TIMECHANGE
WM_PALETTECHANGED WM_WININICHANGE
WM_PALETTEISCHANGING WM_POWER

Сообщения инициализации

WM_INITDIALOG WM_INITMENUPOPUP
WM_INITMENU

Сообщения буфера вырезанного изображения

WM_ASKCBFORMATNAME WM_PASTE
WM_CHANGECBCHAIN WM_PAINTCLIPBOARD
WM_CLEAR WM_RENDERALLFORMATS
WM_CUT WM_RENDERFORMAT
WM_COPY WM_SIZECLIPBOARD
WM_DESTROYCLIPBOARD WM_UNDO
WM_DRAWCLIPBOARD WM_VSCROLLCLIPBOARD
WM_HSCROLLCLIPBOARD

Сообщения DDE

WM_DDE_ACK WM_DDE_POKE
WM_DDE_ADVICE WM_DDE_REQUEST
WM_DDE_DATA WM_DDE_TERMINATE
WM_DDE_EXECUTE WM_DDE_UNADVISE
WM_DDE_INITIATE

Неклиентные сообщения

WM_NCACTIVATE WM_NCMBUTTONDOWN
WM_NCCREATE WM_NCMBUTTONUP
WM_NCCALCSIZE WM_NCMOUSEMOVE
WM_NCDESTROY WM_NCMMOUSEMOVE
WM_NCHITTEST WM_NCPAINT
WM_NCLBUTTONDBLCLK WM_NCRBUTTONDBLCLK
WM_NCLBUTTONDOWN WM_NCRBUTTONDOWN
WM_NCMBUTTONDBLCLK WM_NCRBUTTONUP

Сообщения печати

DM_COLOR DM_PAPERLENGTH
DM_COPIES DM_PAPERSIZE
DM_COPY DM_PAPERWIDTH
DM_DEFAULTSOURCE DM_PRINTQUALITY
DM_DUPLEX DM_PROMPT
DM_IN_BUFFER DM_SCALE
DM_INPROMPT DM_SPECVERSION
DM_MODIFY DM_TTOPION
DM_ORIENTATION DM_UPDATE
DM_OUT_BUFFER DM_YRESOLUTION
DM_OUTDEFAULT

Управляющие сообщения

BM_GETCHECK EM_LINEINDEX
BM_SETCHECK EM_SETHANDLE
BM_GETSTATE EM_GETHANDLE
BM_SETSTYLE EM_GETTHUMB
BM_SETSTATE EM_LINELENGTH
EM_REPLACESEL
BN_CLICKED EM_SETFONT
BN_PAINT EM_GETLINE
BN_HILITE EM_LIMITTEXT
BN_UNHILITE EM_CANUNDO
BN_DISABLE EM_UNDO
BN_DOUBLECLICKED EM_FMTLINES
EM_LINEFROMCHAR
CB_GETEDITSEL EM_SETWORDBREAK
CB_LIMITTEXT EM_SETTABSTOPS
CB_SETEDITSEL EM_SETPASSWORDCHAR
CB_ADDSTRING EM_EMPTYUNDOBUFFER
CB_DELETESTRING EM_MSGMAX
CB_DIR
CB_GETCOUNT EN_SETFOCUS
CB_GETCURSEL EN_KILLFOCUS
CB_GETLBTEXT EN_CHANGE
CB_GETLBTEXTLEN EN_UPDATE
CB_INSERTSTRING EN_ERRSPACE
CB_RESETCONTENT EN_MAXTEXT
CB_FINDSTRING EN_HSCROLL
CB_SELECTSTRING EN_VSCROLL
CB_SETCURSEL
CB_SHOWDROPDOWN LB_ADDSTRING
CB_GETITEMDATA LB_INSERTSTRING
CB_SETITEMDATA LB_DELETESTRING
CB_GETDROPPEDCONTROLRECT LB_RESETCONTENT
CB_GETDROPPEDSTATE LB_SETSEL
CB_MSGMAX LB_SETCURSEL
CB_SHOWDROPDOWN LB_GETSEL
CB_SETITEMHEIGHT LB_GETCURSEL
LB_GETTEXT
CBN_SETFOCUS LB_GETTEXTLEN
CBN_KILLFOCUS LB_GETCOUNT
CBN_EDITCHANGE LB_SELECTSTRING
CBN_EDITUPDATE LB_DIR
CBN_DROPDOWN LB_GETTOPINDEX
CBN_SELCHANGE LB_FINDSTRING
CBN_DBLCLK LB_GETSELCOUNT
CBN_CLOSEUP LB_GETSELITEMS
CBN_ERRSPACE LB_SETTABSTOPS
CBN_SELENDCANCEL LB_GETHORIZONTALEXTENT
LB_SETHORIZONTALEXTENT
DM_GETDEFID LB_SETTOPINDEX
DM_SETDEFID LB_GETITEMRECT
LB_SETITEMDATA
EM_GETSEL LB_SELITEMRANGE
EM_SETSEL LB_MSGMAX
EM_GETRECT
EM_SETRECT LBN_SELCHANGE
EM_SETRECTNP LBN_DBLCLK
EM_SCROLL LBN_SELCANCEL
EM_LINESCROLL LBN_SETFOCUS
EM_GETMODIFY LBN_KILLFOCUS
EM_SETMODIFY
EM_GETLINECOUNT STM_GETICON
STM_SETICON

Сообщения пера

WIN_USER WM_RCRESULT
WM_GLOBALRCCHANGE WM_SKB
WM_HEDITCTL WM_PENWINFIRST
WM_HOOKRCRESULT

Сообщения мультимедиа

MM_ADLIB MM_MOM_CLOSE
MM_JOY1BUTTONDOWN MM_MOM_DONE
MM_JOY1BUTTONUP MM_MOM_OPEN
MM_JOY1MOVE MM_MPU401_MIDIN
MM_JOY1ZMOVE MM_MPU401_MIDIOUT
MM_JOY2BUTTONDOWN MM_PC_JOYSTICK
MM_JOY2BUTTONUP MM_SNDBLST_MIDIN
MM_JOY2MOVE MM_SNDBLST_MIDIOUT
MM_JOY2ZMOVE MM_SNDBLST_SYNTH
MM_MCINOTIFY MM_SNDBLST_WAVEN
MM_MICROSOFT MM_SNDBLST_WAVEOUT
MM_MIDI_MAPPER MM_WAVE_MAPPER
MM_MIM_CLOSE MM_WIM_CLOSE
MM_MIM_DATA MM_WIM_DATE
MM_MIM_ERROR MM_WIM_OPEN
MM_MIM_LONGDATA MM_WOM_CLOSE
MM_MIM_LONGERROR MM_WOM_DONE
MM_MIM_OPEN MM_WOM_OPEN

Другие сообщения

WM_COALESCE_FIRST WM_MDIGETACTIVE
WM_COALESCE_LAST WM_MDIICONARRRANGE
WM_COMMNOTIFY WM_MDIMAXIMIZE
WM_COMPAREITEM WM_MDINEXT
WM_DRAWITEM WM_MDIRESTORE
WM_DROPFILEW WM_MDISETMENU
WM_KEYFIRST WM_MDITILE
WM_MDIACTIVATE WM_MEASUREITEM
WM_MDICASCADE WM_NEXTDLGCTL
WM_MDICREATE WM_SYSTEMERROR
WM_MDIDESTROY

Сообщения, не документированные Microsoft

WM_ALTTABACTIVE WM_ISACTIVEICON
WM_BEGINDRAG WM_LBTRACKPOINT
WM_CONVERTREQUEST WM_NEXTMENU
WM_CONVERTRESULT WM_QUERYDROPOBJECT
WM_DRAGLOOP WM_QUERYPARKICON
WM_DRAGMOVE WM_SETHOTKEY
WM_DRAGSELECT WM_SETVISIBLE
WM_DROPOBJECT WM_SIZEWAIT
WM_ENTERMENULOOP WM_SYNCPAINT
WM_ENTERSIZEMOVE WM_SYNCSTACK
WM_EXITMENULOOP WM_SYSTIMER
WM_EXITSIZEMOVE WM_TESTING
WM_FILESYSCHANGE WM_YOMICHAR
WM_GETHOTKEY

Назад |Содержание | Вперед