在真正的C++,可以從這樣一個RTF控制創建一個數據流緩存器:
class RTF_buf : public std::streambuf {
std::vector<char> buffer;
public:
RTF_buf(HWND ctrl) {
DWORD len = SendMessage(ctrl, WM_GETTEXTLENGTH, 0, 0);
buffer.resize(len+1);
SendMessageA(ctrl, WM_GETTEXT, len+1, (LPARAM)&buffer[0]);
setg(&buffer[0], &buffer[0], &buffer[len]);
}
};
注這實際上並不限於RTF控制。只是另一個例子,它也可以正常使用EDIT控件。
C++/CLI增加了一些皺紋。首先,你正在處理RichTextBox中的「寬」字符。其次,你不會(通常)以HWND開始 - 你必須通過Handle
屬性從System.Windows.Forms.RichTextBox
中檢索它。不幸的是,這將返回HWND
作爲IntPtr
而不是HWND
,因此您必須添加一個強制轉換才能將其轉換爲正確的類型。這使得代碼有點醜陋,但沒有太可怕:
#include <windows.h>
#include <streambuf>
#include <iostream>
#include <vector>
#include <algorithm>
#pragma comment(lib, "user32.lib")
using namespace System;
using namespace System::Windows::Forms;
class RTF_buf : public std::wstreambuf {
std::vector<wchar_t> buffer;
public:
RTF_buf(RichTextBox^ control) {
HWND ctrl = *reinterpret_cast<HWND *>(&control->Handle);
int len = SendMessage(ctrl, WM_GETTEXTLENGTH, 0, 0);
buffer.resize(len+1);
SendMessage(ctrl, WM_GETTEXT, len+1, (LPARAM)&buffer[0]);
setg(&buffer[0], &buffer[0], &buffer[len]);
}
};
我們可以創建一個緩衝和istream的是這樣的:
RTF_buf b(this->richTextBox1);
std::wistream in(&b);
最後,我們可以從流中讀取數據,並對其進行處理就像我們基本上任何其他(廣泛)的流一樣。例如:
wchar_t ch;
while (in >> ch)
// do something with ch
所以C++/CLI不加小複雜的任務,但最終只有一點點 - 主要是一線獲得控件的句柄,並將其轉換爲正確的類型。除此之外,緩衝區類的代碼幾乎不需要改變,並且實例化和使用它只會改變我們使用寬字符而不是縮小的程度。
這就是令牌錯誤,下面是另一個錯誤:'錯誤LNK2019:無法解析的外部符號'extern「C」long __stdcall SendMessageW(struct HWND__ *,unsigned int,unsigned int,long)「(?SendMessageW @@ $ $ __ @@ IIJ @ Z)在函數「extern」C中引用long __clrcall SendMessage(struct HWND__ *,unsigned int,unsigned int,long)「(?SendMessage @@ $$ J0YMJPAUHWND __ @@ IIJ @ Z)' –
I將「user32.lib」添加到鏈接器輸入中,解決了鏈接器錯誤 –
This works。Thanks for the enlightenment。 –