none
ActiveX или нет? RRS feed

  • Общие обсуждения

  • Сделал я на WF C++ первую простую программку мини-эксплорер

    Весь код в Form1.h, ну и еще при клике на файле (или группе файлов) вызывается openfile.cpp и стандартный miniexp.cpp
    Весь код прилагаю в конце, может кому-нибудь интересно. Код очень простой, но если нужны комментарии, могу дать.

    А вопрос у меня такой.
    Когда я программировал на матлабе, то вначале каждой программки писал
    h = miniexplorer(ver, [2033 880 180 600 50], flagtools);
    т.е. вызывал это окошко с файлами и кнопками. Имена всех событий известны, т.е. далее создавал файл с именем события и писал в нем что надо. Это все. Кода эксплорера скрыт, все события открыты под листом файлов и каждой кнопкой. Все было удобно.
    Теперь в С++ хотелось бы иметь нечто подобное, т.е. одной строчкой вызывать этот мини-эксплорер. Т.е. желательно это делать кодом, без обращения к дизайнеру формы.
    Вроде бы теперь нужно весь мой код свернуть в ActiveX, но я не нашел в своем VC 2010 года возможность открыть ActiveX библиотеки MFC
    Вот здесь http://msdn.microsoft.com/ru-ru/library/yc13as7d.aspx
    [quote]В диалоговом окне Новый проект выберите значок Элемент управления ActiveX библиотеки MFC[/quote]
    У меня стандартный VC 2010, но этого в диалоговом окне не нахожу. В чем дело?
    Может быть можно обойтись без ActiveX? Скажем будет где то лежать этот код и я его просто буду вызывать одной строчкой, но как это сделать?

    Код не входит, а приложить файл похоже нет опции


    • Изменено tur91 10 января 2013 г. 10:09
    • Изменен тип Abolmasov Dmitry 30 января 2013 г. 12:08
    10 января 2013 г. 10:06

