HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1018
Rich(InoueSoftwear)RichEidt50Wで表やオブジェクトを作成することはできますか?5解決


Rich(InoueSoftwear)

リンク

2015/10/18(Sun) 17:21:58|NO.72365

RichEidt50Wで便利なテキストエディタを作っているんですが、
表やオブジェクトを作成することはできますか?
使用DLL:"MSFTEDIT.DLL"
(RichEidt50Wを使ったわけはwordpadでRichEidt50Wコントロールが使われていたからである)



この記事に返信する


Rich(InoueSoftwear)

リンク

2015/10/18(Sun) 17:26:12|NO.72366

(オブジェクト:Microsoft Graph グラフ、Microsoft 数式 3.0、パッケージなど)



774

リンク

2015/10/20(Tue) 18:46:50|NO.72396

表やオブジェクトは、OLEオブジェクトとして埋め込むみたいです。
>>https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd387916%28v=vs.85%29.aspx

プログラム側で作成・編集機能を実装し、OLEオブジェクトの内容を更新すれば
作成も不可能では無いのかも……という気がします。



Rich(InoueSoftwear)

リンク

2015/10/24(Sat) 13:04:55|NO.72465

MSDNを見ながらがんばってやってみようと思ったんですが、よくわかりません。
詳しく教えてください。(C++/Cはやったことがありません)



774

リンク

2015/10/26(Mon) 21:36:36|NO.72536

私もよくわからない為、詳しくお教えする事はできません。
どなたかわかる方お願い致します。

とりあえず、参照先の内容をど〜にかこ〜にかHSPに移殖してみたサンプルです。

