[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 12/26 23:49 / Filesize : 222 KB / Number-of Response : 898
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

★初心者にVisual C++を教えるスレ★ Part29



1 名前:Part28の1000 mailto:sage [2008/02/15(金) 01:45:56 ]
Visual C++入門者・初心者からの質問を、
お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう。
・できるだけ具体的に。

質問の仕方については次のページが大変参考になります。
www.hyuki.com/writing/techask.html
myu.daa.jp/osiete/

■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
 (MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。

過去スレ、関連スレなどは>>2-5辺り。

75 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:04:10 ]
>>74
CLR ではなく、Win32 で

76 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:21:11 ]
>>75
最初それのコンソールアプリケーションというのを選べばいいのかなと思ったのですが、
mainの代わりに_tmainというのがあったので、違うのかなと思ってましたが、気にしなくていいんでしょうか・・・?

あ、すみませんVisual C++ 2008 Express Editionをインストールしました

77 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:34:49 ]
_tmain はあんまり気にしなくていい。
消して問題ない。

78 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:40:12 ]
>>77
ありがとうございます、気にしないで進めることにします

79 名前:デフォルトの名無しさん [2008/02/18(月) 16:15:02 ]
テンキーの+ボタンはVK_ADDフラグで取得出来るのですが、
ノートPC等でテンキーが付いてない場合、
+キーに相当するキーが押されたかを検出するには、
どのようししたら、良いでしょうか?


;れ


このキーのフラグは?

80 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:17:26 ]
>>79
ノートPCでもFnキー併用とかNumLock併用でVK_ADDを発行すると思うけど。

81 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:17:53 ]
「;」か「シフトand;」ってわけじゃないの?

82 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:23:19 ]
それだったらフルキーボードでも使えるわけで、だとしたらVK_ADDでは当然拾えないのだけれど。

83 名前:79 mailto:sage [2008/02/18(月) 16:25:14 ]
シフトを押されてなくとも、「;」が押されたら+を押したと解釈してあげたいのです。
case ';'では引っかからず、case -69で引っかけられました。
(デバッグモードでメッセージ見ました)
-69って一体・・・・?

case ';'で掛からないのが納得行きません。



84 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:30:14 ]
ちょっと待て、私のキーボードではShift+;は:なんだが。
つーか、Shift+=が+なんだが。

85 名前:79 mailto:sage [2008/02/18(月) 16:37:45 ]
英語キーボード配列
とかいろいろありそうですね・・・
素直にShiftキー押してもらおうかな・・・

86 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:38:40 ]
つまり、ややこしいことに日本語キーボードでは';'キーはVK_OEM_PLUS(0xbb = -69)であり、
英語キーボードでは';'キーはVK_OEM_1になると。英語キーボードで'+'の刻印がある'='キーはVK_OEM_PLUSなんだけどね。

87 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:48:31 ]
これだな
#define VK_OEM_PLUS 0xBB // '+' any country

88 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:07:33 ]
c++にかぎったものじゃないんですが、
今ゲーム作っててマス移動の当たり判定なら変数でなんとかなるけど
ドット単位であたり判定作ろうとしたらどういう風に管理すればいいんですか?

89 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:30:31 ]
ドット単位で当たり判定もてばいいじゃない
1ドット1ビットで十分だが、面倒ならcharで取るとかな。

90 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:31:50 ]
あと、マップに属性もたせるならそれ相応のビット数が必要

91 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:36:03 ]
円形なら半径だけもっとけばいいし、
正方形なら角度も保持しとけばいい。
あとは数学的に判定。

範囲が極端に小さければ
マス移動と似た形で判定してもいいかもね。

92 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 22:53:18 ]
ちょっと質問です

cliext::hash_map<array<char> ^, int> って型を作りたいんですが、
比較演算子の定義の仕方がわかりません

一応、こんなのを比較演算子として予定してます

