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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0418
とあるプログラマWindows標準のではないタイトルバーを持つウィンドウ4解決


とあるプログラマ

リンク

2019/4/18(Thu) 02:24:58|NO.87204

screen命令で初期化されるウィンドウはWindows標準のウィンドウ(エクスプローラなどの 一番左にアイコン・ウィンドウタイトル、右に最小化・最大化・閉じるボタンを持つウィンドウ)で初期化されますが、このタイトルバーの部分を特殊なもの(Chrome・PC版LINE・Discordなどのような)に変更するにはどういった手段がありますでしょうか。
思い浮かぶ方法としてはSetWindowLongでウィンドウスタイルをWS_OVERLAPPED WS_BORDERに変えてタイトルバーになる部分を自分で描画もしくは子ウィンドウで作成して、移動をsendmsg WM_NCLBUTTONDOWNで処理、閉じるボタン等も同様に行う方法なのですが、これより効率の良い方法もしくはタイトルバー自体をいじくる関数等あるのでしょうか。
やろうとしていることが少し特殊だと思うので検索しても望む結果がヒットしなかったので質問しました。



この記事に返信する


Ponyo

リンク

2019/4/18(Thu) 08:13:23|NO.87207

bgscrまたはウィンドウスタイル変更API(SetWindowLong,GetWindowLong)で
変える手があり、他にもクライアント領域を広げるという手もあります。
http://hsp.tv/play/pforum.php?mode=pastwch&num=56498

しかし、OSによってレイアウトが崩れてしまいますので、(私の場合ひどいですw)
タイトルバーなしのウィンドウにそのままタイトルバー風の描画を付ける。
これを私はよく行います。



ham

リンク

2019/4/18(Thu) 20:48:05|NO.87209

少し前に同じようなこと調べまくったんですが、
本格的にやるにはWM_NCPAINTを捕まえて何かするらしいです。
小難しいことが書かれていて私にはできそうにありませんでしたが。
http://hsp.tv/play/pforum.php?mode=pastwch&num=75852

結局、疑似タイトルバーを作る方が楽ですがね。



とあるプログラマ

リンク

2019/4/18(Thu) 22:15:26|NO.87210

>>Ponyoさん、hamさn
非クライアント領域に無理やり描画することは可能らしいですが、結構面倒くさそうですね… やはりタイトルバーなしウィンドウに疑似タイトルバーを付けてあげるのが良さそうですね。しかし最大化処理とかも含めるとこっちもかなり大変そうですが…
ありがとうございます。以下検証用コードです。

#include "user32.as" // 定数定義ヘッダ "constant.as" がない環境用 #define GWL_STYLE $FFFFFFF0 #define WS_OVERLAPPED 0 #define WS_BORDER $00800000 #define WS_VISIBLE $10000000 #define WS_CHILD $40000000 #define WS_CLIPCHILDREN $02000000 #define WS_CLIPSIBLINGS $04000000 #define SWP_NOACTIVATE $00000010 #define SWP_NOSIZE $00000001 #define SWP_FRAMECHANGED $00000020 #define SWP_NOZORDER $00000004 #define SWP_NOMOVE $00000002 #define HWND_TOP $00000000 #define WM_LBUTTONDOWN $00000201 #define WM_NCLBUTTONDOWN $000000A1 #define HTCAPTION $00000002 #define CaptionSize 26 ;タイトルバーのサイズ(高さ) bgscr 0 ;screenで初期化したウィンドウだとタイトルバーの残骸が出るためbgscrで GetWindowLong hwnd,GWL_STYLE ;ウィンドウスタイル取得 SetWindowLong hwnd,GWL_STYLE,stat|WS_BORDER|WS_CLIPCHILDREN|WS_CLIPSIBLINGS ;ボーダーと子ウィンドウ描画用スタイルを付与 SetWindowPos hwnd, HWND_TOP, 0,0, 0,0, SWP_NOSIZE| SWP_NOMOVE| SWP_NOZORDER |SWP_FRAMECHANGED ;ボーダー変更したため hMainWindow=hwnd bgscr 1,ginfo_winx,CaptionSize ;タイトルバー用子ウィンドウ SetParent hwnd,hMainWindow ;子ウィンドウに設定 SetWindowPos hwnd , 0 , 0,0 , NULL,NULL,SWP_NOSIZE|SWP_NOZORDER ;メインウィンドウの(0,0)に移動 oncmd gosub *Drag,WM_LBUTTONDOWN ;ドラッグ時に移動 hCaptionWindow=hwnd color 56,173,249 boxf color 255,255,255 pos 10,2 mes "たいとる" objsize CaptionSize-4,CaptionSize-4 pos ginfo_winx-CaptionSize,2 button goto "X",*exit gsel 0 pos 0,CaptionSize mes "メインウィンドウ上に子ウィンドウを張り付けてるので、" mes "見た目上のクライアント領域はY方向にタイトルバーのサイズだけ動かす必要がある。" mes "見た目上のクライアント領域すら別の子ウィンドウにすれば(0,0)にすることができる。" stop *Drag SendMsg hMainWindow,WM_NCLBUTTONDOWN,HTCAPTION,0 ;移動 return *exit end



小泉優也

リンク

2019/6/29(Sat) 07:59:24|NO.87771

僕の過去作で、Loytoというものがあります。
今度最大化などに対応させるので、しばらくお待ちください。
(もう解決したようですが)



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