ClassExpert позволяет вам создавать новые классы, редактировать и обновлять реализацию классов, а также перемещаться по классам в исходном коде приложений AppExpert. Чтобы связать классы с ресурсами, вы можете использовать ClassExpert с Resource Workshop.
Для запуска 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 добавляет в ваш код буфер передачи. Во время выполнения в этом буфере собирается информация, и вы можете использовать ее вместо проверки кода с независимой фиксацией. Чтобы связать экземпляр переменной с управляющим элементом (добавить его), сделайте следующее:
Оставшаяся пустая структура и вызов буфера передачи на программный код не влияют, и удалять их не нужно.
Чтобы просмотреть исходный код класса, выберите класс в области классов. Исходный код выводится в области редактирования. Чтобы переместить курсор на конструктор, дважды щелкните "мышью" на имени в области классов. Для перехода на обрабатываемое события дважды щелкните "мышью" на событии в области событий.
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.
При запуске Resource Workshop как средства просмотра приложения AppsExpert (с помощью администратора проекта в IDE или ClassExpert) его поведение отличается от автономного запуска следующим:
Rescan - это специальное инструментальное средство работы с проектом, которое проверяет весь перечисленный в проекте исходный код и обновляет или перестраивает базу данных проекта (файл .APX). Rescan просматривает в исходном коде специальные маркеры и перестраивает информацию о ресурсах проекта. Если сканирование было успешным, то файл базы данных проекта переименовывается в *.~AP, и создается новый файл базы данных. В противном случае сохраняется файл *.APX.
Rescan можно использовать для удаления класса, перемещения класса из одного исходного класса в другой, удаления класса, обработчика, экземпляра переменной или идентификатора диалога, импорта класса из другого объекта AppsExpert или переформирования запорченного файла базы данных проекта (*.APX).
Чтобы переместить класс из одного исходного файла в другой, сделайте следующее:
Чтобы переименовать класс, функцию обработки события, экземпляр переменной или идентификатор диалога, сделайте следующее:
Чтобы импортировать класс из одного проекта AppsExpert в другой, сделайте следующее:
Чтобы перестроить потерянный или запорченный файл .APX, сделайте следующее:
Утилита 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 |
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 |
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 |
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 |