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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0927
E.Tペイントを作りたい9解決


E.T

リンク

2014/9/27(Sat) 13:42:53|NO.65271

HSPでGIMPのようなソフトを作りたいのですがいくつかわからないことがあるので
質問します。
・マウスをドラッグすると選択・円を描いたりする機能
・レイヤー機能
・すべてのレイヤーを画像ではなくソフト用のファイルで保存

とりあえず今ここら辺が思いつきません。
お願いします。



この記事に返信する


とおりすがり

リンク

2014/9/27(Sat) 14:18:14|NO.65272

HSPでGIMP。いいですね、わたしも欲しい。

質問に答えるにあたってまずはE.Tさんの現在の状況を知りたいところです。
たとえば、質問にある「レイヤー機能」を実現するには Artlet2D を利用するのが早道かと思いますが
ペイントソフトのサンプルはもうご覧になりましたか?



男子中学生

リンク

2014/9/27(Sat) 15:05:20|NO.65274

ちょっとおもしろそうなので円の描画を・・・


*main color 255,255,255:boxf;画面塗りつぶし color 0,0,0:font "",12 if a=1:pos hx,hy:mes "左..."+hx+" 上..."+hy pos mousex,mousey+30:mes "右..."+mousex+" 下..."+mousey ;パラメータの座標を描画(mesで) stick key,256;マウス左ボタンの状態を取得 if key=256{ if a=0:hx=mousex:hy=mousey:a=1//代入可能状態 ;マウスを押した瞬間のカーソル座標をhx,hyに代入 }else:a=0;ボタンを離すとhx,hyを初期化(代入可能状態にする) if a=1:color 200,0,0:circle hx,hy,mousex,mousey,0 ;仮として円を描画 redraw 1:wait 1:redraw 0:goto *main

マウスを押しているときのみに表示される
確認用の円の描画です。


関係ないですけど
ctrl+z&ctrl+yでできる「ひとつ戻る・進む」機能などもつけたいなら、
操作を配列変数などで記憶させておくのも手ですね。



さっくん

リンク

2014/9/27(Sat) 15:06:17|NO.65275

適当なんですが、bufferで仮想画面(レイヤー)を作って、
gcopyでレイヤーごとにイメージをコピーすれば、できると思います。
(で、でも一応適切な方法は考えてますからね (・m・u)



ぴょぴょ(科学太郎)

リンク

2014/9/27(Sat) 15:11:56|NO.65276

> ・マウスをドラッグすると選択・円を描いたりする機能
http://blog.goo.ne.jp/masaki_goo_2006/e/0bef456f36014badee9355130cb57694
http://blog.goo.ne.jp/masaki_goo_2006/e/b4090484e9a3a048776cb47d04bb622d

もうすでに男子中学生さんがサンプルを載せてますが、
私のブログに「ドラッグ図形の描き方」を載せてます。
ただし、C言語ですから分からない場合は次の質問でどうぞ。

> ・レイヤー機能
これは buffer で管理すれば良い。
また、合成は「gmode 2」か、API関数の MaskBlt、AlphaBlend、TransparentBlt を使います。

> ・すべてのレイヤーを画像ではなくソフト用のファイルで保存
こちらは、あなた自身が処理に都合が良い画像フォーマットを考えることになります。

> とりあえず今ここら辺が思いつきません。
まずは図形のドラッグ移動を実装します。
しかし、このときに編集機能で「やり直し」「元に戻す」をメニューバーで実装するどうかで変化。
つまり、やり直しが可能なようにドラッグ移動の図形などを描きます。

直線を引いた場合には、メモリ上に直線命令、始点、終点の情報を保存します。
矩形ならば、メモリ上に矩形命令、始点、終点の情報を保存します。
楕円ならば、メモリ上に矩形命令、始点、終点の情報を保存します。

ここで1つ前に「やり直し」する場合は
buffer をクリアして
メモリ上の直線命令、始点、終点
メモリ上の矩形命令、始点、終点
の2つの命令を自動実行します。

これで編集機能の「やり直し」や「元に戻す」を実装できます。

また、手抜きならば「やり直し」「元に戻す」を10段階と定めて
buffer 1 ~ buffer 10 をループする形で管理すれば編集履歴の
「やり直し」「元に戻す」を簡単に実装できます。



E.T

リンク

2014/9/28(Sun) 08:31:47|NO.65288

今の開発状態はuser32.asとmod_menu.asをインクルードするところで
エラーが出るのですが以前質問した時自己解決したのに
やり方を忘れて起動処理で止まっています。たしかmod_menuでuser32と同じ
やつを登録しているからそれを消したらいけるはずだったような…
それで消してみてメニューを表示させようとするとパラメーターの型が違います
とでます。
戻る・進むはbufferでやろうと思います。



E.T

リンク

2014/10/1(Wed) 20:52:05|NO.65392

ありがとうございました。
とりあえず円のやり方などがわかったので
解決にします。



kanahiron

リンク

2014/10/2(Thu) 00:16:01|NO.65396

>それで消してみてメニューを表示させようとするとパラメーターの型が違います
>とでます。
これは#funcでの関数の登録方法の違いですかね

win32で文字列型を渡すときは、内部的にはポインタと呼ばれる数を渡します
ポインタは32bitOSなら32bitの整数型になります

#funcの説明に書いてありますが、関数を登録するときに引数を
intにすれば整数型を、sptrなら文字列のポインタと渡すと書いてあります
HSPで変数のポインタを知るにはvarptrという関数を使います

つまりまとめるとこうなります

//例1---------------------------------- #uselib "shlwapi.dll" #cfunc PathIsDirectory "PathIsDirectoryA" int mojigata = "C:\\Program Files" mes PathIsDirectory(mojidata) //整数型を指定しているのでエラーになります

//例2---------------------------------- #uselib "shlwapi.dll" #cfunc PathIsDirectory "PathIsDirectoryA" sptr mojigata = "C:\\Program Files" mes PathIsDirectory(mojidata) //OKです

#uselib "shlwapi.dll" #cfunc PathIsDirectory "PathIsDirectoryA" sptr mojigata = "C:\\Program Files" mes PathIsDirectory(varptr(mojidata)) //OKです

#uselib "shlwapi.dll" #cfunc PathIsDirectory "PathIsDirectoryA" int mojigata = "C:\\Program Files" mes PathIsDirectory(varptr(mojidata)) //OKです

HSPではポインタは意識しませんが、Cだと必須の知識になります
これを気に少し調べてみてはいかがでしょうか



サンダーボルトⅡ

リンク

2014/10/3(Fri) 23:30:45|NO.65403

保存については、

bsave "●●●.好きな拡張子"
でいいんじゃないでしょうか?



E.T

リンク

2014/10/4(Sat) 13:05:06|NO.65412

ほぞんはbsaveでやります。
メニューはわからないです…



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