Kitchen Pages, KitCAD i3 KGC rX - SDK source - Index

This, version is limited in function - language or grid support is not enabled. Example code only.

Example of TCPPWebBrowser component control (works with XE3 and above)

The Windows registry needs a setting for the browser to function as EDGE (11001). Information about this setting is not included.


CPPWebBrowser; C++ Builder example

KitCADi3KGCrX.cpp


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

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("MainUnit1.cpp", Form1);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
	try
	{
		Application->Initialize();
		Application->MainFormOnTaskBar = true;
		Application->CreateForm(__classid(TForm1), &Form1);
		Application->Run();
	}
	catch (Exception &exception)
	{
		Application->ShowException(&exception);
	}
	catch (...)
	{
		try
		{
			throw Exception("");
		}
		catch (Exception &exception)
		{
			Application->ShowException(&exception);
		}
	}
	return 0;
}
//---------------------------------------------------------------------------


MainUnit1.h



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

#ifndef MainUnit1H
#define MainUnit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.OleCtrls.hpp>
#include <Vcl.ComCtrls.hpp>
#include "SHDocVw_OCX.h"      //TCPPWebBrowser
#include <Vcl.Dialogs.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TRichEdit *RichEdit1;
	TCppWebBrowser *WebBrowser1;
	TOpenDialog *OpenDialog1;
	TSaveDialog *SaveDialog1;
	TTimer *Timer1;
	void __fastcall SetPermissions11001(TObject *Sender);
	void __fastcall SetPermissions11000(TObject *Sender);
	void __fastcall FormCreate(TObject *Sender);
	void __fastcall WebBrowser1BeforeNavigate2(TObject *Sender, LPDISPATCH pDisp, Variant *URL,
          Variant *Flags, Variant *TargetFrameName, Variant *PostData, Variant *Headers,
          VARIANT_BOOL *Cancel);
	void __fastcall WebBrowser1NewWindow3(TObject *Sender, LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel,
          unsigned_long dwFlags, BSTR bstrUrlContext, BSTR bstrUrl);
	void __fastcall Timer1Timer(TObject *Sender);


private:	// User declarations
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


MainUnit1.cpp


//---------------------------------------------------------------------------
#include <System.Win.Registry.hpp> //added by jason
#include <vcl.h>
#include <mshtml.h>     // IHTMLDocument - IHTMLElement, added by jason
#pragma hdrstop

#include "MainUnit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{

String params = "";
for (int ai=0;ai<=ParamCount();ai++)
	{
		//the switch of \version provides usecurrentversion = false
//	if (LowerCase(ParamStr(ai)) == "/version") {usecurrentversion = false;}
	if (LowerCase(ParamStr(ai)) == "/b") {Beep(10000,1000);}
	if (LowerCase(ParamStr(ai)) == "/q") {Application->Terminate();}
	if ( LowerCase(ParamStr(ai)) != "-embedding"
		  && LowerCase(ParamStr(ai)) != "-embedding.kpd"
		  && LowerCase(ParamStr(ai)) != "embedding"
		  && !LowerCase(ParamStr(ai)).IsEmpty()
		  && FileExists(ParamStr(ai))
		  && ParamStr(ai)!=Application->ExeName ){
	 params = ParamStr(1); //should point to HTML file
//ShowMessage(ParamStr(ai));
			}
	 }

//ShowMessage(params);
	if(FileExists(ExtractFilePath(Application->ExeName)+"conf\\KitCADi3KGCrX.11000")==true){	SetPermissions11000(this); }
	if(FileExists(ExtractFilePath(Application->ExeName)+"conf\\KitCADi3KGCrX.11001")==true){	SetPermissions11001(this); }
	WebBrowser1->Navigate( WideString(params).c_bstr() );

Timer1->Enabled = true;
 }
