今だけ人気マンガ100円レンタル特集♪

アプリケーションの作成について質問させて頂きます.

以前javaでちょっとしたお絵かきソフトを作ったことが有り、興味が湧いて
他の言語で本格的に作ってみたいと思っていますが、どうはじめていいのか困っています。

分からない点として
(1)言語はC++でと思っているのですが、調べたていたらwinApiのプログラミングが要求
されたりと、どうはじめていいのかわからない状態です。まずはwinApiを使って製作するのが
いい方法なのか?

(2)理想としてはwindowsのペイント、gimpもどきのアプリを作ってみたいのですが、これらのソフトはどのような言語、ライブラリ(?)を使って作成されたのか?。

ご存じの方がいらしたら、ご回答の程よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

(2) たとえば、GIMPなら、ソースコードが簡単に入手できます。


どんなライブラリを使っているかも書いてあります。
http://www.gimp.org/source/
    • good
    • 0
この回答へのお礼

ご回答有難うございます.
リンク先のファイルが多すぎて今は何見ていいかわからないですが,頑張ってみます.
ありがとうございました.

お礼日時:2012/07/14 12:30

(1)WinではWindowsAPIのGDIを使って描画するのが一般的です。


C++の標準ライブラリではグラフィック関数はありません。

(2)WindowsのペイントはたぶんMFC、gimpはGTK+と言うフレームワーク/ライブラリで作られています。MFCに関しては有料のVisualStudioが必要です。
    • good
    • 0
この回答へのお礼

描画を行うライブラリが多数存在するのは勉強になりました.
何を使ったらいいか分からんですが,何かやってみます
ご回答ありがとうございました.

お礼日時:2012/07/14 12:51

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q簡単なペイントソフトを作っているのですが・・・

winXP、C++Builder4を使用しています。

Canvasなどを使って、マウスを押し続けているときにだけ描線が描かれるプログラムを書きました。

次に追加したいのが、ペイントソフトなどにある「消しゴム」のような機能(描かれた線を消す)なんですが、何をどう使えばいいのかわかりません。

また、消しゴム機能が出来たら、次に指定した範囲の線分を移動させる機能を作りたいと考えています。あわせて、どのようにすればいいか教えていただきたいです。

初心者のつまらない質問かもしれませんが、お知恵を拝借させてください。よろしくお願いします。

Aベストアンサー

なるほど。3Dまで発展させるための習作でしたか。それなら私のいっていた方法はダメです。
それでしたら線を管理するクラスを作った方が良いと思います。
No.3さんの仰るように内部にSTLのVectorでも持って線を構成する座標を保存します。あとはそれに特定の座標が線に含まれているかどうかの判定関数と指定されたコンテクストに描画する関数でも付けてやればとりあえずは何とかなりますね。
あ、それを束ねる管理クラスもあった方が良いと思いますが。
移動は選択された範囲内の座標で背景色でない座標をピックアップしてその各座標を各線に対して君のかい?と尋ねてまわって移動させる線を決定、そのあと移動量を各座標に反映させるといいでしょうね。
消去は座標をピックアップするところまでは同じでその後単純にVectorから要素を削除してやって、何もなくなったら線そのものを削除でいいのでは。
もちろん効率化のためにはいろいろ方法があります。座標を保存するときに複数の座標を一つの変数に入れたり、線の管理クラスに基本座標を持たせてみたりなどなど。そのあたりは有る程度分かるようになってから他人が書いたゲーム用のライブラリでも見てみると頭が痛くなるような事やってますよ(笑)

ただし↑だとなめらかな線を構成するのが非常に難しいですよね。私は必要としなかったので何とも言えませんがベジェ曲線なども使えるようにしたほうがいいと思います。

なるほど。3Dまで発展させるための習作でしたか。それなら私のいっていた方法はダメです。
それでしたら線を管理するクラスを作った方が良いと思います。
No.3さんの仰るように内部にSTLのVectorでも持って線を構成する座標を保存します。あとはそれに特定の座標が線に含まれているかどうかの判定関数と指定されたコンテクストに描画する関数でも付けてやればとりあえずは何とかなりますね。
あ、それを束ねる管理クラスもあった方が良いと思いますが。
移動は選択された範囲内の座標で背景色でない座標をピッ...続きを読む

Qペイントのようなソフトのソースリスト

WindowsXPで動く画像処理プログラムを作成する必要があります。
プログラム作成の参考になるような、ペイントソフトのようなプログラムのソースリストどこかにありませんか?
希望はC言語あるいはC++で開発したいです。
お薦めの書物の推薦も歓迎です。
よろしくお願いします。

Aベストアンサー

引用ですか。
プログラム作成の参考に…と書かれていましたので、ソースを見て、理解して、自力でプログラミングされると受け取ってました。
念のため書きますが、プログラムソースの一部をコピーして自分のプログラムに組み込むのは、元プログラムの作成者が認めてない限り著作権法違反となりますのでご注意を。