Все ответы

  • Теперь в С++ хотелось бы иметь нечто подобное, т.е. одной строчкой вызывать этот мини-эксплорер. Т.е. желательно это делать кодом, без обращения к дизайнеру формы.

    Вам нужно из одной программы просто вызвать другую? Если да, то используйте например CreateProcess, а если используете .Net, то класс Process.

    ActiveX нужен например, если хотите что-то встроить в саму форму.

    10 января 2013 г. 19:31
  • Да, мне надо из события под listBox или кнопкой вызвать функцию из другого файла, которая и будет стартовой для многих вычислений картинки, которую сначала надо изобразить на форме, причем результаты вычислений надо будет выводить на форму в картинку. Это обработка изображения. Может быть можно из события кнопки в NET вызвать функцию, которая будет просто в С++? Может быть так удобней и правильней?

    Из события под listBox вызываю функцию в файле open_files.cpp. Вот код в Form1.h

    // Form1.h
    #include "openfile.cpp"
    namespace miniexp {
    ................
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    ...........
    	private: System::Void listBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {
    			 array<String^>^ pathfiles = get_list_fullpath_selected_files();
    			 open_files::openfiles(pathfiles);
    		 }
    ...........
              };
    }

    а вот файл openfiles.cpp

    // openfiles.cpp
    #include "stdafx.h"
    using namespace System;
    using namespace System::IO;
    public ref class open_files
    {
      public: static void openfiles(array<String^>^ files)
      {
    	  String^ fileName = files[0];
    	  
    	  int i(-1);
    	  FileStream^ fs = gcnew FileStream(fileName, FileMode::Open);
             BinaryReader^ br = gcnew BinaryReader(fs);
    	  long sizefile = br->BaseStream->Length/2;
    	  array<int>^ arr = gcnew array<int>(sizefile);
    	  for(int i = 0; i < sizefile; i++)
    		  arr[++i] = br->ReadInt16();
    	  fs->Close();
      }
    };

    Сейчас вызываю из WF Form1.h функцию в WF openfiles(array<String^>^ files) и остаюсь в WF. А можно ли из события в WF вызвать функцию в родном С++? и уже все дальнейшие вычисления производить в родном С++?

    Это все один вопрос.

    Второй вопрос как пользоваться Process ? Не понимаю я там по ссылке. Мне маленький пример нужен, наподобие того как я выше только что изложил.


    И третий основной вопрос, с которого я начал: есть код в Form1.h, с кнопкой и др объектами. Далее следует написать несколько разных программ причем каждая из них должна начинаться с того кода в Form1.h. Что делать? Каждый раз копировать или можно одной строкой всегда вызываеть его и все?

    • Изменено tur91 10 января 2013 г. 20:20
    10 января 2013 г. 20:14
  • Да, мне надо из события под listBox или кнопкой вызвать функцию из другого файла, которая и будет стартовой для многих вычислений картинки, которую сначала надо изобразить на форме, причем результаты вычислений надо будет выводить на форму в картинку. Это обработка изображения.

    Поясните, что делает программа miniexplorer. Нужно ли Вам в новой программе (которую создаете) отображать miniexplorer, или нужна только функция openfiles() оттуда и больше ничего?

    Может быть можно из события кнопки в NET вызвать функцию, которая будет просто в С++? Может быть так удобней и правильней?

    По-моему, Вы не совсем понимаете, что такое .Net. Во-первых, это платформа, которая поддерживает несколько разных языков (C#, VisualBasic, C++ ...). Только вот С++ не обычный (не тот, который придумал Страуструп), а управляемый (managed). Ещё его называют C++/CLI или Managed C++. Из Вашего примера видно, что используется именно Managed C++, т.е. это уже .Net.


    Из события под listBox вызываю функцию в файле open_files.cpp. Вот код в Form1.h

    // Form1.h
    #include "openfile.cpp"
    namespace miniexp {
    ................
    public ref class Form1 : public System::Windows::Forms::Form
    	{
    ...........
    	private: System::Void listBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {
    			 array<String^>^ pathfiles = get_list_fullpath_selected_files();
    			 open_files::openfiles(pathfiles);
    		 }
    ...........
              };
    }

    В С++ не принято включать (через директиву #include) cpp-файл (реализацию) в другой файл.

    #include "openfile.cpp" // Так не делают в большинстве случаев

    Обычно создается пара файлов (*.cpp и *.h), которою можно назвать модулем. В *.h файле указываются только сигнатуры функций (т.е. имя функции и ее параметры) + тип возвращаемого значения. Этот файл как раз и используют в #include. А в *.cpp непосредственно сам код (реализация).


    а вот файл openfiles.cpp
    // openfiles.cpp
    #include "stdafx.h"
    using namespace System;
    using namespace System::IO;
    public ref class open_files
    {
      public: static void openfiles(array<String^>^ files)
      {
    	  String^ fileName = files[0];
    	  
    	  int i(-1);
    	  FileStream^ fs = gcnew FileStream(fileName, FileMode::Open);
             BinaryReader^ br = gcnew BinaryReader(fs);
    	  long sizefile = br->BaseStream->Length/2;
    	  array<int>^ arr = gcnew array<int>(sizefile);
    	  for(int i = 0; i < sizefile; i++)
    		  arr[++i] = br->ReadInt16();
    	  fs->Close();
      }
    };

    Что должна делать эта функция? По коду я вижу, что ничего полезного она не делает. Файл хоть и читается в массив arr, но arr в дальнейшем не используется.


    Второй вопрос как пользоваться Process ? Не понимаю я там по ссылке. Мне маленький пример нужен, наподобие того как я выше только что изложил.

    Пример вот тут можете посмотреть. Ну и просто погуглить не помешает.



    И третий основной вопрос, с которого я начал: есть код в Form1.h, с кнопкой и др объектами. Далее следует написать несколько разных программ причем каждая из них должна начинаться с того кода в Form1.h. Что делать? Каждый раз копировать или можно одной строкой всегда вызываеть его и все?

    Если несколько разных программ должны использовать один и тот же код, этот код следует оформить в виде библиотеки (в терминологии .Net это называется сборка). Для создания такого проекта в VS надо выбирать тип Class Library. В проектах, где будет использоваться библиотека нужно ее подключить в разделе References (сборки).



    • Изменено tulosba 11 января 2013 г. 7:17
    11 января 2013 г. 7:01
  • tulosba, спасибо за развернутый ответ.

    Программа miniexplorer показывает файлы на listbox и кликом на них открывает их группы. Кнопки для удобства чтобы вызывать разного рода процедуры.

    Вообще все программы по обработке видео. Желательно чтобы miniexplorer всегда висел и файлы, которые обрабатываются, были видны. В дальнейшем я предполагаю подключить OpenCV.  Как я писал, что программировал на матлабе, но он оказался медленным, поэтому понадобилось перейти на С, да и затем другому программисту легче все переписать под процессор. NET понадобился для того чтобы написать miniexplorer, ну и сейчас предстоит показывать картинки и действия программы на них. Может быть и неверно, что я начал с NET? Надо было писать на голом С. Проблема в том, что я почти не знаю ни С ни NET и мне трудно определиться как мне решить свои задачи обработки изображений.

    Я переписал openfile.cpp, теперь он выглядит так:

    #include "stdafx.h"
    
    using namespace System;
    using namespace System::IO;
    
    public ref class open_files
    {
      private: static array<int, 2>^ getmatrixfile(String^ filename)
    	{
    	  FileStream^ fs = gcnew FileStream(filename, FileMode::Open);
          BinaryReader^ br = gcnew BinaryReader(fs);
    	  int rows(480), cols(752);
    	  array<int, 2>^ arr(gcnew array<int, 2>(rows, cols));
    	  for(int col = 0; col < cols; col++)
    		for(int row = 0; row < rows; row++)
    		  arr[row,col] = br->ReadInt16();
    	  fs->Close();
    	  return arr;
    	}
    
      public: static void openfiles(array<String^>^ files)
      {
    	 String^ filename = files[0];
    	 array<int, 2>^ M = getmatrixfile(filename);
      }
    };

    Эта функция должна открывать лист файлов (пока только один) и возвращать матрицу каждого. Дальше надо ее показать как картинку на форме, дальше обработка картинки и вывод результатов обработки на картинку. Алгоритм надо протестировать на многих файлах. Каждый файл может включать тысячи фреймов. Текущий код openfile.cpp открывает один фрейм.

    Так возможно (и нужно ли) из NET вызывать функции написанные на старом С++ ?  Просто мне обычный С++ кажется легче и писать обработку на нем легче.

    Значит Class Library мне необходим?

    Пока понятия не имею как показать матрицу как картинку и как на картинку вывести массив точек.

    11 января 2013 г. 9:27
  • Так возможно (и нужно ли) из NET вызывать функции написанные на старом С++ ?  Просто мне обычный С++ кажется легче и писать обработку на нем легче.

    Можно например создать обычную DLL (написанную на С/С++), а в .Net коде использовать подход, именуемый P/Invoke. Данный подход имеет смысл использовать, если имеется довольно большой объем кода на С/С++ и переписывать его на .Net-языки довольно долго.


    Значит Class Library мне необходим?

    А вот если кода немного, то проще сделать уже .Net-совместимую библиотеку и использовать ее в виде сборки (как я писал в предыдущем сообщении).

    Пока понятия не имею как показать матрицу как картинку и как на картинку вывести массив точек.

    Можно попробовать например отобразить каждый пиксель разной яркости (чем меньше значение эл-та в матрице, тем ниже яркость). Для работы с картинкой можно использовать класс Bitmap.

    11 января 2013 г. 11:27
  • Спасибо, tulosba

    Теперь мне все это надо попробовать, тогда наверняка будут еще вопросы.

    А можно ли в принципе исходным сделать старый С++ и вызывать из него тот же эксплорер и формы и выводить на них картинки?

    Пока не нахожу простой пример создания Class Library в С++.

    В VC 2010 есть подсказчик? Может быть его только надо включить? А в VC 2012 есть?

    Еще был у меня один вопрос по структуре программирования как в основном файле вызывать функции из различных файлов-библиотек функций.

    Спрошу его подробней через пару дней.

    11 января 2013 г. 14:28
  • А можно ли в принципе исходным сделать старый С++ и вызывать из него тот же эксплорер и формы и выводить на них картинки?

    Вам бы над формулировкой вопроса подумать как следует. Что значит "сделать исходным", "старый С++" (неуправляемый код?)  ?

    Пока не нахожу простой пример создания Class Library в С++.

    В VC 2010 есть подсказчик? Может быть его только надо включить? А в VC 2012 есть?

    Создаете в VS новый проект. Выбираете нужный тип (Class Library) на нужном языке программирования. Пишите там код, который хотите использовать в других приложениях (для начала какой-нибудь класс со статическими функциями, и делаете этот класс открытым (public)). Потом создаете новый проект (например как у Вас было вначале Windows Forms) но в том же решении (Solution) что и библиотека. Так будет проще ее использовать. Открываете дерево проектов и добавляете для WF проекта ссылку (Reference) на ранее созданную библиотеку.
    12 января 2013 г. 16:04
  • tulosba, спасибо за разъяснения, но... честно говоря мне не нравится так программировать

    Поясню что я имею ввиду. В матлабе я программировал так:

    В строке 3 я просто вызываю форму с эксплорером и кнопками. Весь код спрятан, открыты только поименованные листы событий листбокса и кнопок. Эту строчку я могу добавлять в любом проекте. Это первое.

    Теперь я пишу в каком то листе события, например, в openfile.m пишу например так

    minmat) будут полями класса name_lib, а вызываться они будут из файла события так: name_lib::minmat, но неясно как возвращаться будет структура data, т.е. ее надо будет еще раз объявлять в файле события?

    Т.е. на пункт 2) у меня примерно намечен ответ, а по пункту 1) полная неясность.

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

    У меня какая то задача. Я вызываю строчкой свой экплорер, затем вызываю по ссылкам на библиотеку функции и все. Возможно ли так сделать в С++. Может быть я что то недопонимаю.

    M = get_data_one_file(path);

    figure(hF(1)); ishow(M);

    Событие листбокса поставляет path, беру эту матрицу М, создаю новую форму (figure) и выкладываю в нее матрицу. Далее будет обработка со многими функциями, разделенными по библиотекам. Как я их вызваю? В строчках 32-36 выше написано напр

    mt = matrixfuncs; это значит что глобальная переменная mt указывает на файл-библиотеку с функциями

    а в событии, т.е. в openfile.m можно вызвать, например, [r c val] = mt.minmat(mat); (функция minmat описана в строке 11)

    Т.е. так просто решены все проблемы организации программ.

    В NET С++ хотелось бы сделать примерно так же все просто: 1) одной строчкой вызывать какой то блок (напр эксплорер) с формой и известными событиям и 2) через, например, указатель вызывать функции из библиотек.

    Вероятно библиотеки можно сделать так:

    public ref class name_lib
    {
      public: struct data
              {
                 int a;
                 int b;
              }
      public: static data = minmat(int a, String^ b)
      {
         ..........
         data dat->a = a; data dat->b = 2*a;
         return dat;
      }
    };
    т.е. функции (
    12 января 2013 г. 18:34
  • ответ обрезался почему то, далее следует

    т.е. функции (minmat) будут полями класса name_lib, а вызываться они будут из файла события так: name_lib::minmat, но неясно как возвращаться будет структура data, т.е. ее надо будет еще раз объявлять в файле события?

    Т.е. на пункт 2) у меня примерно намечен ответ, а по пункту 1) полная неясность.

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

    У меня какая то задача. Я вызываю строчкой свой экплорер, затем вызываю по ссылкам на библиотеку функции и все. Возможно ли так сделать в С++. Может быть я что то недопонимаю.

    12 января 2013 г. 18:36
  • Проблема в том, что Вы (по Вашим же словам) не знаете в должном объёме ни C/C++, ни .Net. Однако хотите их использовать. Желание похвальное, но для этого надо поднабраться знаний.

    Я, к сожалению, не знаю matlab (лет 10 назад наверное запускал его последний раз), и если Вы хотите использовать .Net приложения вместе с ним, то вряд ли смогу Вам помочь.

    Но всё-таки, опишите Вашу задачу в общих чертах, без применения языков программирования и технологий. Я так понял у вас есть какие-то исходные данные в матричной форме, которые нужно как-то визуализировать. Но не совсем ясно что это за данные. Какой их объём, какого рода обработка требуется. Как часто обновляются эти данные, кто источник, кто потребитель и т.п.

    Может быть ответы на эти вопросы смогут лучше прояснить ситуацию и найти путь к решению Вашей задачи.

    14 января 2013 г. 11:03
  • tulosba, над конвейером производственной линии подвешена видеокамера для подсчета и отбраковки таблеток. Частота фреймов и их размер пока не определены окончательно. Таблетки идут соприкасаясь друг с другом и могут быть не круглыми. Следует их отделять друг от друга программно и определять целостность контура, царапины и проч. дефекты, также по цвету.

    Как я уже писал предполагаю использовать OpenCV, уже подключил его к проекту в WF. Сейчас проблема с выводом изображения из файла на форму в OpenCV. Программа уже большей частью написана на матлабе, но ему тяжело с такими объемами. Поэтому и перехожу на NET C++. Затем программа будет написана для процессора не мной.

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

    14 января 2013 г. 19:02
  • Как я уже писал предполагаю использовать OpenCV, уже подключил его к проекту в WF.

    Подключали через Emgu CV?

    Сейчас проблема с выводом изображения из файла на форму в OpenCV.

    Не очень Вас понимаю. OpenCV библиотека обработки изображений, как можно в ней сделать вывод на форму? Или Вы имеете в виду, что картинка в формате OpenCV (какой-нибудь IplImage) и нужно его отобразить на экране?

    Программа уже большей частью написана на матлабе, но ему тяжело с такими объемами.

    Получается, что объемы всё таки какие-то уже известны.


    Поэтому и перехожу на NET C++. 

    Если Вы уперлись в производительность матлаба, то я не очень вижу смысла переходить на .Net языки. Лучше писать на чистом (неуправляемом) С/С++.


    Затем программа будет написана для процессора не мной.

    Что Вы подразумеваете под этой фразой?


    Если бы можно было писать на старом С++ и просто как то вызвать мой эксплорер было бы легче писать обработку.

    Сделать из одной программы запуск другой обычно не составляет особых проблем и сделать это можно во многих популярных языках.

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

    А вот тут как раз встает вопрос какие данные "miniexplorer" должен получить из внешнего мира (от другой программы, которая его вызывает) и какие данные возвращать обратно этой программе. В крайнем случае можно реализовать всё через файлы.

    15 января 2013 г. 7:07
  • Подключил OpenCV  вручную, могу объяснить как. О Emgu CV  слышу впервые, спасибо. Пока не знаю что с этим делать. Какое преимущество у Emgu CV?

    - OpenCV библиотека обработки изображений, как можно в ней сделать вывод на форму?

    На форму OpenCV. Результаты каждого шага обработки нужно выводить на экран для контроля. Это можно делать на форме NET и OpenCV. Я намерен попробовать то и другое.

    - Лучше писать на чистом (неуправляемом) С/С++.

    Да, но как тогда вызвать эксплорер? Игнорировать его мне бы не хотелось.

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

    - Сделать из одной программы запуск другой обычно не составляет особых проблем и сделать это можно во многих популярных языкахю

    Скажите как это сделать в моем случае, если исходный язык чистый С++ и эксплорер в NET. Эксплорер сейчас не получает никаких входных данных, только читает при своей загрузке текстовый файл с последним рабочим путем и при выборе на листбоксе нескольких файлов возвращает массив путей к ним.


    • Изменено tur91 15 января 2013 г. 9:38
    15 января 2013 г. 9:36
  • Скажите как это сделать в моем случае, если исходный язык чистый С++ и эксплорер в NET.
    Я же Вам давал ссылку на CreateProcess в первом сообщении.
    15 января 2013 г. 10:01
  • Подключил OpenCV вручную, могу объяснить как. О Emgu CV слышу впервые, спасибо. Пока не знаю что с этим делать. Какое преимущество у Emgu CV?

    - OpenCV библиотека обработки изображений, как можно в ней сделать вывод на форму?

    На форму OpenCV. Результаты каждого шага обработки нужно выводить на экран для контроля. Это можно делать на форме NET и OpenCV. Я намерен попробовать то и другое.

    - Лучше писать на чистом (неуправляемом) С/С++.

    Да, но как тогда вызвать эксплорер? Игнорировать его мне бы не хотелось.

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

    - Сделать из одной программы запуск другой обычно не составляет особых проблем и сделать это можно во многих популярных языкахю

    Скажите как это сделать в моем случае, если исходный язык чистый С++ и эксплорер в NET. Эксплорер сейчас не получает никаких входных данных, только читает при своей загрузке текстовый файл с последним рабочим путем и при выборе на листбоксе нескольких файлов возвращает массив путей к ним.

    15 января 2013 г. 10:31
  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]

    25 января 2013 г. 10:26