|
|
|
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
| |
|
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では取れません。(こういうので結構嵌るんだこれが)
|
|
2016/3/11(Fri) 00:18:30|NO.74857
>NO.74854
掘木様のように既に知識をお持ちの方なら問題無いのかも知れませんが、
何かしらの参考元のコードをHSPに正しく変換する作業が大変。
というのが私の考える最大のデメリットですね。
実際こうして初っ端から躓いてるわけですし…
失礼ながら質問者様はまだそこまでの知識は持ち併せて無いように思えます。
HSPに正しく変換するには他言語以上に深い理解が必要になりそうですので
それならいっそそっちの言語習得した方が早そうですよ。
という意見です。
|
|
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じゃないので分岐が必要です
|
|
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
| |
|