|
|
2011/6/15(Wed) 19:05:45|NO.39673
screen では薄い灰色で縁取りされて見えます。
bgscr では縁取りない四角形です。
この bgscr に色(赤、黒、任意)の付いた縁をつけたい、その幅
を任意に決めたいと思います。
簡単に言うと、色付きの額縁のような bgscr を作りたいのです。
よろしくお願い申し上げます。
|
|
2011/6/15(Wed) 19:43:43|NO.39674
このような感じでしょうか。
#define margX 5//横方向余白
#define margY 5//縦方向余白
#define scrX 600//枠内横幅
#define scrY 400//枠内縦幅
bgscr 0,2*margX+scrX,2*margY+scrY
color 255,0,0 :boxf//外枠色で画面全体を塗りつぶす
color 0,0,0 :boxf margX,margY,margX+scrX,margY+scrY//枠の内側だけを基準の色で塗りつぶす
縦横の余白分bgscrの初期化サイズを拡げて、余白部分を塗りつぶしました。
以降、余白分を気にしながら座標管理しなければならないのが難点ですが。
|
|
2011/6/15(Wed) 20:23:59|NO.39676
最初の質問の文章が言い足りなくて、すみません。
額縁のbgscrを作ってから、
#include "user32.as"
#func SetLayered "SetLayeredWindowAttributes" int , int , int , int
bgscr 0,ginfo(20), ginfo(21)
GetWindowLong hwnd, -16 // 移動
SetWindowLong hwnd, -16, stat | $10000 | $40000
このようなウィンドウスタイルの変更文を加えて、
可変サイズbgscrを目指しております。
それを言わなくて申し訳ありません。
提示いただいたようなことは試みておりました。サイズを変えると
ばらばらになります。
何とかなりますでしょうか?
|
|
2011/6/15(Wed) 21:04:15|NO.39678
普通のウィンドウからタイトルバーを消すのはどうですか?
|
|
2011/6/15(Wed) 22:01:23|NO.39679
返信を頂いてから、
「タイトルバーを消して、枠色を変更すれば」と思い探していましたが
枠色の変更方法を見つけられませんでした。
「メインウィンドウ(bgscr)の裏に枠の分だけ広いウィンドウを置いて、
メインウィンドウのサイズ変更に追従する」という方法はいかがでしょうか。
|
|
2011/6/15(Wed) 22:12:00|NO.39680
枠の色は変えられないはずでは?
|
|
2011/6/15(Wed) 23:50:20|NO.39682
> screen では薄い灰色で縁取りされて見えます。
水色ベースのグラデーションに見えます。Vistaでは。多分7でも。
この部分はOSに任されている部分なのでどうしようもないかと思います。
デスクトップのテーマを変更すればいいのかな?でも勝手にそんなことしたらユーザーに怒られますが。
もしかしたら何か方法があるのかもしれませんが、とりあえず思いつかないのでたんすさんベースで書いてみました。
#include "user32.as"
#func SetLayered "SetLayeredWindowAttributes" int , int , int , int
#define margX 5//横方向余白
#define margY 5//縦方向余白
#define scrX 600//枠内横幅
#define scrY 400//枠内縦幅
bgscr 0,2*margX+scrX,2*margY+scrY
GetWindowLong hwnd, -16 // 移動
SetWindowLong hwnd, -16, stat | $10000 | $40000
;Windowsメッセージ割り込み
#define WM_SIZE $5 ;ウィンドウのサイズが変更されたウィンドウに送られる
oncmd gosub *On_WM_SIZE, WM_SIZE ;ウィンドウのサイズ変更
wait 0 : width ginfo_winx,ginfo_winy
stop
*On_WM_SIZE
l = lparam<<16>>16 ; 下位ワード サイズ変更後のクライアント領域のウィンドウ幅
h = lparam>>16 ; 上位ワード サイズ変更後のクライアント領域のウィンドウ高さ
color 255,0,0 :boxf//外枠色で画面全体を塗りつぶす
color 0,0,0 :boxf margX,margY, l-margX,h-margY//枠の内側だけを基準の色で塗りつぶす
color 0,255
return
解説は入れてないので自分で調べてね。
あ、一つ思いつきました。
ウィンドウリサイズをOSに任せないで自前でマウス操作取得して、widthでリサイズすればご希望のものが出来ると思います。とってもめんどくさいですが。
|
|
2011/6/16(Thu) 06:34:29|NO.39689
whoさんに同じく枠の色を変える事はできない、というよりWindows全体で同じ枠の色を共有してしまっている気がします。
理由としては、ウィンドウの枠の色が取得できると思われるgetsyscolor関数なる物があるのですが、このgetsyscolor関数はハンドル値を引数に取らないのです。普通、ハンドル毎に別々の値を持つようなデータを取得する関数には、大概ハンドル値が引数に指定されています。
ですので、システムの段階で枠の色を変えるのは諦めて、小手先の技術で枠っぽい物を作るしかないかと思います。
一応、screen命令のウィンドウをベースに、透明なbgscr命令製のウィンドウを重ねるスクリプトを作ってみました。以下は一例
#include "user32.as" //kernelとの住み分けが分からない
#define WM_SIZE 0x0005 //ウィンドウの大きさを変えると届くメッセージ
#define WM_MOVE 0x0003 //ウィンドウの位置を動かすと届くメッセージ
#define WM_LBUTTONDOWN 0x0201 //左クリックすると届くメッセージ
#define WM_LBUTTONUP 0x0202 //左クリックを解除すると届くメッセージ
#define SIZE_RESTORED 0 //ウィンドウの大きさが変わったフラグ
#define SIZE_MINIMIZED 1 //ウィンドウが最小化されたフラグ
#define SIZE_MAXIMIZED 2 //ウィンドウが最大化されたフラグ
#define SIZE_MAXSHOW 3 //無用
#define SIZE_MAXHIDE 4 //同上
#define argb(%1) /*ARGB型の整数値からcolor命令を作るマクロ*/ \
color ((%1)&$00ff0000)>>16, ((%1)&$0000ff00)>>8, (%1)&$000000ff
#define BASE_WINDOW 1
#define FRAME_WINDOW 2
#define ISX 640
#define ISY 480
#define RSX 320
#define RSY 240
#define BLACK $000000
#define SCARLET $FF0020
//ID0番のウィンドウはサイズ固定なので消去
screen 0, , , 2
//ID1番のウィンドウを作成
screen BASE_WINDOW, ISX, ISY, 0, , , RSX, RSY //こちらが本題
oncmd goto *サイズ, WM_SIZE
oncmd goto *ムーヴ, WM_MOVE
gosub *四尺測定 //4つの変数を測定する
mouse wx1+100, wy1+100
wait 3
rsxl = ginfo_mx-mousex-wx1 //ID1番の左の枠余白
rsxr = sizex-320-rsxl //ID1番の右の枠余白
rsyu = ginfo_my-mousey-wy1 //ID1番の上の枠余白
rsyd = sizey-240-rsyu //ID1番の下の枠余白
handle = hwnd //ID1番のハンドル値
gosub *ID2番作成 //これは他の場所でも使うのでサブルーチンに
stop
//擬似的な枠となるID2番のウィンドウを作成するサブルーチン
*ID2番作成
bgscr FRAME_WINDOW, sizex, sizey-rsyu+rsyd, 8, wx1, wy1+rsyu-rsyd
gsel FRAME_WINDOW, 2 //ID2番の表示順位を最大に
GetWindowLong hwnd,-20
SetWindowLong hwnd,-20,stat|$80000
SetLayeredWindowAttributes hwnd, BLACK, 255, 3 //黒を透明色に
argb BLACK
boxf
argb SCARLET
boxf 2, 2, sizex-3, sizey-rsyu+rsyd-3
argb BLACK
boxf rsxl, rsyd, sizex-rsxr, sizey-rsyu
//拡大縮小ができるように、左クリックの入力と解放をID1番の
//ウィンドウに送るような仕組みにしたつもりだが上手く動かず
oncmd *左クリック入力, WM_LBUTTONDOWN
oncmd *左クリック解放, WM_LBUTTONUP
return
//wx1,wy1,sizex,sizeyの4変数の値を取得するサブルーチン
*四尺測定
gsel BASE_WINDOW
wx1 = ginfo_wx1
wy1 = ginfo_wy1
sizex = ginfo_sizex
sizey = ginfo_sizey
return
//サイズ変更時に飛んでくるラベル
*サイズ
if (wparam=SIZE_MAXSHOW) | (wparam=SIZE_MAXHIDE) : stop
gosub *四尺測定
gosub *ID2番作成
stop
//ウィンドウ移動時に飛んでくるラベル
*ムーヴ
gsel FRAME_WINDOW
width , , (lparam&$FFFF)-rsxl, ((lparam>>16)&$FFFF)-rsyd
stop
//左クリックした時に飛んでくるラベル
*左クリック入力
sendmsg handle, WM_LBUTTONDOWN, wparam, lparam
stop
//左クリックを解除した時に飛んでくるラベル
*左クリック解放
sendmsg handle, WM_LBUTTONUP, wparam, lparam
stop

| |
|
2011/6/16(Thu) 21:15:34|NO.39692
木村さん
> whoさんに同じく枠の色を変える事はできない
> getsyscolor関数はハンドル値を引数に取らないのです
基本的には Widnows では出来ないことですか。うんー、いくら
探しても見つからないわけでした。
擬似的には見事に出来るのでびっくりし、
勉強させていただきました。
ありがとうございます。
|
|
2011/6/16(Thu) 21:49:35|NO.39693
GENKIさんに返事が遅れて申し訳ありません。
プログラムを動かしてみたのですが、うまく私のところで動かなくて、
検討しておりました。
bgscr 0,2*margX+scrX,2*margY+scrY
GetWindowLong hwnd, -16 // 移動
SetWindowLong hwnd, -16, stat | $10000 | $40000
この部分を、以下のように変更して
bgscr 0, ginfo(20), ginfo(21)
GetWindowLong hwnd, -16 // 移動
SetWindowLong hwnd, -16, stat | $10000 | $40000
width 2*margX+scrX,2*margY+scrY
無事動きました。
これもすばらしいです。勉強になりました。
皆さん、ありがとうございます。
|
|