//---------------------------------------------------------------------------
void __fastcall TForm1::SetPermissions11001(TObject *Sender) {
#ifdef _Windows
	UnicodeString cHomePath = "SOFTWARE";
	UnicodeString cFeatureBrowserEmulation =
		"Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION\\";
	int cIE11 = 11001;
	UnicodeString sKey = ExtractFileName(ParamStr(0));
	TRegIniFile *Reg = new TRegIniFile(cHomePath);
	__try {
		TRegistry *reg1 = dynamic_cast<TRegistry*>(Reg);
		if (Reg->OpenKey(cFeatureBrowserEmulation,
			true) && !(reg1->KeyExists(sKey) && reg1->ReadInteger(sKey)
			== cIE11)) {
			reg1->WriteInteger(sKey, cIE11);
		}
	}
	__finally {
		Reg->Free();
	}
#endif
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetPermissions11000(TObject *Sender) {
#ifdef _Windows
	UnicodeString cHomePath = "SOFTWARE";
	UnicodeString cFeatureBrowserEmulation =
		"Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION\\";
	int cIE11 = 11000;
	UnicodeString sKey = ExtractFileName(ParamStr(0));
	TRegIniFile *Reg = new TRegIniFile(cHomePath);
	__try {
		TRegistry *reg1 = dynamic_cast<TRegistry*>(Reg);
		if (Reg->OpenKey(cFeatureBrowserEmulation,
			true) && !(reg1->KeyExists(sKey) && reg1->ReadInteger(sKey)
			== cIE11)) {
			reg1->WriteInteger(sKey, cIE11);
		}
	}
	__finally {
		Reg->Free();
	}
#endif
}

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

void __fastcall TForm1::WebBrowser1BeforeNavigate2(TObject *Sender, LPDISPATCH pDisp,
		  Variant *URL, Variant *Flags, Variant *TargetFrameName, Variant *PostData,
		  Variant *Headers, VARIANT_BOOL *Cancel)
{

//debug
//Application->MessageBoxW(L"here - beforenavigate2", BSTR(URL) ,0);


//cancel and save richedit depending on which URL was given
Variant vs1 = "about:blankS"; //dont cancel on about:blank
Variant vs2 = "res:\/\/ieframe.dll\/syntax.htm#http:\/\/\/cgi-bin\/kitcadi3_kp2.cgi";
Variant vs3 = "http:\/\/\/cgi-bin\/kitcadi3_kp2.cgi";
Variant vs4 = "http:\/\/www.kitchenpages.com\/cgi-bin\/kitcadi3_kp2.cgi";

AnsiString s1 = URL->AsType( varString );
AnsiString s2 = vs1.AsType( varString );
AnsiString s3 = vs2.AsType( varString );
AnsiString s4 = vs3.AsType( varString );
AnsiString s5 = vs4.AsType( varString );

bool save = false;
if(s1 == s2){ *Cancel=TRUE; }
if(s1 == s3){ *Cancel=TRUE; save=true;}
if(s1 == s4){ *Cancel=TRUE; save=true;}
if(s1 == s5){ *Cancel=TRUE; save=true;}
//ShowMessage(s2);

if(save==true){

//always grab a copy of the html body into a richedit control
AnsiString aContenuText = "";
AnsiString aContenuHTML = "";
Variant vDocument = WebBrowser1->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
   Variant vBody = vDocument.OlePropertyGet("Body");
   Variant vContenuText = vBody.OlePropertyGet("InnerText");
   Variant vContenuHTML = vBody.OlePropertyGet("InnerHTML");
   aContenuText = vContenuText;
   aContenuHTML = vContenuHTML;
}

RichEdit1->Lines->Text = aContenuHTML;

 //shorten the loaded file if its HTML
 AnsiString textareastart = "<textarea name=\"data\" id=\"content\" rows=\"40\" cols=\"80\">";
 AnsiString textareaend = "<\/textarea>";
 AnsiString xURL =  RichEdit1->Lines->Text;
if( AnsiString(xURL).AnsiPos(textareastart) != 0){
 RichEdit1->Lines->Text = String(xURL).SubString((55 + AnsiString(xURL).AnsiPos(textareastart)),String(xURL).Length());
}
AnsiString xURLx =  RichEdit1->Lines->Text;
if( AnsiString(xURLx).AnsiPos(textareaend) != 0){
 RichEdit1->Lines->Text = String(xURLx).SubString(0,(AnsiString(xURLx).AnsiPos(textareaend))-1);
}


//get filename from savefile dialog
if( SaveDialog1->Execute() ){
 RichEdit1->Lines->SaveToFile( SaveDialog1->FileName );
}

}
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WebBrowser1NewWindow3(TObject *Sender, LPDISPATCH *ppDisp,
		  VARIANT_BOOL *Cancel, unsigned_long dwFlags, BSTR bstrUrlContext,
		  BSTR bstrUrl)
{
//debug
//Application->MessageBoxW(L"here - newwindow3", bstrUrl ,0);

//cancel file OPEN function and use OPENDIALOG to get file
WideString s1 = "about:blankS"; //dont cancel on about:blank
WideString s2 = "res:\/\/ieframe.dll\/syntax.htm#http:\/\/\/cgi-bin\/kitcadi3_rXopen.cgi";
WideString s3 = "http:\/\/\/cgi-bin\/kitcadi3_kp2.cgi";
WideString s4 = "http:\/\/www.kitchenpages.com\/cgi-bin\/kitcadi3_rXopen.cgi";

bool load = false;
if(bstrUrl == s1){ *Cancel=TRUE; }
if(bstrUrl == s2){ *Cancel=TRUE; load=true;}
if(bstrUrl == s3){ *Cancel=TRUE; load=true;}
if(bstrUrl == s4){ *Cancel=TRUE; load=true;}
//ShowMessage(bstrUrl);

if(load==true){

if( OpenDialog1->Execute() ){
 RichEdit1->Lines->LoadFromFile( OpenDialog1->FileName );


 //shorten the loaded file if its HTML
 AnsiString textareastart = "<textarea name=\"data\" id=\"content\" rows=\"40\" cols=\"80\">";
 AnsiString textareaend = "<\/textarea>";
 AnsiString xURL =  RichEdit1->Lines->Text;
if( AnsiString(xURL).AnsiPos(textareastart) != 0){
 RichEdit1->Lines->Text = String(xURL).SubString((1 + AnsiString(xURL).AnsiPos(textareastart)),String(xURL).Length());
}
AnsiString xURLa =  RichEdit1->Lines->Text;
if( AnsiString(xURLa).AnsiPos(textareaend) != 0){
 RichEdit1->Lines->Text = String(xURLa).SubString(0,(AnsiString(xURLa).AnsiPos(textareaend))-1);
}




	int Kloop = 0; bool Kisok = true;
	 do {
	  RichEdit1->SelStart = Kloop;
	  RichEdit1->SelLength = 1;
	  if(RichEdit1->SelText=="\\"){ RichEdit1->SelText = "\\\\"; Kloop=Kloop+3;}
	  if(RichEdit1->SelText=="\r\r"){ RichEdit1->SelText = ""; Kloop=Kloop+1;}
	  if(RichEdit1->SelText=="\r"){ RichEdit1->SelText = "[!EOL!]"; Kloop=Kloop+7;}
	  if(RichEdit1->SelText=="\n"){ RichEdit1->SelText = "[!EOL!]"; Kloop=Kloop+7;}
	  if(RichEdit1->SelText=="\r\n"){ RichEdit1->SelText = "[!EOL!]"; Kloop=Kloop+7;}
	  Kloop++;
	  if(Kloop <= RichEdit1->Text.Length()){Kisok = true;}else{Kisok = false;}
}while(Kisok);


	Kloop = 0; Kisok = true;
	 do {
	  RichEdit1->SelStart = Kloop;
	  RichEdit1->SelLength = 1;
	  if(RichEdit1->SelText=="\t"){ RichEdit1->SelText = ""; }
	  if(RichEdit1->SelText=="\r"){ RichEdit1->SelText = ""; }
	  if(RichEdit1->SelText=="\n"){ RichEdit1->SelText = ""; }
	  if(RichEdit1->SelText=="\r\n"){ RichEdit1->SelText = ""; }
	  Kloop++;
	  if(Kloop <= RichEdit1->Text.Length()){Kisok = true;}else{Kisok = false;}
}while(Kisok);




RichEdit1->WantReturns=false;
//var kp2loaddata = '#KitCAD-i3-KGC-2.27.19.66 _[!EOL!][KitCAD2][!EOL!]Objects=1[!EOL!]File=new_drawing.kp2[!EOL!]Jobumber=[!EOL!]Clientame=0[!EOL!]EstPrice=0.00[!EOL!]Comment= [!EOL!][0][!EOL!]name=AKGraphicControl1[!EOL!]File=C:\\Program Files (x86)\\Kitchen\\Objects\\BC2di.kpd[!EOL!]Top=78[!EOL!]Left=337[!EOL!]Width=1000[!EOL!]Depth=600[!EOL!]otation=471[!EOL!]epeats=1[!EOL!]Height=0[!EOL!]HeightFrom=0[!EOL!]xdTop=68[!EOL!]xdLeft=68[!EOL!]';

  //var kp2loaddata
  WideString jscommand = "var kp2loaddata = '" + RichEdit1->Lines->Text.Trim() + "';";

RichEdit1->Lines->Text = jscommand;
 // ShowMessage(jscommand);
jscommand = RichEdit1->Lines->Text;

IHTMLDocument2  *Doc = NULL;
 IHTMLWindow2 *topwindow;
 if(SUCCEEDED(WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&Doc)))  {
   HRESULT hr = Doc->get_parentWindow(&topwindow);
   if (SUCCEEDED(hr))  {
	 VARIANT v;
	 VariantInit(&v);
	 topwindow->execScript(jscommand.c_bstr(),NULL,&v);
	 VariantClear(&v);
	 topwindow->Release();
   }
   Doc->Release();
 }

  //try{ ChromeBrowserLoadkp2filept2(); }catch(e){}
WideString jscommand2 = "try{ ChromeBrowserLoadkp2filept2(); }catch(e){}";

IHTMLDocument2  *Doc2 = NULL;
 IHTMLWindow2 *topwindow2;
 if(SUCCEEDED(WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&Doc2)))  {
   HRESULT hr = Doc->get_parentWindow(&topwindow2);
   if (SUCCEEDED(hr))  {
	 VARIANT v2;
	 VariantInit(&v2);
	 topwindow2->execScript(jscommand2.c_bstr(),NULL,&v2);
	 VariantClear(&v2);
	 topwindow2->Release();
   }
   Doc2->Release();
 }


 //return to previous state
 RichEdit1->WantReturns=true;

}
}

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//escape the file path to exe
/*
RichEdit1->Lines->Text = ExtractFilePath( Application->ExeName );
	int Kloop = 0; bool Kisok = true;
	 do {
	  RichEdit1->SelStart = Kloop;
	  RichEdit1->SelLength = 1;
	  if(RichEdit1->SelText=="\\"){ RichEdit1->SelText = "/"; Kloop++;}
	  if(RichEdit1->SelText=="\r"){ RichEdit1->SelText = ""; }
	  if(RichEdit1->SelText=="\n"){ RichEdit1->SelText = ""; }
	  if(RichEdit1->SelText==" "){ RichEdit1->SelText = "%20"; }
	  Kloop++;
	  if(Kloop <= RichEdit1->Text.Length()){Kisok = true;}else{Kisok = false;}
}while(Kisok);
AnsiString EscapedFilePath = "file:///"+RichEdit1->Lines->Text;
//WideString jscommand = "ChromeBrowser='guiclient.exe';var msieS=document.createElement('script');msieS.setAttribute('type','text\/javascript');msieS.setAttribute('src','" + EscapedFilePath + "msie.js');document.body.appendChild(msieS);";
*/

