初歩的ですみません。
マウスで始点と終点を決めて直線を書くプログラムを知っている方がおりましたら教えてください。

よろしくお願いします。

A 回答 (2件)

WinTKというのは良く分からないんで、MFCの方を……


とりあえずダイアログアプリケーションで説明すると、

1.
 ダイアログベースのスケルトンを作ります
2.
 xxxDlg.h に座標を保持るためメンバを追加します。
class CxxxDlg : public CDialog
 {
   CPoint m_ptBegin, m_ptEnd;

3.
クラスウィザードで WM_LBUTTONUP, WM_RBUTTONUP を選択します。

4.
 void CxxxDlg::OnLButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に左ボタンが離された座標が入ってますので保持しておきます(始点)
   m_ptBegin = point;
   CDialog::OnLButtonUp(nFlags, point);
 }
5.
 void CxxxDlg::OnRButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に右ボタンが離された座標が入ってますので保持しておきます(終点)
   m_ptEnd = point;

   // 再描画します。
   InvalidateRect( NULL );

   CDialog::OnRButtonUp(nFlags, point);
 }

6.
 CxxxDlg::OnPaint()関数の以下の部分を変更します。

 else
 {
   CDialog::OnPaint();
 }
      ↓
 else
 {
   CPaintDC dc( this );

   dc.MoveTo( m_ptBegin );
   dc.LineTo( m_ptEnd );

   CDialog::OnPaint();
 }

と、大体こんな感じです。m_ptBegin, m_ptEndはコンストラクタで初期化してやっておいて
ください。説明が大雑把なんでわかりにくかったら言ってくださいね。

ほな。
    • good
    • 0
この回答へのお礼

ありがとうございました。
だいたいわかりました。
あとは自分でがんばってみます。

お礼日時:2001/11/22 17:37

えーと、WinのVC++だって勝手に決め付けてざっと説明しますと、処理するメッセージは WM_LBUTTONDOWN で、始点終点を取って、デバイスコンテキストを作って,MoveToEx とか LineTo とかいう関数を使って実現できます。



プラットフォーム、開発環境などが分からないと答えようがないので、そのへんの補足をお願いします。

この回答への補足

プラットフォームは以下のいずれかになります。
1、VisualC++によるWinTK C言語プラットフォーム
2、VisualC++とMFCによるC++言語プラットフォーム

VisualC++は6.0を使用しています。

もう一つ補足ですが、マウスの左クリックで始点座標の指定、右クリックで終点座標の指定になるようにお願いします。

説明が足りなくて申し訳ありませんでした。

補足日時:2001/11/21 21:10
    • good
    • 0

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

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

このQ&Aを見た人が検索しているワード

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

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* ...続きを読む

QC++にて、塗りつぶされた円を描くプログラムを描くにはどうすればいいで

C++にて、塗りつぶされた円を描くプログラムを描くにはどうすればいいでしょう?

Aベストアンサー

中心x0,y0、半径rの円を塗りつぶすには、いろいろと方法があると思います。
・ベタな方法
全座標(x,y)について、 (x-x0)*(x-x0)+(y-y0)*(y-y0) を計算、 <= r*r なら円の中なので色を付ける。
実際には、円に外接する正方形よりだけ確認すればよいで 、 x0-r<=x<=x0+r,y0-r<=y<=y0+rの範囲を調べる。

・y0-r<=y<=y0+r のyについて、dy = y - y0 とする。
dx=x-x0 とすると、r,dx,dyからなる直角三角形ができるので、値のわかっているr,dyからdxが求まる。
左右の座標がそれぞれ x0-dx,y と x0+dx,yになるので、その間に色を付ける。

・(塗りつぶさない)円をかくアルゴリズムをつかって、円を書く
→囲まれた領域を塗りつぶす方法(ペイントアルゴリズムと言われたりする)を使って、円の中を塗る。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QC++でscanfは使えない?

お盆休みを利用してC言語の勉強をしようと思っています。
さわり程度にはわかるのですが、ポインタなどを本気で理解してみようと思っています。

PCにvisual studio2013が入っているので、2013のC++のプロジェクトを使って勉強していこうと思っているのですが、下記のように入力すると、scanfでエラーが出てしまいます。

#include "stdafx.h"
#include <stdio.h>

void main()
{
int n;
scanf("%d",&n);
}

C++ではC言語の文法は全て使えると聞いていたのですが、ある程度例外もあるということなのでしょうか?それともなにか原因があるのでしょうか?

Aベストアンサー

scanfはC言語の「文法」ではありません。
「標準ライブラリ」と呼ばれる、ライブラリに含まれる関数の一つでしかありません。


あと、具体的にどんなエラーメッセージが出たのですか?
メッセージの内容を読んで理解することも、プログラミング技術向上に大事なことです。

http://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9.E3.81.A8.E5.9B.9E.E9.81.BF.E6.96.B9.E6.B3.95
にあるように、scanfは使い方を間違えるととても「危険」な関数です。
そこで
http://msdn.microsoft.com/ja-jp/library/9y6s16x1%28v=vs.100%29.aspx
> セキュリティに関するメモ
とあるように、Microsoftとしてはセキュリティ強化版を使うことを推奨しています。
# 根本対策にはなってないという説もありますが。

そのため、設定次第では、scanfを使っただけで警告、またはエラーになります。

scanfはC言語の「文法」ではありません。
「標準ライブラリ」と呼ばれる、ライブラリに含まれる関数の一つでしかありません。


あと、具体的にどんなエラーメッセージが出たのですか?
メッセージの内容を読んで理解することも、プログラミング技術向上に大事なことです。

http://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9.E3.81.A8.E5.9B.9E.E9.81.BF.E6.96.B9.E6.B3.95
にあるように、scanfは使い方を間違えるととても「危険」な関数です。
そこで
http://msdn.microsoft.com/ja...続きを読む

Qブレゼンハムのアルゴリズムについて(プログラミング初心者です)

ブレゼンハムのアルゴリズムについて
C言語で直線描画のプログラミングをしています。
複数の点P_1=(x1,y1),P_2=(x2,y2).... を結ぶ直線を描画するにあたり、
ブレゼンハムのアルゴリズムを用いようと思ったのですが、
描きたい直線の傾きが負の場合、また、傾きが1をこえる場合にうまく描画できず困っております。
P1とP2の位置関係に関係なく線を引くにはどうすればよいでしょうか。

画像にソースコードの一部を添付します。
当方プログラミングに関しては初心者なので改善点などがあれば合わせて指摘していただけると嬉しいです。
配列vx[i]、vy[i]には線で結びたい点P_i(i=1,2,3...)点のx座標、y座標が格納されており、
座標に点を打つ関数は作成済みです。

よろしくお願いします。

Aベストアンサー

> 描きたい直線の傾きが負の場合、また、傾きが1をこえる場合にうまく描画できず困っております。

傾きが正の1未満になるように変換して計算すれば良いのでは?
具体的には
・傾きが1より大きいとき
 直線y=xに対象な点に変換、すなわちxとyの入れ替えをして計算し、描画時に戻す。
・傾きが1未満の負のとき
 直線x=0に対象な点に変換、すなわちy=-yの入れ替えをして計算し、描画時に戻す。
・傾きが1より大きい負のとき
 上記2つを組み合わせる。


人気Q&Aランキング