|
|
Home » Developing U++ » UppHub » Ole Automation [FEATURE REQUEST?]
|
|
|
|
|
|
|
|
|
Re: Ole Automation [FEATURE REQUEST?] [message #40841 is a reply to message #40817] |
Mon, 23 September 2013 06:49   |
iST1
Messages: 107 Registered: August 2013
|
Experienced Member |
|
|
I struggle with the problem of embedding Word. This is howto (::SetParent way is the same as in correctly worked http://www.codeproject.com/Articles/3582/Word-Control-for-NE T):
class MainFrm : public TopWindow {
public:
OfficeSheet sheet;
OfficeDoc doc;
MainFrm() {}
void TestExcel() {
if (sheet.IsAvailable("Open")) {
sheet.Init("Open");
} else if (sheet.IsAvailable("Microsoft")) {
sheet.Init("Microsoft");
}
sheet.AddSheet(true);
EmbedAsFrame("XLMAIN");
}
void TestWord() {
if (doc.IsAvailable("Open")) {
doc.Init("Open");
} else if (doc.IsAvailable("Microsoft")) {
doc.Init("Microsoft");
}
doc.AddDoc(true);
EmbedAsFrame("Opusapp");
}
void EmbedAsFrame(const String &className) {
HWND embeded = FindWindow(className, NULL);
::SetParent(embeded, GetHWND());
Rect r = GetScreenView();
Rect pr = GetScreenClient(GetHWND());
MoveWindow(embeded, r.left - pr.left, r.top - pr.top, r.Width(), r.Height(), 0);
}
};
GUI_APP_MAIN
{
MainFrm w;
w.Open();
//w.TestExcel();//embeded
#if 1
w.TestWord();//opened in separated window
#else
//if we manualy opened some Word, it embeded
w.EmbedAsFrame("Opusapp");
#endif
w.Run();
[Updated on: Mon, 23 September 2013 06:56] Report message to a moderator
|
|
|
|
|
|
|
Re: Ole Automation [FEATURE REQUEST?] [message #40855 is a reply to message #40854] |
Mon, 23 September 2013 16:07   |
 |
koldo
Messages: 3432 Registered: August 2008
|
Senior Veteran |
|
|
iST1 wrote on Mon, 23 September 2013 15:29 | I do not have Office > 2003, but can you give me some advice about frame removing? Something like this
int counter = ActiveWindow.Application.CommandBars.Count;
for(int i = 0; i < counter;i++)
ActiveWindow.Application.CommandBars[i].Enabled=false;
}
Also can be Close method added to Automation?
|
Hello iST1
I do not know what do you mean with "frame removing".
What would have to do Close()?
This code is better but flickering remains:
#include <OfficeAutomation/OfficeAutomation.h>
using namespace Upp;
class WordFrm : public TopWindow {
public:
WordFrm() {
Sizeable().Zoomable();
embedded = 0;
}
void Embed() {
if (doc.IsAvailable("Microsoft"))
doc.Init("Microsoft");
doc.AddDoc(true);
embedded = FindWindow("Opusapp", NULL);
LONG lStyle = GetWindowLong(embedded, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_SIZEBOX);
SetWindowLong(embedded, GWL_STYLE, lStyle);
LONG lExStyle = GetWindowLong(embedded, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(embedded, GWL_EXSTYLE, lExStyle);
SetWindowPos(embedded, NULL, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
::SetParent(embedded, GetHWND());
Layout();
}
private:
OfficeDoc doc;
HWND embedded;
virtual void Layout() {
if (embedded == 0)
return;
Rect r = GetScreenView();
Rect pr = GetScreenClient(embedded);
MoveWindow(embedded, r.left - pr.left, r.top - pr.top, r.Width(), r.Height(), TRUE);
}
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
if (message == WM_SIZE)
Layout();
return TopWindow::WindowProc(message, wParam, lParam);
}
};
GUI_APP_MAIN
{
WordFrm w;
w.Open();
w.Embed();
w.Run();
}
Best regards
Iñaki
[Updated on: Mon, 23 September 2013 16:09] Report message to a moderator
|
|
|
|
|
|
|
|
Goto Forum:
Current Time: Sat Apr 26 15:01:06 CEST 2025
Total time taken to generate the page: 0.00991 seconds
|
|
|