我有一个C++/CLI System::Windows::Forms::UserControl派生控件,它只能在新数据输入时自己重绘(一小部分).但是出于某种原因,即使没有任何东西可以在应用程序外部引起它,也会调用OnPaint机制.
这是一个片段:
void Spectrogram::OnPaint(System::Windows::Forms::PaintEventArgs ^e)
{
// Overidden to stop the background being painted(?)
}
void Spectrogram::AddNewFFTData( float* data, int fataWidth )
{
Graphics^ gfx = CreateGraphics();
//now do some drawing
gfx->Dispose();
}
Run Code Online (Sandbox Code Playgroud)
所以我调用add data方法添加一些新数据,这些数据理论上应该写入前一个条目(清除一些突出显示)并写入新条目.
在那天我曾经开发过MFC/OpenGL应用程序,我要做的第一件事就是覆盖这个OnEraseBackground方法.据我所知,没有明显的方法可以阻止它被删除.我错过了什么?
我有一个在C#中定义的接口,它有一个方法
Array[] Foo();
Run Code Online (Sandbox Code Playgroud)
我需要在用C++/CLI编写的类中实现此接口.我尝试了以下语法
array<array<Object^>^>^ Foo();
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误,说明我的返回类型与界面中的类型不匹配.有谁知道如何将C#转换Array[]为C++/CLI?
任何人都可以看到这个错误吗?我得到的错误是:
1> MainForm.cpp(71):错误C2059:语法错误:')'
1> MainForm.cpp(72):错误C2143:语法错误:缺少';' 在'{'之前
1> MainForm.cpp(75):错误C2181:非法其他没有匹配if
1> MainForm.cpp(75):错误C2059:语法错误:')'
1> MainForm.cpp(76):错误C2143:语法错误:缺少';' 在'{'之前
码:
if (oMail->From->ToString()->Contains("email@gmail.com")) //Compare to whitelist
{
mailSend::sendMail("email@gmail.com", "Commands Accepted!", "You are on the whitelist for this server.");
}
else if () //Compare to blacklist
{
mailSend::sendMail("email@gmail.com", "Commands Rejected!", "You are on the blacklist for this server.");
}
else () // Else do Default Behavior
{
if (UserSettings::TheInstance2->defaultBehavior->ToString() == "Accept")
{
mailSend::sendMail("email@gmail.com", "Commands Accepted!", "Accepted");
}
else if (UserSettings::TheInstance2->defaultBehavior->ToString() == "Accept (And add to Whitelist)")
{
mailSend::sendMail("email@gmail.com", …Run Code Online (Sandbox Code Playgroud) 首先,我是C++/CLI的新手.
做了一些研究后,我发现我可以Marshal::PtrToStringBSTR用来转换IntPtr为System::String.那么,有没有办法将我的_bstr_t变量转换为一个,IntPtr以便我可以将它传递给提到的函数并进行转换?
要么,
将_bstr_t变量转换为的正确方法是System::String什么?
我想知道本机指针是否有任何指向托管堆的方式?我知道这将是一件危险的事情,因为堆压缩和GC周期改变了对象地址,但它仍然可能吗?一个例子将不胜感激.
另外,Handle(^)是否真的无法指向本机堆?
谢谢.
我有c ++ dll,我正在转换为c ++/cli.设置/ clr编译器选项后,我的项目构建正常.但是,当我尝试通过引用ac #project中的dll来引用本机方法时,c#project无法找到它.不设置/ clr构建MSIL的所有源代码,这些代码应该从其他.net程序集中可见吗?为什么我必须创建一个c ++/cli包装类来使本地代码对c#代码可见?
我不清楚c ++/cli是如何工作的......
我在C中理解,运算符^用于逐位EX-OR.在其中一个C++代码中,我看到了以下使用此运算符的行:
using namespace System::Threading;
public ref class Expert : public System::Windows::Forms::Form
{
int i ;
float a ;
public:
int count;
Thread^ th;
}
Run Code Online (Sandbox Code Playgroud)
^这里是什么意思?
我有一个使用OpenCV的C++/CLI项目.我自己在VS 2010中编译了这个版本的OpenCV,我可以在非托管项目中使用它而没有问题 - 当我尝试在托管项目中使用它时,麻烦就开始了.
感兴趣的功能是cv::imread(std::string&, int).简单地从托管模块调用它根本不起作用,在接收端产生<无效指针>.我有点期待它.毕竟,托管代码有自己的std::string实现.
当我创建一个单独的C++文件,从其模块中删除CLI支持并将我的代码放入其中时,事情变得更有趣了.现在,imread获得了一个有效的指针,但其内容被扰乱了.显然,string我传递它包含的字符串指针偏移4个字节,但它预计它在0偏移量.
非托管模块使用与OpenCV相同的CRT DLL,并将所有选项设置为适合正常OpenCV使用的值.为什么会有不同的string布局?我搞不清楚了.
示例代码:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <string>
using namespace cv;
using namespace std;
void Run()
{
string path("C:\\Users\\Don Reba\\Pictures\\Merlin 1D.jpg");
Mat image(imread(path, CV_LOAD_IMAGE_GRAYSCALE));
imwrite("image.jpg", image);
}
Run Code Online (Sandbox Code Playgroud) 我有一个字符串^,它被转换为Uint32在下面的代码中:
try
{
int newX = System::Convert::ToUInt32(this->cbXSizeBox->Text);
}
catch (FormatException^ e)
{
printf("\nNot a valid 3-digit number");
this->cbXSizeBox->Text = System::Convert::ToString(capBoxSize->x);
}
Run Code Online (Sandbox Code Playgroud)
这很好.(FYI capBoxSize-> x是另一个可以评估为uint32的值).
基本上捕获的是捕获cbXSizeBox-> Text(这是一个字符串)的值,回到它的默认值,如果用户输入除数字之外的任何内容(例如2g9).
如果catch块没有捕获格式异常,我想添加代码来将capBoxSize-> x的值更改为它的新有效值.我试图找到一些对编译器说的内容,"如果你抓住了这个异常,就这样做.但是如果你没有捕获异常,那就去做吧." 是否可以在if else语句中包含catch块?
如果您了解我正在尝试做什么,任何建议将不胜感激.
PS在try块中更改capBoxSize-> x的代码实际上并不是我认为的选项.因为这可能会尝试将newX分配给capBoxSize-> X这样的"2ty",这是一个Uint32.这可能会导致错误.
在C++/CLI中,以下两个是相同还是不同?
System::String ^source("Hello World");
System::String ^source= gcnew System::String("Hello World");
Run Code Online (Sandbox Code Playgroud)
第一个是堆栈,第二个堆栈吗?
或者他们都在堆?
.Net对象我认为只有引用它们不能在堆栈上创建,这与C++允许我们不同.有人可以解释一下吗?
c++-cli ×10
c++ ×3
syntax ×2
.net ×1
c# ×1
graphics ×1
heap-memory ×1
opencv ×1
try-catch ×1
visual-c++ ×1