★初心者にVisual C++を教えるスレ★ Part25at TECH
★初心者にVisual C++を教えるスレ★ Part25 - 暇つぶし2ch1:デフォルトの名無しさん
07/01/10 00:00:39
1 : ◆Manna2uCLg :2005/04/15(金) 13:33:14
Visual C++入門者・初心者からの質問を、
お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

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

質問の仕方については次のページが大変参考になります。
URLリンク(www.hyuki.com)
URLリンク(myu.daa.jp)

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

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


2:デフォルトの名無しさん
07/01/10 00:01:18
Part24 スレリンク(tech板)
Part23 スレリンク(tech板)
Part22 スレリンク(tech板)
Part21 スレリンク(tech板)
Part20 スレリンク(tech板)
Part19 スレリンク(tech板)
Part18 スレリンク(tech板)
Part17 スレリンク(tech板)
Part16 スレリンク(tech板)
Part15 スレリンク(tech板)
Part14 スレリンク(tech板)
Part13 スレリンク(tech板)
Part12 スレリンク(tech板)
Part11 スレリンク(tech板)
Part10 スレリンク(tech板) ※
Part09 スレリンク(tech板) ※
Part08 URLリンク(pc5.2ch.net)
Part07 URLリンク(pc5.2ch.net)
Part06 URLリンク(pc5.2ch.net)
Part05 URLリンク(pc5.2ch.net)
Part04 URLリンク(pc5.2ch.net)
Part03 URLリンク(pc5.2ch.net)
Part02 URLリンク(pc3.2ch.net)
Part01 URLリンク(pc3.2ch.net)


3:デフォルトの名無しさん
07/01/10 00:04:52
【関連スレ】
■MFC相談室 mfc17d.dll■
スレリンク(tech板)l50
Win32API質問箱 Build48
スレリンク(tech板)l50
鬱だ氏のう DirectX (Part 16)
スレリンク(tech板)l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
スレリンク(tech板)l50
C++相談室 part55
スレリンク(tech板)l50
C/C++の宿題を片付けます 80代目
スレリンク(tech板)l50
【初心者歓迎】C/C++室 Ver.33【環境依存OK】
スレリンク(tech板)l50

【関連サイト】
猫でもわかるプログラミング
URLリンク(www.kumei.ne.jp)
MSDN ライブラリ ※変更された
URLリンク(msdn.microsoft.com)
URLリンク(msdn2.microsoft.com) (2005のことはこっち)
Platform SDK Update ※変更された
URLリンク(www.microsoft.com)
Google
URLリンク(www.google.co.jp)


4:デフォルトの名無しさん
07/01/10 00:05:23
【このスレの前身 VisualC++相談室 過去スレ】
part 1 URLリンク(piza.2ch.net)
part 2 URLリンク(piza.2ch.net)
part 3 URLリンク(piza2.2ch.net)
part 4 URLリンク(pc.2ch.net)
part 5 URLリンク(pc.2ch.net)
part 6 URLリンク(pc.2ch.net)
part 7 URLリンク(pc.2ch.net)
part 8 URLリンク(pc.2ch.net)
part 9 URLリンク(pc5.2ch.net)

5:デフォルトの名無しさん
07/01/10 00:40:00
>>1

6:デフォルトの名無しさん
07/01/10 07:53:59
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□派遣先の社員の意見にはたとえ間違っていても反対しない
□派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ派遣先に常駐したい


7:デフォルトの名無しさん
07/01/10 15:13:31
UIスレッドについての質問です
メインから子スレッドにメッセージを飛ばしたいのですがうまくいきません
PostThreadMessageを使い第一引数にはスレッドのm_nThreadIDを渡しています

子スレッド側のソースにはON_THREAD_MESSAGEを使って配置しています

しかしメッセージがきている様子はありませんPostThreadMessageじゃないのでしょうか?
コンパイラはエラーをだしていませんでした

8:デフォルトの名無しさん
07/01/10 15:25:58
メッセージがきている様子が無いのは何で確認したの。
メッセージループの中?

9:7
07/01/10 15:28:06
MFCなのでメッセージマップに対応した関数のところに
ブレークポイントをつけていたのですが反応がありませんでした

10:デフォルトの名無しさん
07/01/10 16:09:57
試しにPreTranslateMessageを通過してるかみてみて

11:デフォルトの名無しさん
07/01/10 16:10:06
とりあえずPostThreadMessageの戻り値を確認

12:7
07/01/10 16:22:33
PreTranslateMessageを子スレッドにオーバーライドしたんですが
PostThreadMessageのあとに通過していませんでした

13:7
07/01/10 16:52:51
virtual BOOL PreTranslateMessage(MSG *pMsg){return 1;}

子スレッドのヘッダファイルに追加したのはこれですが間違ってますか?

14:デフォルトの名無しさん
07/01/10 16:58:16
んー、、、そうなるとPostが失敗しているか、Post先が違うかじゃないのかな

15:7
07/01/10 17:03:49
PostThreadMessageの返り値は1でした
post先は子スレッドのメンバ変数のm_nThreadIDで指定するんじゃないんですか?

16:デフォルトの名無しさん
07/01/10 17:12:03
俺も初心者だけど、
PreTranslateMessageは自分で処理した時(普通に処理されたくない時)にTRUEを返すんじゃないの?
必ずreturn 1じゃ全てのメッセージを握り潰しちゃうんじゃないかな。

17:7
07/01/10 17:17:50
オーバーライドしても通過しなかったのでreturn 1も通ってないことになります

18:デフォルトの名無しさん
07/01/10 17:22:47
子スレッド側でモーダルダイアログ出してるとか

19:7
07/01/10 17:29:49
子スレッドでダイアログ等の表示はやっていません

20:デフォルトの名無しさん
07/01/10 17:32:02
メッセージキューそのものはあるんだよね?
Sleep入れながらしつこく何回か送ってみても反応なし?

21:デフォルトの名無しさん
07/01/10 17:32:12
子スレッドのメッセージループはちゃんと回ってるのか?

22:7
07/01/10 17:40:25
子スレッドのメッセージマップはこんな感じでううでしょうか?

BEGIN_MESSAGE_MAP(CWinThreadの派生クラス名, CWinThread)
ON_THREAD_MESSAGE(ユーザー定義のメッセージ,割り当てる関数名)
END_MESSAGE_MAP()

スリープをいれながらやってみましたが無反応でした
メッセージキューやメッセージループはマップに追加だけでは駄目なのでしょうか?

23:7
07/01/10 18:07:32
子スレッド(TestThread)のヘッダファイル
afx_msg void TestMssage(UINT afg, LONG aty);

子スレッド(TestThread)のソースファイル

BEGIN_MESSAGE_MAP(TestThread, CWinThread)
ON_THREAD_MESSAGE(WM_TEST,TestMssage)
END_MESSAGE_MAP()
.
.
.
void TestThread::TestMssage(UINT afg, LONG aty){}


メインソースファイル
TestThread Testes;
.
.
.
PostThreadMessage(Testes.m_nThreadID,WM_TEST,1,1);

指摘お願いします


24:デフォルトの名無しさん
07/01/10 18:10:04
子スレッドのメッセージループはちゃんと回ってるのか?

25:7
07/01/10 18:12:42
スレッドメッセージループはRunの中なのですか?
子スレッドはInitInstance()内で処理をし続けているので
メッセージループがRunにあるとすれば回っていないと思います

26:7
07/01/10 18:23:30
InitInstanceの処理中に他の処理を割り込ませることは無理なのですか?

27:デフォルトの名無しさん
07/01/10 18:34:58
UIスレッドなんだろ、なんでそんなことしてるんだ

28:7
07/01/10 18:43:49
UIスレッドでの処理中にユーザ側からポチっとなっと
スレッドのリスタートやら破棄やらいろいろしたいのです

つまり処理中に割り込んでまた初めからすぐにスタートのような感じです
フラグ変数を立てるやり方だとどこでそれがくるかわからないし反映も遅いし
ソースがフラグだらけになってしまうと思います

29:デフォルトの名無しさん
07/01/10 18:46:27
メッセージポンプはRun()の中。
InitInstance()で処理し続けちゃダメ。
初期化だけしてすぐ終われ。

30:7
07/01/10 18:51:13
>>29
そうするとRunをオーバーライドしてそこに処理を書くということでしょうか?
うーんでもRunの中はメッセージを待つのでまずいような
でもそうなると処理中は割り込めないような・・・
どうすればいいのでしょうか?

31:デフォルトの名無しさん
07/01/10 18:59:25
VisualC++6.0の入門書を読み始めました。
時代の流れに乗り遅れないためにと、始めたのですが、
VisualC++はどういうアプリケーションで使われているのでしょうか?

32:デフォルトの名無しさん
07/01/10 20:00:33
入門書から既に時代遅れな件について

33:デフォルトの名無しさん
07/01/10 20:00:37
>>30
UIを扱うスレッドで長い時間がかかる処理をする、ということ自体がダメ。
だから「UIだけを扱うスレッドを走らせよう」って発想が出て「UIスレッド」って呼ばれるのよ。

処理に割り込みなんて、自分で書かないとできない。
(TerminateProcessやTerminateThreadはDLL絡みとかで問題がある)
長い時間がかかる処理を中断させたいなら、その処理内で中断フラグをちょくちょく見るしかない。

34:デフォルトの名無しさん
07/01/11 01:33:23
先スレの992ですが
外人さんの作った、VC6のプログラムを、VC8に移植しているのですが日本語表示が上手く出来ません、
>>996の手ほどきで
1.プロジェクトのプロパティでリソースのカルチャを日本語にする
2.リソースビューでIDD_ABOUTBOXをシングルクリックしプロパティのLanguageを日本語
3.リソースビューでIDD_ABOUTBOXをダブルクリックしFontを日本語Fontに変更
間でしたのですが
4.ダイアログに適当に日本語を設定しビルドと、
>>あとPG内で_tsetlocaleはしておいたほうが無難。
とアドバイスしてくれてたのですが
_tsetlocaleで検索すると
_tsetlocale(LC_ALL,_T(""));に設定しなさいとか出てきたのですが、これってMFCの場合ですよね?

35:デフォルトの名無しさん
07/01/11 01:41:56
補足します、現在の文字コードはマルチバイトに設定しています、
コンパイラの設定を上記の変更をしたおかげで、リストビューのタイトルメニュー等は
日本語表示が出来るようになったのですが
日本語データを読込んで表示する部分で変換が出来ていません(文字化けします)
なるべく手間を掛けずに日本語表示できる方法があれば教えてください。


36:デフォルトの名無しさん
07/01/11 01:47:21
>>34
いいえ、_tsetlocaleはMFCのものではありません。Cランタイムの関数です。

37:デフォルトの名無しさん
07/01/11 01:54:27
>>36
そうですか、_tsetlocaleを使う場合何か特別なヘッダーファイルを
インストールしないとだめなのでしょうか?
_tsetlocale(LC_ALL,_T(""));こう記述すると
error C2065: 'LC_ALL' : 定義されていない識別子です。
error C3861: '_T': 識別子が見つかりませんでした
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
となるのですが?


38:デフォルトの名無しさん
07/01/11 02:07:14
>>37
#include <locale.h>です。MSDNぐらいは見ましょう。

>日本語データを読込んで表示する部分で変換が出来ていません
読み込んだデータじゃなく固定で "てきとう" を表示しようとしたら表示できます?

39:デフォルトの名無しさん
07/01/11 02:07:14
>>37
msdn 読んでくれ。

40:デフォルトの名無しさん
07/01/11 02:14:12
すみません、良く調べますそれから報告ですが
現在64個のエラーが出ているのですが、エラーのリストを秀丸に貼り付けて正規表現の置換を使って分析したら。
: error C2664: 'lstrcpyW' : 1 番目の引数を 'char [100]' から 'LPWSTR' に変換できません。
             : 1 番目の引数を 'char [100]' から 'LPCWSTR' に変換できません。