int compare(array<char> ^left, array<char> ^right){
 if (left->Length == right->Length){
  for(int i = 0; i < left->Length; i++){
   if (left[i] != right[i]) return left[i] < right[i] ? -1 : 1;
  }
  return 0;
 }
 return left->Length < right->Length ? -1 : 1;
}

どうすればいいんでしょう…

93 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:59:51 ]
STLと同じで、比較関数は基本的にlhs < rhsなboolを返すもの。
msdn2.microsoft.com/en-us/library/bb385779.aspx
あとは、hash_setのコンストラクタに比較関数へのデリゲートを取る奴があるから、そいつに渡す。
キーの型がoperator <が多重定義できるものなら、そっちを多重定義してもいけるはず。

ところで、hash_mapだけど、ハッシュ関数は気にしなくていいの?
デフォルトでは、GetHashValueが使われるけど、これもコンストラクタで指定できる。
ほかにも、ハッシュを使わず、比較関数だけで順序付けるsetもあるよ。



94 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 20:23:07 ]
>>93

Myhash_set c2 = cliext::greater<wchar_t>();
この部分ですよね

bool comp(array<char>^, array<char^>) の関数を渡してもエラーになるので、
定義の仕方が違うのかなと思ってるのですが…どうにも解りません

95 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 23:43:01 ]
質問です。
「点数のデータが入った1次元配列のアドレスと人数を受け取り、
それらの最大点〜(略)を求めて返す関数を作成する」

という問題なのですが、@「〜を受け取り」、A「〜返す」
とはどういう意味なのですか?
どうか教えていただけませんでしょうか

96 名前:デフォルトの名無しさん [2008/02/20(水) 23:51:09 ]
引き数を受け取り、戻り値を返す。

97 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:38:58 ]
スケルトンを作るとするとこんな感じ。
int GetMaxPoint( const int * points, int num ) {
// 最大値検索処理
return max;
}

98 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:44:33 ]
「返す」とはreturn();の空白に数値などを入れることですか?
この問題ってサブルーチンを作るようなものですか?

99 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:46:42 ]
>>97
ありがとうございます。教科書で似たような処理を見つけたので
勉強します。

100 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 02:23:15 ]
うざい。VCと関係ないし。

101 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:22:49 ]
>>100
初心者にはそんなこと分かんねーんだよww

102 名前:デフォルトの名無しさん [2008/02/22(金) 14:01:27 ]
CFormViewにピクチャーボックスを貼り付けて線を描画したものを
再描画する処理について質問です。

OnDrawで処理をするとなぜか、フォームのほうに描画されて、
その上にピクチャーボックスが貼り付けられる形になってしまいます。
ピクチャーボックスのプロパティのタイプでフレームと四角形とで
比べてみるとなんとなくそんな気がします。

CDC* pPIC=m_pict.GetDC(); //ウィザードでメンバ変数と作成
CRect rt;
m_pict.GetClientRect(&rt);
pPIC->MoveTo(0,0);
pPIC->LineTo(1000,1000);

細かいところは省略しています。

OnPaintで描くと正常に描画されるみたいですが、
そのとき、WinAPIの時みたいに
BeginPaint
EndPaint
とかの処理が必要なのでしょうか?必要だとしたら
BeginPaint
ShowGraph() //描画処理
EndPaint
と言うことも可能なのでしょうか?


103 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:04:59 ]
そのOnDrawはViewを描画するためのDCが来るからな
OnPaintはBeginPaintのあとOnDraw呼んでるだけだし。

何がしたいの?
PictureBoxに直接書けば再描画気にしないでいいよ



104 名前:デフォルトの名無しさん [2008/02/22(金) 14:05:20 ]
>102
すいません、環境を描き忘れました。
なんとなく分かると思いますがMFCで
VC6.0です。OSはWinXP SP2です。


105 名前:デフォルトの名無しさん [2008/02/22(金) 14:09:06 ]
>103
CPen で描いているのですが再描画しないとWindowの後ろに
隠れると消えます。
別の方法があるというのですか?



