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

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

■ このスレッドは過去ログ倉庫に格納されています
0001987NGNG
タイトルのとおり、
Visual C++ 初心者用スレッドです。

前スレ・関連スレは、>>2 ぐらい。
0433デフォルトの名無しさんNGNG
>>432
スレタイが読めない文盲の方ですか?( ´ー`)y-~~
0434デフォルトの名無しさんNGNG
>>433
( ´,_ゝ`)
0435デフォルトの名無しさんNGNG
なんつーか何かに例えたがるよな、プログラマって。
0436デフォルトの名無しさんNGNG
>>435
物を教える時に例え話って使うだろ。
プログラミングに限らず。

てか、>>432の意味がマジでワカランかったの?
不条理な逆ギレイクナイ!
0437デフォルトの名無しさんNGNG
>>430
関数のオーバーヘッドがある、最適化し難い(メモリ転送命令が使えない)等…
>>432はなかなか良い例えだと思うが…
0438あぼーんNGNG
( ´∀`)/< 先生!!こんなのを見つけました。
http://japan.pinkserver.com/yamazaki/moe/hankaku09.html
http://japan.pinkserver.com/yamazaki/moe/hankaku10.html
http://japan.pinkserver.com/yamazaki/moe/hankaku07.html
http://japan.pinkserver.com/yamazaki/moe/hankaku08.html
http://japan.pinkserver.com/yamazaki/moe/hankaku05.html
http://japan.pinkserver.com/yamazaki/moe/hankaku06.html
http://japan.pinkserver.com/yamazaki/moe/hankaku03.html
http://japan.pinkserver.com/yamazaki/moe/hankaku04.html
http://japan.pinkserver.com/yamazaki/moe/hankaku01.html
http://japan.pinkserver.com/yamazaki/moe/hankaku02.html
0439デフォルトの名無しさんNGNG
>>433
( ´_ゝ`)
0440デフォルトの名無しさんNGNG
いや、問返しはカコワルイよ。
0441430NGNG
分かりました。ありがとうございました。後、StretchDIBitsでマップをスクロール
する場合、一度半マス移動分のを表示してから、1マス移動を表示したいのですが、
マイナスの座標から表示しても(16ピクセルのセルなら8ピクセルずらし、通常17×17
セルなら18×18セルをずらして表示)大丈夫なのですか?また、他の方法があるなら
教えてください。
0442デフォルトの名無しさんNGNG
StretchDIBitsって使ったこと内や

CreateDIBSection→BitBlt, StretchBltでやってる
0443デフォルトの名無しさんNGNG
LPVOID test;

(DWORD) test;
(UINT) test;
(WORD) test;
(BYTE) test;
--
(DWORD) test;
だけ型キャストの警告がでます。どうしてでしょうか?
VC7使ってます。
お願いします。
0444エラー内容も書けNGNG
>>443
どんなキャストの警告が出る?
VC6では出なかった。
もしもこういうコードを書いているなら当然だが……

LPVOID test;
DWORD test2 = (DWORD) test;
UINT test3 = (UINT) test;
WORD test4=(WORD) test;
BYTE test5=(BYTE) test;

(testが初期化されていないから値が不定。)
0445デフォルトの名無しさんNGNG
>>417,418
返事遅くなりましたが、どうもありがとうございました。
クリーンインストールするんで、レジストリでもなんでも 強気でいじれるので、
いろいろいじってみたいと思います。
どうも ありがとございました。
0446443NGNG
>>444
どうも
'型キャスト' : ポインタを 'LPVOID' から 'DWORD' へ切り詰めます。
ってエラーです。

sizeof で LPVOID と DWORD を調べても、両方4byteで問題ないはずなんですよね。
むしろ問題であるはずのBYTE と WORD のキャストには無警告なんですよ。

おそらくVC7だと64bitアドレスもサポートしてるんで、その性だとおもうんですが、
だとしたら、なんでBYTEとWORDへのキャストには無警告なんでしょうね・・・
0447あNGNG
>>443
いいからソースを見せなさい。
0448443NGNG
やっぱり警告は64ビット対応が原因でした。
UINT型とDWORD型のみへの警告は恐らく、旧来の手法に対する警告ってことでしょうね。