: error C2440: '=' : 'const char [1]' から 'LPWSTR' に変換できません。
の2種類だけですが解決の糸がかりになりませんでしょうか?


41:デフォルトの名無しさん
07/01/11 02:16:06
>>40
35で言ってる >補足します、現在の文字コードはマルチバイトに設定しています
があやしい。'lstrcpyW'はUNICODE用。

42:デフォルトの名無しさん
07/01/11 02:24:22
なんども、すみません
35の時点ではマルチバイトでしたが日本語変換できないので
_tsetlocale(LC_ALL,_T(""));を使うにために現在はUNICODEに設定しています


43:デフォルトの名無しさん
07/01/11 04:22:03
> _tsetlocale(LC_ALL,_T(""));を使うにために現在はUNICODEに設定しています 
悪いけど、お前さんに今の作業を完了させる事は難しい気がする。

LPCWSTR とか _T() とか、調べるべきキーワード沢山あるじゃん。

44:デフォルトの名無しさん
07/01/11 07:31:01
_tsetlocale使うのにUNICODEを設定する必要は無いと思うが。

45:7
07/01/11 10:06:05
>>33
マルチスレッドで長く複雑な処理は難しいということですか

フラグをちょくちょく見るにはソースのなかにちょくちょく
チェックするためのif文等をいれていくしかないのでしょうか?

そうするぐらいならタイマ割り込みのようなもので
スレッド側で定期的に監視させたいのですが
UIスレッドの処理中に子スレッド側で
タイマ割り込みのようなことはできるのでしょうか?

46:デフォルトの名無しさん
07/01/11 10:19:16
>>45
ワーカースレッドにしとけ

47:7
07/01/11 10:26:21
ワーカースレッドだと複雑な処理は難しいでしょう
JAVAなら割り込みメソッドがちゃんと用意されてるみたいです
URLリンク(www.javaworld.jp)

48:デフォルトの名無しさん
07/01/11 10:34:04
InitInstance内で済まそうとしてるってことは単純な処理としか思えんが・・・

49:デフォルトの名無しさん
07/01/11 10:37:28
>>47 の内容みたけど、その程度ならEvent使えば同じことできるじゃん

50:7
07/01/11 10:38:56
今のところUIスレッドから派生したクラスの中で作った
メンバ関数をInitInstance内の中で呼び出すしかないと思ってやってるんですが
初心者なので他になにか良い方法があれば教えてください

51:7
07/01/11 10:43:23
Eventは使ったことがないのですが調べてみます
参考ページがあれば教えてもらえたらうれしいです

52:デフォルトの名無しさん
07/01/11 10:49:13
つまり、ユーザーインターフェースは入力も出力も必要ない
割り込みは必要ってことでいいのかな

53:7
07/01/11 10:53:17
はい

子スレッドの状態を見るのはメイン側にメッセージを飛ばして解決しています

54:デフォルトの名無しさん
07/01/11 11:16:02
単純な処理を複雑にやりたいということか

55:7
07/01/11 11:19:17
クラスで実装しないと厳しいので単純でもないです

56:7
07/01/11 11:23:34
初期化はコンストラクタ内でやっています
InitInstanceかRunいがいに処理を置ける場所がないように見えます
処理はし続けているので単純と言われれば単純ですね

メッセージを待って処理をするタイプではないです

57:デフォルトの名無しさん
07/01/11 11:38:24
Javaの例も割り込みは自分でチェックするか例外が発生するしかないようだし
イベントの発生をチェックしては。
Sleepが絡むときはSleepのスレッド作ってそこからイベント、かなあ
最近のMFC知らんけどもっといい方法あるのかな

58:デフォルトの名無しさん
07/01/11 11:51:18
.NETのSystem.Threading.Threadを派生する感じで実装するといい。
これでスレッドとクラスが一対一になって扱いやすくなる、といいな。

MFC使ってるみたいだから、
メンバにCWinThreadのポインタと中断用のCEventを用意して、
StartでAfxBeginThreadでタスクメンバ関数を起動、
ただし、CREATE_SUSPENDEDで起動 - CWinThread.m_bAutoDelete=FALSE
- CWinThread.ResumeThread() の手順を踏んでおく。
タスクメンバ関数は中断用CEventを適時監視しつつ処理を実行する。
AbortではCEvent.SetEvent()。
JoinはWaitForSingleObjectをINFINITEで、
IsAliveはWaitForSingleObjectをウェイト0で呼び出す。
ちなみに、CWinThreadポインタの破棄は、
もう一度スレッドを起動しなおす時か、デストラクタの時だけにした方が色々楽。

中断するときは、Abort->Join呼び出しでスレッド停止待ち。
自然に完了を待つには、SetTimerのハンドラでIsAlive見て確認、ってのが一番楽。

59:デフォルトの名無しさん
07/01/11 12:20:44
何この馬鹿?
教えるだけ無駄だろ

> 25 名前:7[] 投稿日:2007/01/10(水) 18:12:42
> スレッドメッセージループはRunの中なのですか?
> 子スレッドはInitInstance()内で処理をし続けているので
> メッセージループがRunにあるとすれば回っていないと思います
>
> 26 名前:7[] 投稿日:2007/01/10(水) 18:23:30
> InitInstanceの処理中に他の処理を割り込ませることは無理なのですか?

60:7
07/01/11 12:22:41
MFCで.NETのクラスを派生ですか
どうやればできるのかわかりません
クラスの追加ウィザードからできるのでしょうか?
環境はVC++7.0です

61:7
07/01/11 12:24:50
>>59
すいません初心者なもので
あとそれは引用だけでまったく答えになっていませんよね

62:デフォルトの名無しさん
07/01/11 12:30:13
馬鹿を晒しものにしてやってるだけだから気にしなくていいよ

63:7
07/01/11 12:32:43
>>61
そうですか初心者を教えるスレで初心者相手に
馬鹿にして猿山大将気取りのなにが楽しいのか
わかりませんが気にしないことにします

64:7
07/01/11 12:33:33
>>62さんでした^^;

65:デフォルトの名無しさん
07/01/11 12:40:12
初心者ならともかく馬鹿に教えることは不可能

66:7
07/01/11 12:52:20
>>65
>>25>>26の時点では
InitInstanceの処理中に割り込みをするにはメッセージを使うのかもしれないと
思っていたのでRun関数は通っていないのでメッセージ待ちは他の場所がるのかと
勘違いしていました

この時点での初心者と馬鹿の違いを教えてもらいたいところですが
それはまたスレ違いだと思いますので
馬鹿ですいませんがVC++を教えてもらえないでしょうか?^^;

67:デフォルトの名無しさん
07/01/11 12:56:56
割り込みって書いてる時点で、Windowsアプリの知識が根本的に足りないと感じた。

68:デフォルトの名無しさん
07/01/11 12:57:11
便乗質問ですが
ワーカースレッドでは実現困難で、UIスレッドを使うべきケースが思い浮かびません。
いくつかサンプルを拾って見てみたのですが、サンプルを書くために必然性なしにUIスレッドに
しているとしか思えないようなモノばかりでした。

CWinApp以外ではどういう時に使ってます?

69:デフォルトの名無しさん
07/01/11 12:57:52
一つ聞かせて頂きたいんですけど、C++はCの上位互換ですけど
C++が出来てCが出来ない人って居るんでしょうか?

70:デフォルトの名無しさん
07/01/11 13:02:29
そうでもない

71:7
07/01/11 13:02:53
>>67
子スレッドの処理中にメイン側の合図で他の処理をすることが目的なので
割り込みと表現したのですが^^;

72:デフォルトの名無しさん
07/01/11 13:04:48
>>69
STLとboostが使えないと何も出来ない、という人はいるかも。

73:デフォルトの名無しさん
07/01/11 13:08:34
>>71
Windowsではそういうことはできない。
メッセージでも、明示的/暗黙的にメッセージを処理できる状態にしてやらないと処理できない。

74:デフォルトの名無しさん
07/01/11 13:13:38
スレッドと言いながら関数に割り込みかけてる。

75:7
07/01/11 13:19:41
>>73
できないとなるとフラグメンバ変数かシグナル状態を変えて
ソース内で定期的にif文を記述しでチェックするしかないのでしょうか
そうなると>>58さんの方法がまだ理解できてないんですが
同じような方法ということでしょうか?

76:デフォルトの名無しさん
07/01/11 13:22:22
関数の中のループに割り込みかけたいらしい。

77:デフォルトの名無しさん
07/01/11 13:24:58
winnyはC++で書かれていますが、winMXもC++で書かれているのですか?

78:デフォルトの名無しさん
07/01/11 13:37:41
>>75
フラグ変数がCEventオブジェクトになっただけ

79:デフォルトの名無しさん
07/01/11 13:45:15
>>75
普通、重たい処理はループしてるから遅いわけで、ループ一回りに掛かる時間は
ごくわずか。そのループ中に1行eventの状態チェック入れるだけ。
ループしてないのに重いとか、ループ一回りが遅いというなら75の言うとおりになるかも。

80:77
07/01/11 16:10:41
誰か知りませんでしょうか?

81:デフォルトの名無しさん
07/01/11 16:34:28
VisualStudio2003を使用してMFCでモードレスダイアログを実装しようとしています。

URLリンク(support.microsoft.com)

こちらのページを見て、そのとおりに記述しているのですが、コンストラクタ内の
Create文を通ってもダイアログが表示されません。OSはWinXPです。
問題がわかる方、またはその他の良い方法を知っている方がいましたらよろしくお願いします。



82:デフォルトの名無しさん
07/01/11 16:37:50
>>81
ダイアログのID はIDDですか?

83:82
07/01/11 16:49:15
>>81
ごめん、ちょっとやってみた。
ダイアログのプロパティでVisible をtrueにするか
new したあとで ShowWindow(SW_NORMAL) 呼んでみな

84:デフォルトの名無しさん
07/01/11 18:47:13
MFC使うなら2005Expressじゃダメですか?VC8.0あたり買ってこないとダメ?

後これといった質問はないのですが、
此処での初心者ってのはどこまでが初心者なんですか?

85:デフォルトの名無しさん
07/01/11 19:24:55
>>81
特に問題なくダイアログ表示できた

86:81
07/01/11 19:29:46
>>82
IDDでした

また、Visibleにしたところ、ちゃんと表示されるようになりました。
(今までのは作成だけされて見えていなかったということでしょうか?
タスクを見ているとメモリ使用量だけはCreateした分だけ増えていたので・・・)
ありがとうございました!

87:デフォルトの名無しさん
07/01/11 21:30:29
まあそうみたいだな。
モードレスダイアログは作りっぱなしでSHOW、HIDEするケースが多いから
ShowWindow()も試しておいたほうがいいと思うよ。

88:デフォルトの名無しさん
07/01/11 22:06:09
プログラム関連ではないのですが、質問です。
resource.hのファイル名を変更してTestResource.hとしました。
以降このファイルにリソースのdefine値を連動させておくため、
リソースファイルのincludeをresource.hからTestResource.hに変更した
まではよかったのですが、リソース変更後に保存するとなぜかinclude
先がresource.hに戻ってしまいます。これはどうしてなんでしょうか?
解決法を知っている方いましたらお教えください。お願いします。

89:デフォルトの名無しさん
07/01/11 22:10:17
変えるとなんかいいことあるの?

90:デフォルトの名無しさん
07/01/11 22:13:38
>>88
リソースビューで、xx.rcを右クリックしてインクルードファイルの設定替えればいい
つーか、ヘルプに書いてあると思うが

91:デフォルトの名無しさん
07/01/11 22:25:06
>>84
Express Edition には MFC はついてこないので
パッケージ版を購入してくるべし。

92:デフォルトの名無しさん
07/01/11 22:34:15
>90
できました、ありがとうございます。

93:デフォルトの名無しさん
07/01/11 22:36:49
>>91本当ですか。。。。所持金ヤバイのにorz2万とかムリス
アカデミはなんか無理そうだし・・・