106 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:27:57 ]
オーナードロー使ってるのか、ビットマップでやってるのかどっち?

107 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:35:55 ]
viewとコントロールは別のウインドウだから描画は別
コントロールの描画のタイミングでやらないと

108 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:51:14 ]
Viewのほうで描画するのなら、オーナードローにして
WM_DRAWITEMで引数からHDC持ってきて描画するのがいいかなあ

109 名前:デフォルトの名無しさん [2008/02/22(金) 15:10:02 ]
>108
今までCViewのほうばかり使っていたので、恥ずかしながら
オーナードローと言うこと自体知りませんでした。
今度はそれで検索して調べてみます。



110 名前:デフォルトの名無しさん [2008/02/22(金) 15:13:36 ]
>107
クラスウィザードでピクチャーボックスのオブジェクトIDをクリックしても
BN_CLICKEDしか出ません。
根本的に考えていることが違うのでしょうか?


111 名前:デフォルトの名無しさん [2008/02/22(金) 15:27:53 ]
>103
何がしたいのか書いていませんでした。
ただ単にピクチャーボックスにグラフを書きたいだけです。
>107
CStatocをサブクラス化しないと無理ということですか?

112 名前:デフォルトの名無しさん [2008/02/22(金) 15:28:38 ]
>111
> CStatocをサブクラス化しないと無理ということですか?
CStaticです。すみません。


113 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:43:30 ]
FormViewってことはダイアログエディタ使ってんだよね。
まあサブクラス化でもいいけど、プロパティのタイプにオーナードロー(描画)って無い?
と思ってVC6を久しぶりに起動してみたら無いんだな。



114 名前:デフォルトの名無しさん [2008/02/22(金) 16:12:55 ]
>113
ないですね^^
よそのホームページで調べたとおりにやったのですが。


115 名前:デフォルトの名無しさん [2008/02/22(金) 16:19:27 ]
>113
ボタンならありますね。


116 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:37:17 ]
ちょっと試しにVC6で、rcファイルをテキストエディタで開いて、
SS_BLACKFRAME を SS_OWNERDRAW に書き換えて
OnDrawItem を作ったら動いたぞ。
まあこのやり方はどうなのか、という話もあるが。

117 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:54:58 ]
ボタンなんかと違ってわざわざオーナードローしてまで使うもんじゃないし

118 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:56:34 ]
VS2003以降はオーナードローあるからなあ

119 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:57:59 ]
ま、オレはいつもSTATICは場所の確保だけしてもらって
中は親のほうで書いてたけどな。

120 名前:デフォルトの名無しさん [2008/02/22(金) 17:13:26 ]
>116
確かに動作したけど、再びリソースエディタで開くと
変な動作をしますね。確かに楽でいいと思うけど。

121 名前:デフォルトの名無しさん [2008/02/22(金) 17:17:05 ]
>119
それはコントロールを自分でcreateして作ることですか?


122 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:18:21 ]
>>121
いや、どこに描くかの場所だけ取得
実際の描画はOnDraw()等でやる。

今回のはサブクラス化するのがいいと思うよ。

123 名前:デフォルトの名無しさん [2008/02/22(金) 22:10:49 ]
>122
Createしたとき以外に成功したことがないです。
少しだけ具体例を挙げて欲しいのですがいいですか?
オーナー描画はViewのほうでするのですか?

ViewのほうのOnDrawItemで

if( lpDrawItemStruct->CtlType == ODT_STATIC &&
lpDrawItemStruct->CtlID == IDC_PCT ){

CDC* myDC=m_pict.GetDC();
CPict* pPIC=(CPict*)GetDlgItem(IDC_PCT);
CDC* myDC=pPIC->GetDC();
CRect rt;
pPIC->GetClientRect(&rt);
// m_pict.GetClientRect(&rt);
myDC->MoveTo(0,0);
myDC->LineTo(1000,1000);
}