さて、そういう用途でしたらライブラリ化されたものがあればいいんじゃないかと思いました。

OpenCV
http://opencv.jp/
インテルがオープンソースで公開している画像処理ライブラリです。BSDライセンスですので著作権表示さえしておけば利用可能です。

LEAD TOOLS
http://www.componentsource.co.jp/products/leadtools-raster-imaging-pro-c-j/summary.html
製品の画像処理ライブラリです。これを利用すれば著作権表示すら必要ありません。自分の物として販売・配布できます。

Qマージソートが外部整列に向いている理由。

現在ソート方法について学んでいます。
色々と調べながら勉強を進めているのですが、

マージソートは外部整列に向いている。

とよく書かれているものの、
「なぜ」外部整列に向いているのかが分かりません。

パソコンの知識が乏しい者ですので、出来るだけ初心者でも分かりやすい説明をして頂けると助かります。
宜しくお願い致します。

Aベストアンサー

>「なぜ」外部整列に向いているのかが分かりません。
テープデバイスのように順次アクセスしかできないようなものに格納されたデータでもソートできるから。

とはいえよくあるアルゴリズムの解説本では、順次アクセスしかできない場合のプログラム片はあまり載ってないような気がします。

"Merge sort is so inherently sequential that it's practical to run it using slow tape drives as
input and output devices. It requires very little memory, and the memory required does not change with
the number of data elements. If you have four tape drives, it works as follows:

1. Divide the data to be sorted in half and put half on each of two tapes
2. Merge individual pairs of records from the two tapes; write two-record chunks alternately to each of the two output tapes
3. Merge the two-record chunks from the two output tapes into four-record chunks; write these alternately to the original two input tapes
4. Merge the four-record chunks into eight-record chunks; write these alternately to the original two output tapes
5. Repeat until you have one chunk containing all the data, sorted --- that is, for log n passes, where n is the number of records.

For the same reason it is also useful for sorting data on disk that is too large to fit
entirely into primary memory. On tape drives that can run both backwards and forwards,
merge passes can be run in both directions, avoiding rewind time.
"
http://en.wikipedia.org/wiki/Merge_sort

#日本語版の記述はひどいな…

>「なぜ」外部整列に向いているのかが分かりません。
テープデバイスのように順次アクセスしかできないようなものに格納されたデータでもソートできるから。

とはいえよくあるアルゴリズムの解説本では、順次アクセスしかできない場合のプログラム片はあまり載ってないような気がします。

"Merge sort is so inherently sequential that it's practical to run it using slow tape drives as
input and output devices. It requires very little memory, and the memory required does not change with
...続きを読む

Qfgetsなどのときのstdinのバッファを消すには?

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.

QC言語で簡単なゲームを作る方法

僕はC言語を学び始めた程度ですが、一番簡単に作れるゲームとその作り方(ソース)を教えて下さい。お願いします。

Aベストアンサー

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP_KATI : TYP_MAKE);
  case JKN_CHOKI:  return ((computer == JKN_PA) ? TYP_KATI : TYP_MAKE);
  case JKN_PA:  return ((computer == JKN_GOO) ? TYP_KATI : TYP_MAKE);
  default:   return -1;
 }
}

// じゃんけんゲーム
int main( void )
{
 // ゲーム変数
 int count;  // 勝負回数
 int kati = 0; // 勝ちカウンタ
 int make = 0; // 負けカウンタ
 // 一時変数
 int human;  // キー入力の一時変数(人間用)
 int computer; // 乱数発生の一時変数(コンピュータ用)
 
 // (6)じゃんけん勝負を10回行う
 printf( "★じゃんけんゲーム(10回勝負)\n\n" );
 for ( count = 1 ; count <= 10 ; count++ ){
  // (1)人間:3つの状態を入力
  printf( "%2d回目…[1]グー [2]チョキ [3]パー を入力して下さい:", count );
  do {
   // (2)キー入力
   switch ( getche() ){
    case '1': human = JKN_GOO; break;
    case '2': human = JKN_CHOKI; break;
    case '3': human = JKN_PA; break;
    default: human = -1; break;
   }
  } while ( human == -1 );
  
  // (3)コンピュータ:3つの状態を乱数で決める
  computer = (rand() % 3);
  // (4)人間vsコンピュータの勝負
  switch ( check(human,computer) ){
   case TYP_KATI:
    kati++;
    printf( "⇒勝ち。\n" );
    break;
   case TYP_MAKE:
    make++;
    printf( "⇒負け。\n" );
    break;
   case TYP_AIKO:
    printf( "⇒引き分け。\n" );
    break;
   default:
    printf( "⇒エラー。\n" );
    break;
  }
 }
 // (7)結果表示
 printf( "\n★じゃんけんゲームの結果\n" );
 printf( "人間    :%d 回勝ち\n", kati );
 printf( "コンピュータ:%d 回勝ち\n", make );
 printf( "※引き分け回数は %d 回でした。\n", (10 - kati - make) );
 return 0;
}