94:デフォルトの名無しさん
07/01/11 22:55:38
>7にはこのコードをあげる。よい子は使っちゃダメだぞ。
typedef void (*throwFuncType)();
void dothrow_func(){ throw 300;}
DWORD CALLBACK threadproc( void * ){
printf("BeginThread\n");
int i=0;
try{
while(1) { i++; }
}catch( int ){
printf("\n%d: catched exception.\n",i);
}
return 0;
}
int main(){
throwFuncType dothrow_ptr = dothrow_func;
DWORD id; HANDLE hThread = CreateThread(NULL,0,threadproc,NULL,0,&id);

char t[255]; fgets(t,200,stdin);

CONTEXT context; context.ContextFlags = CONTEXT_CONTROL;
SuspendThread( hThread); GetThreadContext(hThread, &context);
context.Eip = (DWORD)dothrow_ptr;
SetThreadContext(hThread, &context); ResumeThread( hThread);
WaitForSingleObject(hThread,INFINITE);
}

95:デフォルトの名無しさん
07/01/11 23:10:33
>>93
アカデミックはスタンダード相当でMFCもきちんとあるはずだぞ。

96:デフォルトの名無しさん
07/01/11 23:28:20
>>94
こんな手があったのか。面白いけどちょっと怖いな。

97:デフォルトの名無しさん
07/01/11 23:34:16
>>95
学生じゃ無くて無理そうなのでは

98:デフォルトの名無しさん
07/01/12 13:33:06
MFCのデータベースプログラミングをしようとして
ODBCを使ってみたんですがテーブルごとにクラスが作られてしまいますが
いろいろなテーブルを取得したい場合はどうすればいいのでしょうか?

99:デフォルトの名無しさん
07/01/12 15:25:55
>>98
自分で直接CDatabaseやらCRecordsetやらをいじくればいいが、
今時ならせめてADOかOLEDBを使うのを薦める。

100:デフォルトの名無しさん
07/01/12 16:16:14
環境 VC++7.0 Windows2000

保存と取り出しができているので成功しているはずなんですが
INIファイルで保存と取り出しはできたのですが保存先がわかりません
プロジェクト名.INIで保存されてるはずのファイルがみつかりません
ファイルの検索でもひっかかりません
Windows2000だとどこか特別な場所に保存されるのでしょうか?
m_pszProfileNameもデバッグ時に確かめましたがプロジェクト名でした


ソース
m_iData1 = 20;
m_sString1 = "mojiretsu";
……

// INIファイルに情報を保存する
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileInt("ProgramData", "IntData1", m_iData1);
pApp->WriteProfileString("ProgramData", "String1", m_sString1);






// INIファイルから情報を取り込む
CWinApp* pApp = AfxGetApp();
m_iData = pApp->GetProfileInt("ProgramData", "IntData1", 0);
m_sString1 = pApp->GetProfileString("ProgramData", "String1", NULL);


101:デフォルトの名無しさん
07/01/12 16:23:00
プロジェクト名.INI に保存されるというのはどこに書いてあった?

まあ2000ならwin.ini でもなくてレジストリにマッピングされてると思うけど。

102:デフォルトの名無しさん
07/01/12 16:23:02
レジストリ?

103:デフォルトの名無しさん
07/01/12 16:25:26
>>101

ここです
URLリンク(www.alpha-net.ne.jp)

104:100
07/01/12 16:34:41
レジストリエディタから検索かけたら
プロジェクト名.iniがありましたが

これ直接編集できるんですか?

105:デフォルトの名無しさん
07/01/12 16:35:22
ええと、VC++の7.0って.NETの年数無しバージョンだっけ?
ちょっとMFCのバージョンわからんが、

InitInstance() に、SetRegistryKey(_T("アプリのキー")) というのが無いかな?
そこで指定した文字列をキーに、

\\HKEY_CURRENT_USER\Software\アプリのキー\ProgramData\IntData1 に データが入って無いか?
レジストリはスタートメニューからファイル名を指定して実行を選んで regedit と入れれば
レジストリエディタが起動する。

106:デフォルトの名無しさん
07/01/12 16:42:40
もう一つ前のバージョンだったか。
NTの時から、INIファイルをレジストリにマッピングする機能があって
INIファイルに書いてもレジストリに書き込まれる仕組みがOSにあった。
その場合は
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping
以下にできる

MFCはそれを使わずにレジストリに切り替える機能もある。
SetRegistryKey()がそれ
任意のファイルにしたければ、APIのWritePrivateProfile・・・ を使えばいいかな。

107:100
07/01/12 16:48:02
>>105
.NETの年数無しバージョンです

ありがとうございますありました

これはレジストリエディタを使わないと編集できないということなのでしょうか?



108:100
07/01/12 16:55:21
INIファイルをレジストリにマッピングする機能ですか・・・
INIファイルを普通に編集したいならWritePrivateProfileで保存しなければ
いけないんですね

ということはそれも指定してINIファイルを読み込みにいかないといけないのか

109:デフォルトの名無しさん
07/01/12 16:58:28
どうしてもファイルにしたければ、SetRegistryKey()を呼ばないで
Private の付いたAPIを呼ぶしかないかなあ、、、
でもこれ16bitWinの互換性に残ってるだけだしな。

110:デフォルトの名無しさん
07/01/12 17:11:02
MFCのiniのパスはm_pszProfileName

111:100
07/01/12 17:18:34
これだとレジストリでやったほうが簡単そうですね
ありがとうございました

112:デフォルトの名無しさん
07/01/12 17:34:12
MFCはレジストリもiniもどっちも同じ方法だし
レジストリとiniの切り替えも簡単

113:デフォルトの名無しさん
07/01/12 17:49:50
iniの場合フルパスを意識しないとならんけどな

114:100
07/01/13 14:32:27
m_pszProfileNameのパス変えて
他のにも書き込んだり読み込んだりできました

でもパス名変えるとアプリケーション終了時にOSがエラーだしてきます


115:デフォルトの名無しさん
07/01/13 14:46:11
MSDN読め

116:100
07/01/13 14:57:46
わかりました

117:デフォルトの名無しさん
07/01/13 15:44:35
VC++.NET Standard (VC++7.0)使用です

mciコマンドで音を鳴らしていたのですが、音を鳴らす時に1秒くらい固まるのでマルチスレッドにしようとAfxBeginThreadにそこらへんの処理をぶち込みました。
するとmciSendCommandにて303エラーが発生。
おそらくスレッドから呼び出したから安全性がどうのこうのといった内容だと思うのですが
これを回避するにはどのようにすれば良いのでしょうか?

118:デフォルトの名無しさん
07/01/13 15:56:12
シングルスレッドだってスレッドから呼び出してることに変わりは無いけどな
303って、MCIERR_ILLEGAL_FOR_AUTO_OPEN?
メインスレッドで自動オープンしたデバイスを別スレッドから触ろうとした?

119:デフォルトの名無しさん
07/01/13 16:38:36
エラーメッセージは「指定されたコマンドを自動的に開かれたデバイスで実行することはできません」です
メインスレッドで自動オープンしたうんぬんというのが何を指しているのかは分かりませんが
少なくともmciなんたらの命令は作成したマルチスレッド内でしか使っていません
どうやらwindowメッセージ(MM_MCINOTIFY)の受け取りを親スレッドでしているのが原因らしいです

AfxBeginThreadの中でメッセージ(MM_MCINOTIFY)の受信ってできるのでしょうか?
それとも別の方法でスレッドを作るのかな?CWinThreadとか使った事が無いけど可能ですか?

120:デフォルトの名無しさん
07/01/13 16:56:57
すみません捕捉しておきます

mop.dwCallback = (DWORD)pDoc->GetSafeHwnd();
mop.lpstrDeviceType=DeviceType[pDoc->BGMNum];
mop.lpstrElementName=midiFile;


mciErr = mciSendCommand(NULL,MCI_OPEN, MCI_NOTIFY | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD_PTR)&mop);
mpp.dwCallback = (DWORD)pDoc->GetSafeHwnd();

スレッドの中を抜粋するとこんな感じです
mci関数で曲を止める時は親ウィンドウでやっていますが、エラーメッセージが表示されるのが、ちょうどここのmciSendCommandの所なので
それ以前に親ウィンドウでmci関数の命令を呼び出していないという意味です

おそらくコールバックのハンドルはスレッドのハンドル?を渡せば良い気がしないでも無いですが
スレッド内でのメッセージ処理をCWinThread(もしくはAfxBeginThreadで呼び出したスレッド関数)で受け取る方法が分かれば解決といった感じになりそうです
以前に何か違う方法でスレッドを作っていた気がしないでもないですが、やり方を完全に喪失しておりますし
何よりもMFCを使って初プログラムしているので、なるべくどちらかで処理したいと思っております

これはMFC相談室の方に移動ですか?

121:デフォルトの名無しさん
07/01/13 17:30:56
非同期

122:デフォルトの名無しさん
07/01/14 13:06:01
全角文字を文字化けせずに、tcpで相手に送信する方法がわかりません・・・。


123:デフォルトの名無しさん
07/01/14 14:56:59
送る側と受ける側で文字コードが揃っていればとりあえずできるはず。

124:デフォルトの名無しさん
07/01/15 10:36:09
MFCでアプリケーション名を変更する方法を教えてください

125:デフォルトの名無しさん
07/01/15 11:12:56
どこで使われる名前のこと言ってるの?

126:デフォルトの名無しさん
07/01/15 11:15:49
起動したときに一番左上に表示されるところです

127:デフォルトの名無しさん
07/01/15 12:16:28
>>124
URLリンク(msdn2.microsoft.com)(vs.80).aspx

128:デフォルトの名無しさん
07/01/15 14:58:29
>>127

free((void*)m_pszAppName);
m_pszAppName=_tcsdup(_T("test"));

m_pszAppNameの中身は変わりましたが起動しても反映されてませんでした

129:デフォルトの名無しさん
07/01/15 15:26:19
それ見て表示する人がいるから
その人が表示する前に変えないとだめだな

見た目の問題ならウィンドウへ直接書いちゃった方が楽かもしれんな

130:デフォルトの名無しさん
07/01/15 15:40:31
Doc/Viewなら文字列リソースのIDR_MAINFRAMEだっけか

131:124
07/01/15 15:47:01
できました ありがとうございます

132:デフォルトの名無しさん
07/01/15 15:47:54
ちょっと興味持ったんで見てみたけど、m_pszAppNameはAfxMessageBox()のタイトルには影響するね。
IDR_MAINFRAMEはDoc/View外しても有効だね。

結局、動的に替えるなら自分でSetWindowText()したほうがいいのか

133:デフォルトの名無しさん
07/01/16 14:24:45
すいません、先月はじめたばかりなのですが、デバッガの使い方がさっぱり判りません。
適当に買った本で勉強して、言葉は理解できるのですが内容までは判らないのが現状です。
よろしければ実際にサンプルコードを用いながら解説しているサイト等教えていただけないでしょうか?
特に、スッテプイン、ステップオーバー、スッテプアウトが鬼門です。

134:デフォルトの名無しさん
07/01/16 14:27:14
連続で失礼します。特にforの繰り返し構文を用いたときのデバッガの使い方が知りたいです。
よろしくお願いします。

135:デフォルトの名無しさん
07/01/16 14:31:23
>>133
その、「スッテプイン、スッテプアウト」とやらは何物だ?

それはさておき、これくらい知っておけばなんとかなるだろ。
StepIn:関数に踏み込む
StepOver:関数に踏み込まずに次(の行)を踏む。
StepOut:関数から抜け出す
BreakPoint:停止する行を指定

136:デフォルトの名無しさん
07/01/16 15:12:27
最初は適当な変数に目を付けてウォッチしながらステップ実行してるだけで
いろいろわかるとい思う

137:デフォルトの名無しさん
07/01/16 18:40:28
>135
はい、日本語としては判るのですが、なんというかこう感覚として身についていないというか
どうも雲をつかむような感じがして会得できていないのです。

>136
ありがとうございます。自分で適当にコードを書いていろいろと試してみます。