#include <windows.h>
#include <stdio.h>
void main( )
{
DWORD d; UINTui; WORD w;BYTE b;LPVOID p;
p = &d; d = (DWORD) p; ui = (UINT) p; w = (WORD) p; b = (BYTE) p;

printf( "LPVOID = %d\n", sizeof( LPVOID ) );
printf( "DWORD = %d\n", sizeof( DWORD ) );
printf( "UINT = %d\n", sizeof( UINT ) );
printf( "WORD = %d\n", sizeof( WORD ) );
printf( "BYTE = %d\n", sizeof( BYTE ) );
}

結果:LPVOID = 4,DWORD = 4,UINT = 4,WORD = 2,BYTE 1

warning C4311: '型キャスト' : ポインタを 'LPVOID' から 'DWORD' へ切り詰めます。
d = (DWORD) p;
warning C4311: '型キャスト' : ポインタを 'LPVOID' から 'UINT' へ切り詰めます。
ui = (UINT) p;
0449430NGNG
>>442 ありがとうございます。やってみます。
0450デフォルトの名無しさんNGNG
ツールバー上のボタンの文字列を
あらかじめ設定した文字列から
イベント取得時に変更したいのですが
どうやればいいんでしょうか?
0451デフォルトの名無しさんNGNG
オーナードロー
0452あNGNG
警告やな、エラーではないな。
了解。
0453bloomNGNG
http://www2.leverage.jp/start/
0454デフォルトの名無しさんNGNG
テンプレートのデフォルトパラメータにvoidを使用できないのですが
c++の決まりですか?VCの決まりですか?
template < typename T = void > class hoge 〜

template < typename T > class hoge 〜
にたいして
hoge < void > foo;は可能な様です。
0455山崎渉NGNG
(^^)
0456デフォルトの名無しさんNGNG
次からテンプレでMFC使ってるかどうかを書くように促して欲しい
0457454NGNG
ちなみにVC6のコンパイラの話です
エラーメッセージ↓
error C2182: '__formal' : 'void' 型を使って宣言されました。
0458デフォルトの名無しさんNGNG
俺できなかったな
仕方ないのでintにしてる

void *はできるかな? やってないけど
0459454NGNG
>>458
レスどうもです。
その他この他いろんな疑問(VCの不具合?)がでてきたので自分で調べる環境を整えます。
CGI作って遊んだっきりのcygwinが役に立ちそうです・・・
とりあえず立ち上げて・・・即exit。全く使い方覚えていない・・・
0460デフォルトの名無しさんNGNG
VCの不具合って、。。。まず自分のなコードを疑った方がいいよ。
0461デフォルトの名無しさんNGNG
ん〜 void* ならともかく void って実態ないでしょ。
そんなコード作る意義あるんですかね。

0462454NGNG
>>460
テンプレートについてはかなり不充分らしいです。(特にVC6)
実際ちょっとした実験コードを書いたらすぐに壁にぶち当たりました。
んで,なれないg++で実験してみました。

メンバ関数テンプレートで
class Foo {
 template <typename T> void bar(){...}
}
Foo foo;
foo.bar<hoge>();

において「<hoge>が不用です」なんて言われるのです。
g++だとOKでした。
引数でとる場合はOKなんですけどね。

class Foo {
 template <typename T> void bar( T& t ){...}
}
Foo foo;
foo.bar<hoge>();
int i;
foo.bar(i)

でも自分が間違っている気がします。
0463454NGNG
>>461
Modern C++ Design の第11章マルチメソッドに一つの例があります。
てゆうかこれを実験してみたかっただけなんですが。
LokiPortVC6版がホスィ。
0464デフォルトの名無しさんNGNG
>>457
つべこべ言わずにVisualStudio .NET 2003を待て。もうすぐ発売だ。
ANSI準拠度がかなり上がっているぞ。
0465デフォルトの名無しさんNGNG
準拠度98%だっけ?99%?
0466デフォルトの名無しさんNGNG
BITMAPINFO BmInfo;
BmInfoHed.biPlanes=1;
BmInfoHed.biBitCount=24;
for(a=0;a<16*16;a++)
{
r=rand()%64;
lpBMP[a*3]=r/16*85;
lpBMP[a*3+1]=r/4%4*85;
lpBMP[a*3+2]=r%4*85;
}
色のバイトの所を8にするとうまく色が表示されないのですが(6で足りるはずなのに)、
どうすればよいのでしょう。
0467デフォルトの名無しさんNGNG
>>466
色のバイトのところってなんじゃい。

ビットマップの構造として幅が8*nドットになるようにダミーデータが入るのと関係あるのだろうか
0468466NGNG
>>467
色のバイトの所とはBmInfoHed.biBitCount=24の所です。
再び調べてみた所、24(フルカラー)以外の場合は予め色を登録しておかなければ
ならないようです。初心者なので、質問もうまくできませんでしたが、
お答えありがとうございました。もう少し勉強してきます。
0469フルタワーが机の下に入らんNGNG
BMP ファイルの幅は 4の倍数になるようになってます。
これは x86系の CPU が 4 の倍数を計算するときだけ微妙に速くなるからです。
0470デフォルトの名無しさんNGNG
>これは x86系の CPU が 4 の倍数を計算するときだけ微妙に速くなるからです。
なんか大嘘をぶっこいている奴がいるんだがどうしよう
メモリのバス幅の問題とアーキテクチャの問題の近藤君がいるよ
0471デフォルトの名無しさんNGNG
初心者だ、見逃してやれ
0472デフォルトの名無しさんNGNG
>>468

たとえば 8 ビットカラーの場合、BITMAPINFO hoge; じゃあなくて、
LPBITMAPINFO bi = new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
てな感じで clut の分も確保して、bi->bmiColors[0...255] にそれぞれの色を入れて、
bi->bmiHeader.biClrUsed = 256; とかする。
0473あNGNG
>>466
ヘルプを見る。
ちゃんと全部かいてある。
その 6ではいけない理由もな。
0474デフォルトの名無しさんNGNG
466の突込みどころはそれだけじゃないような

lpBMP[a*3]=r/16*85;
lpBMP[a*3+1]=r/4%4*85;
lpBMP[a*3+2]=r%4*85;
の部分

p = lpBMP;
...
*p++ =r/16*85;
*p++ =r/4%4*85;
*p++ =r%4*85;
みたいにするほうがいいよ
こっちの方が速いはず
0475デフォルトの名無しさんNGNG
たいした違いはない。
0476デフォルトの名無しさんNGNG
シンボルってなんですか?
VisualStudio6.0をセットアップする時にもWindowsNT Symbol Setup が
どうのこうのというメッセージが出ますが、これをするとどうなるのですか、
しないとどうなるのですか?
OSはWindows2000です。私はVBしか使った事がなくて、これからVCをやってみようかと
思っているのですが・・・
0477デフォルトの名無しさんNGNG
最強の開発言語
http://www.borland.co.jp/delphi/personal/
0478デフォルトの名無しさんNGNG
>476
VisualC++でデバッグをするときにちょっと便利になる。
ディスク容量に余裕があるならセットアップしとけ。

…でも使ってるOSに対する正しいシンボル情報は
別途入手する必要があるかも。
まあ分からなかったら今はまだ気にしなくていい。
0479デフォルトの名無しさんNGNG
ペゾルド読んでます。

Win98/NTではすべてのスレッドが、それぞれのメッセージキューを持つ
らしいのですが、作成したスレッドにメッセージを送るにはどうしたら
いいんですか?

DWORD WINAPI ThreadFunc (LPVOID Param);

↑この関数内部で GetMessage すると、このスレッドのメッセージキューから
メッセージをGetできるってことですよね?

int WINAPI WinMain ();

の場合は hInstance を使って CreateWindow() したウインドウに対して
メッセージを送ることで、WinMain のメッセージキューに送られるみたい
ですが。

またWinMainじゃない、作成したスレッドでCreateWindow する場合は
WinMain の hInstance を使えばいいのでしょうか?
0480あNGNG
>>479
そんなあなたに WaitForSingleObject
いまなら CreateEvent が、もれなくついてきます。
0481デフォルトの名無しさんNGNG
>>479
PostThreadMessage()で送ってGetMessage()かPeekMessage()で受け取る。
この時に気を付けなければならないのは送信先スレッドにメッセージキューが
無いとPostThreadMessage()は失敗する。
CreateMessageQueue()みたいな関数は存在しないので注意。
詳しくはヘルプ参照。
別スレッドでも基本的にWinMainのhInstanceを使用する。
0482デフォルトの名無しさんNGNG
>>481
PostThreadMessage なんてのがあるんですね。
メッセージキューってすべてのスレッドで自動的に
作られるんじゃないんですか?

>>480
どうもです。こっちはペゾルドにも書いてありますた。
0483あNGNG
>>482
それは失礼しますた。

ちょっと強引だが、
Windowsでは、プロセスに自動的にメッセージが「送られて」くるが
それを 「受け取る」&「中身を見る」のは、プログラマの仕事です。
あくまでイメージね。
0484デフォルトの名無しさんNGNG
>>482
メッセージキューは自動的に作成されるが、
スレッドを生成したら自動的にメッセージキューが作成されるわけではないので注意。
ヘルプとか見ると受け取りスレッド側でAPI関数を呼べば自動的に作成されるようだが、
全てのAPI関数がそうなのかはよくわからん(藁)
一番確実なのは受け取りスレッド側でPeekMessage()を呼べはメッセージキューが作成される。
0485デフォルトの名無しさんNGNG
個人的にはPostThreadMessageはお勧めしない。
見えないウィンドウを作ってそのウィンドウにPostMessage
する方が紛れがない。
思わぬAPIがスレッドのメインウィンドウの存在を前提に
してたりする、んじゃなかったかな。
0486デフォルトの名無しさんNGNG
>>485
なるほど。つまりメッセージでコントロールするなら、
わざわざ新規スレッドで作る必要は無いってこと
なのかな。

それとも新スレ作ってもhInstanceで何かのウインドウを
作るべきってこと?
0487デフォルトの名無しさんNGNG
>>485
あ、すんません。理解しました。
ウインドウ作ると SendMessageが使えるってことですね。
0488デフォルトの名無しさんNGNG
最近プログラミング覚えようとおもったものです。
Visual Studio 6.0はあるんですが、Visual Studio NETって買う必要ありますか?
0489デフォルトの名無しさんNGNG
無いです。もうすぐVisualStudio.NET2003が出ます。
0490488NGNG
>>489
VisualStudio.NET2003は買ったほうがいいということでしょうか。
0491デフォルトの名無しさんNGNG
>>490
現状と予算と目的次第。
0492デフォルトの名無しさんNGNG
プログラミング覚えるならVS6.0で充分
0493デフォルトの名無しさんNGNG
というか覚えようと思ってる段階なのにVS6.0をすでに持ってるってのが怪しい
0494485NGNG
>>486-487
新規スレッドの先頭でCreateWindowするってこと。
まあ面倒だし、PostThreadMessageってのは
そういう面倒なことをなくすためのAPIじゃないのかって
話もあるだろうけどね。