WideString jscommand = "ChromeBrowser='guiclient.exe';var msieS=document.createElement('script');msieS.setAttribute('type','text\/javascript');msieS.setAttribute('src','msie.js');document.body.appendChild(msieS);";

IHTMLDocument2  *Doc = NULL;
 IHTMLWindow2 *topwindow;
 if(SUCCEEDED(WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&Doc)))  {
   HRESULT hr = Doc->get_parentWindow(&topwindow);
   if (SUCCEEDED(hr))  {
	 VARIANT v;
	 VariantInit(&v);
	 topwindow->execScript(jscommand.c_bstr(),NULL,&v);
	 VariantClear(&v);
	 topwindow->Release();
   }
   Doc->Release();
 }
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------


MainUnit1.dfm



object Form1: TForm1
  Left = 0
  Top = 0
  ActiveControl = WebBrowser1
  Caption = 'KitCAD i3 KGC rX'
  ClientHeight = 562
  ClientWidth = 984
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  Icon.Data = {
    0000010001002020100000000000E80200001600000028000000200000004000
    0000010004000000000080020000000000000000000000000000000000000000
    0000000080000080000000808000800000008000800080800000C0C0C0008080
    80000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000
    0000000000000000000000000000000000000007000000000000000000000000
    0000008707000000000000000000000000007707070000000000007700000000
    0003770707000000000007770000000000887707070000000700737000000000
    0778870708700700007738077700000007F737070870770770737077F0070000
    0777777808707F3777370770000000000077F77808707F87F0707F0FF7880007
    7000777807808F7F870F0078337707777777F77807883FF330007813777F0887
    7777FF7008838838003333777F7F000887777880888888BBB338877700077880
    000008808333BBBB33BB00007777788888833833333BBBBBB00077777700F777
    77777883333BBBBBB3333887000070000007777BBBBBBBBBB000000000000077
    7700077BBBBBFBBBBBB00777770007777770777BBBBBBBBFF33B7FFF77700077
    8007777BBB3BBBBBBFF33877000000000078777877F3BB3BB77FF33387000000
    7837778877703BF33F777000783700008877073F8000377088F7777000070003
    F780038780700370038F777000000000700088FF807707770038FF7770700000
    000837FF7070000007F387000000000000037F77807000000070337077000000
    0000077770700000000008870000000000000777707000000000777700000000
    000000077070000000000070000000000000000000000000000000000000FFFF
    FFFFFFEFFFFFFFCBFFFFFF2BFFCFFE2BFF8FFC2BFB1FF829BC23F8292446F809
    009FFC090120E70902C08008070080180C00E010000E1F9000F0000007030000
    000F7E0007FFC380018381000001C600000FFC000003F0010070F087101EE185
    981FF7048C05FE05F83FFE05FD13FF85FF8FFF85FF0FFFE5FFDFFFFFFFFF}
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object WebBrowser1: TCppWebBrowser
    Left = 0
    Top = 0
    Width = 984
    Height = 562
    Align = alClient
    TabOrder = 1
    OnBeforeNavigate2 = WebBrowser1BeforeNavigate2
    OnNewWindow3 = WebBrowser1NewWindow3
    ExplicitLeft = 480
    ExplicitTop = 291
    ExplicitWidth = 300
    ExplicitHeight = 150
    ControlData = {
      4C000000B3650000163A00000000000000000000000000000000000000000000
      000000004C000000000000000000000001000000E0D057007335CF11AE690800
      2B2E126208000000000000004C0000000114020000000000C000000000000046
      8000000000000000000000000000000000000000000000000000000000000000
      00000000000000000100000000000000000000000000000000000000}
  end
  object RichEdit1: TRichEdit
    Left = 16
    Top = 144
    Width = 233
    Height = 297
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    Lines.Strings = (
      'RichEdit1')
    ParentFont = False
    PlainText = True
    TabOrder = 0
    Visible = False
    WordWrap = False
  end
  object OpenDialog1: TOpenDialog
    DefaultExt = '*.kp2'
    FileName = 'untitled'
    Filter = 
      'KitCAD files|*.kp2|KitCAD files|*.kpd;*.kp2;*.kp3|HTML files|*.h' +
      'tml;*.htm|Text files|*.txt'
    Left = 24
    Top = 96
  end
  object SaveDialog1: TSaveDialog
    DefaultExt = '*.kp2'
    FileName = 'untitled'
    Filter = 
      'KitCAD files|*.kp2|KitCAD files|*.kpd;*.kp2;*.kp3|HTML files|*.h' +
      'tml;*.htm|Text files|*.txt'
    Left = 80
    Top = 96
  end
  object Timer1: TTimer
    Interval = 6000
    OnTimer = Timer1Timer
    Left = 136
    Top = 96
  end
end






Copyright 2015-2018, all rights reserved. License.