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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0305
InoueSoftwearMDIウィンドウがうまく表示されない6解決


InoueSoftwear

リンク

2016/3/5(Sat) 15:26:50|NO.74785

MDIを使用したエディタを作ろうと思っていますが、MDIウィンドウがうまく表示されず、
子ウィンドウのエディットボックスやボタンが使用できません。
どなたか教えてください。

#include "user32.as" #include "hscallbk.as" #define GWL_WNDPROC -4 #define CW_USEDEFAULT 0x80000000 #define IDI_APPLICATION 32512 #define IDC_ARROW 32512 #define WS_CHILD 0x40000000 #define WS_VISIBLE 0x10000000 #define WS_CLIPCHILDREN 0x02000000 #uselib "" #func Prc "" int,int,int,int setcallbk Proc,Prc,*WProc GetWindowLong hwnd,GWL_WNDPROC Old = stat MDIClass = "MDIChildWindowClass" LoadIcon 0,IDI_APPLICATION //デフォルトアプリケーションアイコン hIcon=stat LoadCursor 0,IDC_ARROW //標準矢印カーソル hCursor=stat //MDI子ウィンドウクラス登録 dim WNDCLASSEX, 12 WNDCLASSEX.0 = 48 WNDCLASSEX.1 = 0 WNDCLASSEX.2 = varptr(Proc) WNDCLASSEX.3 = 0 WNDCLASSEX.4 = 0 WNDCLASSEX.5 = hInstance WNDCLASSEX.6 = hIcon WNDCLASSEX.7 = hCursor WNDCLASSEX.8 = 13 WNDCLASSEX.9 = 0 WNDCLASSEX.10= varptr(MDIClass) WNDCLASSEX.11= 0 RegisterClassEx varptr(WNDCLASSEX) CreateMenu hMenu.0 = stat AppendMenu hMenu.0,0,0,"MENU" SetMenu hwnd, hMenu.0 DrawMenuBar hwnd //MDIクライアントウィンドウ作成 CreateWindowEx 0x200,"MDICLIENT", "",WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,0,0,ginfo(12),ginfo(13),hwnd,hMenu.0,hinstance,0 hMDIClient=stat //MDI子ウィンドウ作成 repeat 3 CreateMDIWindow MDIClass,"MDIChildWindow"+strf("(%02d)",cnt),0,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hMDIClient,hinstance,0 hMDIChild(cnt)=stat CreateWindowEx 0x200,"Edit","Edit",WS_CHILD | WS_VISIBLE,0,0,200,200,hMDIChild(cnt),0,hinstance,0 CreateWindowEx 0,"Button","Button",WS_CHILD | WS_VISIBLE,0,200,200,20,hMDIChild(cnt),0,hinstance,0 loop stop *WProc CallWindowProc Old, callbkarg(0), callbkarg(1), callbkarg(2), callbkarg(3) return



この記事に返信する


774

リンク

2016/3/7(Mon) 23:41:27|NO.74812

質問に対する回答では無いのですが、こんなのではダメなのでしょうか。

#include "user32.as" *Start Screen 0,gInfo.20,gInfo.21,,,,800,600 hClient=hWnd :Title "Client #0" :SysColor 12 :BoxF GetWindowLong hClient,-16 :SetWindowLong hClient,-16,stat|$00CF0000 Repeat 3,1 Screen cnt,gInfo.20,gInfo.21,,,,480,360 hChild(cnt)=hWnd :Title StrF("Child #%d",cnt) :SysColor 15 :BoxF GetWindowLong hWnd,-16 :SetWindowLong hWnd,-16,stat|$00CF0000 SetParent hWnd,hClient Loop Stop
MDIとしての体裁を整えるには最大化やサイズ変更などに仕込みが必要ですが、
HSPで扱うならコチラの方が楽な気がします。

どうしても正式な(?)MDIウィンドウに拘るのであれば、他言語での開発をお勧めします。
HSPで実装する事にデメリットしか見当たらないからです。



掘木

リンク

2016/3/10(Thu) 23:03:14|NO.74854

デメリットしかない?そのデメリットとは?使用メモリリソースの問題ですかね?

少なくとも私にはHSPのもつGUI作成のインタフェース郡がGUIの一種であるMDIと非常に相性がよさそうに見えますが?
下手なラッパー関数郡を用意するより何倍も楽に扱えそうですがね。

>>InoueSoftwearさん
MDIの実装を一から作ってるわけじゃないのでしょう?
何かしらの参考元のコードがあってそれをHSPに変換しているのでしょう?
正しく変換できていますか?

1.メニューを作っているのにCreateMDIWindowのlparamとしてCLIENTCREATESTRUCTのポインタを指定していない。
 どうやら指定しなくても動くのがよくわからないけど。