IDC_PCTがピクチャーボックスのIDです。
CPicはCStaticをサブクラス化したものです。
//でコメントしている行のm_pictは、サブクラス化してない
普通のCStaticのメンバ変数です。
両方試してみました。

やはりOnPaint以外再描画されません。





124 名前:デフォルトの名無しさん [2008/02/22(金) 22:24:43 ]
しかもリソースのプロパティのスタイルでフレーム以外
描画されないみたい。


125 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 08:10:30 ]
質問させていただきます。VisualC++.net 2005(C++/CLI)を使用してます。
生成されるEXEファイルのアイコンを変更したいのですが方法がわかりません。

IcoFXで16x16・24x24・32x32の3つのサイズを含む32ビットアイコンを用意しました
これをリソースエディタで読み込み、IDをIDR_MAINFLAMEに変更する方法を
試みましたが、用意したアイコンがリソースエディタに読み込めませんでした。
「警告:Visual Studioイメージエディタでは、32ビットカラーイメージをサポートしていません。
イメージを保存するときに、変更は破棄されます。」
リソースエディタを経由しないでEXEファイルのアイコンを変更する方法はありませんでしょうか?

よろしくお願いします。

126 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:19:16 ]
ビルドするだけ

127 名前:デフォルトの名無しさん [2008/02/23(土) 10:40:37 ]
>121
サブクラスのほうでOnDrawItemを作ってやるというのは
分かったのですがうまくいきません。
他に注意すべき点とか有りますか?


128 名前:デフォルトの名無しさん [2008/02/23(土) 12:09:56 ]
ここってマインスイーパーのプログラムの質問
してもいいんですかね?

129 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:27:16 ]
>>127
横レスです。
>>102まで戻って
枠外まで描画してしまうのはWNDCLASSのstyleに 'CS_PARENTDC' がついているから。
次の方法で枠内に描画できる。
1)CDC::IntersectCilpRect()で制限する。
2)CDC* pPIC=m_pict.GetDC(); を
 CDC* m_PIC=m_pict.GetWindowDC(); に変える。CWindowDCを使ってもいい。

MSDNフォーラムにも同様の質問が出ていて多少参考になるかも。
そこも理由をちゃんと理解してないようだけど…

Visual C++ フォーラム
ピクチャーコントロールへの描画が、はみ出てしまいます
forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2756516&SiteID=7

130 名前:129 mailto:sage [2008/02/23(土) 12:33:11 ]
ごめん、ちょっと紛らわしいので補足。
1),2)を順番に実行するという意味ではなく、
1),2)の内いずれか一つの方法を採用してという意味です。

131 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:35:35 ]
pastebin.windy.cx/?page=view&id=1203741161
これ,いわゆる多重継承の菱形継承なのですが,
なぜあいまいであるはずの変換演算子について
C2385 のエラーが発生しないのでしょうか?
Visual C++ 2008 Express Edition です.

33行目ではエラーになるのに39行目ではエラーになりません.
しかも二つある基底クラス D1,D2 のどちらの変換演算子が
呼び出されるかが宣言における継承の順序に依存しているのです.
変換演算子ではなく通常のメソッド Greeting については
あいまいである旨のエラー C2385 が出ます.

132 名前:131 [2008/02/23(土) 13:39:33 ]
もしかしたら Visual C++ 2008 (vc9) のバグかもしれません.
g++ 4.1.3 ではエラーになりました.

test.cpp: In function ‘int main(int, char**)’:
test.cpp:33: error: request for member ‘Greeting’ is ambiguous
test.cpp:7: error: candidates are: void BaseClass::Greeting() const
test.cpp:7: error: void BaseClass::Greeting() const
test.cpp:39: error: request for member ‘operator const std::string&’ is ambiguous
test.cpp:17: error: candidates are: D1::operator const std::string&()
test.cpp:23: error: D2::operator const std::string&()


133 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:52:16 ]
菱形継承じゃないよ。単なる多重継承。

んで、39 でエラーにならないのは正直バグじゃないかと。