138:sage
07/01/17 00:15:37
こんばんは。
↓のファイルをC++としてコンパイルしたいのですが、クラス宣言のところでエラーになってしまいます。
/TPオプションは付けています。
こういう場合、他に設定するところがあるんでしょうか?
以上よろしくお願いします。


//ファイル名:main.c
#include <stdio.h>

class test{
public:
void func1(){
printf("func1\n");
}
};

void main(){
test obj1;

obj1.func1();
}


139:デフォルトの名無しさん
07/01/17 00:31:52
VC8なら通ったよ

140:138
07/01/17 00:40:25
>>139
私はMicrosoft Visual C++ 2005を使って、空のプロジェクトに
>>138のmain.cを追加して作りましたが通りませんでした。
変えたオプションとかありますか?

141:デフォルトの名無しさん
07/01/17 00:47:57
/TPだけです。

たぶんプロジェクトのプロパティでは/TPになってて
ソースのプロパティでは/TCになってるんじゃないかな。

142:デフォルトの名無しさん
07/01/17 00:49:54
ところで、それなんて嫌がらせ?

143:138
07/01/17 00:52:07
>>141
できました!
プロパティってソースごとに設定できるんですね...
ありがとうございます。

144:デフォルトの名無しさん
07/01/17 08:08:53
>>138
C++のコードを書くなら拡張子をcにするなよ。

145:デフォルトの名無しさん
07/01/17 10:19:01
リストコントロールを一番下までスクロールさせたくて、
↓こんな処理をやっているのですが、もっとスマートな方法はないでしょうか?

CListCtrl m_lstInfo;
CSize size;

size.cx = 0;
size.cy = 100000; //100000以上の高さだったらどうする?
BOOL bRet = m_lstInfo.Scroll(size);


開発環境:WinXp、VC++6.0
です。

146:デフォルトの名無しさん
07/01/17 10:58:02
>>145
EnsureVisible使ったら?

147:145
07/01/17 11:22:13
>>146
できました!
ありがとうございます。

148:デフォルトの名無しさん
07/01/17 14:20:32
仮想リストビューにチェックボックスつけたいのですが
表示されるところまではなんとか行ったのですが
SetCheckまでも自分で実装しなければなりません。
初心者である自分には異常に難しいのですが
他にいい方法は無いでしょうか?

149:デフォルトの名無しさん
07/01/17 16:36:20
仮想モードで表示まで完成してるならSetCheckは不要。
もしユーザーのマウス/キーボード入力に反応しないってこと言ってるなら
それはSetCheckとは無関係。両イベントから内部状態変更&アイテム再描画
をかけるだけ。

150:質問1
07/01/17 19:26:42
↓のようなエラーが出ます。
d:\abstract2bad\abstract2bad\abstract2bad.cpp(40) : error C2248: 'basepair::getkey' : protected メンバ (クラス 'basepair' で宣言されている) にアクセスできません。
d:\abstract2bad\abstract2bad\abstract2bad.cpp(20) : 'basepair::getkey' の宣言を確認してください。
d:\abstract2bad\abstract2bad\abstract2bad.cpp(7) : 'basepair' の宣言を確認してください。
d:\abstract2bad\abstract2bad\abstract2bad.cpp(45) : error C2248: 'basepair::getvalue' : protected メンバ (クラス 'basepair' で宣言されている) にアクセスできません。
d:\abstract2bad\abstract2bad\abstract2bad.cpp(18) : 'basepair::getvalue' の宣言を確認してください。
d:\abstract2bad\abstract2bad\abstract2bad.cpp(7) : 'basepair' の宣言を確認してください。




151:デフォルトの名無しさん
07/01/17 19:27:42
自己解決しました

152:デフォルトの名無しさん
07/01/17 19:28:22
そのまんまの意味じゃん

153:質問1(続き)
07/01/17 19:29:04
ソースを次に書きます。

/* 派生クラスで純粋仮想関数をオーバーライドするプログラム */
#include <iostream>
#include <string>
using namespace std;

// basepair抽象クラスの定義
class basepair {
// デフォルトコンストラクタの使用を禁止する
basepair() {}
protected://① A
//public://① B
// データメンバ
string key, value;
// 引数をとるコンストラクタ
basepair(const char *pstrkey, const char *pstrval)
: key(pstrkey), value(pstrval) {}
// getvalue()メンバ関数を定義する
const char *getvalue() { return value.c_str(); }
// getkey()メンバ関数を定義する
const char *getkey() { return key.c_str(); }
// keycomp()純粋仮想関数を宣言する
virtual int keycomp(basepair &rp) = 0;
// valcomp()純粋仮想関数を宣言する
virtual int valcomp(basepair &rp) = 0;
// getpairvalue()純粋仮想関数を宣言する
virtual const char *getpairvalue(const char *pstrkey) const = 0;
// getpairkey()純粋仮想関数を宣言する
virtual const char *getpairkey(const char *pstrval) const = 0;
};
//(以下に続く)

154:質問1(続き)
07/01/17 19:29:40
// mypair派生クラスの定義
class mypair : public basepair {
public:
// 引数をとるコンストラクタ
mypair(const char *pstrkey, const char *pstrval)
: basepair(pstrkey, pstrval) {}

// keycomp()純粋仮想関数に独自の実装を行う
virtual int keycomp(basepair &rp) {
return strcmp(key.c_str(), (rp).getkey());// ② A エラー箇所40行目
// return strcmp(key.c_str(), static_cast<mypair &>(rp).getkey());// ② B
}
// valcomp()純粋仮想関数に独自の実装を行う
virtual int valcomp(basepair &rp) {
return strcmp(value.c_str(), (rp).getvalue());// ③ A エラー箇所45行目
// return strcmp(value.c_str(), static_cast<mypair &>(rp).getvalue());// ③ B
}
// getpairvalue()純粋仮想関数に独自の実装を行う
virtual const char *getpairvalue(const char *pstrkey) const {
if (key == pstrkey) return value.c_str();
else return NULL;
}
// getpairkey()純粋仮想関数に独自の実装を行う
virtual const char *getpairkey(const char *pstrval) const {
if (value == pstrval) return key.c_str();
else return NULL;
}
};
//(以下に続く)

155:質問1(続き)
07/01/17 19:30:31
int main() {
// mypairクラス型の配列を作成する
mypair mp[] = { mypair("358-0015", "さいたまけんいるましにほんぎ"),
mypair("500-8165", "ぎふけんぎふしおいまつちょう"),
mypair("272-0034", "ちばけんいちかわしいちかわ"),
mypair("060-0000", "ほっかいどうさっぽろしちゅうおうく"),
mypair("670-0974", "ひょうごけんひめじしいいだ"),
mypair("770-0874", "とくしまけんとくしましみなみおきのす")
};

if ( mp[5].keycomp(mp[1]) )
{
cout << "mp[5]とmp[1]のKeyは異なる\n";
}
else
{
cout << "mp[5]とmp[1]のKeyは同じ\n";
}

if ( mp[5].keycomp(mp[5]) )
{
cout << "mp[5]とmp[5]のKeyは異なる\n";
}
else
{
cout << "mp[5]とmp[5]のKeyは同じ\n";
}

getchar();

return 0;
}

156:質問1(続き)
07/01/17 19:35:54
コンパイルを通すには②、③で、rpはキャストすればいい(それぞれ、A→B)ようですが、
これって、static_castがベストでしょうか?




157:質問1(続き)
07/01/17 19:38:46
dynamicだと問題があるでしょうか?

以上です。

158:デフォルトの名無しさん
07/01/17 20:33:15
basepair の、公開メンバっぽいものを全て protected にしてる所に問題があると思うよ。

あと、スレ違い臭

159:デフォルトの名無しさん
07/01/17 21:16:54
>>158
>basepair の、公開メンバっぽいものを全て protected にしてる所に問題があると思うよ。
ご回答ありがとうございます。

>あと、スレ違い臭
今まで気づきませんでした。すみません。

これにて私の質問は終えたいと思います。

160:デフォルトの名無しさん
07/01/18 16:01:37
垂直スクロールバーを矢印キーで動かして値を変化させることはできますか?
たとえばバーが2つあって「↑↓」で1つ目を増減させ、「←→」で2つ目を増減させるとか。
今はSB_LINELEFT等を使ってマウスで動かしてます。

161:デフォルトの名無しさん
07/01/18 16:16:03
楽勝できる

162:デフォルトの名無しさん
07/01/18 16:54:01
>>161
片方しか動かせないんですよ。お兄ちゃんおせーてください。

163:デフォルトの名無しさん
07/01/18 21:28:45
ヘッダファイルってどこに保存すればいいのですか?

164:デフォルトの名無しさん
07/01/18 22:28:07
どこでも好きなところにどうぞ

165:デフォルトの名無しさん
07/01/18 23:00:27
>>164
学校の宿題で、ヘッダファイルをDLして、プログラムを書くらしいのですが、
どのフォルダに追加していいのか分かりません。

左のヘッダーファイルのフォルダに追加したのですが、
「include ファイルを開けません」
「'gucc.h': No such file or directory」と出てしまいます。
gucc.hはヘッダーファイルの名前です。

visual C++ 2005を使っています。

166:デフォルトの名無しさん
07/01/18 23:10:43
ではもう一度

どこでも好きなところにどうぞ


その代わり、インクルードパスの指定はしっかりしてください


それすらわからんなら全部まとめて同じ場所に保存しとけ


それでもダメなら先生に教わっておいで

167:デフォルトの名無しさん
07/01/19 00:27:32
それでもダメなら俺とディープキスしろ

168:デフォルトの名無しさん
07/01/19 00:38:58

         _,,..,,,,_   _,,..,,,,_
        ./     ヽ /   ヽ
       l   ・ωl lω・   l
       `'ー--┳━┳---‐´


         _,,..,,,,_   _,,..,,,,_
        ./     ヽ /   ヽ
       l    ,,・3,,-ω-,, l  ~♪
       `'ー--┳━┳---‐´

169:デフォルトの名無しさん
07/01/19 16:52:13
開発環境:WinXp、VC++6.0

リストコントロールの水平スクロールバーが表示されているかどうか判定する方法ってありますか?

170:169
07/01/19 17:43:34
自己解決しました。

if(GetScrollLimit(SB_HORZ) > 0)

171:169
07/01/19 17:53:34
開発環境:WinXp、VC++6.0

また行き詰ってしまったので、再度質問です。

リストコントロールの選択アイテムが、可視部の何番目が選択されているかというのは分かりますでしょうか?


下図の例で言うと、垂直スクロールバーが表示されているリストコントロールで、
矢印の行が選択されていた場合、インデックス値は2ですが可視部だけなら1ということで、
その1という値を求めたいということです。


<例図>(『あ』はインデックス0番目のアイテムだが、スクロールによって見えてない。)

 (あ)
   ―――
  |い      ∥
→|う■■■■∥
  |え      ∥
  |お      ∥
  |――― 

172:デフォルトの名無しさん
07/01/19 18:04:05
リストコントロールはそんな使い方を想定してはいない。

173:デフォルトの名無しさん
07/01/19 18:08:50
>>171
m_list.GetCurSel() - m_list.GetTopIndex()

174:デフォルトの名無しさん
07/01/19 18:29:01
>>173
GetCurSelはリストコントロールにはなかったですけど、出来ました!
ありがとうございます。

m_list.GetSelectionMark() - m_list.GetTopIndex()


175:デフォルトの名無しさん
07/01/19 21:05:11
VC++.net「Windowsフォームアプリケーション」において、MFCにおけるBitBlt関数のように
画像をpictureboxから別のpictureboxに部分コピーする方法がわからないのですが
何か良い方法はないでしょうか。

176:デフォルトの名無しさん
07/01/19 21:16:24
DrawImageじゃだめかな

177:デフォルトの名無しさん
07/01/19 21:22:28
System.Drawing.Graphics.DrawImageで頑張ってください
BitBlt使う方法もあるけどな