#module #uselib "kernel32.dll" #cfunc _LoadLibrary "LoadLibraryA" sptr #func _FreeLibrary "FreeLibrary" sptr #deffunc rich_Create int p0, int p1, local a a=gInfo(3),0,Limit(p0,80,4096),Limit(p1,12,4096) If(hLib){a.1=Length(iRich)}else{hLib=_LoadLibrary("riched32.dll")} WinObj "richedit","",$0200,$50b021c4,a.2,a.3 :a.2=stat If(a.2<0){Return -1} :iRich(a.1)=(a.0<<16)||a.2 Return a.2 #deffunc rich_Destroy onexit ii=gInfo(3) :ForEach iRich :gSel iRich(cnt)>>16 :ClrObj iRich(cnt)&$ffff :Loop gSel ii :If(hLib){_FreeLibrary hLib} Return #global #module // ここが本題の部分 #uselib "ole32.dll" #cfunc _CreateILockBytesOnHGlobal "CreateILockBytesOnHGlobal" int,int,var #cfunc _StgCreateDocfileOnILockBytes "StgCreateDocfileOnILockBytes" int,int,int,var #cfunc _OleCreateFromFile "OleCreateFromFile" var,var,var,int,var,int,int,var #func _OleSetContainedObject "OleSetContainedObject" int,int #define IID_IUnknown "{00000000-0000-0000-C000-000000000046}" #define IID_ILockBytes "{0000000A-0000-0000-C000-000000000046}" #define IID_IStrage "{0000000B-0000-0000-C000-000000000046}" #define IID_IOleObject "{00000112-0000-0000-C000-000000000046}" #define IID_IOleClientSite "{00000118-0000-0000-C000-000000000046}" #define IID_IRichEditOle "{00020D00-0000-0000-C000-000000000046}" #define CLSID_NULL "{00000000-0000-0000-0000-000000000000}" #usecom IUnknown IID_IUnknown "{}" #comfunc IU_QueryInterface 0 var,var #usecom ILockBytes IID_ILockBytes "{}" #usecom IStrage IID_IStrage "{}" #usecom IOleObject IID_IOleObject "{}" #comfunc IOO_GetUserClassID 15 var #usecom IOleClientSite IID_IOleClientSite "{}" #usecom IRichEditOle IID_IRichEditOle "{}" #comfunc IREO_GetClientSite 3 var #comfunc IREO_InsertObject 7 var #define cType In(%1,%2,%3) (((%2)<=(%1))&((%3)>=(%1))) #define ClrCom(%1) if(vartype(%1)==6){delcom %1:dim %1} ;--IID文字列 => IID構造体(*var, "IID") #deffunc iid2var array pa, str p0, local a, local b sDim b,$100,2 :b.1=p0 :a=-1,0,0,StrLen(b.1) Repeat :If((a==0)||(a.1>=a.3)){Break} :a=Peek(b.1,a.1) :a.1++ If(In(a,$30,$39)||In(a,$41,$46)||In(a,$61,$66)){Poke b.0,a.2,a :a.2++} Loop :If(a.2<32){Return 0} Dim pa,4 :lPoke pa,,Int("$"+StrMid(b,,8)) Repeat 2,2 :wPoke pa,cnt*2,Int("$"+StrMid(b,cnt*4,4)) :Loop Repeat 8,8 :Poke pa,cnt,Int("$"+StrMid(b,cnt*2,2)) :Loop Return 1 ;--オブジェクト埋め込み(hRichEdit, "FileName", [start], [end]) #define global rich_InsertObject(%1,%2,%3=-1,%4=-1) _rich_InsertObject %1,%2,%3,%4 #deffunc _rich_InsertObject int p0, str p1, int p2, int p3, local a, local b, local c Exist p1 :If(p0==0)||(strsize<1){Return 0} :Dim a,10 SendMsg p0,$043c,0,varptr(a.0) :If(a.0==0){Goto *@f} ;EM_GetOleInterface NewCom pRichEditOle,IRichEditOle,-1,a.0 :LogMes "pRichEditOle";;;; If(_CreateILockBytesOnHGlobal(0,1,a.1)){Goto *@f} NewCom pLockBytes,ILockBytes,-1,a.1 :LogMes "pLockBytes";;;; If(_StgCreateDocfileOnILockBytes(a.1,$1012,0,a.2)){Goto *@f} ;STGM_SHARE_EXCLUSIVE[$0010] | STGM_CREATE[$1000] | STGM_READWRITE[$0002] NewCom pStorage,IStrage,-1,a.2 :LogMes "pStrage";;;; Dim formatEtc,5 :formatEtc=0,0,1,-1,0 ;DVASPECT_CONTENT[$0001], TYMED_NULL[$0000] LogMes "formatEtc";;;; IREO_GetClientSite pRichEditOle,a.3 :If(stat){Goto *@f} NewCom pClientSite,IOleClientSite,-1,a.3 :LogMes "pClientSite";;;; iid2var clsid,CLSID_NULL :iid2var iid_Unk,IID_IUnknown sDim b,$200 :CnvStoW b,p1 ;unicode文字列でないとダメ? OLERENDER_DRAW[$0001] If(_OleCreateFromFile(clsid,b,iid_Unk,$0001,formatEtc,a.3,a.2,a.4)){Goto *@f} NewCom pUnk,IUnknown,-1,a.4 :LogMes "pUnk";;;; iid2var iid_OO,IID_IOleObject IU_QueryInterface pUnk,iid_OO,a.5 :If(stat){Goto *@f} NewCom pObject,IOleObject,-1,a.5 :LogMes "pObject";;;; _OleSetContainedObject a.5,1 IOO_GetUserClassID pObject,clsid :If(stat){Goto *@f} LogMes "get clsid";;;; Dim reobject,14 :reobject.0=56 ;cbStruct MemCpy reobject,clsid,16,8 ;clsid reobject. 1=-1 ;cp = REO_CP_SELECTION[$ffffffff] reobject.11=1 ;dvaspect = DVASPECT_CONTENT[$0001] reobject.12=1|2 ;dwFlags = REO_RESIZABLE[$0001] | REO_BELOWBASELINE[$0002] reobject.13=0 ;dwUser = 0 reobject. 6=a.5 ;poleobj = pObject reobject. 8=a.3 ;polesite = pClientSite reobject. 7=a.2 ;pstg = pStorage reobject. 9=0,0 ;sizel = SIZEL{ 0 } ;参照元とは異なり指定位置(選択範囲)に挿入 SendMsg p0,$00b0,varptr(a.6),varptr(a.7) ;EM_GetSel If(p2>=0){a.6=p2} :If(p3>=a.6){a.7=p3}else{If(a.6>a.7){a.7=a.6}} SendMsg p0,$00b1,a.6,a.7 ;EM_SetSel IREO_InsertObject pRichEditOle,reobject :a.8=(stat==0) If(a.8){LogMes "InsertObject"};;;; *@ :ClrCom pObject :ClrCom pUnk :ClrCom pClientSite ClrCom pStorage :ClrCom pLockBytes :ClrCom pRichEditOle Return a.8 #global imgTV=Dir_TV+"btn_hsptv.bmp" txtTV=Dir_TV+"..\\doclib\\hsptv_api.txt" *start Screen 0,640,480 :SysColor 15 :BoxF Pos 4,4 :rich_Create 632,444 :hRich=ObjInfo(stat,2) Dim i,15 :i.0=60,$40000000,0,0,0,$ff8020 ;CFM_Color SendMsg hRich,$0444,,varptr(i) ;EM_SetCharFormat SendMsg hRich,$0443,0,$202020 ;EM_SetBkgndColor Exist imgTV :If(strsize>0){PicLoad imgTV,1} Exist txtTV :If(strsize>0){ sDim txt,strsize+1 :bLoad txtTV,txt,strsize SendMsg hRich,$00c2,1,varptr(txt) ;EM_ReplaceSel SendMSg hRich,$00b1 ;EM_SetSel (先頭へ) } Pos 556,448 :ObjSize 80,24 :Button gosub "埋め込み",*btn_Insert STOP *btn_Insert rich_InsertObject hRich,imgTV Return
COMやらOLEやらは特に不得手なので、何か色々間違ってそうです…



Rich(InoueSoftwear)

リンク

2015/11/3(Tue) 10:41:18|NO.72722

ありがとうございます。
いま、パソコン使えないので後でためします。



ONION software Copyright 1997-2023(c) All rights reserved.