[表示 : 全て 最新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辺り。

45 名前:44 mailto:sage [2008/02/17(日) 02:42:01 ]
誤爆orz

46 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 02:47:34 ]
バーかw

47 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:02:53 ]
>>44に感謝して質問させていただきます。
自分のパソコンで一時的に(実家にいるときとかとかに)コードとかを書いて、出来ればデバッグまでおわらせて
実行するのは大学のパソコンで行いたいんだけど、この場合はプロジェクトの種類は何を選べば良いでしょうか?
使ってるのはVisual C++ express editionなんですが。
大学のlinuxではバージョンは分からないですがg++でコンパイルです。
Makefileも欲しいんですが、そんなことって出来ますか?

48 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:03:05 ]
誤爆で説得力なくなる文だなw
専ブラはたまにこれやらかすな

49 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:06:06 ]
>>47
Win32コンソールでいいかなあ
Makefileは昔のVCは作れたけど、今のは無理かな
まあMAKEだけ別管理にするのがよさげ

50 名前:デフォルトの名無しさん [2008/02/17(日) 03:16:17 ]
>>47
Cygwin入れた方が手っ取り早いと思う。

51 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:26:55 ]
>>49
なるほど。サンクス。
>Makefileは昔のVCは作れたけど
「全般」っていう種類のプロジェクトにメイクファイルプロジェクトっていうのがあるけどこれ?

>>50
今wikipedia見たらvmwareみたいなやつか。
vistaで不安定って書いてあったからちょっと引け腰。

52 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 05:04:57 ]
vmwareとはエミュレートするレベルが違う
vistaで不安定ならvmwareにXPでも入れて動かせばいいじゃない

53 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 05:09:57 ]
>>52
vmwareを入れるのならXPでなくターゲットのlinuxそのものをその上にインストールすればいいんじゃないかw
>>51
エミュレーションソフトを入れて大学のlinuxと同じもので開発環境を構築してみては?



54 名前:47 mailto:sage [2008/02/17(日) 05:50:19 ]
再度すみません。>>47です
とりあえずmakefileプロジェクトでクラスを書いてメインで動作確認のコードを書いてみたんですが、
ビルドを押すと、

実行するビルド コマンド ラインがありません。

と出てしまってよく分からないんだけれどこれはどういう状態です
google先生でも一応調べたんですが分からないっす。

55 名前:デフォルトの名無しさん [2008/02/17(日) 08:09:53 ]
>>54
その無駄な努力はやめて、CDブート可能なLinux使うかCygwin入れるかしろ。

56 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:18:34 ]
なんとしてもVCでやりたいんだなwww

57 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:02:26 ]
>>54
makefile プロジェクトは実行するコマンドから全て自分で指定
しないといけないから、君にはまだ無理。

そもそも、Visual Studio には make コマンドなんかついてない
ことすら知らないでしょ?

nmake で代用することもできるけど、makefile の文法が gmake
とは違う部分があるので、お勧めしない。

他の人が書いてるように、VMware とか入れて Linux 走らせるの
がいいと思う。VMware が不安と言うなら VirtualPC でやれば
MS の加護が受けられるのでちょっぴり安心かもしれない。
(まともに使ったことないからよく知らんけど。)

58 名前:デフォルトの名無しさん [2008/02/17(日) 09:39:08 ]
だからもう、vmwareじゃなくてCDbootのLinuxでいいよ。キノピなら問題ないでしょ。

59 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:44:31 ]
別にcygwinでいいだろ

60 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:53:41 ]
VC関係ない

61 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:13:50 ]
itpro.nikkeibp.co.jp/article/NEWS/20070912/281813/
vmware + linux

無料だお

62 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:44:13 ]
>57
Windowsの上に載ってるVirtualPCにはMSのサポートがあるけど、
そのVirtualPCの上に載ってるLinuxはどこがサポートするんだゐ?

63 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:14:38 ]
サポートがいるなら、

Windows Vista / VirtualPC 2007 ->
 WindowsXP / VirtualServer 2005 R2 SP1 ->
  Red Hat Enterprise Linux

ってやればいいんじゃないかな。



64 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:35:59 ]
OSだけで何万費やすつもりなんだw

65 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:09:46 ]
環境を同じにするんじゃなけりゃ、ソースだけを共通にするほうが面倒がないよ。
まあ環境同じが楽だけど、行ったり来たりするほうが鍛えられる

66 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:15:04 ]
という勘違いした人が一人いると無駄な作業が増える。

67 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:21:11 ]
同じソース使うことのどこが勘違いなんだか。
デバッガにVCが使えるメリットは大きい。

68 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:22:42 ]
いまだにデバッガとか使うやついるの?
printfで十分だろ

69 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:23:34 ]
まあprintfで十分な規模ならprintfで十分

70 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:32:54 ]
学校で作るもんなんてそんな規模だろ

71 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 19:17:13 ]
すみません、ちょっと質問です。

ダイアログにwebbrowserコントロールとボタンコントロールを貼り付けて
ボタン押下でgoogleのページを表示させています。

その時にフォーカスがgoogle検索ページの
エディットボックスにフォーカスするのですが、
このフォーカスを移動させたくない場合、どのようにすれば良いでしょうか。

Navigate2のメソッドを利用しており、このメソッドのフラグを調べてみましたがないようです。
また、webbrowser2側でSetFocus()をオーバーライドしようとするも
webbrowser2側ではSeFfocus()を呼んでないようです。

webbrowser2にフォーカスを移動させない方法ってありますでしょうか?


72 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 19:22:21 ]
javascriptをoffにすればいいんじゃない?

73 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 19:50:21 ]
>>72
ありがとうございます!
IEのオプションでjavascriptをオフにしたらフォーカスが移動しなくなりました。

今現在は自分だけのローカルPCだけに反映されると思いますが、
他のPCでも有効にするためには、Navigate2のheaderとかに組み込めばいいのかな…

とりあえず、調べてみます。
ありがとうございました。




74 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 20:22:14 ]
C++とC++/CLIは微妙に違うらしいのですが、素のC++の勉強がしたい場合「空のプロジェクト」というやつでプログラムを書けばいいのでしょうか?

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でマインスイーパーを作ってます
地雷がうまく表示されないのと地雷を踏んだ時にリセットされません
どこがおかしいのか教えてください






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

前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