// モニター画像をアイコンファイルにする
//
// grp_to_icon.imw3
//
// デスクトップ画像を取り込み任意の位置(32×32)の絵をアイコンファイルにします
// アイコンファイル形式はIMW3で使える形式です
//
// デスクトップ画像を取り込む
GetGrp
{
wx = WIN_L ; wy = WIN_T ; // 現在のウィンドウ位置を記憶
SetWinPos(SCR_W,0,0) ; // ウィンドウをスクリーン外へ退避
x = ClientToScreenX(0) ; // ウィンドウから見たスクリーン座標を取得
y = ClientToScreenY(0) ;
CopyBMP(0,-x,-y,SCR_W,SCR_H,1,0,0,SCR_W,SCR_H,0) ; // デスクトップ画像を裏画面に取得
SetWinPos(wx,wy,0) ; // ウィンドウを元の位置へ
}
DrawScreen
{
// ウィンドウの位置に合わせて画像も移動する
x = ClientToScreenX(0) ;
y = ClientToScreenY(0) ;
CopyBMP(1,x,y+24,WIN_W,WIN_H, 0,0,24,WIN_W,WIN_H,0) ;
Box(0,px-1,py-1,px+32+1,py+32+1,-2,-1) ; // 対象エリア
Box(0,0,24,WIN_W,WIN_H,3,-1) ;
}
PAINT
{
// 初回だけ実行
if(init == 1){
call("GetGrp") ; init = 0 ;
}
call("DrawScreen") ;
}
// ウィンドウの移動
MOVE
{
call("DrawScreen") ;
}
INIT
{
// 対象エリア座標
px = WIN_W / 2 - 16 ;
py = WIN_H / 2 - 16 ;
error = 0 ;
init = 1 ;
}
CREATE
{
SetWinSize(400,300) ;
SetWinColor(16) ;
SetCaption("モニター画像をアイコンへ") ;
Data("hed",1,62) ; // ヘッダデータ
Data("pal",256,3) ; // パレット色データ
Data("icon",32,32) ; // アイコン画像データ
Data("dat",1,2238) ; // ファイルデータ
pal_start = 62 ; // パレットコード開始位置
ico_start = 1086 ; // アイコンデータ開始位置
x = 2 ; y = 2 ; w = 32 ; h = 18 ;
CreateControl(0,"画像更新","ID_re",x,y,w*2,h) ; x = x + w * 3 ;
CreateControl(0,"←","ID_l",x,y,w,h) ; x = x + w ;
CreateControl(0,"↑","ID_u",x,y,w,h) ; x = x + w ;
CreateControl(0,"↓","ID_d",x,y,w,h) ; x = x + w ;
CreateControl(0,"→","ID_r",x,y,w,h) ; x = x + w * 2 ;
CreateControl(0,"アイコン保存","ID_save",x,y,w*3,h) ;
// 裏画面確保(念のため必要サイズの2倍)
SubScreen(1,SCR_W*2,SCR_H*2) ;
SubScreen(2,64,64) ;
}
// 画像更新
ID_re{ call("GetGrp") ; }
// 矢印ボタン 対象枠を移動
ID_l{ px = px - 1 ; call("DrawScreen") ; }
ID_r{ px = px + 1 ; call("DrawScreen") ; }
ID_u{ py = py - 1 ; call("DrawScreen") ; }
ID_d{ py = py + 1 ; call("DrawScreen") ; }
// アイコン保存
ID_save
{
call("MakeSaveData") ;
if(error > 0){
MessBox("色数が多すぎます","エラー",0,1) ;
return ;
}
n = FileNameDlgW("名前を付けて保存","list",4) ;
if(n < 1){ return ; }
OpenFileWrite("FILE_NAME") ;
n = 0 ;
loop(2238){
WriteFile(n,dat(0,n)) ;
n = n + 1 ;
}
CloseFile ;
}
// r g b 色からパレット番号を探す、無ければ追加する
MakePalData
{
error = 0 ;
p = 0 ;
loop(255){
// 無い場合
if(p >= pal_many){
pal(p,0) = r ; pal(p,1) = g ; pal(p,2) = b ;
data = p ;
pal_many = pal_many + 1 ;
return ;
}
// 同じ色の場合
if(pal(p,0) == r){ if(pal(p,1) == g){ if(pal(p,2) == b){
data = p ; return ;
} } }
p = p + 1 ;
}
error = 1 ; // 256色に収まらない
}
// アイコンファイルのデータを作成
MakeSaveData
{
// 裏画面2へ書込み
CopyBMP(0,px,py,32,32,2,0,0,32,32,0) ;
DataInit("dat",0) ; // 0で初期化
// ヘッダ部データセット
dat(0, 2) = 1 ; dat(0, 4) = 1 ; dat(0, 6) = 32 ; dat(0, 7) = 32 ;
dat(0,12) = 8 ; dat(0,14) = 168 ; dat(0,15) = 8 ; dat(0,18) = 22 ;
dat(0,22) = 40 ; dat(0,26) = 32 ; dat(0,30) = 64 ; dat(0,34) = 1 ;
dat(0,36) = 8 ; dat(0,43) = 4 ; dat(0,55) = 1 ; dat(0,59) = 1 ;
// アイコン・パレット データ作成
DataInit("pal",255) ; // パレット白で初期化
pal(255,0) = 0 ; pal(255,1) = 0 ; pal(255,2) = 0 ; // 透明色パレット
x = 0 ; y = 0 ;
pal_many = 0 ;
loop(32){
loop(32){
r = GetPixelR(2,x,y) ;
g = GetPixelG(2,x,y) ;
b = GetPixelB(2,x,y) ;
call("MakePalData") ; // 色からパレット番号を探す
if(error > 0){ return ; }
icon(x,y) = data ; // パレット番号をセット
x = x + 1 ;
}
x = 0 ; y = y + 1 ;
}
// パレットデータセット
n = 0 ; pos = 62 ;
loop(256){
dat(0,pos) = pal(n,2) ;
dat(0,pos+1) = pal(n,1) ;
dat(0,pos+2) = pal(n,0) ;
pos = pos + 4 ; n = n + 1 ;
}
// アイコンデータセット
y = 31 ;
loop(32){
x = 0 ;
loop(32){
dat(0,pos) = icon(x,y) ;
pos = pos + 1 ; x = x + 1 ;
}
y = y - 1 ;
}
}