注意:全角空白をタブ文字に変換して下さい。

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP...続きを読む

Q線を引くには?

Visual C++ 2003でFormを使用しています。
それでForm[デザイン]にPictureBox作り、そのPictureBoxに線を描きたいのですが、どのようにプログラムを書けばよろしいのでしょうか?
線は直線です。

Aベストアンサー

線の描画は Graphicsオブジェクトを通して行います

描画イベントで
Graphics* g = pictureBox1->CreateGraphics();
g->DrawLine( __gc new Pen( Color::red ), Point( 10,10), Pen( 100, 100 ) );
g->Dispose();
といった具合ですよ
# こちらは一時的な描画です … 他のウィンドウが重なると消えてしまいます

または Bitmapオブジェクトを使って
Bitmap* bmp = (Bitmap*)pictureBox1->Image;
if ( bmp == NULL )
  bmp = __gc new Bitmap( PictureBox1->Width, pictureBox1->Height );
Graphics* g = Graphics::FromImage( bmp );
g->DrawLine( __gc new Pen( Color::red ), Point( 10,10), Pen( 100, 100 ) );
g->Dispose();
pictureBox1->Image = bmp;
といった具合にすると他のウィンドウが重なっても消えません

線の描画は Graphicsオブジェクトを通して行います

描画イベントで
Graphics* g = pictureBox1->CreateGraphics();
g->DrawLine( __gc new Pen( Color::red ), Point( 10,10), Pen( 100, 100 ) );
g->Dispose();
といった具合ですよ
# こちらは一時的な描画です … 他のウィンドウが重なると消えてしまいます

または Bitmapオブジェクトを使って
Bitmap* bmp = (Bitmap*)pictureBox1->Image;
if ( bmp == NULL )
  bmp = __gc new Bitmap( PictureBox1->Width, pictureBox1->Height );
Graphics* ...続きを読む

QTTL論理素子の雑音余裕とはなんでしょうか

タイトルの通りでございます。

TTLの論理素子の雑音余裕というものを調べているのですが、なかなか調べても出てきません。

分かるかたがいらっしゃいましたら、どうぞ教えてください。

よろしくお願いします。

Aベストアンサー

簡単に言うと、信号ラインにどのくらいの振幅のノイズが乗ると
誤動作するか、という数値です。

例えば、"L"を出力しているTTLがあるとします。TTLのメーカが保証する
"L"の電圧が例えば「0.4V以下」だったとします。

一方、この信号を受けるTTLは、0.9V以下の入力電圧を"L"と認識する
ことを保証しているとします。

すると、ばらつきなどを含めた"L"の最悪値(最も"H"に近い"L")である
0.4Vという信号に、あと+0.5Vのノイズがのると信号線は0.9Vになり
これは"L"と認識してもらえるギリギリとなります。

つまり、0.5Vを超えるノイズが乗ると誤動作する可能性が出てきます。
ここで言う 0.5Vを雑音余裕度と言います。従って"L"側と"H"に別個の
雑音余裕度がありますが、ノイズが乗るのは"H"でも"L"でも乗るので
どちらか小さい値を、まとめて雑音余裕度と言います。

なお、上記の数字は例えです。正確にはメーカのデータシートをご覧
ください。

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q”電波自由空間損失”のエクセルでの計算方法

現在、エクセルを使って、電波自由空間損失の計算を行いたいと思っているのですが、

エクセルに設定した式の答えと、http://keisan.casio.jp/has10/SpecExec.cgi このケイサンのWEBサイトで出てくる答えが同じにならず困っています。

例えば距離が3メートルで、周波数が50MHzだった場合の式として、
周波数50MHzの波長は6メートルなので、


=LOG10((4*3.14*0.003)/6)^2

=4.85(dB)

このように出てくるのですが、


同じ計算をWEBサイト側で行うと

15.92182518(dB)


と出て来ます。



式が間違っていますでしょうか?

Aベストアンサー

=10*LOG((4*PI()*0.003*50/0.3)^2)
で15.96ぐらいですね。

あなたの数式は2乗の計算の括弧のかかり具合とかも間違ってて,LOGの結果を2乗してます。

Qプログラミング初心者だがペイントツールを作りたい。 visual studio 2017をインストー

プログラミング初心者だがペイントツールを作りたい。

visual studio 2017をインストールしたはいいですが、全く分かりません。
Win10やiPadで動く簡単なペイントソフトが作れれば満足です。

Aベストアンサー

まずマウスクリックやタップでそこに点が描かれる
というような、簡単なものを考えて見ましょう。

取りあえず、Canvasとマウスイベントで遊んでみれば?


人気Q&Aランキング