トップページ⇒tech
1001コメント322KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001Part28の10002008/02/15(金) 01:45:56
Visual C++入門者・初心者からの質問を、
お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

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

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

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

過去スレ、関連スレなどは>>2-5辺り。
0153デフォルトの名無しさん2008/02/24(日) 01:58:12
>>152 問題はここではないんですね
地雷の表示がうまくいかないのはここの部分であってますか?
0154デフォルトの名無しさん2008/02/24(日) 02:00:51
>>153
脳味噌にも皺伸ばししているのか?
地雷の表示はどうなってほしいのがどううまくいかないのかも説明できないなら寝た方がいいぞ。
0155デフォルトの名無しさん2008/02/24(日) 02:08:56
>>154
説明不足ですいませんでした
柵の真ん中に赤い丸で表示されるはずなんですが
実際は柵の下部分に半円で表示されるんです
0156デフォルトの名無しさん2008/02/24(日) 04:34:41
>>155
>dc.Ellipse(ix*Width+5,iy*Width+Width+5,ix*Width+Width-5,iy*Width+Width-5);
これあってるの?
0157デフォルトの名無しさん2008/02/24(日) 05:02:51
DSで動くソフトを作りたいんですけど
まず初めに何をすればいいんですか?
(´・ω・`)
0158デフォルトの名無しさん2008/02/24(日) 05:43:44
>>156
+5の方の「Width」がひとつ多かったです
直してビルドして確認してみたらちゃんと赤い丸で表示されました
赤い丸が表示されないという問題は無事解決しました ありがとうございました
0159デフォルトの名無しさん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;
}
01601592008/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のままでうまく表示出来ません
どこがおかしいのか教えてください
0161145.1592008/02/24(日) 06:26:48
>>145のマインスイーパーについての質問です
0162デフォルトの名無しさん2008/02/24(日) 08:08:41
>どこがおかしいのか教えてください
あんたの頭。
お願いだから寝てください。できれば永久に。

>Mine_Kazu[Y][X]=-1;
-1をセットしているのに
>if(Mine_Kazu[iy][ix]==1)
1を数えているじゃないか。
01631612008/02/24(日) 15:56:01
>>162 直したら地雷の数表示されました
ありがとうございます
0164デフォルトの名無しさん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;
}
0165145.159.160.1642008/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);
}
起動〜終了まで出来るようになったのですが
終了時にクリアのログの後に地雷を踏んだログが出てしまいます
どこが悪いのか教えてください
0166デフォルトの名無しさん2008/02/24(日) 16:09:00
>どこが悪いのか教えてください
あんたの頭。いい加減にしなさい。
0167デフォルトの名無しさん2008/02/24(日) 17:13:45
>>166 本当にわからないんです
自分の頭が悪いのはわかってます・・・
0168デフォルトの名無しさん2008/02/24(日) 17:19:07
ここにソースあるから
http://www.kohgakusha.co.jp/support/game_mfc/index.html
0169デフォルトの名無しさん2008/02/24(日) 18:04:19
>>167
何が悪いか判ってよかったな。つまり、あんたにはプログラミングは無理ってことだ。
0170デフォルトの名無しさん2008/02/24(日) 18:24:49
VC++でMFC使わずにWin32Appで書いてるんですが、
MFC覚えた方がいいですか?
仕事だとMFCとWin32Appはどっちが使われてます?
0171デフォルトの名無しさん2008/02/24(日) 19:12:09
MFC覚えたらかなり生産性あがるよ
0172デフォルトの名無しさん2008/02/24(日) 21:00:31
>>170
使えと言われたときのために軽くかじっておくのはいいと思う。
かじったことのない俺が言っても説得力0だけど。
0173デフォルトの名無しさん2008/02/24(日) 22:31:57
お勧めの入門書はありますか?
0174デフォルトの名無しさん2008/02/24(日) 23:34:28
VC++でEmacsキーバインドを使いたいのですが、
わざわざTabキーを入力しなければインデントしてくれません。
自動インデントをしてくれるようにする方法はありますか?

VC++のバージョン:
 Visual C++ 2008 Express Edition
現在の設定:
 ツール->オプション->環境->キーボード
  次の追加キーボードマップスキームを適用->Emacs
 ツール->オプション->テキストエディタ->C/C++->タブ
  インデント->スマート
  タブ->タブの保持
 後はおおむねデフォルトです。
0175デフォルトの名無しさん2008/02/25(月) 00:34:04
>173
MFCなら 10年前に買った、新Visual C++ 6.0 入門編 シニア編
かな?
0176デフォルトの名無しさん2008/02/25(月) 00:48:31
>>175
それって入門用には最悪だろ
0177デフォルトの名無しさん2008/02/25(月) 04:08:20
なぜSelectObjectは描画後とかに戻し作業が必要なんですか?
DeleteObjectもなくても動くんですがどういうことですか?

pDC->SelectObject(oldFont);
myFont.DeleteObject();
0178デフォルトの名無しさん2008/02/25(月) 06:43:45
戻し作業は不要だけど、状況によっては戻す必要がある。

DeleteObjectは必要だけど、なくても一応動く
ただDeleteObjectしてないように見えるけど、実際は見えない部分でやってる場合もある。

間違ったやり方をしているサンプルもあるし、
一見間違っているように見えて間違ってないサンプルもあるから
猿真似しかできないやつだと理解は難しい。
0179デフォルトの名無しさん2008/02/25(月) 07:19:13
MFC 使ってるならデストラクタで自動的に DeleteObject される。
myFont をローカル変数にしていた場合、
SelectObject で戻し作業をしてないと
登録しているオブジェクトを DeleteObject しようとしてしまう。

myFont がローカル変数でない場合は
状況によっては必ずしもすぐさま戻す必要は無いが、
最終的には戻す必要がある。
0180デフォルトの名無しさん2008/02/25(月) 09:56:18
MSDNのサンプルは戻さずに消してるよ

GRAPHICS\GDI\FONTS\FONTVIEW\STATUS.C

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rect);

hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
border = rect;
border.bottom = border.top + cyStatusBorder;
FillRect (hdc, &border, hBrush);
DeleteObject (hBrush);

hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
border = rect;
border.top = border.bottom - cyStatusBorder;
FillRect (hdc, &border, hBrush);
DeleteObject (hBrush);

EndPaint (hwnd, &ps);
0181デフォルトの名無しさん2008/02/25(月) 10:10:24
あ、それselectしてないか
0182デフォルトの名無しさん2008/02/25(月) 11:32:29
ペゾ本読み返してみたら戻さなくていいが正解だった。
0183デフォルトの名無しさん2008/02/25(月) 15:01:06
つまり戻さないとどうなるんですか?描画し終わったらデリようが、戻そうがどうでもよくないですか?
0184デフォルトの名無しさん2008/02/25(月) 15:15:32
戻さないと消せない。
消さないとリソース消費が膨れ上がる。
ストックオブジェクトなら消す必要が無い
どの辺が疑問かわからん
0185デフォルトの名無しさん2008/02/25(月) 15:19:33
ローカル変数だと自動デリでアクセス違反起こすって事じゃないの
0186デフォルトの名無しさん2008/02/25(月) 15:20:25
まさにそれが聞きたかったんだ
ありがとう
0187デフォルトの名無しさん2008/02/25(月) 15:31:23
描画の時にその都度選択しないといけないのは
解放されてしまうからなんだよね
だから自分で元に戻さなくても大丈夫
0188デフォルトの名無しさん2008/02/25(月) 16:10:31
出したものは片付ける
0189デフォルトの名無しさん2008/02/25(月) 16:22:58
出した後は疲れて寝ちゃうからほったらかし
0190デフォルトの名無しさん2008/02/25(月) 17:06:07
>>185
アクセス違反は起きないよ。


SelectObjectされたままだとDeleteObjectが失敗するからどんどん溜まっていく。
使っているGDIオブジェクトの数はタスクマネージャでも確認できる。
・・・上限っていくつだろ?ググってみたがわからん。
0191デフォルトの名無しさん2008/02/25(月) 18:19:05
>>190
たぶん上限というのは9xで64KB, NTで標準1MBのやつ。
で、オブジェクト1個で何バイトだよって話になるんだけどね。
0192デフォルトの名無しさん2008/02/25(月) 19:39:37
このスレはペゾルド本読んでるやつ誰もいないのか?
戻さずに削除するやり方がちゃんと書いてあるだろ
0193デフォルトの名無しさん2008/02/25(月) 20:08:58
だったら書けよチンカス
0194デフォルトの名無しさん2008/02/25(月) 21:09:36
SelectObjectしたらいつまで有効?
毎回SelectObjectするのは何故?
0195デフォルトの名無しさん2008/02/25(月) 23:49:47
SelectObjectしたままほっとらかしておいて大丈夫な状況なら、ほったらかしにすれば宜しいかと。
0196デフォルトの名無しさん2008/02/27(水) 18:35:12
CButton* radio1=(CButton*)GetDlgItem(IDC_RADI01);
の(CButton*)この括弧ってなんなの?
ポイント関係の項目読んでも解説が出てこないんですけど!
0197デフォルトの名無しさん2008/02/27(水) 18:36:40
索引で「型キャスト」を調べるべし
0198デフォルトの名無しさん2008/02/27(水) 18:42:06
OK!!
0199デフォルトの名無しさん2008/02/27(水) 18:59:20
わかりました。
CButtonクラスにするポインタradio1にGetDlgItemで取り出したIDC_RADI01のアドレスをCスタイルキャストでポインタに強制変換していれてるんですね。
さっぱりわかりません
0200デフォルトの名無しさん2008/02/27(水) 19:05:23
やばいわかっちゃった
GetDlgItemで取り出したIDC_RADI01のアドレスをCButton型のポインタにしていれてるんだ!
0201デフォルトの名無しさん2008/02/27(水) 19:06:24
もうだめだ
0202デフォルトの名無しさん2008/02/27(水) 19:20:51
いやあってる!ありがとうございました!
0203デフォルトの名無しさん2008/02/27(水) 21:27:46
Visual Studio 2003 なんですが、
Foo.cpp タブの下に表示されている
クラスとメソッドを選択するバーを消す
方法を教えて下さい。
0204デフォルトの名無しさん2008/02/27(水) 22:04:16
何でRADI01(ラジ01)なんだろう。
0205デフォルトの名無しさん2008/02/27(水) 22:09:44
>>203
Visual Studio 2005 Part 23
http://pc11.2ch.net/test/read.cgi/tech/1196663772/l50
0206デフォルトの名無しさん2008/02/27(水) 22:34:55
CWnd* myPICT=GetDlgItem(IDC_PICT);
CClientDC myDC(myPICT);
は丸暗記するものなんですか?
それともここを理解しないと先は暗いですか?
0207デフォルトの名無しさん2008/02/27(水) 22:42:30
理解できてたらおぼえる必要ないだろ
忘れたら前に書いたコード探すだけだし
0208デフォルトの名無しさん2008/02/27(水) 22:43:58
暗記なんてするのは学校のテストだけですよ
0209デフォルトの名無しさん2008/02/27(水) 22:46:49
も、もしかして CWnd と CClientDCの構造体の中身から調べなきゃいけないんですか?
0210デフォルトの名無しさん2008/02/27(水) 22:47:05
いい加減こいつがうざくなってきた
0211デフォルトの名無しさん2008/02/27(水) 22:48:17
すいません二度と来ません
0212デフォルトの名無しさん2008/02/27(水) 22:48:44
さいならっきょ
0213デフォルトの名無しさん2008/02/27(水) 22:50:15
>>209
もし、その中身を知っていなきゃコーディングできないとするならばそんな関数があること自体おかしいと思わないか?
printfの実装なんぞ知らなくたって使えるだろ?
0214デフォルトの名無しさん2008/02/27(水) 22:59:42
MFC使っててCWnd知らないやつはいないだろうし
CDC使ったことがあったらCClientDCも使えるだろうし
02152032008/02/27(水) 23:20:28
>>205

載ってる?
行って探してみたけど無さそうだったよ。
そもそも、消す機能ついて無い気もしてきた。。
とりあえずあきらめよう。
Thx.
0216デフォルトの名無しさん2008/02/29(金) 00:56:57
VC++6.0なんだけど一行って何行まで書けるの?
2行に分けたい場合はどうするの?
0217デフォルトの名無しさん2008/02/29(金) 01:12:19
日本語でおk
0218デフォルトの名無しさん2008/02/29(金) 01:18:45
CやC++では、ただの空白やタブのみならず改行なども同じように区切りとして扱われる。
ようするに、だいたい改行したいと思ったところにただ改行を書くだけで大丈夫。

例えばVBのように行継続文字を書く必要はない。
それに相当するものはある(バックスラッシュを使う)のだが上記の理由で基本的に不要。
0219デフォルトの名無しさん2008/02/29(金) 02:45:29
すごくよくわかりました。ありがとうございました
0220デフォルトの名無しさん2008/02/29(金) 03:13:17
#defineとかは駄目だけどな
0221デフォルトの名無しさん2008/02/29(金) 09:39:47
長いリテラルを複数行に分けて書く
0222デフォルトの名無しさん2008/02/29(金) 10:15:08
ソースのことなのか実行結果のことなのかくらい書いたほうがいいけどなw
0223デフォルトの名無しさん2008/03/01(土) 18:33:50
みんなバージョンいくつ使ってるの?
0224デフォルトの名無しさん2008/03/01(土) 18:52:36
いまだに6.0が現役です
0225デフォルトの名無しさん2008/03/01(土) 20:00:21
>>216
>一行って何行まで書けるの?
一行でなくなったら一行ではなくなるではないか。
0226デフォルトの名無しさん2008/03/03(月) 09:48:08
つまり答えは一行には一行まで書けます、だな
0227デフォルトの名無しさん2008/03/03(月) 12:10:55
古谷一行に訊け
0228デフォルトの名無しさん2008/03/03(月) 20:52:04
一文字に何行書けますか?
という質問だろ、
文脈から判断せいや
0229デフォルトの名無しさん2008/03/03(月) 21:04:22
>>216
文字列なら
char *str = "abc"\
"def";
みたいな感じ
関数ならint hoge(int a,int b,
int c)
{}
みたいな感じ
0230デフォルトの名無しさん2008/03/03(月) 21:11:34
>一文字に何行書けますか?

・・・え?
一文って何行まで書けるの? じゃないのか?
0231デフォルトの名無しさん2008/03/03(月) 21:22:39
お前らC++の前に日本語習得してこいよ
0232デフォルトの名無しさん2008/03/03(月) 21:34:47
>>229
"で閉じているときは\は無くていいよ。↓でOK
char *str = "abc"
       "defg"
       "hijk";

閉じないなら\で繋げる。
char *str = "abc\
defg\
hijk";
(もっとも、この場合は行頭に桁揃えのスペースやタブを入れられなくなるが・・・)
0233デフォルトの名無しさん2008/03/05(水) 00:12:55
アウトプットウィンドウに表示されるテキストを右端で折り返すこと
はできないのでしょうか? 長いエラーメッセージが表示されたとき、
水平スクロールバーを使ってスクロールしながら読むのは骨が折れます。
Visual C++6.0です。よろしくお願いします。
0234デフォルトの名無しさん2008/03/05(水) 00:19:42
適宜改行しておけばいいんでね?
0235デフォルトの名無しさん2008/03/05(水) 00:24:39
改行って、どうやって改行するんですか? カーソルを置いて[Enter]を
押しても改行されませんよ。
0236デフォルトの名無しさん2008/03/05(水) 01:53:19
「右端で折り返す」オプションなかったっけ、2005にはあるが、、、
っと起動してみたがみつからんなあ、長年つかってなかったからよーわからん
ヘルプもうまく出んな
0237デフォルトの名無しさん2008/03/05(水) 01:55:09
>>235
出力時にですがな。
0238デフォルトの名無しさん2008/03/05(水) 02:12:24
>>237
>235が言ってるのはビルドエラーだよ?
コンパイラのコードをいじれと?
0239デフォルトの名無しさん2008/03/05(水) 02:26:33
んが? 自分で出したエラーメッセージじゃないの?
そら失礼。
0240デフォルトの名無しさん2008/03/05(水) 06:53:06
ちんちん!
0241デフォルトの名無しさん2008/03/05(水) 12:35:45
ちんちんの後でつらいですが、
int a[10];
の a[10] 以降の配列にデータを入れ続けた場合の被害は、最悪プログラムの強制終了だ。と上の方に書いてありましたが本当ですか?
なんか最近OS起動後すぐにWindousのプロセスが強制終了しだしたんですが、
自分のアプリ外のメモリ領域は保護してくれるぐらいの機能はあるんですよね?VC++6.0なんですけど。
0242デフォルトの名無しさん2008/03/05(水) 13:10:14
>>241
ttp://www.kumei.ne.jp/c_lang/intro/no_22.htm

動かない事はないけどメモリアドレス関係のバグは命取り
0243デフォルトの名無しさん2008/03/05(水) 13:27:14
メモリの保護はOSの役目なのでVC++とか関係ないです。
0244デフォルトの名無しさん2008/03/05(水) 14:06:06
test
B?ng
0245デフォルトの名無しさん2008/03/05(水) 21:34:33
質問です.VC++2005を使用しているのですが
LPSTR型の文字列をchar str[200]に代入したいのですが可能でしょうか?

0246デフォルトの名無しさん2008/03/05(水) 21:44:28
typedef CHAR * LPSTR;
だから
0247デフォルトの名無しさん2008/03/05(水) 21:51:04
strncpy 使わないとな。
0248デフォルトの名無しさん2008/03/06(木) 01:15:44
Visual C++ 2008 Express Editionを使ってるんですけど、プロパティバインディングって使えないんでしょうか?
適当なコントロールを選んで、プロパティのApplicationSettings->PropertyBindingの...をクリックし、バインドしたいプロパティを選んで新規を押し、
項目を入力してOKを押すと「設定ファイルがプロジェクトに見つかりません。設定ファイルを追加して、再試行してください。」と出ます。
(プロジェクト名).config, (プロジェクト名).exe.config, App.config, config.xml, (プロジェクト名).xmlといろいろ追加してみましたが結局出来ませんでした・・・。

どうすればいいものかと途方にくれてます。。
0249デフォルトの名無しさん2008/03/06(木) 18:19:22
大きなダイアログのタブオーダーの設定をしている最中に
スクロールバーでダイアログを動かすと
次にクリックした位置がオーダー1に戻ってしまうのですが、
これってVC2005のバグなのでしょうか?
こういう場合、どのようにしてタブオーダーを設定すればよいでしょうか。
0250デフォルトの名無しさん2008/03/06(木) 18:48:33
>>249
http://msdn2.microsoft.com/ja-jp/library/csz6b8x8(VS.80).aspx
Ctrlを押しながらクリックすれば途中から設定できるはず

それかホイールマウスでスクロールする。
0251デフォルトの名無しさん2008/03/06(木) 18:57:09
>>250
> Ctrlを押しながらクリックすれば途中から設定できるはず

スクロールした後にコントロールをCtrl+クリックすると、
そこが新たな基準点になるだけで、
そのコントロール自体のタブオーダーは変更されないのです。

> それかホイールマウスでスクロールする。

ホイールを回してもスクロールしないのですが、
これはなにかの設定に依存するのでしょうか?
0252デフォルトの名無しさん2008/03/06(木) 19:06:18
>>251
スクロールした後で一つ前のコントロールをCtrl+クリックして基準点として
それ以降を設定すればいいのでは?

ホイールスクロールはマウスユーティリティによるものかも。
■ このスレッドは過去ログ倉庫に格納されています