134 名前:131 [2008/02/23(土) 14:12:07 ]
>>133 そうでした.菱形継承で作っているプログラムで気づいて
切り出してきたので頭がそういう風になってしまってました.
そもそも例示したコードの BaseClass って必要なかったです.

connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=329756
レポートしておきました.

135 名前:デフォルトの名無しさん [2008/02/23(土) 14:15:50 ]
>130
ありがとうございます。
枠に収まるように組んでいたので今まで気づきもしませんでしたが
そのように予防することができるのですね。 おそらくビットマップ
にして保存するときは見えない部分もそれで保存できると言うこと
ですか?
あと、CViewを引き継いでいるCFormViewで基本時に
OnPaintは使わないと言われていましたが、関数内に
コードを書かなくても宣言するだけでOnDrawが使えなくなる
とは思っていませんでした。

136 名前:129 mailto:sage [2008/02/23(土) 14:30:39 ]
>>135
MFCスレの方とごっちゃにして答えてしまったみたいだ。
MFCスレの枠内に描画制限するのは上の解決方法でいいとして、
実はこっちのスレの回答にはなっていない。ごめん。

今VC6で確認したんだけど、
ピクチャーのタイプを'四角形'にしてCFormView::OnDraw()で描画すると
描画後にピクチャー自身のWM_PAINTで背景が塗りつぶされてしまっているよう。
もし背景色を変えたいとのことであれば
タイプは'フレーム'のままでOnDraw()内で
FillRect()で背景を自前で塗りつぶせばできる。
でもOnDraw()で無理矢理ピクチャーの位置に描画するより
皆が回答してくれた通りにした方がいいと思う。

> コードを書かなくても宣言するだけでOnDrawが使えなくなる
> とは思っていませんでした。

このあたりはCView::OnPaint()のソースを見ればわかるよ。

137 名前:デフォルトの名無しさん [2008/02/23(土) 15:25:23 ]
>FillRect()で背景を自前で塗りつぶせばできる。

既にあきらめてそれをやっています^^
それってバグじゃない? とか思ったり。

>このあたりはCView::OnPaint()のソースを見ればわかるよ
他のホームページでだいたいのことは分かりました。
ソースも検索で見てみました。

CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);

いつもと違って誤ってOnPaintを作ってからOnDrawを
作って書いたのでひどい目に遭いました。

そこで便乗質問ですが、CView以外でOnPaint内で
CDCを使った場合、BeginPaintとかいるんですか?
CPaintDCならいらないと聞いたのですが。



138 名前:デフォルトの名無しさん [2008/02/23(土) 15:38:29 ]
>136
> 皆が回答してくれた通りにした方がいいと思う。
オーナー描画、BitMap のうちどれですか?
オーナー描画もいろいろ調べたのですが、あきらめました。
BitMapも入門書ではピクチャーボックスではCDialogにですが、
OnPaintで再描画しているサンプルでした。
皆が進めるのはOnDraw OnPaint以外に書く方法ですか?
仮にサブクラス化したとして、どのタイミングで再描画
しているのでしょ?


139 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 17:10:05 ]
ごちゃごちゃ回りくどいことやらずに直接viewに書く

140 名前:129 mailto:sage [2008/02/23(土) 17:47:06 ]
>>137
> CPaintDCならいらないと聞いたのですが。

これはCPaintDCのコンストラクタ・デストラクタを見ればわかる。

>>138
(1)オーナードローを使う。
 VC6ではダイアログエディタでオーナードローにできないのでコード上で
 CFrameView::OnInitialUpdate()あたりで
 m_pict.ModifyStyle(SS_TYPEMASK, SS_OWNERDRAW);でする。
 その後CFrameView::OnDrawItem()で描画処理。
(2)CWndやCStatic派生クラスのOnPaint()内で描画する。

簡単なのは(1)だと思うけど
グラフを書きたいとのことなので、
グラフをあちこちで使いまわすのなら(2)かな。