2.MDIフレームの親であるHSPWindowID0のコールバック関数を書き換えていない。
 呼ぶべきコールバック関数としてHSPの持つWindowはデフォルトがDefWindowProcなので不十分です。
 DefFrameProcを呼ぶコールバック関数に定義しなおしましょう。

おまけ
・TranslateMDISysAccelを呼ぶように改造するとMDI固有のショートカットキーが利用できます。
 ただし、これをすると事実上イベント駆動プログラム化まっしぐら・・・。
・MDI子ウィンドウに対してコールバック関数を定義していますが、
 この子ウィンドウの子ウィンドウにHSPのbgsrcを貼り付けると通常のinput命令等が利用できます。
 ただし、buttonはあまり役に立ちません。
・当然ですが、メニューを処理するのはMDIの親であるHSPwindowID0なため、
 書き換えたコールバック関数側です。oncmdでは取れません。(こういうので結構嵌るんだこれが)



774

リンク

2016/3/11(Fri) 00:18:30|NO.74857

>NO.74854
掘木様のように既に知識をお持ちの方なら問題無いのかも知れませんが、
何かしらの参考元のコードをHSPに正しく変換する作業が大変。
というのが私の考える最大のデメリットですね。
実際こうして初っ端から躓いてるわけですし…

失礼ながら質問者様はまだそこまでの知識は持ち併せて無いように思えます。
HSPに正しく変換するには他言語以上に深い理解が必要になりそうですので
それならいっそそっちの言語習得した方が早そうですよ。
という意見です。



InoueSoftwear

リンク

2016/3/11(Fri) 13:50:04|NO.74865

返信遅れました。
掘木さんの
>MDIの実装を一から作ってるわけじゃないのでしょう?
>何かしらの参考元のコードがあってそれをHSPに変換しているのでしょう?
>正しく変換できていますか?
MDIウィンドウは、C++のコードを見たり、解説を見たりして一から作りました。
http://wisdom.sakura.ne.jp/system/winapi/win32/win139.html

774さんの
>失礼ながら質問者様はまだそこまでの知識は持ち併せて無いように思えます。
最近MDIに興味をもったので、MDIに関する知識はあまりありません。

----

あと、いろいろいじったらMDIアプリケーションに近くなったのですが、
メニューバーの最小化・元に戻す・閉じるボタンを押すと、82行目でエラーが発生します。
原因が分からないので、教えてください。


#include "user32.as" #include "hscallbk.as" #define GWL_WNDPROC -4 #define CW_USEDEFAULT 0x80000000 #define IDI_APPLICATION 32512 #define IDC_ARROW 32512 #define WS_CHILD 0x40000000 #define WS_VISIBLE 0x10000000 #define WS_CLIPCHILDREN 0x02000000 #define WM_COMMAND 0x0111 #define MF_INSERT 0x00000000 #define MF_POPUP 0x00000010 #define MF_SEPARATOR 0x00000800 #uselib "" #func _MDIWndProc "" int,int,int,int setcallbk MDIWndProc,_MDIWndProc,*MyMDIWndProc SetWindowLong hwnd,GWL_WNDPROC,varptr(MDIWndProc) OldHSPWndProc=stat MDIClass = "MDIChildWindowClass" LoadIcon 0,IDI_APPLICATION //デフォルトアプリケーションアイコン hIcon=stat LoadCursor 0,IDC_ARROW //標準矢印カーソル hCursor=stat //MDI子ウィンドウクラス登録 dim WNDCLASSEX, 12 WNDCLASSEX.0 = 48 WNDCLASSEX.1 = 0 WNDCLASSEX.2 = varptr(MDIWndProc) WNDCLASSEX.3 = 0 WNDCLASSEX.4 = 0 WNDCLASSEX.5 = hInstance WNDCLASSEX.6 = hIcon WNDCLASSEX.7 = hCursor WNDCLASSEX.8 = 13 WNDCLASSEX.9 = 0 WNDCLASSEX.10= varptr(MDIClass) WNDCLASSEX.11= 0 RegisterClassEx varptr(WNDCLASSEX) CreatePopupMenu hMenu.1 = stat AppendMenu hMenu.1,MF_INSERT,100,"新しいウィンドウ(&N)" CreateMenu hMenu.0 = stat AppendMenu hMenu.0,MF_POPUP,hMenu.1,"ウィンドウ(&W)" SetMenu hwnd, hMenu.0 DrawMenuBar hwnd //MDIクライアントウィンドウ作成 CLIENTCREATESTRUCT=hMenu.1,0 CreateWindowEx 0x200,"MDICLIENT", "",WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,0,0,ginfo(12),ginfo(13),hwnd,hMenu.0,hinstance,varptr(CLIENTCREATESTRUCT) hMDIClient=stat MaxMDIChild=0 //MDI子ウィンドウ作成 repeat 3 MaxMDIChild++ CreateMDIWindow MDIClass,"MDIChildWindow"+strf("(%02d)",MaxMDIChild),0,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hMDIClient,hinstance,0 hMDIChild(MaxMDIChild-1)=stat CreateWindowEx 0x200,"Edit","Edit",WS_CHILD | WS_VISIBLE,0,0,200,200,hMDIChild(MaxMDIChild-1),0,hinstance,0 CreateWindowEx 0,"Button","Button",WS_CHILD | WS_VISIBLE,0,200,200,20,hMDIChild(MaxMDIChild-1),0,hinstance,0 loop stop *MyMDIWndProc _hwnd=callbkarg(0) msg=callbkarg(1) wp=callbkarg(2) lp=callbkarg(3) if _hwnd=hwnd{ switch msg case WM_DESTROY PostQuitMessage 0 swbreak case WM_COMMAND if _hwnd=hwnd{ wID=wp&0xFFFF if wID=100{ MaxMDIChild++ CreateMDIWindow MDIClass,"MDIChildWindow"+strf("(%02d)",MaxMDIChild),0,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hMDIClient,hinstance,0 hMDIChild(MaxMDIChild-1)=stat } } default CallWindowProc OldHSPWndProc,_hwnd,msg,wp,lp swbreak swend }else{ DefMDIChildProc _hwnd,msg,wp,lp } return