178:デフォルトの名無しさん
07/01/19 21:24:32
>>176
レスありがとうございました。どうもそれでできそうです。
VC++はMFCとかWINDOWSフォームとか、それぞれ勝手が違うのでちょっと困ってました。
もうちょっと参考書買い足してみることにします。

179:デフォルトの名無しさん
07/01/19 21:25:15
>>177
ありがとうございます。
あとsage忘れました。ごめんなさい。

180:デフォルトの名無しさん
07/01/19 21:40:41
すみません、プログラムの実行時(=作成するプログラム)に
外部実行ファイル(=既存のプログラム)を起動するにはどうしたらよろしいでしょうか?

181:デフォルトの名無しさん
07/01/19 21:51:50
猫でもわかるプログラムを見たんですが
わからない俺は猫以下なんでしょうか…

182:デフォルトの名無しさん
07/01/19 21:56:34
>>180
ShellExecute
>>181
あそこの猫は特別優秀らしい

183:デフォルトの名無しさん
07/01/19 21:59:58
>>182 なるほど
とりあえず何を勉強したらいいんですかね?
目標はゲームを作ることなんですが


184:180
07/01/19 22:13:36
>>182
できました~
調べ物が多くて参ってたので助かりました
ありがとうございました。

185:175
07/01/19 23:40:14
>>177
すいません。windowsフォームでBitBltを使う方法ってどんなのでしょうか。
Drawimageだと画像の「部分」を取り出すことができませんでした。
(画像全体が、取り出したい部分サイズに縮小されてしまいました。
DrawImageUnscaledAndClippedメソッドというのもあるようですが、自分のバージョンは古いらしく対応していないようでした。)
度々すいません。

186:デフォルトの名無しさん
07/01/20 00:22:48
あなたには功夫、じゃなくて努力が足りないわ
DrawImageメソッドには描画元の領域指定できるのも用意されている。よく探せ。

187:175
07/01/20 00:42:09
>>186
ありがとうございます。
もっと粘ってみますね。

188:デフォルトの名無しさん
07/01/20 00:44:34
オーバーロードが30個もあると気が滅入る。

189:デフォルトの名無しさん
07/01/20 08:54:49
MSDNくらい見れんのかと

190:デフォルトの名無しさん
07/01/20 12:22:27
パイだっけ

191:デフォルトの名無しさん
07/01/20 13:17:20
ピクチャボックスに縮小された線の色をピクセル単位ではなく、ドット単位で検出するAPIってありますか?


192:デフォルトの名無しさん
07/01/20 13:21:27
ピクセル単位とドット単位の違いは何?

193:デフォルトの名無しさん
07/01/20 13:50:30
志村~

194:デフォルトの名無しさん
07/01/20 22:07:35
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。

MSDN見てヘッダ関係かと思ったんですが#includeはきっちりしてあるのにエラーが・・・
#include <stdlib.h>
#include <stdio.h>

int Main(int argc, _TCHAR* argv[])
{
printf("test\n");
return 0;
}

なんかしょうもないボカやってる悪寒が

195:デフォルトの名無しさん
07/01/20 22:08:49
フォルダの中にあるファイルを指定して、そのファイルをifstreamで開く、という風にしたのですが、どうしたらいいのでしょうか?

196:デフォルトの名無しさん
07/01/20 22:19:11
プリコンパイル済みヘッダーがないじゃん

197:デフォルトの名無しさん
07/01/20 22:30:35
>>196すみません
stdafx書き込むの忘れてました

弟がstdafx.hを弟がソリューションから消したのが正解でした・・・・
返してくれ俺の3時間orz

198:デフォルトの名無しさん
07/01/20 23:02:12
>>195
プログラムの利用者はどうやってフォルダの中にあるファイルを指定するのか。

199:デフォルトの名無しさん
07/01/21 16:01:47
論理ペンの作成がうまくいかないので、どなたか指南していただけますでしょうか。
SelectObject(hdc,CreateFont(20,0,0,0,
FW_DONTCARE,
FALSE,FALSE,FALSE,
SHIFTJIS_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
"Arial Black")
);
こんな感じで論理ペンを作成したのですが、
どうあがいてもArial Blackではないフォントで描画されてしまいます。
どうしてArial Blackで描画させたいのですがどうすればよいでしょうか・・・

200:デフォルトの名無しさん
07/01/21 16:16:16
ソレはペンではないし、オブジェクトは漏れてるし、

201:デフォルトの名無しさん
07/01/21 16:41:15
思い通りにならないならGetLastError&FormatMessageなりで何か起こってないかなど調べるくらいしなさい
後別にVCの使い方関係ないし、Win32APIスレで聞いた方が良い

202:デフォルトの名無しさん
07/01/21 17:19:53
今度会社でVC6で開発をしなくてはならなくなりました、社内ではVC6が現役でガンガッテいます
漏れ的には無料のVC8の方が格別に使いやすいのですが、ライセンスの関係でVS2005の
無聊版は使えないらしいのです、仕方なく会社のVC6をコッソリ家に持って帰り
インスコしてSP6を当てマスタそして
VC6で開発する時の注意事項などあれば教えてホスイ

203:デフォルトの名無しさん
07/01/21 17:28:04
特にない

204:デフォルトの名無しさん
07/01/21 17:32:33
質問です。
Windowsフォームアプリケーションで、

String *data=S"aaaaa";
if(data->Substring(1,1)==S"a"){text1->Text=S"ok";}
if(data->Substring(1,1)!=S"a"){text1->Text=data->Substring(1,1);}
このような構文を走らせたところ、text1には変化なし、
しかしtext2には"a"と表示されてしまいました。

一体なにがいけないのでしょうか?

205:デフォルトの名無しさん
07/01/21 17:48:42
>>202
注意事項:コッソリ持って帰らない

206:デフォルトの名無しさん
07/01/21 17:49:45
>>202
テンプレート使いまくりの変態プログラミングは諦めろ。
付属のSTLもかなり怪しいし、boostは駄目かもしれん。

207:デフォルトの名無しさん
07/01/21 17:52:39
>>204
Substringということは.NETか
C++で.NET使ったこと無いんだが、なんだその「S」は?
まぁそのSが何のつもりか知らんが、その比較演算はC++としてありえない

208:デフォルトの名無しさん
07/01/21 17:55:55
text2はどこから沸いてきたのか

209:デフォルトの名無しさん
07/01/21 18:08:30
>>202
御社名を教えていただければ、開発に当たっての様様なノウハウをお教えするに吝かではありません。
#尤も、MSに密告しない保証は致しかねますが。

210:デフォルトの名無しさん
07/01/21 18:27:35
>>202です
そうですねこっそり持って帰るのはイクナイノデアンインストールして明日会社に返します。
本棚の隅に1999年に買って一度も目を通したことの無かった
SHOEISHAの「プログラミング学習シリーズ山本信雄 著 VisualStuidio C++」
を開いてみたら
char s(80);
lstrcpy(s, "おはようございます。");
ってなってマスタ、
char s(80);は今日日ねーべなと思い
char s[80];
で動きマスタ
昔のVS6はchar s(80);でもコンパイルエラーでなかったのかな??
因みに漏れはSP6を家で堂々と当てたのでエラーになったのだと思う
C99はchar s(80);これでもOKだったのかい??


211:204
07/01/21 19:05:40
String::Equals(s1->Substring(1,1),"a")でできました。
ありがとうございました。

212:デフォルトの名無しさん
07/01/21 19:45:44
>>210
おそらく本の誤植。
ちなみにC++でchar s(80);はコンストラクタ引数を与える構文になるが、charは組込型なのでchar s = 80;と同じ意味になる。

213:デフォルトの名無しさん
07/01/21 21:01:52
プログラムを作れという課題を出されたのですが、どのようなプログラムを作ればいいか全く検討もつきません。

一応、課題の例は出されたのですが、ちょっと無理かなと思いまして・・・

例は、
・駐車場のパーキングシステム
・飛行機の搭乗席を予約するシステム
・マトリックスを計算する電卓
・ブラックジャック
・ポケットゲーム
などです。

この他になにかアイディアはありませんでしょうか。
宜しくお願いします。

214:デフォルトの名無しさん
07/01/21 21:19:34
>>213
お前死ね
お前が無理ではないと思うプログラム作ったらイイジャマイカ
答え
お前死ね

215:デフォルトの名無しさん
07/01/22 11:21:38
どのスレで質問していいのかわからないのですが、このスレで失礼します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 7
main ()
{
int a[100]={0,5,2,4,6,1,3,7};
int i,x,j;
clock_t ts,te;
double p;
for(i=1; i<=N; i++) a[i]=rand();
ts=clock();
for(i=2; i<=N; i++){
x=a[i]; a[0]=x;
j=i-1;
while(a[j] > x){
a[j+1]=a[j];
j=j-1;
}
a[j+1]=x;
}
te=clock();
p=(double)(te-ts)/CLOCKS_PER_SEC;
for(i=1; i<=N; i++) printf("%d ",a[i]);
printf("\n");
}
という挿入法のプログラムを作り、整列アルゴリズムのデータ個数と処理時間の平均値を用いたのですが、整列手前等で、ある条件下では処理時間が入れ替わることがあるんです。
その理由をお教えください。よろしくお願いします。


216:デフォルトの名無しさん
07/01/22 11:43:04
どの位変わるのか判らんが、現在のPCとOSで必ず同じ時間になる保証はどこにもないよ。
ましてその程度のコードだと、初回とそれ以降ではキャッシュの乗りが確実に違うだろうし。

217:デフォルトの名無しさん
07/01/22 18:19:47
レスどうもです。
説明不足でした。すみません。
PCとOSで必ず同じ時間になる保証はどこにもないのは知ってます。
上記のプログラムで、ある条件下では処理時間が入れ替わることがあるという部分(理由)はあるでしょうか?
お教えください。

218:デフォルトの名無しさん
07/01/22 18:23:30
「入れ替わる」ってどういう意味だ?

まさかとは思うが、CLOCKS_PER_SECの関係でばらつきがでることを問題視したいのだろうか。
例えばCLOCKS_PER_SECが100msなら、110msの処理時間は100msと表示されることも200msと表示されることもあるわけだが。

219:デフォルトの名無しさん
07/01/22 18:33:56
具体的に書いてくれないとわからんな

220:デフォルトの名無しさん
07/01/23 04:40:35
若いの オラが村では派遣労働の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にするとムキになって怒る者がおるでよぉ
問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな民度ゼロの会社で現実忘れるためはよ
北朝鮮と一緒でよ、駄目のものを駄目と言ってはなんねえだべさ
タブーを口にしちゃいけねぇだ


221:お願いします
07/01/23 23:25:07
プログラムを実行したところ、

LINK : fatal error LNK1249: イメージのベース アドレスが 400000、
サイズが 0x7FFEF000 で、最大範囲を超えています。

というエラーが出るのですが、この最大範囲を大きく変更するには
どうすればいいのですか。

よろしくお願いします。

222:デフォルトの名無しさん
07/01/23 23:54:14
リンカオプションの/LARGEADDRESSAWAREを試せ。
だめだったら64bit化しろ。

223:デフォルトの名無しさん
07/01/24 08:05:37
Kitty on your lap
という言葉をよく見かけるのですが、これはUNIX系でいうhoge foo varと
同じような意味なんでしょうか?

224:デフォルトの名無しさん
07/01/24 08:57:19
同じ質問をどこかで見たな…
とりあえずその文でぐぐってみれ。

225:デフォルトの名無しさん
07/01/24 12:17:04
なんかのゲームなのでしょうか。
ホームページ作者の趣味なんですね。

226:デフォルトの名無しさん
07/01/24 16:14:01
よく見かけませんよ

227:デフォルトの名無しさん
07/01/24 18:27:38
キティちゃんをあなたのサランラップで包んでください

228:デフォルトの名無しさん
07/01/24 19:32:57
すいません、教えてください。
VC6.0で作ったプロジェクトを2005に移行することになりました。
型変換や標準関数の変更でガンガンエラーはでるものの、なんとか修正してきましたが、
COMのインターフェースの定義で、oledb.hに書かれているものと同じ名前の
インターフェースを使用していたのですが、2005に移行したらインターフェース名を
変更しないと使用できなくなりました。
名前を変更すればビルドはできるものの、今まで使えていただけに2005でも
何かすれば使えるのではないかと思っています。
どうにかヒントでも頂ければ幸いです。