141 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:52:00 ]
スタティックコントロールは文字や図形を表示してくれるコントロールで、
これをオーナードローにしたら何もしないコントロールだけど
そんなものにわざわざコントロール使う意味ある?

142 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 19:06:43 ]
okwave.jp/qa2565794.html
ダイアログベースのexeで最適なグラフ表示方法 -OKWave

143 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:01:29 ]
>>141
描画だけじゃなくマウスのこととかも含めた
簡易的な位置決めツールにとしては働く。
一応独立したウィンドウなんだし。



144 名前:デフォルトの名無しさん [2008/02/23(土) 21:56:23 ]
>140
ありがとうございます。
m_pict.ModifyStyle(SS_TYPEMASK, SS_OWNERDRAW);
ああ、これをやらないとダメなんですね。
元のFrameViewでよかったんですね。
確かに、コントロールとしての意味がなくなりそうなので

(2)のほうでやってみます。
Createまでする必要がないというのはよく分かりました。
いろいろと溜になる情報ありがとうございました。


145 名前:デフォルトの名無しさん [2008/02/24(日) 00:28:53 ]
void CMine1View::DispMine()
{
CClientDC dc(this);
CBrush *oldBrush1,redBrush,*oldBrush2;
int iy,ix;
for(iy=2;iy<=Masu+1;iy++)
{
for(ix=2;ix<=Masu+1;ix++)
{
if(Mine_Position[iy][ix]==-1)
{
oldBrush1=(CBrush*)dc.SelectStockObject(WHITE_BRUSH);
dc.Rectangle(ix*Width,iy*Width,
ix*Width+Width,iy*Width+Width);
dc.SelectObject(oldBrush1);
redBrush.CreateSolidBrush(RGB(255,0,0));
oldBrush2=dc.SelectObject(&redBrush);
dc.Ellipse(ix*Width+5,iy*Width+Width+5,
ix*Width+Width-5,iy*Width+Width-5);
dc.SelectObject(oldBrush2);
redBrush.DeleteObject();
}
}
}
AfxMessageBox("地雷 踏みました!");
}

VC++6.0でマインスイーパーを作ってます
地雷がうまく表示されないのと地雷を踏んだ時にリセットされません
どこがおかしいのか教えてください

146 名前:デフォルトの名無しさん [2008/02/24(日) 00:36:42 ]
>>145
一体何をリセットした積もりなの?

147 名前:デフォルトの名無しさん [2008/02/24(日) 01:02:49 ]
>>146 プログラム組むの初めてでそれすらもわからないです
本を見ながらやったんですがうまくいかなくて

148 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 01:14:07 ]
Viewなのか、MFCってことだな。 んで、Documentは参照してないと。 
ど、どんな本みてんだYO!

149 名前:デフォルトの名無しさん [2008/02/24(日) 01:16:24 ]
何をリセットしたつもりなのかもわからないのにリセットされないとどうやって判断したの?
少なくとも、「リセットされません」と言うからには何かを「リセットした積もり」なんじゃないの?

150 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 01:28:37 ]
リリースビルドをデバッグビルドにしてみたのですが、
なぜかブレイクポイントがヒットしなくなっていました
これを直すにはどうすればよいのでしょうか。
ちなみにncbファイルの削除というのはやってみました。


151 名前:デフォルトの名無しさん [2008/02/24(日) 01:30:53 ]
>>148 MFCって書いてあります
>>149 地雷を踏んでログがでて最初の画面に戻るはずなんですが


152 名前:デフォルトの名無しさん [2008/02/24(日) 01:48:06 ]
>>151
>145は何の関数か理解している?
少なくとも、「ログがで」たり「最初の画面に戻る」処理は書かれていないわけで。
そもそも、「地雷を踏んだ」かどうかの判定している関数でもないな。

153 名前:デフォルトの名無しさん [2008/02/24(日) 01:58:12 ]
>>152 問題はここではないんですね
地雷の表示がうまくいかないのはここの部分であってますか?



