Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008 |
Методика организации командной работы над Flash-проектом
"Компилятор флэш-файлов"
Представьте себе, что у вас есть большой проект с большим количеством не очень сложных флэш-роликов, которые должны быть достаточно "легкими", не требовать никаких дополнительных файлов для своей загрузки (весь флэш-ролик в одном *.swf-файле).
Но все-таки есть некоторые вещи, которые вы хотите менять одним махом во всех этих флэш-роликах, например, какие-то цвета, язык или что-нибудь еще.
Понятно, что в этом случае очень неудобно каждый раз вручную перекомпилировать все 50 флэш-роликов, особенно это чревато соблазном сохранять результаты прошлых компиляций, а это, в свою очередь, опасно тем, что некоторые последние изменения могут не попасть в сборку.
Именно для такого проекта " компилятор флэш-роликов". Ведь в любой среде разработки (Java, C/C++ и др.) обязательно есть command-line компилятор, которым удобно в командном режиме собирать большие проекты. Во Flash MX такого компилятора нет.
Как же работает наш компилятор? Это отдельная Windows-программа, которая активно использует Win32 API. Она умеет:
- открывать разные *.fla-файлы с помощью функции ShellExecute() ;
- находить окно с флэш-роликом по его заголовку,
- посылать разные клавиатурные сообщения в его окна (имитация действий пользователя),
- закрывать вспомогательные окна с запросами подтверждениями (таким же способом).
Ниже приведен откоментированный код этого компилятора на C с применением WinAPI (компилировался при помощи Microsoft Visual C++ 6.0).
Фактически, наша программа просто делает вид, что пользователь открыл некоторый файл во Флэш МХ и выбрал из меню пункт File / Publish или пункт Control / Test Movie. Чтобы воспользоваться этим " компилятором ", вам нужно будет взять приведенный ниже код (написанный на С для пущей переносимости) и либо откомпилировать его при помощи Microsoft Visual C++ 6.0, как поступали мы, либо (возможно, внеся некоторые изменения) воспользоваться другим С- компилятором. (Надо учесть, что наша программа использует WinAPI и рассчитана только на работу под Windows. Если вы работаете на Макинтоше, вам придется написать свой вариант "флэш- компилятора ".) После того, как вы соберете программу, вы получите приложение командной строки, которому можно будет передать первым аргументом полное имя *.fla-файла, который вы хотите откомпилировать, а вторым - слово compile или publish. Во втором случае будет произведена публикация файла с теми настройками, которые вы выбрали. Затем составьте пакетный файл (*.bat-файл), который будет компилировать все нужные вам ролики.
#include "stdafx.h" #define WINVER 0x0500 // чтобы можно было использовать функции Windows 2000 #include "windows.h" #include "winuser.h" #include "shellapi.h" int main(int argc, char* argv[]) { const int PUBLISH_MENU_ID = 40057; // Номера получены из MSSPY const int COMPILE_MENU_ID = 33371; // с помощью этой утилиты были определены const int CLOSE_CHILD_ID = 57602; // идентификаторы интересующих нас пунктов меню const int SAVE_ID = 57603; if (argc != 3) { // проверка на корректность исходных значений puts ("First parameter: full .fla file name to compile,"); puts ("Second parameter: \"publish\" or \"compile\""); return 0; } int MENU_ID = (!strcmp (argv[2], "publish")) ? PUBLISH_MENU_ID : COMPILE_MENU_ID; // в зависимости от пожеланий пользователя либо компилируем // (ctrl-Enter), либо публикуем (ctrl-F12) char buffer[200] = "Macromedia Flash MX - ["; char buffer1[200] = "Macromedia Flash MX - "; // два варианта заголовка окна: иногда бывает так, а иногда иначе char tmpbuf[200] = ""; char one[2] = " "; for (int i = 0; i < strlen (argv[1]); i++) { // формируем возможные названия окон if (argv[1][i] == '\\') { strcpy (tmpbuf, ""); continue; } else { one[0] = argv[1][i]; strcat (tmpbuf, one); } } strcat (buffer, tmpbuf); strcat (buffer1, tmpbuf); strcat (buffer, "]"); LPCSTR window_name = (LPCSTR) buffer; //сформировали заголовки LPCSTR window_name1 = (LPCSTR) buffer1; WORD low = (WORD)MENU_ID, // младший байт - идентификатор меню, // старший должен быть равен 1. high = 1; //accelerator char param[400]; strcpy (param, "\""); strcat (param, argv[1]); strcat (param, "\""); printf ("%s\n", param); puts ("Trying to open file"); //открываем нужный *.fla-файл ShellExecute (0, "open", param, NULL, NULL, SW_SHOW); HWND h = 0, h1 = 0; puts ("Trying to find the main window"); do { Sleep (100); h = FindWindow ("SmartSketchMDIFrame", window_name); //ищем окно h1 = FindWindow ("SmartSketchMDIFrame", window_name1); } while (!h && !h1); if (!h) h = h1; //нашли одно или другое окно puts ("Sending commands"); // посылаем сообщение о компиляции или публикации SendMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL); //сейчас мы закроем все ненужные окна low = (WORD)CLOSE_CHILD_ID; puts ("Closing child windows"); if (MENU_ID == COMPILE_MENU_ID) // если была компиляция, то закрываем это окно SendMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL); low = (WORD)SAVE_ID; // сохраняем файл SendMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL); // полностью закрываем сhild-окно. // SendMessage работает синхронно, а PostMessage - // асинхронно. Здесь можно использовать PostMessage(), потому // для продолжения работы ничего дожидаться не нужно. low = (WORD)CLOSE_CHILD_ID; PostMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL); //пробуем отыскать диалоговое окно HWND hMain = 0, hDialog = 0; puts ("Searching for the dialog boxes"); do { // ищем диалог о сохранении файла, который, возможно, // появился как результат выполнения команды закрытия окна. hMain = FindWindow ("SmartSketchMDIFrame", "Macromedia Flash MX"); if (hMain) { puts ("There were no dialog"); break; } hDialog = FindWindow (NULL, "Flash MX"); if (hDialog) { high = BN_CLICKED; low = IDNO; SendMessage (hDialog, WM_COMMAND, MAKEWPARAM(low, high), NULL); //закрываем диалог break; } Sleep (100); } while (true); printf ("Main = %Xh, Dialog = %Xh\n", h, hDialog); return 0; }