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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1120
DripHSPからMDIウィンドウを作成するのに必要な手順?2未解決


Drip

リンク

2019/11/20(Wed) 03:41:28|NO.88879

こんにちは!
HSPからMDIウィンドウを作成しようとしたとき、
以下のような方法では子ウィンドウが操作不可能となってしまい、
ウィンドウ枠も細くなってしまいます。(この動作はOSによっても違ったりするでしょうか?)

#uselib "USER32.DLL" #func SetParent "SetParent" int , int screen 0,800,600:p=hwnd screen 2,400,300,4,100,100:c=hwnd SetParent c,p
以下の方法では上記の問題は改善しますが、サイズが可変になってしまうのと、
子ウィンドウがアクティブになったとき親ウィンドウが非アクティブになってしまいます。

#uselib "USER32.DLL" #func SetParent "SetParent" int , int screen 0,800,600:p=hwnd screen 2,400,300,0,100,100:c=hwnd SetParent c,p
また、以下のように子ウィンドウにWS_CHILD(0x40000000)を与えますと
正常に子ウィンドウを掴んだ時親ウィンドウがアクティブを維持しますが、
今度は子ウィンドウのタイトルバーが常時完全な非アクティブとなり、
一般的なMDIアプリケーションのような表示(子ウィンドウのキャプションバーが使用可能な見た目)になりません。

#uselib "USER32.DLL" #func SetParent "SetParent" int , int #func GetWindowLong "GetWindowLongA" sptr,sptr #func SetWindowLong "SetWindowLongA" sptr,sptr,sptr screen 0,800,600:p=hwnd screen 2,400,300,0,100,100:c=hwnd SetParent c,p GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat|$40000000 gsel 0,1
サイズ固定の子ウィンドウを作成した時の問題はWindowsのクラシックUIを利用した際に
再現しない場合があるなど環境による影響を受け易いようです。
これらの問題を改善して(つまり、子ウィンドウはサイズ固定ウィンドウかつ
 ウィンドウ周囲が細くならず、子ウィンドウを掴んだ時も親ウィンドウがアクティブを
 維持する状態で安定的に)HSPからMDIウィンドウを利用する方法はあるでしょうか?
もしHSPからこのようなMDIウィンドウを作成する正しい手順について
情報をお持ちの方がいらっしゃれば是非お寄せいただければ幸いです。



この記事に返信する


暇人

リンク

2019/11/20(Wed) 20:49:38|NO.88888

MDI用のウィンドウ作成命令があります。
メインウィンドウのタイトルとMDI子ウィンドウのタイトルが
両方アクティブに見えるようにするにはscreenじゃ無理かもしれない・・・

詳しくは↓
http://wisdom.sakura.ne.jp/system/winapi/win32/win139.html

MDIウィンドウがうまく表示されない
http://hsp.tv/play/pforum.php?mode=pastwch&num=74785
のNO.74884に実用例が有ります。
ただ、使用してるコールバックモジュールが
HSPには同梱されていないので、HSP3.5β6から同梱されてる
modclbk3.hspを使用する為の修正箇所を挙げます。

>#include "hscallbk.as"


#include "modclbk3.hsp"
に置き換え


>#uselib ""
>#func _MDIWndProc "" int,int,int,int
>setcallbk MDIWndProc,_MDIWndProc,*MyMDIWndProc


newclbk3 MDIWndProc, 4, *MyMDIWndProc
に置き換え


>SetWindowLong hMainWindow,GWL_WNDPROC,varptr(MDIWndProc)


SetWindowLong hMainWindow,GWL_WNDPROC,MDIWndProc
に置き換え


>WNDCLASSEX.2 = varptr(MDIWndProc)


WNDCLASSEX.2 = MDIWndProc
に置き換え


>CreateWindowEx 0x200,"MDICLIENT", "",WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,0,0,ginfo(12),ginfo(13),hMainWindow,hMenu.0,hinstance,varptr(CLIENTCREATESTRUCT)


#define MDIS_ALLCHILDSTYLES 0x0001 CreateWindowEx 0x200,"MDICLIENT", "",WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | MDIS_ALLCHILDSTYLES,0,0,ginfo(12),ginfo(13),hMainWindow,hMenu.0,hinstance,varptr(CLIENTCREATESTRUCT)
に置き換え


>//MDI子ウィンドウ作成
>repeat 3
> MaxMDIChild++
> CreateMDIWindow MDIClass,"新しいドキュメント"+MaxMDIChild,0,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hMDIClient,hinstance,MaxMDIChild-1


//MDI子ウィンドウ作成 //MDI子ウィンドウ用サイズ固定スタイル #const MDI_CHILD_STYLE 0x10000000|0x40000000 | (0x00CF0000-0x00040000)//WS_VISIBLE|WS_CHILD | (WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_THICKFRAME+WS_MINIMIZEBOX+WS_MAXIMIZEBOX-WS_THICKFRAME) repeat 3 MaxMDIChild++ CreateMDIWindow MDIClass,"新しいドキュメント"+MaxMDIChild,MDI_CHILD_STYLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hMDIClient,hinstance,MaxMDIChild-1
に置き換え


>*MyMDIWndProc
の下に

dim callbkarg,4 clbkargprotect callbkarg
この2行を挿入


> case WM_CLOSE
の下に

repeat MaxMDIChild sendmsg hMDIClient,WM_MDIDESTROY,hMDIChild(cnt) loop SetWindowLong hMainWindow,GWL_WNDPROC,OldHSPWndProc
この4行を挿入(これをしないと終了時にエラーが出るけど正しいのかは分からない・・・)



Drip

リンク

2019/11/23(Sat) 22:02:36|NO.88912

暇人さん

ご返信が遅れ失礼いたしました!
詳しい方法をご丁寧にありがとうございます。

ご提示くださった方法でこちらでも正しいMDIウィンドウの生成を確認することができましたが、
かなり大変な記述になってしまうようですね…。
HSPでは2つ以上ウィンドウが出ているとdialog命令も迂闊に使えないので、
(ウィンドウ1つならdialogが出現している間メインウィンドウが操作できなく
 なるので良いですが、ウィンドウが2つあるともう片方は操作できてしまう上
 oncmdも受け取ってしまうためgosubの破綻が簡単に作り出せてしまうので
 EnableWindowなどでのフォローが必須なんですよね)
HSPではMDIやオーナーウィンドウの仕組みを充実させていただけると大変助かるのですが;;

MDIの利用はもう少し検討してみようと思います。
ありがとうございました。



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