掘木

リンク

2016/3/11(Fri) 22:25:23|NO.74872

こちらもソレ、やらかしましたよ。

こちらの提示した2の項を満たしていません。
子ウィンドウ側は問題無いですが、
親のプロシージャも共通ですとDefMDIChildProcはDefFrameProcじゃないので分岐が必要です



InoueSoftwear

リンク

2016/3/12(Sat) 13:34:23|NO.74884

CallWindowProcをDefFrameProcにしたりしていじったらできました。
ありがとうございます。

#include "user32.as" #include "hscallbk.as" #include "shell32.as" #define GWL_WNDPROC -4 #define GWL_USERDATA -21 #define GW_CHILD 5 #define CW_USEDEFAULT 0x80000000 #define IDI_APPLICATION 32512 #define IDC_ARROW 32512 #define WS_CHILD 0x40000000 #define WS_VISIBLE 0x10000000 #define WS_CLIPCHILDREN 0x02000000 #define WM_SIZE 0x0005 #define WM_CLOSE 0x0010 #define WM_COMMAND 0x0111 #define WM_MDIDESTROY 0x0221 #define WM_MDITILE 0x0226 #define WM_MDICASCADE 0x0227 #define WM_MDIICONARRANGE 0x0228 #define WM_MDIGETACTIVE 0x0229 #define WM_MDISETMENU 0x0230 #define MDITILE_VERTICAL 0x0000 #define MDITILE_HORIZONTAL 0x0001 #define MDITILE_SKIPDISABLED 0x0002 #define MDITILE_ZORDER 0x0004 #define MF_INSERT 0x00000000 #define MF_POPUP 0x00000010 #define MF_SEPARATOR 0x00000800 #uselib "" #func _MDIWndProc "" int,int,int,int setcallbk MDIWndProc,_MDIWndProc,*MyMDIWndProc screen 0,ginfo(20),ginfo(21),0,,,640,480 hMainWindow=hwnd title "MDIのテキストエディタ" SetWindowLong hMainWindow,-16,0x16CF0000 SetWindowPos hMainWindow,0,0,0,0,0,0x27//再描画 SetWindowLong hMainWindow,GWL_WNDPROC,varptr(MDIWndProc) OldHSPWndProc=stat MDIClass = "MDIChildWindowClass" SHFILEINFO=0 SHGetFileInfo ".txt",0x80,varptr(SHFILEINFO),0x160,0x111//テキストファイルアイコン取得 hIcon=SHFILEINFO.0 LoadCursor 0,IDC_ARROW //標準矢印カーソル hCursor=stat //MDI子ウィンドウクラス登録 dim WNDCLASSEX, 12 WNDCLASSEX.0 = 48 WNDCLASSEX.1 = 0 WNDCLASSEX.2 = varptr(MDIWndProc) WNDCLASSEX.3 = 0 WNDCLASSEX.4 = 0 WNDCLASSEX.5 = hInstance WNDCLASSEX.6 = hIcon WNDCLASSEX.7 = hCursor WNDCLASSEX.8 = 13 WNDCLASSEX.9 = 0 WNDCLASSEX.10= varptr(MDIClass) WNDCLASSEX.11= 0 RegisterClassEx varptr(WNDCLASSEX) CreatePopupMenu hMenu.1 = stat #enum IDM_NEWWND = 100 #enum IDM_CLOSEWND #enum IDM_CASCADE #enum IDM_TILE_H #enum IDM_TILE_V #enum IDM_ICONARRANGE AppendMenu hMenu.1,MF_INSERT,IDM_NEWWND,"新しいウィンドウ(&N)" AppendMenu hMenu.1,MF_INSERT,IDM_CLOSEWND,"ウィンドウを閉じる(&D)" AppendMenu hMenu.1,MF_SEPARATOR,0,0 AppendMenu hMenu.1,MF_INSERT,IDM_CASCADE,"重ねて表示(&C)" AppendMenu hMenu.1,MF_INSERT,IDM_TILE_H,"上下に並べて表示(&H)" AppendMenu hMenu.1,MF_INSERT,IDM_TILE_V,"左右に並べて表示(&V)" AppendMenu hMenu.1,MF_INSERT,IDM_ICONARRANGE,"アイコンの整列(&A)" CreateMenu hMenu.0 = stat AppendMenu hMenu.0,MF_POPUP,hMenu.1,"ウィンドウ(&W)" SetMenu hMainWindow, hMenu.0 DrawMenuBar hMainWindow //MDIクライアントウィンドウ作成 CLIENTCREATESTRUCT=hMenu.1,0 CreateWindowEx 0x200,"MDICLIENT", "",WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,0,0,ginfo(12),ginfo(13),hMainWindow,hMenu.0,hinstance,varptr(CLIENTCREATESTRUCT) hMDIClient=stat MaxMDIChild=0 //MDI子ウィンドウ作成 repeat 3 MaxMDIChild++ CreateMDIWindow MDIClass,"新しいドキュメント"+MaxMDIChild,0,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hMDIClient,hinstance,MaxMDIChild-1 hMDIChild(MaxMDIChild-1)=stat RECT=0,0,0,0 GetClientRect hMDIChild(MaxMDIChild-1),varptr(RECT) CreateWindowEx 0x200,"Edit","",WS_CHILD | WS_VISIBLE | 0x300004,RECT(0),RECT(1),RECT(2)-RECT(0),RECT(3)-RECT(1),hMDIChild(MaxMDIChild-1),0,hinstance,0 hMDIEdit(MaxMDIChild-1)=stat loop stop *MyMDIWndProc _hwnd=callbkarg(0) msg=callbkarg(1) wp=callbkarg(2) lp=callbkarg(3) if _hwnd=hMainWindow{//メインウィンドウからのメッセージ switch msg case WM_CLOSE DestroyIcon hIcon//アイコンハンドル削除 PostQuitMessage hMainWindow//終了 swbreak case WM_SIZE nWidth = lp&0xFFFF nHeight = (lp>>16)&0xFFFF MoveWindow hMDIClient,0,0,nWidth,nHeight,1 swbreak case WM_COMMAND wID=wp&0xFFFF if wID=IDM_NEWWND{//新しいウィンドウ MaxMDIChild++ CreateMDIWindow MDIClass,"新しいドキュメント"+MaxMDIChild,0,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hMDIClient,hinstance,0 hMDIChild(MaxMDIChild-1)=stat RECT=0,0,0,0 GetClientRect hMDIChild(MaxMDIChild-1),varptr(RECT) CreateWindowEx 0x200,"Edit","",WS_CHILD | WS_VISIBLE | 0x300004,RECT(0),RECT(1),RECT(2)-RECT(0),RECT(3)-RECT(1),hMDIChild(MaxMDIChild-1),0,hinstance,0 hMDIEdit(MaxMDIChild-1)=stat return } if wID=IDM_CLOSEWND{//ウィンドウを閉じる sendmsg hMDIClient,WM_MDIGETACTIVE if stat{ sendmsg hMDIClient,WM_MDIDESTROY,stat } return } if wID=IDM_CASCADE{//重ねて表示 sendmsg hMDIClient,WM_MDICASCADE,0 return } if wID=IDM_TILE_H{//上下に並べる sendmsg hMDIClient,WM_MDITILE,MDITILE_HORIZONTAL return } if wID=IDM_TILE_V{//左右に並べる sendmsg hMDIClient,WM_MDITILE,MDITILE_VERTICAL return } if wID=IDM_ICONARRANGE{//アイコンの整列 sendmsg hMDIClient,WM_MDITILE,WM_MDIICONARRANGE return } default DefFrameProc hMainWindow,hMDIClient,msg,wp,lp swbreak swend }else{//MDI子ウィンドウからのメッセージ DefMDIChildProc _hwnd,msg,wp,lp switch msg case WM_SIZE GetWindow _hwnd,GW_CHILD:hEdit=stat RECT=0,0,0,0 GetClientRect _hwnd,varptr(RECT) MoveWindow hEdit,RECT(0),RECT(1),RECT(2)-RECT(0),RECT(3)-RECT(1),1 swbreak swend } return



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