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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0331
空気他のbgscr(screen)をクリックした際でもScreen0をアクティブにしたい。4解決


空気

リンク

2017/3/31(Fri) 00:41:58|NO.78752

bgscr別に描画したものをuser32.dllのSetParentでscreen 0内に納め、

一つのメインウィンドウ内に複数bgscrを合体させたGUIを作っています。
screen 0上のbgscrをクリックした際にscrren 0が非アクティブになります。
(SetParentでscreen 0内に納めないbgscrでも発生しますので仕様なのでしょう。)

bgscr上のbuttonや
user32.dllを利用したスクロールバー等に支障無く、
bgscrをアクティブにせずにScreen 0のみをアクティブにする方法を
サンプルスクリプトにて実装方法を教えて頂けると幸いです。よろしくお願い致します。

また、スクリプトを改造し商用利用する事もあるかもしれませんので
ご理解の程、よろしくお願い致します。



この記事に返信する


MillkeySoftware

リンク

2017/3/31(Fri) 01:33:40|NO.78753

ウィンドウメッセージ WM_NCACTIVATE でアクティブウィンドウの切り替えを拒否すればいいんじゃないかなー。

#define WM_NCACTIVATE 0x0086 screen 0,800,600,0 : cls 4 oncmd gosub *NoActive,WM_NCACTIVATE bgscr 4,320,240,0 : cls 4 stop *NoActive if ginfo(24) = 4 : return fActive = wParam & 0xFFFF fMinimized = (wParam >> 16) & 0xFFFF if fActive == 0 : return 0 return



空気

リンク

2017/3/31(Fri) 04:23:35|NO.78755

MillkeySoftwareさん。早急な回答感謝致します。
残念ながら、提示して頂いた手法でbgscrのBuntton等が正常に動作しなくなるようです。
わざわざ、回答して頂いたのに申し訳ないです。

現在、過去スレやGoogleやMSDNやMSDNのHSP記述解説サイトなどで調べていますが、
GetWindowLongとSetWindowLongで子ウィンドウ指定という事が出来るらしく、
例えば、scrennを
GetWindowLongとSetWindowLongとSetParentで子ウィンドウ指定をした際に
子ウィンドウが親ウィンドウのアクティブ状態を横取りしたりする事が無いようですが。
bgscrの場合はWS_POPUPというスタイルが生成時に適用されるようで、
WS_POPUPとWS_CHILD(子ウィンドウスタイル)が兼用出来ない事が
親ウィンドウのアクティブ状態を横取りする原因のようです。
(解説が正しいか自信がありませんが。)

現在、解決するためのサンプルスクリプトを記述中です。
WinAPI等は全然詳しくないので色々なサイトからコピペした記述の組み合わせなので
バグ等出ないか少し心配ですが・・・。



空気

リンク

2017/3/31(Fri) 04:28:05|NO.78756

以下サンプルスクリプトで自己解決しました。
バグ等ありましたら報告して頂けると幸いです。
#include "user32.as"
#const global GWL_STYLE $FFFFFFF0;ウィンドウスタイル(nIndex) #const global WS_POPUP $80000000;ポップアップウィンドウスタイル #const global WS_CHILD $40000000;子ウィンドウスタイル ;メインウィンドウ(screen 0) screen 0,800,600 hwnd_main = hwnd ;枠無しウィンドウ1(bgscr 1) bgscr 1,200,200 hwnd_child = hwnd SetParent hwnd_child , hwnd_main color 255,0,255 :boxf;検証用 input a;検証用 ;bgscrのウィンドウスタイルは子ウィンドウと兼用出来ない ;WS_POPUPが指定されているのでXORのフラグ反転で ;WS_POPUPを指定解除し、WS_CHILDをORのフラグONで ;子ウィンドウ扱いする事。 ;親ウィンドウのフォーカスがbgscrに横取りされなくなる。 GetWindowLong hwnd, GWL_STYLE SetWindowLong hwnd, GWL_STYLE, stat ^ WS_POPUP | WS_CHILD ;起動時にウィンドウをアクティブにしないと ;初回にbgscrをクリックした際に ;親ウィンドウがアクティブにならない gsel 0,1
参考にさせて頂いたサイト:
http://chokuto.ifdef.jp/urawaza/api/SetWindowLong.html
http://hsp.tv/play/pforum.php?mode=pastwch&num=36587
http://lhsp.s206.xrea.com/hsp_window.html
https://msdn.microsoft.com/ja-jp/library/cc364760.aspx



空気

リンク

2017/3/31(Fri) 05:07:30|NO.78757

試しにモジュール化してみました。
従来の「SetParent」を「SetParent_Bgscrchild」に置き換えるだけで
bgscrを一般的な子ウィンドウと同等な仕様に子ウィンドウ化出来ます。

SetParent_Bgscrchild モジュール
#include "user32.as"
/*bgscr用Setparent*/ #module #const global GWL_STYLE $FFFFFFF0;ウィンドウスタイル(nIndex) #const global WS_POPUP $80000000;ポップアップウィンドウスタイル #const global WS_CHILD $40000000;子ウィンドウスタイル #deffunc SetParent_Bgscrchild int p1, int p2 SetParent p1,p2 GetWindowLong p1, GWL_STYLE SetWindowLong p1, GWL_STYLE, stat ^ WS_POPUP | WS_CHILD return #global ;NYSL Version 0.9982ライセンス、CC0ライセンス、Public Domain ;の3種類の中からお好きな形態で利用可能です。



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