Как установить текст в элементе управления TextBox из собственного кода? - PullRequest
1 голос
/ 11 апреля 2011

Можно ли манипулировать элементами управления .net из собственного кода?В частности, я хотел бы установить текст TextBox из некоторого нативного кода.Я хочу, чтобы это делалось таким образом, чтобы отделить бизнес-логику от пользовательского интерфейса, но именно нативный код знает, как правильно форматировать данные (некоторые байты, полученные в протоколе).

Я знаюЯ мог бы получить дескриптор окна через свойство Handle, но как там я мог бы вызвать нужный метод?

Является ли обработка строк моей единственной опцией?Должен ли собственный код создавать сообщение для отображения на элементе управления?

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Если вы хотите отделить свою бизнес-логику от пользовательского интерфейса, а некоторая часть вашей бизнес-логики находится в собственном коде, то было бы неплохо не изменить любое содержимое графического интерфейса из нативный код напрямую, потому что он в точности противоположен тому, чего вы хотите достичь. Лучше попытаться написать какой-нибудь метод-обертку в C ++ / CLI, чтобы вызвать оттуда подпрограмму собственного формата данных, сделав ее доступной для использования в коде GUI.

Если вы действительно хотите выполнять вызовы из собственного кода в управляемый код, вы можете объявить (собственный!) Статический метод в C ++ / CLI, который вызывает управляемый метод. Вы можете передать указатель функции на такой метод на нижний уровень вашей программы (например, на ваш родной уровень C ++), который может быть вызван оттуда.

Что-то вроде:

// the native code layer:
// "Callbacks.h"
void (*_myNativeCallback)();
void InitCallback(void (*myNativeCallback)())
{
   _myNativeCallback=myNativeCallback;
}
// now you can use _myNativeCallback within your native code


// the C++/CLI layer:
#include "Callbacks.h"
//...
static void MyNativeCallback()
{
    ManagedClass::StaticMethod();
}
InitCallback(MyNativeCallback);

В ManagedClass::StaticMethod у вас есть доступ к вашему .NET-коду, и у вас не должно быть проблем с манипулированием TextBox любой формы, которую вы можете получить оттуда. Если вам нужно преобразовать нативную строку в System::String, этот фрагмент кода может оказаться полезным:

inline System::String StdToSysString(const std::string &s)
{
    return gcnew System::String(s.c_str());
}

И наоборот (предполагается, что кодовая страница Ansi):

inline std::string SystemToStdString(System::String ss)
{
    using namespace System::Runtime::InteropServices;
    const char* chars = 
      (const char*)(Marshal::StringToHGlobalAnsi(ss)).ToPointer();
    std::string s = chars;
    Marshal::FreeHGlobal(System::IntPtr((void*)chars));
    return s;
}
1 голос
/ 11 апреля 2011

«Родной» способ задания текста в текстовом поле - отправить текстовое поле сообщение WM_SETTEXT:

// handle is initialized from TextBox::Handle
PostMessage(handle, WM_SETTEXT, 0, _T("Some text"));

Читать на PostMessage и SendMessage тоже.В зависимости от того, как вы распределяете и формируете текст, вам может понадобиться использовать SendMessage, чтобы избежать преждевременного освобождения.

...