229:デフォルトの名無しさん
07/01/26 02:04:48
WindowsXP,VC2005です。
ユーザーにコマンドライン引数を決めさせたいとき
どのようにすればいいでしょうか?
下のようにするとハングしてしまいます。

#include <iostream>
 using namespace std;

int main(void)
{
char str[100];
char str2;

cout << "引数を入力してください"<<endl;
cin >> str2;
sprintf(str,"test.exe %s",str2);
system(str);
return 0;
}

230:デフォルトの名無しさん
07/01/26 02:26:42
>>229
>下のようにするとハングしてしまいます。
str2はcharなのに書式指定子に%sを使っているから。

231:229
07/01/26 02:39:56
ありがとうございます。
とりあえず
char str2[64];
としたところ正常に動きました。

232:デフォルトの名無しさん
07/01/26 08:36:19
ラジオボタンを2つ用意して、片方をチェックしたらもう片方の
チェックするようにするには、GroupBoxを使うと教えられました。
radioButtonMen,radioButtonWomenの2つのラジオボタンをグループボックスの
上に配置した時に生成されたコードの一部分が↓です。

どのメンバ変数を見れば、どちらをチェックしたかというのがわかるの
でしょうか?


//
// groupBox1
//
this->groupBox1->Controls->Add(this->radioButtonMen);
this->groupBox1->Controls->Add(this->radioButtonWomen);
this->groupBox1->Location = System::Drawing::Point(197, 194);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(200, 45);
this->groupBox1->TabIndex = 24;
this->groupBox1->TabStop = false;
this->groupBox1->Text = L"groupBox1";

this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();


233:デフォルトの名無しさん
07/01/26 18:22:23
C++/CLIで、プログラミングを始めたばかりです。
(VS C++2005の環境)
フォームにボタンやテキストボックスを配置してビルドすると、
ソースが勝手に追加/削除されたり編集されたりします。
その更新されていくソース・プログラムを見ていて思ったんですけど、
Visual C++でWindowsプログラミングをする場合、
通常プログラマは、
クラスの関連(継承とか)をあまり意識しないんでしょうか?

メンバ変数を用意することってあまりないでしょうか?

あと、普通のC++のコンテナ(vectorやlist)は使用されませんか?

234:デフォルトの名無しさん
07/01/26 18:27:34
別に普通に使ってるだろ。
VC++の操作がわかんなかったら手書きでもいいし

235:デフォルトの名無しさん
07/01/26 19:14:23
VC8ではコンパイルする時にDebugモードとReleaseモードの選択が出来たのですが
VC6では出来ないのでしょうか?
Debugモードしか見当たりません・・・・・


236:デフォルトの名無しさん
07/01/26 19:24:43
少しは調べてから質問しよう

237:デフォルトの名無しさん
07/01/26 21:12:11
>>236
>>235ですが
「Vc6 Release」で検索しても分からなかったんですが


238:デフォルトの名無しさん
07/01/26 21:16:12
ツールバーのあたりで右クリックして「ビルド」をチェックで出るよ

239:デフォルトの名無しさん
07/01/26 21:19:25
MSDNに書いてないわけがない

240:デフォルトの名無しさん
07/01/27 00:35:43
Inside Windows買っとけ

241:デフォルトの名無しさん
07/01/27 02:41:48
将棋プログラムを作っています。
すべての種類の駒が描かれている1枚のビットマップから
一部を切り出して(読み込んで)オブジェクトにするには
どうしたらいいでしょうか?
一つずつ別ファイルを用意しないとだめ?

242:デフォルトの名無しさん
07/01/27 07:26:34
>>238
ありがとう


243:デフォルトの名無しさん
07/01/27 13:30:33
VS2005 MFCシングルベースで、

CDC *pDC = GetDC();
AfxBeginThread(ここがわからない);

とメインの中に記述して、マルチスレッドでfunを使って、
funの中でpDCを↓のように使いたいのですが、どうすればいいでしょうか。

void fun(){
  pDC->TextOutW(10,10,_T("aaa"));
}

244:デフォルトの名無しさん
07/01/27 13:33:03
MFCオブジェクトをスレッド間で受け渡してはいけない

245:デフォルトの名無しさん
07/01/27 13:44:20
>>244
そうなんですか・・・。
では、マルチスレッドのfunの中でpDCを使いたい場合はどうすればよろいのでしょうか。

246:デフォルトの名無しさん
07/01/27 13:49:29
馬鹿登場

247:デフォルトの名無しさん
07/01/27 13:58:14
>>245
ハンドル渡せば。
でもいろいろ面倒だから、描画関係はそのウィンドウが属するスレッドでやって
描画に関係ない処理を別スレッドでやる方がいいと思うけど。

248:デフォルトの名無しさん
07/01/27 14:16:57
キチガイにスレッド

249:デフォルトの名無しさん
07/01/27 14:50:03
>>244

なんで?
MSDNのサンプルでもMFCオブジェクトのポインタ渡してるよ。
まーpDCを渡すのはやばいけどね。

250:デフォルトの名無しさん
07/01/27 16:36:24
>>249
ハンドル-オブジェクトのテーブルがスレッド固有とかいろいろ。
詳しくはこの辺
URLリンク(msdn.microsoft.com)

251:デフォルトの名無しさん
07/01/27 17:37:52
>>250
注意点や、危険性とその回避方は書いてあるが >>244 のようなことは書いてないぞ。
非MFCスレッドでは出来ないと書いてあるけど。

252:デフォルトの名無しさん
07/01/27 17:45:10
>>251
>As a general rule, a thread can access only MFC objects that it created.

253:デフォルトの名無しさん
07/01/27 17:50:29
それは明らかにWindows Handle Mapsの説明でしょ。

254:デフォルトの名無しさん
07/01/27 17:54:52
>>253
>This is because temporary and permanent Windows handle maps are kept in thread local storage to ensure protection from simultaneous access from multiple threads.
HDC等もハンドルマップを持ってるから、同様な問題があるよ。

255:デフォルトの名無しさん
07/01/27 18:05:32
>>253
Windows Handle -> HANDLE, HWND, HDC, SOCKET…
Window Handle -> HWND

256:デフォルトの名無しさん
07/01/27 18:10:37
いや、そういうのは分かってるよ...

257:デフォルトの名無しさん
07/01/27 18:30:41
そもそも、別のスレッドから描画をする必要があるか、考え直したほうが良いな。

258:243
07/01/27 19:11:33
1秒ごとに1文字づつTextOutWで文字を表示していくプログラムを作るつもりなんです。

for(i=0;i<10;i++){
  pDC->TextOutW(0,0,_T("aaa"));
  Sleep(1000);
}

で、それを処理させながら他の処理ができるようにしたいのです。
こんな安易な考え方からスレッドを使おうとすることが間違いなのでしょうか。
OnTimerを使う方法以外で何かよい方法がありましたら是非教えてください。
それとも、やはりOnTimerを使うしかないのでしょうか。

259:デフォルトの名無しさん
07/01/27 19:13:56
タイマー使うのが一番簡単な方法だと思うが

260:243
07/01/27 19:15:21
>>259
了解しました。 ご回答ありがとうございました。

261:デフォルトの名無しさん
07/01/27 19:29:47
キチガイにふりまわされて真面目にレスしてたやつかわいそう

262:デフォルトの名無しさん
07/01/27 19:33:48
キチガイにスレッド

263:デフォルトの名無しさん
07/01/31 01:17:06
縦横のサイズを500で、ピクチャボックスの中には線が描かれており、、それを1600まで拡大して、
そのピクチャボックスの中の線の色を変更したり、線を書き足したりして、
書いたものを崩さずに任意のサイズまで縮小したんですけど、どうしたらいいのでしょうか?

できれば、500から1600に拡大して線を描くまでの過程を裏で処理できるようにしたいんですけど、
できるでしょうか?

264:デフォルトの名無しさん
07/01/31 08:40:51
BYTE byte[4] = {0XFF,0XFF,0XC1,0XC1};
DWORD dword;
でbyte⇔dword間で変換をしたいのですが
byte[0]から見て行って変換するしかないのでしょうか?


265:デフォルトの名無しさん
07/01/31 08:43:29
dword = *(DWORD *)byte

ただしエンディアンに注意

266:デフォルトの名無しさん
07/01/31 09:37:14
ワンリトルツーリトルスリーリトルエンディアン

267:デフォルトの名無しさん
07/01/31 12:15:09
エンディアン嘘付かない

268:デフォルトの名無しさん
07/02/01 00:43:04
>265-267

ありがと。リトルエンディアンになることに気をつける

269:デフォルトの名無しさん
07/02/01 05:09:18
【環境】
WinXP HomeEdition
Visual C++ 2005 Express Edition

『ねこでもわかるWindowsプログラミング』で勉強を始めたんですが
本に書いてある通りのプロジェクトの作成ができません。

テンプレートに「Win32 プロジェクトがありません」
アプリケーションウィザードで「Windowsアプリケーション」を選択できません。
ビルドしてもwindows.hが無いとエラーが出ます。

そもそもWindowsアプリケーションが作れないようになっていると感じるのですが
ExpressEditionではこれらの操作はできないのでしょうか?

270:デフォルトの名無しさん
07/02/01 05:18:46
>>269
ExpressEditionではPlatformSDK入れたら使えるみたい

271:デフォルトの名無しさん
07/02/01 07:46:13
いま、「スタンダードVC++」を買おうかなと思ってるんですが、本のなかの開発環境が.NETなんですが、覚えたことは2005でも使えますか?

272:デフォルトの名無しさん
07/02/01 08:27:51
>>271
使えるよ

猫でも級に内容が豊富で、EEでも一発でコンパイルが通るサイトがそろそろ欲しいな
でも俺が作ったら、どうしてもIDE関連やプロジェクトの設定で長々と語ってしまって、先に進めないんだよなー



273:デフォルトの名無しさん
07/02/01 08:56:49
無料だからやりはじめた初心者と
いままでVCやってた人のギャップが激しすぎる。
C#でもやってりゃいんだよ

274:デフォルトの名無しさん
07/02/01 08:59:09
シャープに決めるぜ

275:デフォルトの名無しさん
07/02/01 09:53:14
FindFirstFileで探したファイルをifstreamでファイルを開きたいんですけど、
どうしたらいいんでしょうか?

276:デフォルトの名無しさん
07/02/01 10:50:58
FindFirstFileでファイル名取れるだろ

277:デフォルトの名無しさん
07/02/01 10:53:45
URLリンク(msdn.microsoft.com)
FindFirstFile サンプル付