待てよ。そこまで気にするならイベントオブジェクトを
使って自前でキューを実装した方がいいかも。
うん、そうだ。その方がいい。
0495デフォルトの名無しさんNGNG
他のプログラムの起動とともに処理を開始して、終了したら処理をとめるような
プログラムを組みたいのですが、この場合グローバルフック使ってメッセージを
監視するのでいいのでしょうか?
他にもっと簡単な方法はありますか? 諸先輩方、アドバイスお願いします。
0496山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0497山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0498デフォルトの名無しさんNGNG
厨な質問ですが、
m=objFolder.SubFolders.Count
としたとき、mにはフォルダの個数がはいるのですが、
m=objFolder.SubFolders
ならmにはなにがはいるんでしょう?
0499ネタにマジレスNGNG
>>498
ほんとに厨だな。
objFolderの型情報さえも書いてない。
MSDN調べろよ。
0500デフォルトの名無しさんNGNG
>>498
ちゃんとした参考書を1冊こなせば、
そういう質問はでてこないはず。
0501デフォルトの名無しさん NGNG
Visual C++6.0を日本橋まで意気揚揚と買いに行ったら
プロフェショナルしか売ってなかった・・・・・(しかも一店だけ)。ヽ(`Д´)ノウワァァァァン
早く.NETが使える環境になりてぇ・・・(;_;)
0502デフォルトの名無しさんNGNG
.NETなんか(゚�听)イラネ
0503デフォルトの名無しさんNGNG
Professionalでいいじゃん……
0504デフォルトの名無しさんNGNG
managedはイラネけどVC++.NET2003はホスィ。
0505デフォルトの名無しさんNGNG
MFCって進化してるの?
0506.NGNG
漏前らに質問があります。
まずは何でも良いからフォルダを開きます。
アドレスバーにはデスクトップ、マイコンピュータ、3.5インチFD、、、
と続いていますが、ここでデスクトップを選びます。
このデスクトップをプログラムで開く方法を教えて下さい。

ちなみに
C:\Documents and Settings\administrator\デスクトップ
などではありません。

環境:Win2000Pro、VisualC++6.0
0507デフォルトの名無しさんNGNG
>アドレスバーにはデスクトップ、マイコンピュータ、3.5インチFD、、、
>と続いていますが
続いていません
〜終了〜
0508デフォルトの名無しさんNGNG
>>506
言わんとすることがよく分からん。
0509.NGNG
>>507-508
ではCドライブを開いてから、Backspaceキーを2回押してください。
デスクトップが開かれるはずです。その事です。
0510デフォルトの名無しさんNGNG
>>509
>何でも良いから
とりあえずここから修正しろ
0511デフォルトの名無しさんNGNG
SHGetDesktopFolderの事か?
0512C言語GW宿題NGNG
下記の入園料金を計算するプログラムを作成しなさい。
ユーザーに大人の人数と子供の人数を入力してもらい、
大人は一人1000円、子供は300円で合計を算出し、結果を表示する。
0513デフォルトの名無しさんNGNG
ShellExecuteで
"start C:\Documents and Settings\administrator\デスクトップ "
とかそういうのじゃないだろうなあ。
厨房様は何が言いたいのかさっぱりわからん。
0514デフォルトの名無しさんNGNG
>>512
氏ね

C/C++の宿題やらせてください。おながいします
http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
0515デフォルトの名無しさんNGNG
>>514
優しいな(・∀・)
0516デフォルトの名無しさんNGNG
>>506
ttp://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip24.htm
0517デフォルトの名無しさんNGNG
VC++6でSTLを使っているのですが、コンパイル時に

 デバッグ情報で識別子が 255 文字に切り捨てられました。

というwarningがいくつもでて煩わしく思ってます。
このwarningだけ表示させないようにすることはできないでしょうか?
0518デフォルトの名無しさんNGNG
256文字以上もある識別子?あほですか?
0519デフォルトの名無しさんNGNG
//stdafx.h
#ifdef NDEBUG
#undef _STLP_DEBUG
#undef _STLP_DEBUG_ALLOC
#else
#pragma warning(disable:4786)
#define _STLP_DEBUG 1
#define _STLP_DEBUG_ALLOC 1 //or #undef
#endif
0520デフォルトの名無しさんNGNG
つーか、単なるSTLなら_STLP関係いらねーや。
0521デフォルトの名無しさんNGNG
>>517
どんな識別子使ってるんだ?
0522デフォルトの名無しさんNGNG
>>518
あほ発見
0523デフォルトの名無しさんNGNG
>>521
STLがソースの中で使ってるんだよ。
0524デフォルトの名無しさんNGNG
世の中って想像以上にあほが多いんだな
>>518 >>521
0525デフォルトの名無しさんNGNG
おまいら、C++を使うなら STL(STLPort) ぐらい嫉妬家!
0526517NGNG
>>519
それらを埋め込むことで表示されなくなりました。
ありがとうございます。
0527デフォルトの名無しさんNGNG
俺も517と同じ警告出てた
リリースモードではでないけど

519のコード埋めればいいんだね?

STLPortは知らんかった
ちょっと調べてみようかな
0528デフォルトの名無しさんNGNG
517のコード入れてみたけど相変わらず警告が
何がいけないのやら・・・
0529デフォルトの名無しさんNGNG
>>528
stdafx.hの上の方に入れてみろ。
#pragma warning(disable:4786)の一行だけでいいと思うけど。
0530デフォルトの名無しさんNGNG
>>528
何の警告よ
0531デフォルトの名無しさんNGNG
MFCアプリケーションウィザードで作った
SDIのCEditViewを使ってプログラムしてるんですが
何かちょっと編集して×ボタンを押すと
「Save changes to Untitled?」
っていうメッセージボックスがでるんですが
そのメッセージを出さないようにするには
どうすればいいんでしょうか?

0532デフォルトの名無しさんNGNG
>>531
セーブしなくて良いってこと?

■ このスレッドは過去ログ倉庫に格納されています