154 名前:デフォルトの名無しさん [2008/02/24(日) 02:00:51 ]
>>153
脳味噌にも皺伸ばししているのか?
地雷の表示はどうなってほしいのがどううまくいかないのかも説明できないなら寝た方がいいぞ。

155 名前:デフォルトの名無しさん [2008/02/24(日) 02:08:56 ]
>>154
説明不足ですいませんでした
柵の真ん中に赤い丸で表示されるはずなんですが
実際は柵の下部分に半円で表示されるんです

156 名前:デフォルトの名無しさん [2008/02/24(日) 04:34:41 ]
>>155
>dc.Ellipse(ix*Width+5,iy*Width+Width+5,ix*Width+Width-5,iy*Width+Width-5);
これあってるの?

157 名前:デフォルトの名無しさん [2008/02/24(日) 05:02:51 ]
DSで動くソフトを作りたいんですけど
まず初めに何をすればいいんですか?
(´・ω・`)

158 名前:デフォルトの名無しさん [2008/02/24(日) 05:43:44 ]
>>156
+5の方の「Width」がひとつ多かったです
直してビルドして確認してみたらちゃんと赤い丸で表示されました
赤い丸が表示されないという問題は無事解決しました ありがとうございました


159 名前:デフォルトの名無しさん [2008/02/24(日) 06:20:29 ]
void CMine1View::OnButton1()
{
CClientDC dc(this);
CString ss;
int iy,ix,x,y,m_x,m_y;
Masu=8; MineKazu=0;
for(iy=0;iy<=Masu+1;iy++)
{
for(ix=0;ix<=Masu+1;ix++)
{
Mine_Position[iy][ix]=0; Mine_Pass[iy][ix]=0; Mine_Kazu[iy][ix]=0;
}
}
Width=30;
for(x=Width*2;x<=Width*10;x+=Width)
{
dc.MoveTo(x,Width*2);dc.LineTo(x,Width*10);
}
for(y=Width*2;y<=Width*10;y+=Width)
{
dc.MoveTo(Width*2,y);dc.LineTo(Width*10,y);
}
for(iy=0;iy<=Masu*3;iy++)
{
X=(int)((double)rand()/32767.0*Masu);
Y=(int)((double)rand()/32767.0*Masu);
X=(int)((double)rand()/32767.0*Masu);
Y=(int)((double)rand()/32767.0*Masu);
Mine_Position[Y][X]=-1;
Mine_Pass[Y][X]=-1;
Mine_Kazu[Y][X]=-1;
}

160 名前:159 [2008/02/24(日) 06:25:08 ]
for(iy=2;iy<=Masu+1;iy++)
{
for(ix=2;ix<=Masu+1;ix++)
{
if(Mine_Kazu[iy][ix]==1)
{
MineKazu=MineKazu+1;
}
}
}
ss.Format("地雷の数は%d個です!",MineKazu); dc.TextOut(350,50,ss);
for(iy=2;iy<=Masu+1;iy++)
{
for(ix=2;ix<=Masu+1;ix++)
{
if(Mine_Position[iy][ix]==-1)
{
for(m_x=-1;m_x<=1;m_x++)
{
for(m_y=-1;m_y<=1;m_y++)
{
if(m_x!=0||m_y!=0)
{
if(Mine_Position[iy+m_y][ix+m_x]!=-1)
{
Mine_Position[iy+m_y][ix+m_x]=
Mine_Position[iy+m_y][ix+m_x]+1;
}}}}}}}}
起動した時に地雷の数を表示させたいのですが
表示は0のままでうまく表示出来ません
どこがおかしいのか教えてください

161 名前:145.159 [2008/02/24(日) 06:26:48 ]
>>145のマインスイーパーについての質問です

162 名前:デフォルトの名無しさん [2008/02/24(日) 08:08:41 ]
>どこがおかしいのか教えてください
あんたの頭。
お願いだから寝てください。できれば永久に。

>Mine_Kazu[Y][X]=-1;
-1をセットしているのに
>if(Mine_Kazu[iy][ix]==1)
1を数えているじゃないか。

163 名前:161 [2008/02/24(日) 15:56:01 ]
>>162 直したら地雷の数表示されました
ありがとうございます




164 名前:デフォルトの名無しさん [2008/02/24(日) 16:00:19 ]
void CMine1View::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CBrush blueBrush,*oldBrush1;
CString ss;
int iy,ix;
iy=int(point.y/Width);
ix=int(point.x/Width);
if(2<=iy&&iy<=Masu+1&&2<=ix&&ix<=Masu+1)
{
blueBrush.CreateSolidBrush(RGB(0,0,255));
oldBrush1=dc.SelectObject(&blueBrush);
dc.Rectangle(ix*Width,iy*Width,
ix*Width+Width,iy*Width+Width);
dc.SelectObject(oldBrush1);
blueBrush.DeleteObject();
Mine_Pass[iy][ix]=-1;
if(Mine_Position[iy][ix]>=1)
{
ss.Format("%d",Mine_Position[iy][ix]);
dc.TextOut(ix*Width+10,iy*Width+5,ss);
Mine_Pass[iy][ix]=-1;
}


165 名前:145.159.160.164 [2008/02/24(日) 16:00:56 ]
else if(Mine_Position[iy][ix]==-1)
{
DispMine();
}
for(iy=2;iy<=Masu+1;iy++)
{
for(ix=2;ix<=Masu+1;ix++)
{
if(Mine_Pass[iy][ix]!=-1)
{
//goto saido;
return;
}
}
}
AfxMessageBox("おめでとう!クリアです!");
DispMine();
// saido:;
}
CFormView::OnLButtonDown(nFlags,point);
}
起動〜終了まで出来るようになったのですが
終了時にクリアのログの後に地雷を踏んだログが出てしまいます
どこが悪いのか教えてください

166 名前:デフォルトの名無しさん [2008/02/24(日) 16:09:00 ]
>どこが悪いのか教えてください
あんたの頭。いい加減にしなさい。

167 名前:デフォルトの名無しさん [2008/02/24(日) 17:13:45 ]
>>166 本当にわからないんです
自分の頭が悪いのはわかってます・・・

168 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 17:19:07 ]
ここにソースあるから
www.kohgakusha.co.jp/support/game_mfc/index.html

169 名前:デフォルトの名無しさん [2008/02/24(日) 18:04:19 ]
>>167
何が悪いか判ってよかったな。つまり、あんたにはプログラミングは無理ってことだ。

170 名前:デフォルトの名無しさん [2008/02/24(日) 18:24:49 ]
VC++でMFC使わずにWin32Appで書いてるんですが、
MFC覚えた方がいいですか?
仕事だとMFCとWin32Appはどっちが使われてます?

171 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 19:12:09 ]
MFC覚えたらかなり生産性あがるよ

172 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 21:00:31 ]
>>170
使えと言われたときのために軽くかじっておくのはいいと思う。
かじったことのない俺が言っても説得力0だけど。

173 名前:デフォルトの名無しさん [2008/02/24(日) 22:31:57 ]
お勧めの入門書はありますか?



174 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 23:34:28 ]
VC++でEmacsキーバインドを使いたいのですが、
わざわざTabキーを入力しなければインデントしてくれません。
自動インデントをしてくれるようにする方法はありますか?

VC++のバージョン:
 Visual C++ 2008 Express Edition
現在の設定:
 ツール->オプション->環境->キーボード
  次の追加キーボードマップスキームを適用->Emacs
 ツール->オプション->テキストエディタ->C/C++->タブ
  インデント->スマート
  タブ->タブの保持
 後はおおむねデフォルトです。

175 名前:デフォルトの名無しさん [2008/02/25(月) 00:34:04 ]
>173
MFCなら 10年前に買った、新Visual C++ 6.0 入門編 シニア編
かな?







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<222KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef