`
dqifa
  • 浏览: 118169 次
社区版块
存档分类
最新评论

利用wxwidgets操纵word

 
阅读更多

最近在学习怎么用wxwidgets来操纵word,寻找之中发现MedeoSoftware,里面有很多wxwidgets的用法,不过我最关心的还是其中的dmxMSWordDocument,操作word的方法比较全,很值得学习。代码如下(并附上全部源码):

 

 

dmxMSWordDocument.h

#ifndef _DMX_MSWORD_DOCUMENT_H_
#define _DMX_MSWORD_DOCUMENT_H_

#include "wxCommon.h"

////////////////////////////////////////////////////////////////////////////////
// dmxMSWordFont
////////////////////////////////////////////////////////////////////////////////

struct dmxMSWordFont
{
	long pointsize;
	bool bold;
	bool italic;
	wxString font_name;
	wxColour color;

	dmxMSWordFont(long a_pointsize = 12, bool a_bold = false, bool a_italic = false,
				  const wxString &ar_font_name = "Times New Roman",
				  const wxColour &ar_color = wxColour(0, 0, 0))
	:	pointsize(a_pointsize),
		bold(a_bold),
		italic(a_italic),
		font_name(ar_font_name),
		color(ar_color)
	{}

	dmxMSWordFont(const dmxMSWordFont &ar_font)
	:	pointsize(ar_font.pointsize),
		bold(ar_font.bold),
		italic(ar_font.italic),
		font_name(ar_font.font_name),
		color(ar_font.color)
	{}

	dmxMSWordFont& operator=(const dmxMSWordFont &ar_font)
	{
		if (&ar_font != this) {
			pointsize = ar_font.pointsize;
			bold = ar_font.bold;
			italic = ar_font.italic;
			font_name = ar_font.font_name;
			color = ar_font.color;
		}
		return *this;
	}

	bool operator==(const dmxMSWordFont &ar_font) const
	{
		if (pointsize != ar_font.pointsize ||
			bold != ar_font.bold ||
			italic != ar_font.italic ||
			font_name != ar_font.font_name ||
			color != ar_font.color)
			return false;
		else
			return true;
	}

	bool operator!=(const dmxMSWordFont &ar_font) const
	{
		return !operator==(ar_font);
	}
};

extern dmxMSWordFont gc_DefaultMSWordFont;

////////////////////////////////////////////////////////////////////////////////
// dmxMSWordDocument
////////////////////////////////////////////////////////////////////////////////

class dmxMSWordDocument
{
public: 
	enum Alignment
	{
		c_ALIGN_LEFT	= 0,
		c_ALIGN_CENTER	= 1,
		c_ALIGN_RIGHT	= 2,
		c_ALIGN_JUSTIFY	= 3
	};

	enum PageOrientation
	{
		c_PORTRAIT,
		c_LANDSCAPE
	};

private:
	bool m_ok;
	wxAutomationObject m_word;
	wxAutomationObject m_document;
	wxAutomationObject *mp_table;

	struct TableBufferElement
	{
		wxString Text;
		Alignment TextAlignment;
		dmxMSWordFont Font;
	};

	typedef std::vector<TableBufferElement> TableLineBuffer;
	std::vector<TableLineBuffer> m_table_buffer;
	
public:
	dmxMSWordDocument(const wxString &ar_name = wxEmptyString, bool a_visible = true);
	~dmxMSWordDocument();

	bool IsOk(void) const { return m_ok; }

	void Show(bool a_show = true);

	void Close(void);
	bool SaveAs(const wxString &ar_file_name);

	static bool IsAccessible(void);

	void AddParagraph(Alignment a_alignment = c_ALIGN_JUSTIFY, 
					  const dmxMSWordFont &ar_font = gc_DefaultMSWordFont);

	void AddTextParagraph(const wxString &ar_text, Alignment a_alignment = c_ALIGN_JUSTIFY,
						  const dmxMSWordFont &ar_font = gc_DefaultMSWordFont);

	void AddBitmap(const wxBitmap &ar_image, Alignment a_alignment = c_ALIGN_JUSTIFY);
	void AddPictureFromFile(const wxString &ar_file_name, Alignment a_alignment = c_ALIGN_JUSTIFY);

	bool CreateTableFromString(const wxString &ar_text, long a_cols, long a_rows,
							   const wxChar *ap_separator = "|",
							   long a_table_format1 = 22, // 耱桦?纛痨囹桊钼囗? 22 = "彦蜿?蜞犭桷?7"
							   long a_table_format2 = 16); // 羼腓 礤 镱塍麒腩顸, 蝾 稃蜞屐? 耱桦?纛痨囹桊钼囗? 16 = "彦蜿?蜞犭桷?1"

	void InitTableBuffer(long a_cols, long a_rows);
	void SetTableBufferCellText(long a_col, long a_row, const wxString &ar_text,
								Alignment a_alignment = c_ALIGN_JUSTIFY, 
								const dmxMSWordFont &ar_font = gc_DefaultMSWordFont);
	bool CreateTableFromBuffer(void);

	void AddTable(long a_cols, long a_rows);
	void AddTableCellText(long a_col, long a_row, const wxString &ar_text,
						  Alignment a_alignment = c_ALIGN_JUSTIFY, 
						  const dmxMSWordFont &ar_font = gc_DefaultMSWordFont);
	void AddPictureToTableCell
	(
		long a_col, long a_row, 
		const wxString &ar_file_name,
		Alignment a_alignment
	);
	void AddBitmapToTableCell
	(
		long a_col, long a_row, 
		const wxBitmap &ar_bitmap,
		Alignment a_alignment
	);
	void PasteFromClipboardToTableCell
	(
		long a_col, long a_row, 
		Alignment a_alignment
	);
	
	void Paste(Alignment a_alignment);
	void SetPageOrientation(PageOrientation a_orientation);

	void SetPageLeftMargin(double a_margin_sm);
	void SetPageRightMargin(double a_margin_sm);
	void SetPageTopMargin(double a_margin_sm);
	void SetPageBottomMargin(double a_margin_sm);

	void SetPageHeaderDistance(double a_margin_sm);
	void SetPageFooterDistance(double a_margin_sm);

private:
	void mf_SetPageMargin(const wxString &ar_margin_name, double a_margin);
};

#endif

 

 

dmxMSWordDocument.cpp

#include "wxCommon.h"
#include "dmxMSWordDocument.h"
#include "Useful.h"
#include "message_dialog.h"
#include "wxTranslation.h"
#include "wxstringutil.h"

////////////////////////////////////////////////////////////////////////////////
// dmxMSWordFont
////////////////////////////////////////////////////////////////////////////////

dmxMSWordFont gc_DefaultMSWordFont = dmxMSWordFont();

////////////////////////////////////////////////////////////////////////////////
// dmxMSWordDocument
////////////////////////////////////////////////////////////////////////////////

dmxMSWordDocument::dmxMSWordDocument(const wxString &ar_name, bool a_visible)
:	m_ok(false),
	mp_table(NULL)
{
	// 青矬耜噱?MSWord
	if (!m_word.CreateInstance("Word.Application"))
		return;

	m_ok = true;

	m_word.PutProperty("Visible", a_visible);
	m_word.CallMethod("Documents.Add");
	m_word.GetObject(m_document, "ActiveDocument");

	wxAutomationObject footer(m_document.CallMethod("Sections.Last.Footers.Item", 3L).GetVoidPtr());
	footer.CallMethod("PageNumbers.Add");

	if (!ar_name.IsEmpty())
		m_document.PutProperty("Name", ar_name);

	m_document.PutProperty("Content.Font.Name", gc_DefaultMSWordFont.font_name);
	m_document.PutProperty("Content.Font.Size", gc_DefaultMSWordFont.pointsize);
	m_document.PutProperty("Content.Font.Bold", gc_DefaultMSWordFont.bold);
	m_document.PutProperty("Content.Font.Italic", gc_DefaultMSWordFont.italic);
	m_document.PutProperty("Content.Font.Color", (long)RGB(gc_DefaultMSWordFont.color.Red(), 
														gc_DefaultMSWordFont.color.Green(), 
														gc_DefaultMSWordFont.color.Blue()));
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::Show(bool a_show)
{
	m_word.PutProperty("Visible", a_show);
	m_word.CallMethod("Word.ActiveWindow.Activate");
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::Close(void)
{
	m_word.CallMethod("Quit", false);
}

//------------------------------------------------------------------------------

bool dmxMSWordDocument::SaveAs(const wxString &ar_file_name)
{
	m_document.CallMethod("SaveAs", ar_file_name);
	return true;
}

//------------------------------------------------------------------------------

dmxMSWordDocument::~dmxMSWordDocument()
{
	if (mp_table) {
		delete mp_table;
		mp_table = NULL;
	}
}

//------------------------------------------------------------------------------

bool dmxMSWordDocument::IsAccessible(void)
{
	wxAutomationObject word;
	bool accessible = word.CreateInstance("Word.Application");
	if (accessible)
		word.CallMethod("Word.Close");

	return accessible;
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::AddParagraph(Alignment a_alignment, const dmxMSWordFont &ar_font)
{
	m_document.CallMethod("Content.InsertParagraphAfter");

	wxAutomationObject paragraph;
	m_document.GetObject(paragraph, "Paragraphs.Last");

	paragraph.PutProperty("Alignment", long(a_alignment));
	paragraph.PutProperty("SpaceAfter", long(0));
	paragraph.PutProperty("SpaceBefore", long(0));

	paragraph.PutProperty("Range.Font.Name", ar_font.font_name);
	paragraph.PutProperty("Range.Font.Size", ar_font.pointsize);
	paragraph.PutProperty("Range.Font.Bold", ar_font.bold);
	paragraph.PutProperty("Range.Font.Italic", ar_font.italic);
	paragraph.PutProperty("Range.Font.Color", (long)RGB(ar_font.color.Red(), 
														ar_font.color.Green(), 
														ar_font.color.Blue()));
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::AddTextParagraph(const wxString &ar_text, Alignment a_alignment,
										 const dmxMSWordFont &ar_font)
{
	m_document.CallMethod("Content.InsertAfter", ar_text);

	wxAutomationObject paragraph;
	m_document.GetObject(paragraph, "Paragraphs.Last");

	paragraph.PutProperty("Alignment", long(a_alignment));
	paragraph.PutProperty("SpaceAfter", long(0));
	paragraph.PutProperty("SpaceBefore", long(0));

	paragraph.PutProperty("Range.Font.Name", ar_font.font_name);
	paragraph.PutProperty("Range.Font.Size", ar_font.pointsize);
	paragraph.PutProperty("Range.Font.Bold", ar_font.bold);
	paragraph.PutProperty("Range.Font.Italic", ar_font.italic);
	paragraph.PutProperty("Range.Font.Color", (long)RGB(ar_font.color.Red(), 
														ar_font.color.Green(), 
														ar_font.color.Blue()));

	AddParagraph();
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::AddBitmap(const wxBitmap &ar_bitmap, Alignment a_alignment)
{
	wxOpenClipboard();
	wxEmptyClipboard();
	wxSetClipboardData(wxDF_BITMAP, &ar_bitmap, ar_bitmap.GetWidth(), ar_bitmap.GetHeight());
	wxCloseClipboard();

	Paste(a_alignment);
}


//------------------------------------------------------------------------------

void dmxMSWordDocument::AddPictureFromFile(const wxString &ar_file_name, Alignment a_alignment)
{
	m_document.CallMethod("Content.InsertAfter", wxEmptyString);

	wxAutomationObject paragraph;
	if (!m_document.GetObject(paragraph, "Paragraphs.Last"))
		return;

	paragraph.PutProperty("Alignment", long(a_alignment));
	paragraph.PutProperty("SpaceAfter", long(0));
	paragraph.PutProperty("SpaceBefore", long(0));
	wxVariant range = paragraph.GetProperty("Range");

	wxAutomationObject shapes;
	m_document.GetObject(shapes, "InlineShapes");

	wxVariant no_link_to_file(false);
	wxVariant save_with_document(true);
	shapes.CallMethod("AddPicture", ar_file_name, no_link_to_file, save_with_document, range);
}

//------------------------------------------------------------------------------

bool dmxMSWordDocument::CreateTableFromString(const wxString &ar_text, 
											  long a_cols, long a_rows,
											  const wxChar *ap_separator,
											  long a_table_format1,
											  long a_table_format2)
{
	wxAutomationObject paragraph;
	m_document.GetObject(paragraph, "Paragraphs.Last");

	paragraph.CallMethod("Range.InsertAfter", ar_text);

	std::vector<wxVariant> args;
	args.push_back(wxVariant(dmxT("|"), dmxT("Separator")));
	args.push_back(wxVariant(a_rows, dmxT("NumRows")));
	args.push_back(wxVariant(a_cols, dmxT("NumColumns")));
	args.push_back(wxVariant(true, dmxT("AutoFit")));
	args.push_back(wxVariant(0L, dmxT("AutoFitBehavior")));
	args.push_back(wxVariant(1L, dmxT("DefaultTableBehavior")));

	wxVariant result;
	if (a_table_format1 < 0)
	{
		// 杨玟噱?蜞犭桷??纛痨囹铎 镱 箪铍鬣龛?
		paragraph.CallMethod("Range.ConvertToTable", args.size(), &(args[0]));
	}
	else
	{
		// 消蜞屐? 耦玟囹?蜞犭桷?镥疴 玎溧眄 纛痨囹铎
		args.push_back(wxVariant(a_table_format1, dmxT("Format")));
		result = paragraph.CallMethod("Range.ConvertToTable", args.size(), &(args[0]));
		if (result.IsNull()) 
		{
			// 羼腓 礤 镱塍麒腩顸, 蝾 稃蜞屐? 耦玟囹?怛铕 玎溧眄 纛痨囹铎
			args.back() = wxVariant(a_table_format2, dmxT("Format"));
			if (a_table_format2 > 0)
				result = paragraph.CallMethod("Range.ConvertToTable", args.size(), &(args[0]));

			if (result.IsNull())
				// 眢, 珥圜栩, 耦怦屐 礤 镱塍麒腩顸
				return false;
		}
	}

	AddParagraph();

	return true;
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::InitTableBuffer(long a_cols, long a_rows)
{
	m_table_buffer.resize(a_rows, TableLineBuffer(a_cols, TableBufferElement()));
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::SetTableBufferCellText(long a_col, long a_row, 
											   const wxString &ar_text,
											   Alignment a_alignment, 
											   const dmxMSWordFont &ar_font)
{
	TableBufferElement element;
	element.Text = ar_text;
	element.Font = ar_font;
	element.TextAlignment = a_alignment;

	m_table_buffer[a_row][a_col] = element;
}

//------------------------------------------------------------------------------

bool dmxMSWordDocument::CreateTableFromBuffer(void)
{
	dmxUInt32 rows = m_table_buffer.size();
	if (rows == 0)
		return true;

	dmxUInt32 cols = m_table_buffer[0].size();
	if (cols == 0)
		return true;

	// 灶痨桊箦?耱痤牦 ?耦玟噱?蜞犭桷?
	wxString table_string;
	for (dmxUInt32 j = 0; j < rows; j++)
		for (dmxUInt32 i = 0; i < cols; i++) {
			table_string << m_table_buffer[j][i].Text;
			if (j < rows - 1  || i < cols - 1)
				table_string << '|';
		}

	if (!CreateTableFromString(table_string, cols, rows, "|")) {
		dmxMessageBox(NULL, wxTR("tr_WordDocument", "MsgCreateTableError"), dmxMessageDialog::c_ICON_ERROR);
		return false;
	}

	// 灶痨囹桊箦?麇殛?蜞犭桷?
	wxVariant index = m_document.GetProperty("Tables.Count");
	wxAutomationObject table(m_document.CallMethod("Tables.Item", index).GetVoidPtr());

	for (dmxUInt32 j = 0; j < rows; j++)
		for (dmxUInt32 i = 0; i < cols; i++) {
			if (m_table_buffer[j][i].TextAlignment == c_ALIGN_JUSTIFY &&
				m_table_buffer[j][i].Font == gc_DefaultMSWordFont) 
				continue;
			
			wxAutomationObject cell(table.CallMethod("Cell", long(j + 1), long(i + 1)).GetVoidPtr());

			if (m_table_buffer[j][i].TextAlignment != c_ALIGN_JUSTIFY)
				cell.PutProperty("Range.Paragraphs.Alignment", long(m_table_buffer[j][i].TextAlignment));
			cell.PutProperty("Range.Paragraphs.SpaceAfter", long(0));
			cell.PutProperty("Range.Paragraphs.SpaceBefore", long(0));

			dmxMSWordFont font = m_table_buffer[j][i].Font;
			if (font.font_name != gc_DefaultMSWordFont.font_name)
				cell.PutProperty("Range.Font.Name", font.font_name);
			if (font.pointsize != gc_DefaultMSWordFont.pointsize)
				cell.PutProperty("Range.Font.Size", font.pointsize);
			if (font.bold != gc_DefaultMSWordFont.bold)
				cell.PutProperty("Range.Bold", font.bold);
			if (font.italic != gc_DefaultMSWordFont.italic)
				cell.PutProperty("Range.Font.Italic", font.italic);
			if (font.color!= gc_DefaultMSWordFont.color)
				cell.PutProperty("Range.Font.Color", (long)RGB(font.color.Red(), 
															   font.color.Green(), 
															   font.color.Blue()));
		}

	return true;
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::AddTable(long a_cols, long a_rows)
{
	if (mp_table) {
		delete mp_table;
		mp_table = NULL;
	}

	dmxMSWordFont dummy_font(6, false, false, "Arial");
	AddParagraph(dmxMSWordDocument::c_ALIGN_CENTER, dummy_font);

	wxAutomationObject paragraph;
	if (m_document.GetObject(paragraph, "Paragraphs.Last"))
	{
		paragraph.PutProperty("PointSize", long(6));
	}


	wxVariant args[3];
	args[0] = m_document.GetProperty("Paragraphs.Last.Range");
	args[1] = a_rows;
	args[2] = a_cols;

	m_document.CallMethod("Tables.Add", 3, args);

	wxVariant index = m_document.GetProperty("Tables.Count");
	mp_table = new wxAutomationObject(m_document.CallMethod("Tables.Item", index).GetVoidPtr());
	mp_table->PutProperty("Borders.InsideLineStyle", 1L);// = wdLineStyleSingle
    mp_table->PutProperty("Borders.OutsideLineStyle", 1L);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::AddTableCellText(long a_col, long a_row, 
										 const wxString &ar_text, Alignment a_alignment, 
										 const dmxMSWordFont &ar_font)
{
	if (!mp_table)
		return;

	wxAutomationObject cell(mp_table->CallMethod("Cell", a_row, a_col).GetVoidPtr());
	
	cell.PutProperty("Range.Paragraphs.Alignment", long(a_alignment));
	cell.PutProperty("Range.Paragraphs.SpaceAfter", long(0));
	cell.PutProperty("Range.Paragraphs.SpaceBefore", long(0));

	if (ar_font != gc_DefaultMSWordFont) {
		cell.PutProperty("Range.Font.Name", ar_font.font_name);
		cell.PutProperty("Range.Font.Size", ar_font.pointsize);
		cell.PutProperty("Range.Bold", ar_font.bold);
		cell.PutProperty("Range.Font.Italic", ar_font.italic);
		cell.PutProperty("Range.Font.Color", (long)RGB(ar_font.color.Red(), 
													   ar_font.color.Green(), 
													   ar_font.color.Blue()));
	}

	cell.CallMethod("Range.InsertAfter", ar_text);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::AddPictureToTableCell
(
	long a_col, long a_row, 
	const wxString &ar_file_name,
	Alignment a_alignment
)
{
	if (!mp_table)
		return;

	wxAutomationObject cell(mp_table->CallMethod("Cell", a_row, a_col).GetVoidPtr());
	cell.CallMethod("Range.InsertAfter", wxEmptyString);

	wxAutomationObject paragraph;
	if (!cell.GetObject(paragraph, "Range.Paragraphs.Last"))
		return;

	paragraph.PutProperty("Alignment", long(a_alignment));
	paragraph.PutProperty("SpaceAfter", long(0));
	paragraph.PutProperty("SpaceBefore", long(0));
	wxVariant range = paragraph.GetProperty("Range");

	wxAutomationObject shapes;
	m_document.GetObject(shapes, "InlineShapes");

	wxVariant no_link_to_file(false);
	wxVariant save_with_document(true);
	shapes.CallMethod("AddPicture", ar_file_name, no_link_to_file, save_with_document, range);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::AddBitmapToTableCell
(
	long a_col, long a_row, 
	const wxBitmap &ar_bitmap,
	Alignment a_alignment
)
{
	if (!mp_table)
		return;

	wxAutomationObject cell(mp_table->CallMethod("Cell", a_row, a_col).GetVoidPtr());

	wxAutomationObject range;
	if (!cell.GetObject(range, "Range"))
		return;

	wxOpenClipboard();
	wxEmptyClipboard();
	wxSetClipboardData(wxDF_BITMAP, &ar_bitmap, ar_bitmap.GetWidth(), ar_bitmap.GetHeight());
	wxCloseClipboard();

	range.CallMethod("Paste");
	range.PutProperty("Alignment", long(a_alignment));
	range.PutProperty("SpaceAfter", long(0));
	range.PutProperty("SpaceBefore", long(0));
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::PasteFromClipboardToTableCell
(
	long a_col, long a_row, 
	Alignment a_alignment
)
{
	if (!mp_table)
		return;

	wxAutomationObject cell(mp_table->CallMethod("Cell", a_row, a_col).GetVoidPtr());

	wxAutomationObject range;
	if (!cell.GetObject(range, "Range"))
		return;

	range.CallMethod("Paste");
	range.PutProperty("Alignment", long(a_alignment));
	range.PutProperty("SpaceAfter", long(0));
	range.PutProperty("SpaceBefore", long(0));
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::Paste(Alignment a_alignment)
{
	wxAutomationObject paragraph;
	if (m_document.GetObject(paragraph, "Paragraphs.Last"))
	{
		paragraph.PutProperty("Alignment", long(a_alignment));
		paragraph.PutProperty("SpaceAfter", long(0));
		paragraph.PutProperty("SpaceBefore", long(0));
	}

	m_document.CallMethod("Paragraphs.Last.Range.Paste");
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::SetPageOrientation(PageOrientation a_orientation)
{
	wxAutomationObject page_setup;
	if (!m_document.GetObject(page_setup, "PageSetup"))
		return;

	page_setup.PutProperty("Orientation", long(a_orientation));
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::mf_SetPageMargin(const wxString &ar_margin_name, double a_margin_sm)
{
	wxAutomationObject page_setup;
	if (!m_document.GetObject(page_setup, "PageSetup"))
		return;

	// 1 濑殪 = 2,54 耢 = 72 蝾麝?
	double margin_points = (a_margin_sm*72.0)/2.54;
	page_setup.PutProperty(ar_margin_name, margin_points);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::SetPageLeftMargin(double a_margin_sm)
{
	mf_SetPageMargin("LeftMargin", a_margin_sm);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::SetPageRightMargin(double a_margin_sm)
{
	mf_SetPageMargin("RightMargin", a_margin_sm);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::SetPageTopMargin(double a_margin_sm)
{
	mf_SetPageMargin("TopMargin", a_margin_sm);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::SetPageBottomMargin(double a_margin_sm)
{
	mf_SetPageMargin("BottomMargin", a_margin_sm);
}

//------------------------------------------------------------------------------

void dmxMSWordDocument::SetPageHeaderDistance(double a_margin_sm)
{
	mf_SetPageMargin("HeaderDistance", a_margin_sm);
}
//------------------------------------------------------------------------------

void dmxMSWordDocument::SetPageFooterDistance(double a_margin_sm)
{
	mf_SetPageMargin("FooterDistance", a_margin_sm);
}

////////////////////////////////////////////////////////////////////////////////

 

注:在使用ole时不要忘记包含头文件#include <wx/msw/ole/automtn.h>

分享到:
评论
3 楼 鸵鸟大仙 2012-12-17  
麻烦请问一下怎么在wxwidgets中加载msword.olb?我只会在MFC下实现对word的控制,如果换到wxwidgets下,需要怎么做?万分感谢哈!!
2 楼 dqifa 2012-10-05  
Rat_boy 写道
我现在也在做wxWidgets操作Word的功能 但是搞了好久都没有弄出来,网上又只有你的东西,下载了你的那个东西怎么还是不知道怎么操作,能否讲的再详细一点,还有dmx开头的类是否是阁下自己写的类库啊?各种不会,望指点一二啊



这里有源码:http://emonkey.iteye.com/blog/1672611
1 楼 Rat_boy 2012-09-29  
我现在也在做wxWidgets操作Word的功能 但是搞了好久都没有弄出来,网上又只有你的东西,下载了你的那个东西怎么还是不知道怎么操作,能否讲的再详细一点,还有dmx开头的类是否是阁下自己写的类库啊?各种不会,望指点一二啊

相关推荐

    在wxWidgets中操纵word实例

    在wxWidgets中操纵Word实例,主要是通过COM(Component Object Model)接口实现的,因为Microsoft Office应用程序如Word提供了COM接口供外部程序进行交互。在Windows平台上,COM是微软提供的一种二进制兼容的标准,...

    多目标白鲸优化算法MOBWO:在多目标测试函数中的实证与应用分析,多目标白鲸优化算法MOBWO的实证研究:在九个测试函数中的表现与评估,多目标白鲸优化算法MOBWO 在9个多目标测试函数中测试 Mat

    多目标白鲸优化算法MOBWO:在多目标测试函数中的实证与应用分析,多目标白鲸优化算法MOBWO的实证研究:在九个测试函数中的表现与评估,多目标白鲸优化算法MOBWO 在9个多目标测试函数中测试 Matlab语言 程序已调试好,可直接运行,算法新颖 1将蛇优化算法的优良策略与多目标优化算法框架(网格法)结合形成多目标蛇优化算法(MOSO),为了验证所提的MOSO的有效性,将其在9个多目标测试函数 (ZDT1、ZDT2、ZDT3、ZDT4、ZDT6、Kursawe、Poloni,Viennet2、Viennet3) 上实验,并采用IGD、GD、HV、SP四种评价指标进行评价,部分效果如图1所示,可完全满足您的需求~ 2源文件夹包含MOBWO所有代码(含9个多目标测试函数)以及原始白鲸优化算法文献 3代码适合新手小白学习,一键运行main文件即可轻松出图 4仅包含Matlab代码,后可保证原始程序运行~ ,多目标白鲸优化算法(MOBWO); 测试函数; Matlab语言; 程序调试; 算法新颖; 多目标蛇优化算法(MOSO); IGD、GD、HV、SP评价指标; 代码学习; 轻松出图。,基于

    【图像加密】基于matlab图像加密的混沌地图晶格系统的评估【含Matlab源码 9901期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【图像融合】基于matlab像素的多焦点和多光谱图像融合【含Matlab源码 7572期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    中国石油微服务开发REST API接口定义规范及其安全设计

    内容概要:本文介绍了在中国石油勘探开发梦想云平台上定义REST API接口的基本规范,旨在提高接口质量,便于开发、测试和维护。主要内容包括REST API的基础概念,设计流程,URI、HTTP方法及响应状态码的运用,API文档的管理以及Swagger工具的应用,还详细阐述了API安全认证,特别是JWT的应用。通过这份文档能够帮助开发者理解和实施高质量的微服务架构。 适用人群:适用于参与或计划参与微服务项目的开发团队,尤其是那些致力于提升REST API接口质量和效率的专业技术人员。 使用场景及目标:文档的目标在于引导用户理解REST API接口设计的关键要素,如资源命名、方法选择等,并教会他们如何有效管理和保护这些API,确保其稳定性和安全性。通过实践本指南的原则,用户可以构建出更加健壮的分布式应用程序接口。 其他说明:此外,文中提供了大量关于API文档生成与维护的最佳做法,强调了文档更新须与代码同步,同时也探讨了API变更管理的有效方法。在安全方面,重点讲述了JWT的构成及其工作机制,展示了利用JWT实现高效认证的具体实例。

    【电力变压器】基于matlab电力变压器能量限制【含Matlab源码 10013期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习多输入单输出时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:该文档详细介绍了基于双向长短期记忆(BiLSTM)神经网络与Adaboost集成学习的时间序列预测模型及其应用。文中阐述了项目背景,指出了传统LSTM在复杂数据下存在的局限,提出了通过BiLSTM增强前后依赖关系,并结合Adaboost优化模型精度与泛化能力的方法。全文涵盖了从数据预处理、特征提取到建模、评估、以及GUI设计在内的全过程,并展示了该模型在金融预测、气象预报、能源管理和生产调度等多个领域的广泛应用潜力。文章还包括对代码片段的具体解析、模型部署的考量及未来发展的展望。 适合人群:拥有基本的机器学习与神经网络基础的研究人员和技术开发者,尤其是那些正在寻找时间序列数据分析解决方案的专业人士。 使用场景及目标:1. 多个领域如金融市场、气象预测等的时间序列数据处理任务中;2. 解决传统单一神经网络可能出现的过拟合并优化模型的鲁棒性和准确性。 其他说明:除了详细讲解如何使用Matlab实施完整的BiLSTM和Adaboost集成外,文中还特别注意到了模型调优的重要性——通过超参数搜索、早停策略和其他正则化技巧以预防过拟合情况的发生。此外,文档还讨论了有关实时数据处理、模型安全性和可移植性的要点。附带完整的Matlab代码实现了从环境准备直到预测结果可视化的每一个步骤,使读者可以很容易地复现和定制整个工作流程。

    【重力仿真】基于matlab GUI水平圆柱体重力异常正演【含Matlab源码 11176期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    Go语言1.24版本新特性详解与高性能博客系统miniblog实战项目

    内容概要:Go 1.24 版本引入了多项关键改进,其中包括:泛型类型别名,允许类型别名携带类型参数,简化代码实现;弱指针避免对象因包含在缓存中而无法被释放的问题;改进了终结器,提供了新的运行时函数 AddCleanup 以增强对象清理的灵活性和可靠性。另外,Go 1.24 改善了 map 的默认实现,显著提升了其运行时性能。与此同时,开源项目 miniblog 是一个功能全面、易于理解的 Go 实战项目。该项目采用了类似 Kubernetes 的三层架构设计,涵盖了许多 Go 项目开发的最佳实践和技术栈,不仅有助于开发者理解 Go 项目的核心理念和实施方法,还能提供一系列开发脚手架工具、配套课程和支持材料,以便更轻松地开展实际项目。 适合人群:1年以上 Go 开发经验的研发人员或正在寻找优秀 Go 项目充实自己简历的技术人员。 使用场景及目标:该总结的目标是帮助有一定 Go 基础的知识分子迅速了解新特性及其实用价值。miniblog 项目特别适用于希望加深对 Go 实践认识的学习者,尤其是那些想要通过参与实际编码练习和深入理解 Go 内部工作机制的人群。通过这两个方面的内容学习可以帮助使用者更好地理解 Go 新增特性的应用前景和发展方向,并能够在实践中灵活应用。 其他说明:本文档不仅涵盖了新特性的技术和理论要点,同时也展示了如何通过动手实践强化技能的具体例子。阅读本文不仅可以学到最新的 Go 编程技巧,还将了解到实际开发过程中面临的挑战及其解决方案。此外,还提供了一份详细的安装指导,以及一些常见的操作指南。对于新手而言,可以通过提供的完整配套资料逐步建立起个人的知识体系;而对于资深开发者,则可以在更高层次上审视自身项目的架构设计,进而推动技术创新和个人职业发展。

    智能对话机器人+deepseek+支持微信公众号、企业微信应用、飞书、钉钉接入+基于大模型的智能对话机器人,支持微信公众号、企业

    CoW项目是基于大模型的智能对话机器人,支持微信公众号、企业微信应用、飞书、钉钉接入,可选择GPT3.5/GPT4.0/Claude/Gemini/LinkAI/ChatGLM/KIMI/文心一言/讯飞星火/通义千问/LinkAI,能处理文本、语音和图片,通过插件访问操作系统和互联网等外部资源,支持基于自有知识库定制企业AI应用。 功能如下: 1、 多端部署: 有多种部署方式可选择且功能完备,目前已支持微信公众号、企业微信应用、飞书、钉钉等部署方式 2、 基础对话: 私聊及群聊的消息智能回复,支持多轮会话上下文记忆,支持 GPT-3.5, GPT-4o-mini, GPT-4o, GPT-4, Claude-3.5, Gemini, 文心一言, 讯飞星火, 通义千问,ChatGLM-4,Kimi(月之暗面), MiniMax, GiteeAI 3、 语音能力: 可识别语音消息,通过文字或语音回复,支持 azure, baidu, google, openai(whisper/tts) 等多种语音模型 4、 图像能力: 支持图片生等

    【车间调度】基于matlab哈里斯鹰算法HHO求解分布式置换流水车间调度DPFSP【含Matlab源码 6143期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【图像处理】颜色恒常性算法水下图像处理【含Matlab源码 474期】.md

    CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【图像去噪】基于matlab中值滤波、均值滤波和非局部均值滤波NLM图像去噪【含Matlab源码 10364期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    基于LabVIEW的滚动轴承故障诊断系统:一种振动信号采集与故障诊断的实用设计与实践验证,基于LabVIEW的滚动轴承高效故障诊断系统设计与应用研究,基于LabVIEW的滚动轴承故障诊断系统. 实现对

    基于LabVIEW的滚动轴承故障诊断系统:一种振动信号采集与故障诊断的实用设计与实践验证,基于LabVIEW的滚动轴承高效故障诊断系统设计与应用研究,基于LabVIEW的滚动轴承故障诊断系统. 实现对滚动轴承工作状态的监测,提出了一种基于 Lab VIEW 的滚动轴承故障诊断系统的设计方案,给出了滚动轴承振动信号的采集与故障诊断方法,在 Lab VIEW 的诊断平台下进行信号处理与分析,然后结合滚动轴承故障诊断理论与信号分析结果来对该轴承运行状态进行判断。 最后利用旋转机械振动及故障模拟试验平台对该系统进行验证,验证结果体现了该系统具有可行性和适用性。 ,LabVIEW; 滚动轴承故障诊断系统; 振动信号采集; 故障诊断方法; 信号处理与分析; 验证测试; 可行性; 适用性,基于LabVIEW的滚动轴承故障诊断系统设计与验证

    Javascript语言视频教程.zip

    Javascript语言视频教程,涵盖Javascript语言基础和高级教程,零基础入门。

    在链表的前面-开头插入一个节点

    python在链表的前面-开头插入一个节点

    【图像融合】加权平均+HIS+高通滤波+灰度调制图像融合【含Matlab源码 8041期】.md

    CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    《基于改进动态窗口DWA模糊自适应调整权重的路径规划算法研究及其MATLAB实现》,《基于改进动态窗口DWA的模糊自适应权重调整路径规划算法及其MATLAB实现》,基于改进动态窗口 DWA 模糊自适应

    《基于改进动态窗口DWA模糊自适应调整权重的路径规划算法研究及其MATLAB实现》,《基于改进动态窗口DWA的模糊自适应权重调整路径规划算法及其MATLAB实现》,基于改进动态窗口 DWA 模糊自适应调整权重的路径基于改进动态窗口 DWA 模糊自适应调整权重的路径规划算法 MATLAB 源码+文档 《栅格地图可修改》 基本DWA算法能够有效地避免碰撞并尽可能接近目标点,但评价函数的权重因子需要根据实际情况进行调整。 为了提高DWA算法的性能,本文提出了一种改进DWA算法,通过模糊控制自适应调整评价因子权重,改进DWA算法的实现过程如下: 定义模糊评价函数。 模糊评价函数是一种能够处理不确定性和模糊性的评价函数。 它将输入值映射到模糊隶属度,根据规则计算输出值。 在改进DWA算法中,我们定义了一个三输入一输出的模糊评价函数,输入包括距离、航向和速度,输出为权重因子。 [1]实时调整权重因子。 在基本DWA算法中,权重因子需要根据实际情况进行调整,这需要人工干预。 在改进DWA算法中,我们通过模糊控制实现自适应调整,以提高算法的性能。 [2]评估路径。 通过路径的长度和避障情况等指标评估路

Global site tag (gtag.js) - Google Analytics