Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение для работы в реальном времени... (используя Idle и PeekMessage) 
V
    Опции темы
Arks
  Дата 9.4.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Я тут уже создавал тему об этом. Тогда этот вопрос решил. Пытаюсь теперь тот код переписать под VS2005 (он был под 2003).
Не выходит.
В 2003 было так:
Код

[StructLayout(LayoutKind::Sequential)]
    public __gc struct Message
    {
        IntPtr hWnd;
        UInt32 msg;
        IntPtr wParam;
        IntPtr lParam;
        UInt32 time;
        System::Drawing::Point p;
    };

    [System::Security::SuppressUnmanagedCodeSecurity] // We won't use this maliciously
    [DllImport(S"User32.dll", CharSet=CharSet::Auto)]
    extern "C" bool PeekMessage(engine_tester::Message __gc *msg, IntPtr hWnd, UInt32 messageFilterMin, UInt32 messageFilterMax, UInt32 flags);

public __gc class Form1 : public System::Windows::Forms::Form
    {    
    public:
                 . . .
                Form1(void)
        {
            InitializeComponent();
            msg = new Message();
                        . . .
                 }
public: System::Void OnApplicationIdle(System::Object *sender, System::EventArgs *e)
            {
                while (AppStillIdle())
                {
                    // Render a frame during idle time (no messages are waiting)
                    //UpdateEnvironment();
                    //Render3DEnvironment();
                    engine->Render();
                }
            }

    private: 
        Message *msg;
        bool AppStillIdle(System::Void)
            {
                return !PeekMessage(msg, IntPtr::Zero, 0, 0, 0);
            }
         . . .
      }



Теперь в 2005ой студии я столкнулся с проблемой, что дизайнер форм не работает, если перед классом формы есть какие-либо определения/описания. Поэтому было решено вынести их в отдельный класс:
Код

namespace MyInterop
{
    using namespace System;
    using namespace System::Runtime::InteropServices;
//    using namespace Loader;
    
    [StructLayout(LayoutKind::Sequential)]
    public ref struct Message
    {
        IntPtr hWnd;
        UInt32 msg;
        IntPtr wParam;
        IntPtr lParam;
        UInt32 time;
        System::Drawing::Point p;
    };

    static public ref class MyInteropClass
    {
    public:
        static Message^ msg;

        [System::Security::SuppressUnmanagedCodeSecurity] // We won't use this maliciously
        [DllImport("User32.dll", CharSet=CharSet::Auto)]
        static bool PeekMessage(Message^ msg, IntPtr hWnd, UInt32 messageFilterMin, UInt32 messageFilterMax, UInt32 flags);

    private:
        static MyInteropClass() {msg = gcnew Message();}
        //~MyInteropClass()        {delete msg;}
    };


Потом использовал этот класс в форме:
Код

#include "InteropFuncForForm.h"

    public ref class Form1 : public System::Windows::Forms::Form
    {
          . . .
    public:
        System::Void OnApplicationIdle(System::Object^ sender, System::EventArgs^ e)
        {
        //    pin_ptr<MyInterop::Message^> ppmsg = &MyInteropClass::msg;
        //    System::Windows::Forms::NativeMethods::MSG *mssg;
            while(!MyInteropClass::PeekMessage(MyInteropClass::msg, IntPtr::Zero, 0, 0, 0))
            {
                // Выполняем здесь всю необходимую работу
            }
        }

И тут вылазят ошибки на место вызова PeekMessage:
Error    2    error C2039: 'PeekMessageW' : is not a member of 'MyInterop::MyInteropClass'
Error    3    error C2664: 'PeekMessageW' : cannot convert parameter 1 from 'MyInterop::Message ^' to 'LPMSG'

Пытался со второй бороться, определяя Message структуру как value struct, либо просто struct (т.е. unmaganed) (отсюда кстати и закомменченные строки кода), однако Error 3 всё равно оставалась только уже говорила, что не может конвертнуть либо interior_ptr, либо MyInterop::Message* соответсвенно в LPMSG.
Также пытался использовать MSG из NativeMethods, но тут на строчке
System::Windows::Forms::NativeMethods::MSG *mssg;
вылетала ошибка:
Error    3    error C2039: 'MSG' : is not a member of 'System::Windows::Forms'
не смотря на то, что я вводил эти данные не вручную (выбирал из выпадающих списков) и всплывающая подсказка говорит, 
что это value class ... sealed  smile 
PM MAIL ICQ Skype MSN   Вверх
Arks
Дата 9.4.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Исправил PeekMessage на PeekMessageW. Всё билдится. %)
PM MAIL ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.