278:275
07/02/01 13:42:01
WIN32_FIND_DATA lp;
char pass[500] = "C:\\Documents and Settings\\abcde\\デスクトップ\\program\\適当\\DATA\\abc.txt";
HANDLE h = ::FindFirstFile(pass, &lp);
if(h != INVALID_HANDLE_VALUE){
ifstream in(lp.cFileName)
if(in){
m_list.InsertString(-1, lp.cFileName);
}

というふうにしたんですけど、ファイルの名前は取れるんですけど、
ファイルが開きません。
どこがまちがってるんでしょうか?

279:デフォルトの名無しさん
07/02/01 14:48:31
>>278
lp.cFileNameにどういうファイル名が取れてるか調べればわかるだろう

280:デフォルトの名無しさん
07/02/01 14:56:19
あっ できました!
ありがとうございました!

281:デフォルトの名無しさん
07/02/01 15:03:28
VC++7.0 MFCでメインウインドウを閉じたときに
全ての後処理開放処理の時間がかかるときがあるアプリケーションが
あると思います。そこで終了処理をある程度表示させて確認したいのですが

なにか良い方法はありますか?

282:デフォルトの名無しさん
07/02/01 15:14:44
どうだろ、、、WM_CLOSEとかDESTROYあたりでイベント作って
そのイベントとメッセージをWaitForMultipleObjectsで待ちつつメッセージループ作って
イベントがシグナルになったら閉じる処理の続きとかどうだろう

283:デフォルトの名無しさん
07/02/01 16:26:15
>>281
スプラッシュウィンドウ

284:デフォルトの名無しさん
07/02/01 17:58:31
スプラッシュマウンテン

285:デフォルトの名無しさん
07/02/01 18:10:28
スプラッシュムービー

286:デフォルトの名無しさん
07/02/01 22:14:03
VC++.NET2003 Windowsフォームを使用して開発しています。

1画面でかなり多くの数のコントロールを貼り付けているのですが、
デザイン画面を開くとき重くて時間が掛かっています。
また、Releaceでコンパイルしようとすると30分掛かっても終わりません。。
解決策はあるのでしょうか。

1画面で多くのコントロールを表示する理由は、
画面を切り替えずに複数の画面(?)を表示させるという仕様になっているからです。
今はパネルでコンテナ化し、各画面を出したい時にパネルの表示・非表示を
切り替えているのですが、正直限界です。

良い方法があればぜひ教えて下さい。

287:デフォルトの名無しさん
07/02/02 08:05:43
メモリを増やす

288:デフォルトの名無しさん
07/02/02 08:16:12
お母さんに相談する。

289:デフォルトの名無しさん
07/02/02 08:49:20
メモリは1ギガなんですけど・・・
それでも足りないとなると、他の人に委託しずらい等、
色々支障が出てくると思います。
それに、2ギガに増やして早さが倍になっても、
やっぱり遅い気がします。。

290:デフォルトの名無しさん
07/02/02 09:16:16
それはメモリの問題ではなくてCPUが余りにも余りにもなんではないだろうか。

291:デフォルトの名無しさん
07/02/02 10:23:42
でも1GBと2GBでは段違いの差が出る

292:デフォルトの名無しさん
07/02/02 10:49:16
数ヶ月前に購入したマシンなので、環境を変える事はできないです。
そこまで最新のマシンでなければ動かせないのは
やはりおかしいと思うんです。

画面を分け、あたかも1つの画面で動くように見せるという方法がありましたので、
それでやってみたいと思います。
ありがとうございました。

293:デフォルトの名無しさん
07/02/02 11:47:33
コントロール並べすぎなのがわるいと気づけ

294:デフォルトの名無しさん
07/02/02 12:31:10
それはもちろん分かってました。
だから、それ以外の方法があれば教えて欲しいと思い、
相談させてもらったのですが、、、。

295:デフォルトの名無しさん
07/02/02 12:40:13
コントロールが問題になるほど多数あるということは、それらの配置には規則性があるはずだ。
だとすれば、ポトペタせずに自前で生成すればいい。

296:デフォルトの名無しさん
07/02/02 19:54:33
うーん。
規則は、ある部分もあるのですが、
画面10枚分ぐらいのコントロールを1つのフォームで配置してるので
自分で書くのはちょっとしんどいですね。。
変わる可能性大ですし。

結局、ユーザーコントロールを画面分用意してやる事にしました。

297:デフォルトの名無しさん
07/02/02 23:51:25
……多いと思った段階で分けようって思わないもんかね。

298:デフォルトの名無しさん
07/02/03 00:14:14
MFC,SDIでCEditViewを使ってファイルから読み込んだ結果を
エディットボックスに表示しようと考えています。

表示の仕方は下記です。
void CtestView::setEditBox(char *str){
CEdit &edit = GetDitCtrl();
edit.SetWindowText(str); }

ファイルを読み込んで処理した結果をstrに入れるという感じです。
メニューのファイルオープンから読み込んだ場合は下記の
処理でいけるんですが・・・

CtestView *pView = ((CtestView*)(((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView()));
pView->setEditBox(str);

実行ファイルにファイルをドロップして起動させた場合、
ドキュメントの
BOOL CtestDoc::OnOpenDocument(LPCTSTR lpszPathName)
に入るようですが、ここから上記のsetEditBox()を呼び出してもエラーに
なります。
原因は起動時でまだViewが出来ていないことであることは分かっているのですが、
どのタイミングで呼び出せばよいのか分かりません。

どうすればよいのでしょうか?

299:デフォルトの名無しさん
07/02/03 00:51:59
>>298
新しいドキュメントを開いたあとは必ず
void CtestView::OnInitialUpdate()
が呼び出されるので、そこで
setEditBox(GetDocument()->GetYourString());

300:デフォルトの名無しさん
07/02/03 06:22:59
ファイル読んで表示が終わってからもう一回表示しなおし?
読むときに処理すればいいのでは?

301:デフォルトの名無しさん
07/02/03 07:40:52
>>299
今環境がないので試せないですが、そのタイミングでは必ず
ビューが作成されているんですか?

>>300
読むときに処理すればいいんですが、アイコンにドロップして
起動させた場合はタイミングによってビューが作成されていないので
エラーになるんです。

302:デフォルトの名無しさん
07/02/03 07:44:51
表示しなおしじゃなく、299をやった上で

> CtestView *pView = ((CtestView*)(((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView()));
> pView->setEditBox(str);

は当然削除だろ。個人的にはCtestDocにCtestView.hをincludeするのは、やってはいけない事だと思う。

303:デフォルトの名無しさん
07/02/03 07:48:31
>>301
ドキュメントを読んだあとにビューを更新するために用意されているメソッドだし
当然ビューは存在してるよ。

304:298
07/02/03 08:20:28
>>303
分かりました。
ありがとうございます。

305:デフォルトの名無しさん
07/02/03 09:14:25
>>272ありがとん

306:デフォルトの名無しさん
07/02/03 09:54:09
>>270
ありがとうございます。

せっかく教えて頂いたのにアレなんですが、インストールしようとしたところ
ちょっとCドライブの空きが足りなかったのでしばらくは秀丸とbccでやってみます。

307:いーぶいしー
07/02/03 16:42:45
クライアント(.exe)から
自分で作成したDLLに定義されているClassのpubicなメンバ変数に、アクセスしたい場合、
そのメンバ変数が構造体だと、その構造体の定義はクライアント側にも必要なのでしょうか?
定義を一箇所(DLL側のみ)にはできないのでしょうか?

308:デフォルトの名無しさん
07/02/03 16:49:16
>>307
もちろん必要、共通でinlcudeする*.hファイルに定義しておく。

C++/CLIのrefクラス、ref構造体は例外だけど

309:デフォルトの名無しさん
07/02/04 01:12:51
二色刷りで動物の絵が表紙にデカデカと書いてある本を探しているのですが、
何方かこの本の題名を知らないでしょうか?
なんでも辞書みたいな感じの本で延々とコードが書いてあるらしいのですが。

あとみなさんはどのような本で勉強していますか?
ちなみに僕は学校の授業でやったもののほぼ未経験です。

310:デフォルトの名無しさん
07/02/04 01:52:01
> 動物の絵が表紙にデカデカと書いてある本
沢山あるぞ。好きなのを選ぶが良い。
URLリンク(www.oreilly.co.jp)

> どのような本
一冊で完結なんて出来ないんだから
自分の目的にあった本を
(良い意味で)適当に買いつづけていけばいいと思うよ。

↓参考
推薦図書/必読書のためのスレッド PART33
スレリンク(tech板)l50


311:デフォルトの名無しさん
07/02/04 18:14:46
すいません。御存知の方がいたら教えてください。
環境:Windows XP,VC++6.0 「_MBCS」指定
Windowsのアプリを作っているのですが、リストビューの部分のみにUnicode文字のデータを表示
させたいので以下のようにリストビューの部分のみワイド文字仕様の構造体を使用しています。
リストビュー設定部のソース
static HWND hList;
LV_COLUMNW lvcol;LV_ITEMW item;
InitCommonControls();
hList = CreateWindowExW(0,WC_LISTVIEWW, L"",WS_CHILD | WS_VISIBLE | LVS_REPORT,
0, 0, 300, 200,hWnd,(HMENU)ID_LISTVIEW,hInst,NULL);
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvcol.fmt = LVCFMT_LEFT; lvcol.cx = 100;
lvcol.pszText = L"項目1"; lvcol.iSubItem = 0;
ListView_InsertColumn(hList, 0, &lvcol);

item.mask = LVIF_TEXT; item.pszText = L"内容1";
item.iItem = 0;item.iSubItem = 0;
ListView_InsertItem(hList, &item);
これで実行すると、リストビュー部に表示される文字が全て16進で表示されてしまいます。
正常に「項目1」,「内容1」で表示させる方法は、無いのでしょうか?
ListView_InsertColumnの部分のヘッダファイルを見ると
#define ListView_InsertColumn(hwnd, iCol, pcol) \
(int)SNDMSG((hwnd), LVM_INSERTCOLUMN, (WPARAM)(int)(iCol), (LPARAM)(const LV_COLUMN FAR*)(pcol))
となっているから無理なのかな?よろしくお願いします。


312:デフォルトの名無しさん
07/02/04 18:39:30
>>311
とりあえずListView_InsertColumn中のSNDMSGがSendMessageAになってる。
LVM_INSERTCOLUMNもAつきのほうだし。
マクロは全滅なきがする。

313:311
07/02/04 21:09:25
>>312
ありがとう。
やっぱプロジェクト自体をUnicode仕様にするしかないのかな?
>マクロは全滅なきがする。
マクロ以外で実現する方法ってあるの?


314:311
07/02/04 21:25:03
とりあえず以下のように自分でマクロを作ってみたらうまく表示できた。
#define ListView_InsertColumn_W(hwnd, iCol, pcol) \
(int)SendMessageW((hwnd), LVM_INSERTCOLUMNW, (WPARAM)(int)(iCol), (LPARAM)(const LV_COLUMNW FAR*)(pcol))
これだけで問題ないんだろうか?


315:デフォルトの名無しさん
07/02/04 21:38:50
>>311-312
SNDMSGは単にSendMessageとして定義されているから、
当然プログラム全体をUNICODE化すればマクロがそのまま使えるんだ。

逆に言えばSendMessageがSendMessageWになりさえすればいいわけだから、
UNICODEとしてマクロを使いたい部分の前にこれ、
#pragma push_macro("SendMessage")
#undef SendMessage
#define SendMessage SendMessageW
後に#pragma pop_macro("SendMessage")を置けばいけると思う。
push_macro/pop_macroがVC6でも使えるかどうかは知らないけど。

316:311
07/02/04 22:00:59
>>315
ありがとう。
#pragma push_macro("SendMessage")
#undef SendMessage
#define SendMessage SendMessageW
InitCommonControls();


item.mask = LVIF_TEXT; item.pszText = L"内容1";
item.iItem = 0;item.iSubItem = 0;
ListView_InsertItem(hList, &item);
#pragma pop_macro("SendMessage")
上記のように修正してみたが、コンパイルは通ったが、表示結果は16進のままだった。
VC++6.0では、push_macro/pop_macroが使えないのかもしれない。
>>314に書いた方法でやってみます。
ありがとう。


317:298
07/02/06 07:43:06
OnInitialUpdate() で実行することが出来ました。
もう一つ教えてください。
エディットボックスなどのコントロールの初期化処理を
したいのですが、どのタイミングでやればいいんでしょうか?

WM_CREATEではまだコントロールが作成されていません。
OnInitialUpdate() では問題ないのですが、最初の一度だけと
いう訳にはいきません。

static BOOL flag;
を使ってifで判定して最初だけ実行すれば出来たのですが、
もっとスマートな方法はありますでしょうか?

318:デフォルトの名無しさん
07/02/06 08:54:09
OnInitialUpdateは最初の一度という意味

319:デフォルトの名無しさん
07/02/06 10:39:28
>>317
Documentが変わってもView内のコントロールの位置やサイズが変わらない
タイプのアプリの場合は、自分もOnInitialUpdateでstaticなフラグ使って
一回だけやってる。特に問題ないと思うけど。

これ以上はアプリ形態と初期化内容が判らない限り何ともいえない。

320:デフォルトの名無しさん
07/02/06 16:24:36
ヘッダファイルに変数を追加するだけで
アプリケーション起動時にOSがエラーを出してくることがあります
もう一つ二つ意味のない変数を追加すれば治ることもあるのですが
これはどうしてなのですか?変数追加だけなので
プログラムの中で使ってもいません名前も被っていないです
どんな変数でもこの症状が起こるときは起こります

321:デフォルトの名無しさん
07/02/06 16:28:09
領域外アクセスとかのバグが変数追加で表面化したんだろ

322:デフォルトの名無しさん
07/02/06 16:29:38
つまり他の変数になにか問題があるということですか?

323:デフォルトの名無しさん
07/02/06 16:41:35
Runtime Error!
Program:_xxxxxxxxxxx ←exeの場所
abnormal program termination

こんな感じで表示されます
今回は他の変数を追加しても直りません
助けてください。アクセス外ということは文字列かなにか
静的に領域をとってる配列等が原因なのでしょうか?

324:デフォルトの名無しさん
07/02/06 16:48:23
文字列20文字もいらない文字の領域を200にしたらいけました
うーん無駄に領域を確保すれば直るなんて謎だ

325:デフォルトの名無しさん
07/02/06 16:54:18
謎っつーか、メモリの管理がすげー甘いんじゃなかろうか
一度きっちり調べ直してみることをお薦めする

326:デフォルトの名無しさん
07/02/06 17:14:52
すいません独学なんですがメモリ管理では
全てのメンバ変数にdeleteをしたほうがいいのでしょうか?

327:デフォルトの名無しさん
07/02/06 17:19:11
newしたものにはdelete、new[]したものにはdelete[]。
逆にnewしていないものにdeleteは要らない。

ただし可能な限り、std::vectorなどnew[]/delete[]を隠匿したものを使ったり、
boost::shared_ptr/arrayやboost::scoped_ptr/array、std::auto_ptrなど、
せめてdelete/delete[]だけでも隠匿して使うようにすべき。

328:デフォルトの名無しさん
07/02/06 17:22:56
文字列などは配列で静的に確保しないほうがいいのでしょうか?
newで動的確保するべきなのですか?

329:デフォルトの名無しさん
07/02/06 17:26:58
大量にバッファを必要とするのならともかく、
そうでないのなら静的確保で十分

330:デフォルトの名無しさん
07/02/06 17:30:17
私はその他のオブジェクトもnewで動的確保はしていませんでしたので
deleteを使うところが見当たりません
原因は全て静的にしているせいなのでしょうか?

331:デフォルトの名無しさん
07/02/06 17:36:36
いまだにdllの仕組みが理解できません。
猫でものホームページ見ながら作ってみたんですが
dllを作った時のヘッダを含めて
かつその時出来たlibファイルを
#pragma comment(lib,"~.lib)
か、リンカの設定でリンクしないと使えないのは
libを通してやらないと、dll内の関数を呼び出すことは出来ないと
いう事なんでしょうか。
LoadLibraryを使っても意味無かったので、よくわからないです。
どなたか教えて頂ければ幸いです。

VS2005というIDE環境で勉強してるから楽出来てる分その楽
出来ている理由が解って無く勉強不足になってると自らは思います。


332:デフォルトの名無しさん
07/02/06 17:41:21
>>330
「静的」「動的」の意味が分かっていないような気がする。

コードの中で
  int i;
  char String[80];
とかやるのが「静的確保」。これらの変数は実行ファイルがメモリ上に
ロードされた時点で既に存在していて、終了と同時に消滅する。
グローバル変数だろうが(クラスの)メンバ変数だろうがそれは同じ。
したがって delete/delete[] は必要ない。

333:デフォルトの名無しさん
07/02/06 17:48:03
>>331
LoadLibraryで読み込んだDLLの関数を呼び出すには、
GetProcAddressで関数のアドレスを取得するんだよ。

334:デフォルトの名無しさん
07/02/06 17:49:34
>>331
VS2005で「DLLを作る」と言ったときには自動的にLIBファイルも作られるけど、
この2つは完全に別種のもの。中身は一緒、ただ使い方が違う。

LIBファイルは静的リンク用のファイル。
自分の実行ファイルの中に(コンパイルの時点で)取り込んでしまって、
あたかも自分の書いたコードと同じように使えます、というもの。
だからLIBを組み込むときにはリンカなり#pragmaなりで予め設定をして、
コンパイルのときにリンクすることを明示しなければならない。

DLLは動的リンク用のファイル。
一般的には、まずLoadLibrary()でDLLファイルを読み込み、
(そこでもし成功したなら)次にGetProcAddress()で
DLLの中に埋め込まれた関数を取り出して使う、
最後にFreeLibrary()でDLLを自分のプログラムから取り外す、
という段取りを踏む。
コンパイル時には存在しなくても構わない、実行時にあればいい。

335:デフォルトの名無しさん
07/02/06 17:55:16
>>332
うーんということは私が知らず知らずのうちに
どこかで動的確保しているということでしょうか?

336:デフォルトの名無しさん
07/02/06 18:02:34
>>334
>VS2005で「DLLを作る」と言ったときには自動的にLIBファイルも作られるけど、 
このLIBはインポートトライブラリ。
LoadLibraryやらGetProcAddressやらメンドクサイ処理をしてくれる短いモジュール。
これを静的にリンクすればDLLの呼び出しが簡単に出来る。
インポートトライブラリがあるなら極力使ったほうが楽。

337:デフォルトの名無しさん
07/02/06 18:05:31
インポートトライブラリ
インポートトトライブラリ
インポートトトトライブラリ

338:320
07/02/06 18:12:06
スレッドオブジェクトの配列をグローバル変数にしてるんですが
これはまずいですか?せめて原因をつきとめたいです

339:デフォルトの名無しさん
07/02/06 18:12:57
>>335
動的確保はスタックに積むケースとnewやmallocなどでヒープから確保するケースがある。
静的確保はstaticで定義した場合(明示的にstaticをg使わないケースも含む)
クラス内のメンバー変数はクラスがどう生成されたかによる。

>>336
誤字をさらにコピーしてしまったか、インポートライブラリだな。


340:331
07/02/06 18:44:51
>>333さん
>>334さん
>>336さん
ご教授ありがとうございました。
GetProcAddress()FreeLibrary()ってのも必要なんですね。
それと、dll作った時のlibはインポートライブラリなんですね。
「プログラムはなぜ動くのか」って本を読んだにもかかわらず
流し読みで頭に入っておらず再読したらちゃんと書いてありました。
はぁ、馬鹿だな俺って。

341:デフォルトの名無しさん
07/02/06 19:56:07
SendMessageであるウィンドウにDボタンを送りたいのですが、
SendMessage(hwnd,
このあとをどうすればよいのでしょうか。
ご教授願います。

342:デフォルトの名無しさん
07/02/06 20:06:34
>はぁ、馬鹿だな俺って。
それに気がつくことができれば、今後はもっと「馬鹿」じゃなくなるでしょう。
そうやって向上できる人間が、「賢い」のです。
#で、「ご教示」ですね。

>>320
ソース公開しちゃった方が話が早そうですね。

343:デフォルトの名無しさん
07/02/06 20:07:43
>>341
Dボタンってなんですか?
マウスクリックのイベントを送りたいなら、Spy++でどういうパラメータを渡せばいいか覗いてみると宜しいかと。

344:317
07/02/06 21:25:08
>>319
フラグを使うのは普通なんですね。
ありがとうございました。

345:デフォルトの名無しさん
07/02/07 00:17:13
>>320
いろいろ言われてるけど、とりあえず
配列利用時に、添え字がオーバーアクセスしてないか確認するべし。

> 原因を突き止めたい
デバッガを上手に利用しましょう。
ある特定のメモリ空間にアクセスした時にbreakかけることも出来たはず。
詳しくは「ブレークポイント」をMSDNで調べてくれ。

346:デフォルトの名無しさん
07/02/07 00:59:43
基礎的すぎる質問なんですが、


ダイアログエディタで適当にあれこれコントロールを張ったとき、
VC++2003でビルドしたプログラムを98SEで走らせると、

コントロールのマルチバイト文字がすべて文字化けする。
エディットボックスに直接マルチバイト文字入れても同じく。
メニューバーやステータスバーは文字化けしない。

文字はTCHAR系統を使い、ビルドした結果はすべてwchar_tになっているはず。


このような状況で、文字化けさせない用にする方法を教えてくださいませんでしょうか?

347:デフォルトの名無しさん
07/02/07 01:47:02
9xはUNICODE対応していないから、MSLUを使うか非UNICODEにするかしないとだめだよ。

348:デフォルトの名無しさん
07/02/07 02:07:28
2000とXPは内部コードはUnicodeだけど98とかはどうなんだろう。
localeまわりかな?Unicode適応しないでビルドしたらSJISになっていけるのかな?

349:デフォルトの名無しさん
07/02/07 02:23:29
>>347
なるほど…
わかりました。
ありがとうございました。

350:デフォルトの名無しさん
07/02/07 09:03:22
>>346
マルチバイト文字(列) と ワイド文字(列) の意味を
使い分けられて無い気がするぞ。

マルチバイト文字列は char* で
ワイド文字列は wchar_t* だ。

351:デフォルトの名無しさん
07/02/07 10:14:21
そもそもダイアログでコードページ932で作ってたりして

352:デフォルトの名無しさん
07/02/07 10:18:25
クラスのメンバ変数についての質問です
グローバル変数としてビュークラスの外で宣言したクラスの
メンバ変数は0や空文字で初期化されてるんですが

そのクラスをビュークラスのメンバとして宣言するとそのクラスの
メンバ変数が初期化されないのはどうしてですか?

353:デフォルトの名無しさん
07/02/07 10:26:03
>>352
C++スレ行くか
C++の入門書でも読んで勉強してください

354:デフォルトの名無しさん
07/02/07 10:31:05
>>353
わからないんですね

355:デフォルトの名無しさん
07/02/07 10:36:05
入門書にしっかり書いてある

356:デフォルトの名無しさん
07/02/07 10:39:04
スレリンク(tech板)
ではここで教えてください

357:デフォルトの名無しさん
07/02/07 11:03:34
グローバル変数はコンパイル時に場所が決まってるから

358:デフォルトの名無しさん
07/02/07 16:30:17
というより、C/C++の規格でそうなると定められているためと言ったほうがいいと思う。

359:デフォルトの名無しさん
07/02/07 16:33:10
どうだろね。
仕組みから入ったほうが、そう決まってるからそうなんだ、より納得いくかもしれんし

360:デフォルトの名無しさん
07/02/07 17:01:56
実装がそうだからそれが正しいという保証はどこにもない

361:デフォルトの名無しさん
07/02/07 17:25:43
逆にこれは実装が先にあって仕様が追いついた例でもあるな。
構造体のコピーも似たようなもの。

362:デフォルトの名無しさん
07/02/07 18:49:23
VC++7.0でライブラリファイルをリンクする方法を教えてください
winsockライブラリを使いたいのでお願いします

363:デフォルトの名無しさん
07/02/07 19:23:53
#pragma comment(lib, "Mswsock.lib")

364:269
07/02/08 08:10:55
269です。たびたび申し訳ありません。

SDK入れてWindowsアプリが作れるようになったんですが、ダイアログやアクセレータ等の
リソーススクリプトファイル(.rc)をエディットするResEditorがついてないみたいなので断念しそうです。
というかそれが目的だったので。
Windowsフォーム(.h)は作れるみたいですがどうしていいのかわかんないです。

Visual Studio 2005 Academic Editionだったらリソーススクリプトファイル(.rc)の作成は可能でしょうか?
可能ならば購入したいと思います。よろしくお願いします。

365:デフォルトの名無しさん
07/02/08 10:01:56
MSに訊け

366:デフォルトの名無しさん
07/02/08 10:07:23
>>363
ありがとうございます


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch