|
|
2015/11/28(Sat) 21:17:16|NO.73316
最近スレ立たなくなりましたね…
HSPのbgscrで作成したウィンドウをサイズ可変ウィンドウにするにはどうしたらよいですか?
ウィンドウスタイルでタイトルバーを取り除く方法だと、Windows 10の環境で上部に
白い何かが出てしまい、背景色が黒などの場合目立ってしまいます。
というか、タイトルバーと右上ボタン部分のオーナードローってできないのでしょうか?
Visual Studioとかのタイトルバーみたいにタイトルバー部分に描画したいのですが…
回答よろしくお願いします…
|
|
2015/11/28(Sat) 23:07:59|NO.73324
スレはスペースさんの言葉のスレッドのことですか。そうであれば最近は少ないのは秋で平日で忙しい人が多いからだと思います。
実際土曜日の今日はたくさんスレッドがつくられたようです
#define WS_THICKFRAME $00040000
#define GWL_STYLE $FFFFFFF0
#define WM_NCLBUTTONDOWN $000000A1
#define WM_MOUSEMOVE $00000200
#define HTCAPTION $00000002
#define WM_LBUTTONDOWN $00000201
#uselib "user32.dll"
#cfunc GetWindowLong "GetWindowLongA" sptr,int
#func SetWindowLong "SetWindowLongA" sptr,int,int
bgscr 0, 320, 240
SetWindowLong hwnd, GWL_STYLE, WS_THICKFRAME | GetWindowLong(hwnd,GWL_STYLE)
button "おわり", *owari
oncmd gosub *on_left_click, WM_LBUTTONDOWN
stop
*owari
end
*on_left_click
sendmsg hwnd, WM_NCLBUTTONDOWN, HTCAPTION, lparam
return 0
|
|
2015/11/29(Sun) 12:22:28|NO.73332
>Noap さん
確かに昨日は増えてますね。
最初はその方法を試していたのですが、Windows 10でウィンドウの上部に白いのが出て、
黒で塗りつぶすと目立つので、この方法ではダメなようです。
>Moz さん
過去ログも調べたのですが…調べきれてなかったようです。すみません。
ちゃんとウィンドウサイズの変更ができるようになりました。
ありがとうございます。
|
|
2015/11/29(Sun) 15:41:12|NO.73334
ごめんなさい
もう解決したので余計かもしれませんがとんでもないうっかりミスをしていたので訂正します
そのときのわたしの環境ではこうしなくてもうまく動いていたので投稿時には気がつきませんでした
おそらくこのミスが原因です
#define WS_THICKFRAME $00040000
#define GWL_STYLE $FFFFFFF0
#define WM_NCLBUTTONDOWN $000000A1
#define WM_MOUSEMOVE $00000200
#define HTCAPTION $00000002
#define WM_LBUTTONDOWN $00000201
#define SWP_NOSIZE $00000001
#define SWP_NOZORDER $00000004
#define SWP_NOACTIVATE $00000010
#define SWP_NOMOVE $00000002
#define SWP_NOOWNERZORDER $00000200
#define SWP_FRAMECHANGED $00000020
#define SWP_DRAWFRAME SWP_FRAMECHANGED
#define WM_NCCALCSIZE $00000083
#uselib "user32.dll"
#cfunc GetWindowLong "GetWindowLongA" sptr,int
#func SetWindowLong "SetWindowLongA" sptr,int,int
#func SetWindowPos "SetWindowPos" sptr,int,int,int,int,int,int
bgscr 0, 320, 240
SetWindowLong hwnd, GWL_STYLE, WS_THICKFRAME | GetWindowLong(hwnd,GWL_STYLE)
//WM_NCCALCSIZEを送る
SetWindowPos hwnd,,,,,,SWP_NOZORDER | SWP_NOMOVE | SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOSIZE
button "おわり", *owari
oncmd gosub *on_left_click, WM_LBUTTONDOWN
stop
*owari
end
*on_left_click
sendmsg hwnd, WM_NCLBUTTONDOWN, HTCAPTION, lparam
return 0
| |
|
2015/11/30(Mon) 14:50:50|NO.73345
> Noap さん
WM_NCCALCSIZE……?と思い調べたところ、クライアント領域関係ですね。
screenにこれを使った時は普通にできたのですが、
bgscr+THICKFRAMEに使うと非アクティブになった時に謎の白いやつの幽霊が…
う〜ん…
なんでWindows 10は白いのが出るんだろ…
|
|
2015/11/30(Mon) 17:44:11|NO.73347
「枠は無いけど、ドラッグで可変する枠だよ!」となっている為、
システムの描画で齟齬が生じるのかと…
WM_Size & WM_NCHitTest のメッセージ処理が無難だと思いますよ。
一応、非クライアント部分も描画出来なくは無いというサンプルです。
#module
#uselib "user32.dll"
#cfunc _GetWindowDC "GetWindowDC" sptr
#func _ReleaseDC "ReleaseDC" sptr, sptr
#cfunc _DefWindowProc "DefWindowProcA" sptr,int,int,int
#uselib "gdi32.dll"
#func _BitBlt "BitBlt" sptr,int,int,int,int,sptr,int,int,int
#deffunc NC_BitBlt int p0, int p1, int p2, int p3, int p4, int p5, int p6, local a
a.1=_DefWindowProc(hWnd,iParam,wParam,lParam)
a=_GetWindowDC(hWnd) :_BitBlt a,p1,p2,p5,p6,p0,p3,p4,$cc0020 :_ReleaseDC hWnd,a
Return a.1
#global
*start
Screen 1,640,480,2,,,320,240
onCmd gosub *nc_paint,$0005 ;WM_Size
onCmd gosub *nc_paint,$0085 ;WM_NCPaint
onCmd gosub *nc_paint,$0086 ;WM_NCActivate
Buffer 0,1280,960 :ii=hDC
GradF 0,0,800,600,1,$ff0000,$ffff00
gSel 1,1
Stop
*nc_paint
NC_BitBlt ii,0,0,0,0,800,600
Return stat
|
|
2015/11/30(Mon) 19:18:27|NO.73352
一緒に使うこと自体は問題ないと思いますよ。
WS_ThickFrame自体は、枠線部分でサイズ調整できるかのフラグであって
枠線の有無とは別物なんじゃないかという憶測です。
で、WS_Borderが無いと枠が存在しないと見なされて
その部分が描画されないケースがWindow10ではあるんじゃないかな、と思っただけです。
雑談失礼致しました。
|
|
2015/11/30(Mon) 21:20:17|NO.73354
今MSDNを探してみると日本語版を見つけたので一応そのURLを書きます
ただ英語版のほうが定数の値ものっていて詳しいので英語版も見るといいと思います
https://msdn.microsoft.com/ja-jp/library/czada357.aspx
とりあえずWS_BORDERをたしてみました
やはりパソコンはむずかしいです
#define GWL_STYLE $FFFFFFF0
#define WS_BORDER $00800000
#define WS_POPUP $80000000
#define WS_CAPTION $00C00000
#define WS_DISABLED $08000000
#define WS_THICKFRAME $00040000
#define WS_HSCROLL $00100000
#define WS_VSCROLL $00200000
#define WS_MAXIMIZE $01000000
#define WS_MAXIMIZEBOX $00010000
#define WS_MINIMIZE $20000000
#define WS_MINIMIZEBOX $00020000
#define WS_DLGFRAME $00400000
#define WS_SIZEBOX WS_THICKFRAME
#define WS_CHILD $40000000
#define WS_SYSMENU $00080000
#define WS_VISIBLE $10000000
#define WM_NCLBUTTONDOWN $000000A1
#define WM_MOUSEMOVE $00000200
#define WM_LBUTTONDOWN $00000201
#define HTCAPTION $00000002
#uselib "user32.dll"
#cfunc GetWindowLong "GetWindowLongA" sptr,int
#func SetWindowLong "SetWindowLongA" sptr,int,int
#func MoveWindow "MoveWindow" sptr,int,int,int,int,int
bgscr 0, ginfo_dispx, ginfo_dispy,screen_hide
SetWindowLong hwnd, GWL_STYLE, WS_THICKFRAME | GetWindowLong(hwnd,GWL_STYLE) | WS_BORDER
MoveWindow hwnd, ginfo_wx1, ginfo_wy1, 300, 300, 1
button "おわり", *owari
oncmd gosub *on_LBUTTONDOWN, WM_LBUTTONDOWN
gsel 0,1
stop
*owari
end
*on_LBUTTONDOWN
sendmsg hwnd, WM_NCLBUTTONDOWN, HTCAPTION, lparam
return 0
| |
|