Witam!
Mam pytanie: czy można osadzić powierzchnię roboczą excela we własnej aplikacji?
Witam!
Mam pytanie: czy można osadzić powierzchnię roboczą excela we własnej aplikacji?
Poniższy program tworzy Microsoft Office Spreadsheet 11.0, domyślny interface excela:
#include <ole2.h>
#define _ATL_DLL
#define _ATL_DLL_IMPL
#include <atl\\atldef.h>
#include <atl\\atliface.h>
// linkujemy do atl.dll
#pragma comment(lib, "atl.lib")
LRESULT CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE _hinstance;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE,PSTR, int)
{
_hinstance = hInstance;
HWND hwnd = CreateWindow(TEXT("#32770"),
TEXT("Microsoft Office Spreadsheet 11.0"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, 0,0, _hinstance, 0);
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)DlgProc);
SendMessage(hwnd, WM_CREATE, 0, 0);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
return 0;
}
LRESULT CALLBACK DlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static HWND hwndAtl;
RECT rc;
switch (uMsg)
{
case WM_CREATE:
AtlAxWinInit();
GetClientRect(hwnd, &rc);
hwndAtl = CreateWindow(TEXT("AtlAxWin"),
TEXT("{0002E559-0000-0000-C000-000000000046}"),
WS_CHILD | WS_VISIBLE, 0, 0, rc.right, rc.bottom, hwnd, 0, _hinstance, 0);
break;
case WM_SIZE:
MoveWindow(hwndAtl, 0, 0, LOWORD(lParam), HIWORD(lParam), true);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
PostQuitMessage(0);
break;
default:
return DefDlgProc(hwnd, uMsg, wParam, lParam);
}
return true;
}
Okazuje się, że w VS wystarczy otworzyć plik excela w Webbrowserze. Trzeba tylko (VS 2008 + IE7) dopisać do rejestru takie coś:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8]
"BrowserFlags"=dword:80000024
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.RTF.8]
"BrowserFlags"=dword:80000024
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.12]
"BrowserFlags"=dword:80000024
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.DocumentMacroEnabled.12]
"BrowserFlags"=dword:80000024
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Excel.Sheet.8]
"BrowserFlags"=dword:80000A00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Excel.Sheet.12]
"BrowserFlags"=dword:80000A00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Excel.SheetMacroEnabled.12]
"BrowserFlags"=dword:80000A00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Excel.SheetBinaryMacroEnabled.12]
"BrowserFlags"=dword:80000A00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PowerPoint.Show.8]
"BrowserFlags"=dword:800000A0
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PowerPoint.Show.12]
"BrowserFlags"=dword:800000A0
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PowerPoint.ShowMacroEnabled.12]
"BrowserFlags"=dword:800000A0
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PowerPoint.SlideShow.8]
"BrowserFlags"=dword:800000A0
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PowerPoint.SlideShow.12]
"BrowserFlags"=dword:800000A0
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PowerPoint.SlideShowMacroEnabled.12]
"BrowserFlags"=dword:800000A0
Może komuś się ten sposób przyda ;-)