■ VisualC++(MFC限定)相談室 3■

このエントリーをはてなブックマークに追加
1MFC
VC++.NETになったって、MFCも使う所存!
■ VisualC++(MFC限定)相談室 ■
http://pc.2ch.net/test/read.cgi/tech/989902845/

■ VisualC++(MFC限定)相談室 2■
http://pc.2ch.net/test/read.cgi/tech/1008031675/
3II:02/02/19 03:45
WinIIk
4デフォルトの名無しさん:02/02/19 09:10
4!
5デフォルトの名無しさん:02/02/19 12:49
MFCでは動的にボタンを作った場合
イベントはどうして取ればいいのでしょう?

ON_BN_CLICKED(IDC_XXXXX, OnXXXXX)
↑こんな風に書けないしって事なんですけど。
^ `
VC++のエディタ上でが空白文字のとこに現れるようになったんだが、
どうやったら消せる?
7修正:02/02/19 12:56

VC++のエディタ上で
^ `
が空白文字のとこに現れるようになったんだが、
どうやったら消せる?


8修正:02/02/19 12:59
VC++のエディタ上で
~~~~~
が空白文字のとこに現れるようになったんだが、
どうやったら消せる?
>>8
Ctrl+Shift+8
10 :02/02/19 13:21
thanks
>>5

 生意気に答えてみます。
マクロ
ON_COMMAND(IDC_XXXXX,OnXXXXXXX)
を定義してハンドラ
void CXXXXXX::OnXXXXXXX()
を作成。もちろんヘッダでは
afx_msg void OnXXXXXXX();
を定義。これでどうでしょう。ぜんぜん的外れな回答でしたら
スミマソン
>>5
なんで書けないの?
手動で書けばいいじゃん。
>5
自分で書いたものは //{{ ... }}// の外に置くように。
さもないとClassWizardがパルプンテをくらう。
なつかしいなおい!<パルプンテ
CreateSolidCaretで作成したカレットを、点滅じゃなく点灯表示
させる方法ありますか?
16MFC わけわか:02/02/19 22:38
ちょっと基本を教えてくれ〜〜〜。
MDI で、CxxxDoc と CxxxView ってクラスを作って。例えば、CxxxDoc でファ
イルを読み込んだら読み込んでいる状況を CxxxView に表示したいんだよ。
とりあえず、CxxxDoc でワーカスレッド作って適当な時に、CxxxDoc の状態を
更新して、UpdateAllViews(NULL); って呼べば、CxxxView の OnUpdate()
が呼ばれて表示を更新...、と思ったけどやってみたらアプリケーションエラー
になるんだよ。で、HELP 読んだら「たとえば、あるワーカー スレッドで計算を
行ってから、ドキュメント オブジェクトのメンバ関数 UpdateAllViews を呼び
出して、新しいデータに対するビューの収容先ウィンドウに反映させることはで
きません。」とそのものずばりのことが書いてあんだよ。

で、対処としては「第 1 の方法は、ワーカー スレッドに C++ オブジェクトを
渡さずに HWND などのハンドルを個別に渡す方法です。」と「もう 1 つの方法
は、ワーカー スレッドが処理するタスクごとに新しいユーザー定義のメッセー
ジを作成し、このメッセージを ::PostMessage 関数を使ってアプリケーション
のメイン ウィンドウに渡す方法です。」って書いてあんだけど、HWND 等のハン
ドルってどのハンドル渡しゃいいんだ ? CxxxDoc か ? CxxxView か ?
また、::PostMessage で送ったメッセージを CxxxView で受けるにゃどうすりゃ
いいんだ ?
> HWND 等のハンドルってどのハンドル渡しゃいいんだ ?
この場合はDocかな。

> ::PostMessage で送ったメッセージを CxxxView で受けるにゃどうすりゃ
手動でハンドラを追加する
>>11が参考になるかも。
18デフォルトの名無しさん:02/02/19 23:43
>>17
すまん、もう少し教えてくれ。Doc って、CxxxDoc のことだよね。これには、
HWND はないんだが...。(CxxxView なら、CWnd が m_hWnd 持ってんだけ
ど。) なんか、HWND を取り出す関数とかあるのかな ?
すまんViewだ。
>18
第2の方法(アプリケーションにPostMessage)で行くのなら、
第1の方法(HWND渡して云々)は関係ないだろ。
まあ、この場合、スレッドにViewのウィンドウハンドルを渡して
そこにメッセージを投げさせるのが妥当だろうけど。
21デフォルトの名無しさん:02/02/20 00:08
メモリの確保と開放について質問があります。
例えばクラスの中の関数でこのような感じで
CBrush *CB = new CBrush(theApp.GetProfileInt(theApp.version,_T("TextBkColor"),0));
return (HBRUSH)CB->m_hObject;
newしてその値を返すとき、この*CBをdeleteすることが
できませんが、これはこのままでいいのでしょうか?
それともポインタではなく変数を利用してdeleteすべきでしょうか?
22デフォルトの名無しさん:02/02/20 00:29
>>19
さんくす、でけたよ。
でも MFC のアーキテクチャーがよくわからん。これは、一つの CxxxDoc
に対して、CxxxView が一個だけだから良いけど、複数の CxxxView があ
るときは、その数分 HWND 渡すしかないのかなぁ。
23デフォルトの名無しさん:02/02/20 00:35
>>22
安心したまえ。ドキュメント/ビューアーキテクチャで悩んでいるのは君だけではない。
しかし、大事なのはドキュメント/ビューアーキテクチャは使うことを「強要されない」って事だ。

実際、DocとViewをきっちり使い分けてるやつが何人居るやら。
24デフォルトの名無しさん:02/02/20 00:49
>>21
リークします。
return CB;
じゃだめ?

>>23
>大事なのはドキュメント/ビューアーキテクチャは使うことを「強要されない」
否定はしないが、D/V/Fが完全に分離した設計も腕が上がれば、可能。
この場合、コードの冗長性とパフォーマンスに疑問を感じるが、今のCPUパワーで
なんの問題もない。
データ保持と、そのデータの操作は、CDocに徹する。
CViewは、CDocの内容のレンダリングに徹する。
ただし、CDocの作りはヘボいので注意。

25デフォルトの名無しさん:02/02/20 00:55
>24
やっぱりリークするんですね。
struct HBRUSHを返したいのですが
では変数でやってみようと思って
CBrush CB = CBrush(theApp.GetProfileInt(theApp.version,_T("TextBkColor"),0));
このようにしてみたましたが、これは出来ないみたいですね。

本来
return (HBRUSH)GetStockObject(WHITE_BRUSH);
こうなっていたのをこれだと細かい色指定ができないなあと
思って今の形にしたのですが・・・
どうしたらよいでしょう?
26デフォルトの名無しさん:02/02/20 01:04
>25
そーゆー時は、アプリのはじめでブラシを作っておいて、毎回渡して、
終了時に破棄すべし。
HBRUSHをAPIで、直接作る時も同じ。

ストックオブジェクトは、そのハンドルを破棄する必要がないから(破棄できない)
破棄を省略してるだけ。
WM_CTLCOLORなんかで
return ::CreateBrush();
としたら、毎回リークする(と思う)
2725:02/02/20 01:25
>26
なるほど。ありがとうございます。
無事メモリリークしなくなりました。
2825:02/02/20 01:32
すみません
もうひとつメモリリークに関して質問があります。
ダイアログクラスを
new で作って<vector>にしまっているとき、
必要が無くなったらdeleteして<vector>からそのポインタを消したいのですが、
以下のように
ダイアログクラスの
void MyDlg::OnClose() 関数から
CDialog::OnClose();
delete theApp.whoisdlg.at(d);
theApp.mydlg.erase(theApp.mydlg.begin() + d);
このようにしてdeleteしてみました
クラスの中からそのクラスを指すポインタを削除してるわけですから
なにかおかしなことになるかな?と思ったら
ちゃんと動いてしまいました。しかしデバッガには以下のようにメッセージが
でます。

Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
Warning: no message line prompt for ID 0x8008.
Warning: no message line prompt for ID 0x800A.

これはなにか問題ありますでしょうか?
それともこのような遣り方はやめた方が良いですか?
29デフォルトの名無しさん:02/02/20 01:40
メッセージは、読んだとおりです。
「いきなり、~CDialog()かよっ」って感じです。

おれも良くわからんが、delete this;つーコードは「あり」らしい。
もう寝ます。
>>28
普通ウィンドウ消すときはDestroyWindowを使う。で、CDialogの場合は
OnDestroy の中で delete this するようになっていたような気がするゾナー。
このケースと関係あるかどうかは眠いのでよくわからん。
31デフォルトの名無しさん:02/02/20 02:20
MFCのCRichEditViewで
文章の内容を見て色違いの
文章を出力するにはどうしたらよいでしょう?
文章の先頭を参照してある文字で始まっていたら
その行は色を替えるとかしたいのですが・・
32デフォルトの名無しさん:02/02/20 03:02
間違ってC++相談室の方に書いてしまいました。すみません

CListViewの項目の間のバーをドラッグしたときにウインドウに
送られるメッセージは何でしょうか?
Spy++を使ってみましたが量が多すぎてよくわかりませんでした。
>32
それ専用に定義されたメッセージというのはたぶんない。
WM_LBUTTONUP なり WM_MOUSEMOVE なりで、
GetColumnWidth して幅が変わったかどうか調べる、
くらいしかないんじゃないかな。
CHtmlViewでIHTMLDocument2などを使ってHTMLの要素にアクセスする方法を
解説した書籍やサイトは無いでしょうか。
MSDNライブラリ日本語版で検索しても詳しく説明しているものがないのです。
35デフォルトの名無しさん:02/02/20 12:05
EditBox内でCtrl + VやCtrl + Cを有効にするには
どうしたらよいでしょうか?
右クリックから貼り付けならば出来るのですが・・・。
36デフォルトの名無しさん:02/02/20 12:32
ソース行カウントプロファイルで指定したファイルのみのプロファイルを
行いたいのですが、LCOUNT.BATのどこをどう編集すればよいのか分かりません。
編集しないと糞重いし、必要な個所を見つけるのも一苦労なので困ってます。
>>35
デフォルトで有効になってない?
38デフォルトの名無しさん:02/02/20 17:47
>37
自分もそう思っていたのですが、なぜか動かないのです・・・。
CSplitterWndで区切って使っているので何か特殊な操作が必要なのでしょうか・・?
CSplitterWnd使ってるけど問題なくできるなぁ・・・
アクセラレータを変更したとか?
40デフォルトの名無しさん:02/02/21 00:39
char file_names_buf[0x10000];
file_names_buf[0] = '\0';

CFileDialog dlg(true, NULL, NULL, OFN_ALLOWMULTISELECT,
"CSV(カンマ区切り) (*.csv)|*.csv|全てのファイル (*.*)|*.*||");

dlg.m_ofn.lpstrFile = file_names_buf;
dlg.m_ofn.nMaxFile = sizeof(file_names_buf);
if (dlg.DoModal() != IDOK) return; <---
...

複数ファイル選択可能のファイルダイアログを使っています。
上のコードで、複数のファイルを選択することはできるのですが、
ファイルを一つだけ選択すると、OKボタンを押しているのに、
IDOKが返らず、矢印のところでリターンしてしまいます。
な ぜ で す か ? 

よろしくお教授願います。
4135:02/02/21 01:36
>CSplitterWnd使ってるけど問題なくできるなぁ・・・
>アクセラレータを変更したとか?

すみませんアクセラレーターとは何でしょうか?
>>40
IDCANCELが返ってるね…<DoModal

>>41
リソースにAcceleratorがあるよ。
それでCtrl+*やAlt+*の組み合わせを簡単に設定できる。
ところでCtrl+*ってエディットビューをクリックしたりして
フォーカスを与えてからやってるんだよね?
43デフォルトの名無しさん :02/02/21 01:56
ダイログベースでアプリを造ったんですが
右クリックで関数を実行したい時
マウスポイントの下にコントロールが
あると機能しないんですが、
回避策はあるのでしょうか?
>43
PreTranslateMessageで捕まえる
>>40
char file_names_buf[0x10000];
が大きすぎるみたい。0xFFFFだといける。
VK_RBUTTONですか?
ダブルクリックはどのうなるんでしょう?
でも質問に答えてくださってありがとうございました
4735:02/02/21 05:10
>リソースにAcceleratorがあるよ。
>それでCtrl+*やAlt+*の組み合わせを簡単に設定できる。
>ところでCtrl+*ってエディットビューをクリックしたりして
>フォーカスを与えてからやってるんだよね?

リソース見てみました。
特に変更はしてないです。
しかし。ここではないかと思われる点がありました

ダイアログ上でリターンキーが押されたらある処理を
するようにPreTranslateMessageをオーバーライドしていたのですが、

BOOL LineFormView::PreTranslateMessage(MSG* pMsg)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
if (pMsg->message == WM_KEYDOWN){
switch(pMsg->wParam){
case VK_RETURN:
OnButton1();
return TRUE;
break;
}
}
return CFormView::PreTranslateMessage(pMsg);
}

どうもここでは?と思っています。
しかしこれは見る限りでは
リターンキーが押されたときのみ処理をしたあと
return CFormView::PreTranslateMessage(pMsg);
すべてのメッセージを返していると思われるので、
どうも原因がわかりません・・・・。
>>47
すまん!スプリッタウィンドウっていうからてっきりCEditViewかと思ってたけど
CFormViewにエディットコントロールを貼り付けてたんだね。勘違いしてた。
で、フォームビューに貼り付けたエディットコントロールに対して
Ctrl+Vはデフォルトでできない。(さっき作って確認した)
アクセラレータリソースのCtrl+VやCtrl+Cを削除するとできるようになる。
4940:02/02/21 07:32
>>45
めっちゃたすかりました。
0x10000だと3バイトですもんね。できないはずだ・・・。

5035:02/02/21 13:54
>48
出来ました!ありがとうございます。
しかしなんで
アクセラレータリソースのを削除すると出来るようになるんでしょうか・・???
なんだか逆な気が・・・
今まできいていたほかのViewでもそのまま効くみたいですし。
51仕様書無しさん:02/02/21 14:06
コンフリクトするから
今まではアクセラレータで指定されたリソースIDにメッセージを
持ち逃げされてたというか。
まぁAppWizardのおせっかいな部分ということで。
5335:02/02/21 14:40
すみません。もう一件質問させていただいてよろしいでしょうか?
前述のFormView内のEditBoxの背景色と文字テキストを替えたいのですが、
CEditにはSetBkColorなどの関数がないようなので、
CEditViewと同じように、
CtlColorをオーバーライドすればいいのだろうと思っています。
しかしFormViewの中の1アイテムの関数をオーバーライドする方法がわかりません。
クラスの新規作成を行って見ても
CEditBoxを継承するクラスを作成することは出来ないようですし・・
このような場合はどうしたらよいのでしょうか?
if(nCtlColor == CTLCOLOR_EDIT){
// IDC_EDIT1がEditBoxコントロールのID
if(pWnd->GetDlgCtrlID() == IDC_EDIT1){


}
}
55VASH:02/02/21 21:02
社内LANのあるNTサーバの時刻を取得したんですが、どうするんでしょう?

SQLサーバもこのマシンで動いているので定期的に時刻をSQLテーブルに書いて
ローカルがそのSQLサーバにアクセスして取得する方法考えたけどこんな
アホなことしなくても良さそうだし。
ntpで検索すれ。ミリ秒単位で自動調整できる。
フレッツなどのプロバイダや公的機関のサイトが基準時刻だしてる。
57VASH:02/02/21 22:32
インターネット接続していないサーバの時刻を取る必要がありまして、
>56 の方法は無理なんです。
58デフォルトの名無しさん:02/02/21 22:37
>>56
もう少し、文章を読む癖をつけましょう。
「社内LANのあるNTサーバの時刻を取得したんですが」← こいつも文章を書く癖
をつけたほうが良いけどな。
その、社内 LAN がインターネットに繋がっていないとか考えないのか ?
時刻 → ntp と言う単純 (≒貧素) な発想が笑えます。

>>55
とりあえず、クライアントも Windows なら net time \\サーバ名 /set を定期
的に実行するなどしたら ?
59デフォルトの名無しさん:02/02/21 22:42
>>57
桜時計を(必要な)全マシンに入れて、
サーバーマシンのをSNTPサーバーにすれば楽かな。

# 社内LANなら、net time で何かできる...のだろうと思うが俺はやったことない。
#(DOS窓で net time /? してみれ)
>56
オイオイオイオイ
煽られてるぜ〜?
そういや学校のノートパソコンが充電できなくなってて
電源を入れるたびに毎回時間がおかしくなってたから
スタートアップにnet timeを勝手に入れたなぁ。
62どどどどシロート:02/02/21 22:49
おまがいします。教えてください!!
GetWindowRect APIの機能と、
Cwnd::GetWindowRect メンバ関数の機能とは、どう違うのでしょうか。
引数の数が違うことはわかりましたが・・・
63VASH:02/02/21 22:54
いろいろとどうもです。
クライアントがかなりあるんで >58 の方法はダメかなとおもったけど、
現在作成中のプログラムにnet time \\サーバ名 /set をexecする
コード入れればいいかなとひらめいた。

でもWIN2Kの場合、権限ないと時刻変更できなかったような。
64デフォルトの名無しさん:02/02/21 22:57
>>40
ねえ、あんたもプログラマなら...

if (dlg.DoModal() != IDOK) return; <---

を...

int rc = dlg.DoModal();
if(rc != IDOK) return;

とかに変更して、dlg.DoModal() から何返ってきてんのかを見るとか、IDCANCEL
ってわかったら CommDlgExtendedError() 呼んで、どんなエラーが起きてんのか
調べるとかしないの ? いつまでも教えて君じゃ進歩しないよ。
65デフォルトの名無しさん:02/02/21 23:04
>>62
ソース見りゃいいじゃん。

void CWnd::GetWindowRect(LPRECT lpRect) const
{
 ASSERT(::IsWindow(m_hWnd));
 ::GetWindowRect(m_hWnd, lpRect);
}

要は、そのまま呼んでるだけだよ。
66デフォルトの名無しさん:02/02/21 23:09
>>63
ディフォルトは、Power Users と Administrators だけ可。
ワークグループ環境ならローカルセキュリティポリシーで変更できるよ。
67デフォルトの名無しさん:02/02/21 23:14
いきなりVC++やってもいいんですか?
C++とかから入った方がいいんですかね?
>>60
ププ、「煽られてるぜ〜」だって。馬鹿にされてると思わんかな、普通。
>>67
このスレに書く位だから「VC++やる」を「MFCを使ってWindowsプログラムを作る」と
解釈すると、Cの知識があるならMFCを使いながらC++を勉強することをおすすめする。
>>65
そういうソースってどうやって見つけるんですか?
何か簡単に見つける方法があるのでしょうか。
>>67
Cが普通に出来るなら、やってりゃ結構++については覚えられるよ。問題なし。
もしCが出来ないなら、w95/98のコマンドモード。それが不可能なら
PC-98エミュ上での開発をお勧めしたい(コンパイラはフリーで有る。必要なら再度質問のこと)。
やっぱいきなりグラフィックだのコントロールだのは辛いと思うし、
まずはキャラクターで、ってね。

#w2000/xpが不可なのは、エスケープシーケンスを受け付けないから。
>70
VC買ったらMFCのソースが一式ついてくる。
探す手段の話なら、VCのIDEからでもエクスプローラからでも
「特定の文字列を含むファイルの検索」くらいのことはできる。
>>72
やっぱその方法ですか・・・
コンテキストメニューで「**の定義位置を表示」はできるけど
実際のコードを簡単に検索する機能はないんですね。
>>73
デバッガでステップ実行すれば奥まで入っていけるが。
奥まで入ると迷子になってしまいます
7667:02/02/22 08:11
当方VBとPerlしかやったことないものでして…
どちらから入った方がいいのかと思って質問させていただきました。
>その、社内 LAN がインターネットに繋がっていないとか考えないのか ?
>時刻 → ntp と言う単純 (≒貧素) な発想が笑えます。
ntpはudp/ipが通ってれば、The Internetにつながってなくても
動きますが何か。
78デフォルトの名無しさん:02/02/22 19:58
コントロールのリストボックスに結果を1行づつ表示させているのですが,
行が増えた場合、AddStringまたはInsertStringで最終行に追加しても,
自動的には最終行へスクロールして表示されません.

スクロールを制御する関数,あるいは自動的に表示とスクロールを行う
メソッドなどが存在するのでしょうか?

よろしくお願いします.
>>78
SetCurSelの説明に
「文字列を選択し、その文字列が表示されるように必要に応じてスクロールします。」
って書いてるけど
質問させてください。
CSplitterWndで分割してビューを3個1列に配置しました。
一番左のビューの最小幅を指定し、それより小さくできないようにしたいと思したいのですが、うまくいきません。
SetColumnInfo()を使って最小幅を指定できるのですが、この場合、最小幅より小さくするとビューの幅が0になってしまいます。

WM_SIZEを拾ってMoveWindowでサイズを変更してもやはりダメでした。

うまい方法がありましたら、ご指導お願いします。
>>80
まず君は列の概念から勉強しなおしたまえ。
何で1列なのに一番左なんだ。
1行3列って意味か?
8280:02/02/22 20:06
すいません。訂正です。
×CSplitterWndで分割してビューを3個1列に配置しました。
○CSplitterWndで分割してビューを3個横1列に配置しました。

×思したいのですが
○思うのですが

(;´Д`)
8378:02/02/22 20:11
皆さん,有難うございました.
m_list.SetCurSel(m_list.GetCount()-1)と,
プロバティで行を選択しないを設定したら,
目的の通りになりました.

SetTopIndexってのもあるよ。
しかし、リストボックスで結果表示か……。
>78の次の質問はきっと「どうやったらリストボックスを
水平スクロールできるのですか」だな……。
8578:02/02/22 21:21
>>84
確かに出来ました.有難うございます.
ステータスバーにステータス表示するよりも,
数行のリストボックスに表示した方が,
履歴が分かって良いと思うのですが..

VCのアウトプットウィンドウのような感じです.
エディットボックスで作るべきなんでしょうか?
>>85
別にリストボックスでも悪いことはないんじゃない?
ただ、横スクロールもさせたいって思うと、ちょっとだけ手間がかかる。ちょっとだけな。
リストビューのサブアイテムのテキストってどのように管理されているのでしょ
うか?テキストを編集したとき、テキストの元のデータに編集を反映させたいの
ですが何かよい方法ありませんか?
 つまり
CString text;
m_List->SetItemText(n,m,text);
こうやって表示したテキストを
m_List->SetItemText(n,m,"new");
のように編集した後に元のtextにも変更を反映
させたいんです。参照を渡してみたりしたんですけど、やっぱ
そんなんじゃ無理ですか??
text = _T("new");
8987:02/02/23 03:09
>>88

 あ、いや違うんです。言いたかったのは
text = _T("new");
見たいな代入処理なしで反映されたらなぁ・・・って思ったんです。なぜかというと、
レポートビューにCStringオブジェクトを渡してテキストを書いても、ソートしたりカラムの順番が変わ
るとアイテムとかサブアイテムのインデックスも変わってしまうから、元のCString
オブジェクトを特定するのが大変そうなので・・・。でもInsertItemもSetItemTextも
引数の文字列はconstだから無理ですね。今自分でわかりました。
 でも、どうやって元のオブジェクトを特定するのが一番うまい方法なんだろう・・・。
こりゃキツイ(´_ゝ`)
ずばりLPSTR_TEXTCALLBACKで解決と見た。
9187:02/02/23 03:51
>>90

 厨房なもんですみませんが、具体的な記述方法教えていただけませんか?
9287:02/02/23 04:34
なんとかLVN_GETDISPINFO、LVN_SETDISPINFOを受け取る、というところまで
わかりました。しかし、メッセージをハンドルする関数の書式がわかりません。
どのようにテキストを渡してやればよいのでしょうか?return char*などやって
しまってましたが、やはりだめですね。ハンドラに渡される引数に入れてやるん
でしょうか?ハンドラに渡される引数を教えていただけませんか?
>>92
ClassWizardでLVN_GETDISPINFOのハンドラを作って

void CxxxView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
if(pDispInfo->item.mask & LVIF_TEXT){
switch(pDispInfo->item.iSubItem){
case 0:
::lstrcpy(pDispInfo->item.pszText, _T("Item"));
break;
case 1:
::lstrcpy(pDispInfo->item.pszText, _T("SubItem"));
break;
}
}

*pResult = 0;
}
9487:02/02/23 16:52
>>93

 ありがとうございました!これでうまく行きそうです。本当にありがとう
ございました
 ダイアログにタブコントロールを設けて、その上にピクチャコントロールを張り付けてます。
同じ大きさのダイアログ複数に同様の図形を入れるので、OnPaint()から別にメンバ関数を
作って、描画をそこで行うようにしました(引数はピクチャコントロールのIDで、関数中で
GetDlgItem()する)。
 描画そのものはうまくいったのですが、別のウインドウを上に重ねてから、重ねたウインドウを
最小化させるなど、一部の動作で再描画がされません。
 何か抜けてるのかよく分からない状態なのですが、なにがおかしいのでしょうか?
コードがおかしい
97デフォルトの名無しさん:02/02/24 09:22
TreeViewで項目ごとにフォントの色を変えたいのですが・・・
CTreeCtrl * TC = &GetTreeCtrl();
TC->SetTextColor(RGB(64,64,64));

してもダメなようでした。
EditViewなどでも違う方法をとりますよね。
結局SetTextColorはDrawTextを使うときしか使えないのかな・・・
とすると普通ノーマルのCViewでしか使えないですよね。
方法をご存知の方教えてください。
>97
オーナードローじゃだめなの?
99デフォルトの名無しさん:02/02/25 15:12
プロパティシート又は複数のプロパティーページの同じ場所に
ビットマップを貼り付けたいのですが、
誰かいい方法を知りませんか?
よろしくお願いします。
100PowerPoint:02/02/25 15:34
今回、PowerPointをVC++から制御することになりました。
以前、Excelの処理はやったことがあるので、同じことだろうと思って
余裕でいたのですが、なんだか少し違うようです。
Excelのときは、Application・Workbooks・Workbookの順に
CreateまたはAttachDispatchしていました。
PowerPointだと、Application・Presentations・Presentationになります。
ApplicationとPresentationsのDispatchは正常にいくのですが、
その後、Openするときに「PowerPointのフレームウインドウは存在しません」
とのエラーメッセージがでます。
----- サンプルコード -----
_Application pptApp;
Presentations pptPrts;
_Presentation pptPrt;
int ret = pptApp.CreateDispatch("PowerPoint.Application");
if(ret == 0)
{
return;
}
pptPrts.AttachDispatch(pptApp.GetPresentations());
CString FileName = "D:\\test.ppt";
pptPrt.AttachDispatch(pptPrts.Open(FileName, 0, 0, 1)); <--- ここでエラー
-----------------------------
PowerPointが起動されていれば、ファイルは開きます。
何の制御が足りないんでしょうか?よろしくお願いします。
101デフォルトの名無しさん:02/02/25 20:17
EditBox自作について質問です。

今EditBoxを継承してOCXを作っていて、コントロールに
Replaceメソッドを付けたいのですが、うまくいかず困っています。

コントロール名はTestです

とりあえずReplaceメソッドを新規で追加しました。(このとき引数なし)
次にCTestCtrlのReplaceに(BSTR find,BSTR Rep)と追加したところ、
「Replaceが宣言されていない」を怒られました。
どの場所を直せばよいのか見当がつかないので、どうかお願いします。

あと、Replace関数内で元からあるプロパティ(CaptionやText)が参照できないので
こちらも合わせてお願いします。
102デフォルトの名無しさん:02/02/25 20:56
>>101
死ね
103デフォルトの名無しさん:02/02/25 22:28
Visual C/C++?(ぷっ

こんな生産性の低いプログラムを一生懸命覚えた人、ご苦労様。
いまや世界最高開発者人口を誇るのはVisual Basic。
そしてVisual C# .netの登場でVisual C/C++はFortranやCOBOL
のように過去の開発言語になることは必至。

.netからはBasicやC#でもC/C++と同等の柔軟性を持っていて
かつ生産性も高いものになるそうで、会社内にC#とC++プログラマ
がいたらその差歴然。一日中エラー処理に悩んじゃってください。
>>103
敗北者?
105デフォルトの名無しさん:02/02/26 01:19
いやマジでVisual C++はそのうち消えるだろうな
C,C++は残るだろうけど
106っっj:02/02/26 02:28
カラーダイアログの実装方法を教えれや
107デフォルトの名無しさん:02/02/26 02:43
プロパティページを表示する場所って変えれるんでしょうか?
通常の場所より、下のほうに移動したいんですけど・・・。
誰か知っていたら教えてください。
まー別に深刻な問題でもない。今現在言語一つ二つ出来たら、
大抵は1年も有れば乗り換えられるんでないかな。プログラム向きの脳味噌になってっから。
漏れもハッカーレベルには及ばないにせよ、普通にこなせてるしさ。
109101:02/02/26 09:03
お願いします
110デフォルトの名無しさん:02/02/26 11:41
CListCtrlのCHeaderCtrlのdividerでサイズの変更を不可能にしたいです。
どうしたら良いでしょうか?
CListCtrlでCHeaderCtrlからHDN_BEGINTRACKメッセージが送られていることはわかったのですが、
処理をさせない方法とかわかりません。
宜しくお願いします。
111デフォルトの名無しさん:02/02/26 12:29
>>108
だよな。会社の意向で俺もVC++からVB主流に転換したけど
初めてVB覚えた人に比べ短期間で覚えられた気がする。
それにVBでも変数とそのアドレス意識できるとAPI呼び出すとき
何かと役に立つし。
112デフォルトの名無しさん:02/02/26 12:49
MFCでコンパイルせずにリソース部分を
動的に変更することってできるのでしょうか?
リストビューの項目を変更・追加・削除するとか。

リソースファイル(*.rc)をいじろうとしているのですが
文字列が16進数になっていてどこをいじれば分かりません。

C++Builderならそこらへんがかなり手軽にできると聞きました。
MFC(VisualC++)でも手軽にリソース部分を変更できる
方法がありましたら教えて下さい。よろしくお願いします。
実行時にリソースを変更?
114101:02/02/26 13:19
EditBox自作について質問です。

今EditBoxを継承してOCXを作っていて、コントロールに
Replaceメソッドを付けたいのですが、うまくいかず困っています。

コントロール名はTestです

とりあえずReplaceメソッドを新規で追加しました。(このとき引数なし)
次にCTestCtrlのReplaceに(BSTR find,BSTR Rep)と追加したところ、
「Replaceが宣言されていない」を怒られました。
どの場所を直せばよいのか見当がつかないので、どうかお願いします。

あと、Replace関数内で元からあるプロパティ(CaptionやText)が参照できないので
こちらも合わせてお願いします。

また放置されたらマルチポスト開始します
115尭日 杣:02/02/26 13:44
>110
//CListCtrlの派生クラスCExLsitCtrlを作って
BEGIN_MESSAGE_MAP(CExListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CDeliveListCtrl)
ON_NOTIFY(HDN_BEGINTRACK, 0, OnBegintrack)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// メッセージハンドラ --------------------
void CExListCtrl::OnBegintrack(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
*pResult = 0;
}
//とかどうよ?
マルチポストする前に入門書でも買え
117101:02/02/26 14:21
>>116
5000円出して買った本にはHello Worldとメモ帳、
動画の作り方しか書いてなかったんです。
お年玉使ってVCと入門書買ったのにコレじゃあんまりだ。
せめてちょっと何か作れるようになって遠まわしに自慢したい。

だめですか?
マルチポスト開始予告付き
コワイッ
119101:02/02/26 15:12
メソッドの引数は解決しました。
ヘッダも書き換えなきゃナランのね。

あとは既存のプロパティの参照方法。

アレって追加時に「値の参照・取得」オプションを選択しないと
コード内で参照できないの?
それとも何か別の方法があるの?
120101:02/02/26 15:16
あと聞きたいこと追加。
プロパティとメンバ変数の違いって何?
121101:02/02/26 16:16
3
122デフォルトの名無しさん:02/02/26 16:17
>115

HDN_BEGINTRACKWとHDN_DIVIDERDBLCLICKWのメッセージを受け取り無事解決しました。
(Win2000のため?)
ありがとうございました。

VC++って難しいですね。
123デフォルトの名無しさん:02/02/26 16:34
恐ろしく厨房な質問で申し訳ないのですが、MFCってどこにグローバル変数を
記述すればいいのですか?
マジで分かりません・・・。
>>123
MFC ったって言語自体は C++ (標準からはちょっと外れてるが) なんだから
ソースの好きなところに書いて下さい。
125100:02/02/26 16:40
自己レスです。
CreateDispatch()の後に、pptApp.SetVisible(TRUE);を入れたら
うまくいきました。
値をFALSEにすると、またエラーになるのが不思議ですが。
126123:02/02/26 16:58
>>124
どこかのヘッダに書くと、「すでに定義されています」というエラーが沢山出てしまうのです。
extern付けても「未解決です」というエラーが出てしまって駄目です。
>>126
.cpp の方に書けぃ。ヘッダの方には必要ならexternで。
MFCじゃなくても同じぞ。(w
128デフォルトの名無しさん:02/02/26 17:26
すごくレベルの高い質問だ>>126
*.cppに書いたらど〜いうエラーになるかやってみたら
129123:02/02/26 17:30
>>127-128
*.cppに書いても、当然他のファイル(クラス)から参照できないので
「定義されてません」というエラーが出ます。
だからと言って、全てのファイルにインクルードされるヘッダに書くと
「すでに定義されいます」と出てしまいますし。
externしても、やはり「未解決です」と言ったエラーが出ます。何でだろう。
130101:02/02/26 17:34
2
131127:02/02/26 17:47
>>129
だーら、まずどっかの cpp に一つ書いて、
ヘッダの方には extern で書けとゆーとろーがゴルァ。
>グローバル変数
アプリケーションクラスのヘッダに
static int n;
とか。
133123:02/02/26 17:50
>>131
いや、もちろんそういう書き方してるんですけど。その逆もやってみました。

とりあえず、自分でも最高にくだらない質問してると思うので、何とか自分で解決してみます。
お騒がせしました。
>>129
全てのファイルにincludeされるヘッダとやらに全部書いてるさ。漏れは。

SET int valiable VAL(123);

とかして、Appクラスの場合は SET : NULL VAL(x) : = x
その他は SET : extern VAL(x): NULL とdefineしておく。
必要無いソースにもextern宣言されると言う弱点は有るけど、管理は楽っぽ。
今時はコンパイル速度なんか無視出来るし(w
135101:02/02/26 18:49
1
136101:02/02/26 19:31
0
137101:02/02/26 20:44
-1
138101:02/02/26 20:44
-1
139デフォルトの名無しさん:02/02/26 21:00
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?

プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?
プロパティとメンバ変数って何が違うの?プロパティとメンバ変数って何が違うの?
140デフォルトの名無しさん:02/02/26 21:02
ポインタ値とアドレスって何が違うの?
141デフォルトの名無しさん:02/02/26 21:56
>>140
ポインタ値が示す場所がアドレスです。

ポインタ値→地図
アドレス→実際の場所
スレタイトル見えてますか?
143デフォルトの名無しさん:02/02/27 01:13
>112
質問の意味がよくわからないけど・・・
リソースファイルをテキスト形式で開いたらリソースの中は見れますよ。
ちなみに、「ファイルを開く」→用途をテキストに変更。
144ボー然:02/02/27 17:46
ダイアログエディタで貼り付けた CScrollBar って、もしかして
親ウィンドウにメッセージ送ってこないんスか?
>144
んなこたーない。が、何のメッセージが来るのを期待してる?
146デフォルトの名無しさん:02/02/28 12:33
 スレ違いかもしれませんが教えてください。
VC++6.0でプログラムを作成しています。
 プログラムの途中経過を保存したいために、途中まで出来たところで
すべてをコピーして、新フォルダにペーストし次にこれを開いてプログ
ラムを書いていました。
 すると何とコピー元の内容まで書き換えられているではないですか。
元の内容を書き換えるのをやめさせるにはどのようにしたら良いので
すか?
 初心者の質問ですみません。

 
フロッピーディスクに隔離する。

とうか多だ短にもとのファイルを開いてデバッグしていた
ってことじゃない。
コピーしたらリビルドしたほうが良いよ。
      ,一-、
     / ̄ l |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ■■-っ < >>146 んなーこたーない
    ´∀`/    \__________
   __/|Y/\.
 Ё|__ | /  |
     | У..  |
149デフォルトの名無しさん:02/02/28 13:43
 147, 148のターモさん!有り難うございます、146です。
勇気もりもりで、アプリケーションウィザードでSDIのスケルトンを作り、
それを新たなフォルダーにコピーした後で、画面に"TEST"と表示させるよ
うに変更して保存。次にコピー元のプロジェクトを実行すると
”TEST”は表示されない・・・ ターモさんが正しい・・・。
 では・・・と146でのプログラムを新たなフォルダにコピーして内容を
書き換えると、やっぱりコピー元も変更される。インプリメントファイル
のプロパティを見てみると、コピー元ファイルプロパティが、確かにコピー
元のファイル名になっている・・・ケド・・・・試しに作ったスケルトン
では、コピーしたファイルでもこのコピー元ファイルプロパティは自分自
身になっている。
 なんか変なことしたのかな?


150コージー:02/02/28 14:49
>>149
その変更したファイルは、実はプロジェクトフォルダではない
別の場所にあるとか。
んなーこともないか。
151デフォルトの名無しさん:02/02/28 16:19
146 = 149 です。
 魑魅魍魎の世界です。まるで狐に化かされていたかのように
正常な動作になりました。 ターモさんは正しい。
原因全くわからず
 こりゃまた・・・お騒がせしました。
152デフォルトの名無しさん:02/02/28 16:55
教えてください。
ダイアログ エディタのステータスバーに表示さている
サイズの単位は何でしょうか?
ピクセルじゃないみたいです。
153デフォルトの名無しさん:02/02/28 17:56
MFCでスケルトンで作成したWindowのビューの大きさを変更するにはどうしたら良いんですか?
最初は、フレームのクライアント領域一杯に合わせて作成されるみたいですけど
この大きさを変更したいのです。
154デフォルトの名無しさん:02/02/28 21:03
treectrlの削除した時削除したアイテムの情報を取得したいんですがうまく逝きません

void xxxx::OnDeleteitemTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;//←クラスウィザードに憑いていたコード
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
TV_TIEM item=pNMTreeView->itemNew;//ここに情報が格納されると思ったけど駄目
*pResult = 0;
}


typedef struct _TV_ITEM { tvi
UINT mask;
HTREEITEM hItem;
UINT state;
UINT stateMask;
LPSTR pszText;
int cchTextMax;

int iImage;

int iSelectedImage;
int cChildren;
LPARAM lParam;
} TV_ITEM, FAR *LPTV_ITEM;

根本的に間違ってるのかな?
155154:02/02/28 21:31
スマソ自分で勝手に勘違いしてました。上で問題ないです。
156ともくん:02/02/28 21:55
HVITEM構造体のmaskのHDI_HEIGTHとHDI_WIDTHが同じ値(0x0001)であるため、
リストコントロールのヘッダーの高さが変更できません。
どうしたらいいんでしょう?
>>152
ダイアログユニット(DLU)
詳しくはGetDialogBaseUnitsとかのヘルプを見て下ちい。
158デフォルトの名無しさん:02/02/28 23:21
CToolBarCtrl::EnableButton でツールバーのボタンを淡色表示したいのですが変化ありません。
戻り値は1です。
CToolBarCtrl::HideButton は非表示になります。

なぜCToolBarCtrl::EnableButtonで淡色表示にならないのでしょうか。
159デフォルトの名無しさん:02/03/01 04:03
>>153
WM_SIZEを受け取って自前で大きさを変える。
ついでに WM_GETMINMAXINFO で検索してみたまい。
>>158
MFCには独自のやりかたがあるよ。
UPDATE_COMMAND_UIハンドラで
pCmdUI->Enable(FALSE);
してね。
>>158
ずばり前スレの
http://pc.2ch.net/test/read.cgi/tech/1008031675/783
に出てるんだけどな。
162デフォルトの名無しさん:02/03/02 01:08
ダイアログベースのスケルトンで、

void CHogeDlg::OnPaint()
{
  if (IsIconic())
  {
  この部分

と、

// システムは、ユーザーが最小化ウィンドウをドラッグしている間、
// カーソルを表示するためにここを呼び出します。
HCURSOR CHogeDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

の部分って、いつ呼ばれるんです? ダイアログを最小化しても呼ばれないみたいだし。
っていうか、何のためにあるのか分かりません。何で?
「最小化ウィンドウをドラッグ」ってどういうことですか?
勘違いしているかもしれないけど、
explorer以外のシェルを使うとわかるかも。l
>>162
俺はその部分削除してるけど問題ない
クラスウィザードから削除しましょう
>>162
NT3.51などのprogmanがシェルだったころの名残だろ。
http://www.microsoft.com/japan/support/kb/articles/J013/3/34.asp
166162:02/03/02 02:20
>>163 >>164 >>165
納得です。
167デフォルトの名無しさん:02/03/02 11:42
質問させてください。
ATL COM AppWizardで
MFCをサポートするようにしたんだけど
CRecordsetクラスから派生したODBCで外部DBにアクセスするクラスを生成しようとすると
CRecordsetが定義されていないとエラーが出ます。
#include <afxdb.h>としても
windows.h includedとかってエラーが出ちゃうんですが
解決策のヒントでもいいんでご教授お願いします。
エラーの内容くらい読め

夜目餘目
169デフォルトの名無しさん:02/03/02 16:06
クラスの中のメンバーの持つ関数をオーバーライドするにはどうしたらよいのでしょうか?
たとえばmySocketクラスをCSocketを継承しないで作った場合、

class mySocket {
CArchive *m_paout;
CArchive *m_pain;
CSocketFile* m_psf;
CSocket *m_ps;
}
こんな感じにメンバーがいてソケットにデータを送った場合
データ変身があるとm_psのOnRecieveが呼び出されますよね?
このときのOnReceiveをmySocketクラスからオーバーライドするには
どうしたら良いのでしょうか?
なんのこっちゃ
CSocket *m_ps;
って書いてあるところにそのままCSocketを使うのではなく
CSocketから派生させたクラスを作って、そのクラスでオーバー
ライドするよ。普通は。
委譲ではオーバーライドはできない。
継承すれ。

class mySocket : public CSocket {
CArchive *m_paout;
CArchive *m_pain;
CSocketFile *m_pst;
void OnReceive(int);
};
173デフォルトの名無しさん:02/03/02 19:46
http://techtips.belution.com/ja/vc/0056/

このページにのってる方法で、
MDIアプリケーションでのドキュメントのポインタを得ようとしているのですが、
(後半のサンプル)
CxxxDoc* pDoc = (CxxxDoc*)GetDocument(pView);
引数として指定するpViewをどのようにすべきかがわかりません。
そもそもViewへのポインタが得られていればそこからGetDocument
できるような気がしてしまうのですが・・・・・
174デフォルトの名無しさん:02/03/02 20:43
>171,172

お二方、どうもありがとうございます。
無事解決しました。同じようなケースになることがたまにあるのですが、
それは設計が悪いのですね・・
CFormViewの中に設置したアイテム一つ一つの関数をオーバーライドしようとするときなどに
やっぱりこんな問題にぶつかります。
175デフォルトの名無しさん:02/03/02 22:20
> そもそもViewへのポインタが得られていればそこからGetDocument
> できるような気がしてしまうのですが・・・・・

その Web ページちゃんと読んだ ?

> しかし、ビューをドキュメントに関連付けずに作成した場合などは、
> m_pDocument にドキュメントへのポインタは入っていません。
> したがって GetDocument() は使えないということになります。
> でも、どうしてもドキュメントへのポインタが必要なときがあります。

の時の話だよ。普通は、GetDocument() でいいんだよ。
176173:02/03/02 23:58
>175
いえ、ビューの中から呼ぶのではなく別のところから
自分で作った新規クラスから呼びたいのです。
MDIですのでMAinView+MainDoc以外にも
いくつかのView+Docのくみあわせがあります。
その中で特定のDocを得ようとしているのですあ・・・

177デフォルトの名無しさん:02/03/03 00:35
MDIのようなものをウィザードに頼らずに、ソース手書きで作りたいのですが、
どうすればよいかわかる方はおられますか?
そう、ちょうどタグブラウザのウィンドウシステムみたいにしたいのです。
178 :02/03/03 00:45
vc++.netで、dllをリンクする項目がみあたりません。
以前の設定+リンクの項目ってどこへいったのでしょか。。
179 :02/03/03 01:19
>178
ライブラリの設定なら、なくなったんじゃないかな。
指定しなくてもソースから自動でリンクをするようになってると思う。
180デフォルトの名無しさん:02/03/03 01:22
CPropertySheetをDoModalで開いて
そのダイアログにサイズ変更枠をつけたいんだけど
どうすればいいのでしょう?
181デフォルトの名無しさん:02/03/03 02:31
>>180
俺も前にやろうとしたけど・・・
無理だと思う・・・
サイズ変更枠をつけることはできる。
ただ、それをつかってサイズを変更できるかは
知らないけど。
183173:02/03/03 04:29
すみません。もう少し一般的な質問に戻させてもらってよいでしょうか?
TreeViewを使ったプログラムなのですが、
ViewでもDocでもない
新規クラスをつくりDocのメンバ変数とします。
そしてそこから、Docの中身を変更したときに
TreeViewを再描画させたいのです。ですのでDocのポインタと取り
UpdateAllViewsするのがいいのだろうかと思ったのですが、
このようなケースの時はどのような方法がベストでしょうか・・?
>>177
ウィザードで作ったスケルトンのソースを見れば良いと思います。

>>183
> Docのポインタと取りUpdateAllViewsする
という方法がいいと思います。
185173:02/03/03 06:55
>184
そうですか、やっぱりそこまでの方針は正しかったのですね・・・

強引にCMyCLassから
CMyCLass::Update(){
MainView* pView;
MainDoc * pD = (MainDoc*)GetDocument(pView);
pD->UpdateAllViews(pView);
}
こんな風にしてみましたが、だめでした・・
これは当然でしょうね・・・

↓この関数を呼びたいのですが・・・
CDocument* GetDocument(CView* pView)
{
// pAppにCWinApp オブジェクトへのポインタを取得
CWinApp* pApp= AfxGetApp();

// 最初のドキュメントテンプレートの位置を取得
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
while (posTemplate != NULL)
{
// ドキュメントテンプレートへのポインタを取得
CDocTemplate* pTemplate = pApp->GetNextDocTemplate(posTemplate);

// 最初のドキュメントの位置を取得
POSITION posDoc = pTemplate->GetFirstDocPosition();
while (posDoc != NULL)
{
// pDocにドキュメントへのポインタを設定
CDocument* pDoc = pTemplate->GetNextDoc(posDoc);

// 最初のビューの位置を取得
POSITION posView = pDoc->GetFirstViewPosition();
while (posView != NULL)
{
// pDocViewにビューへのポインタを設定
CView* pDocView = pDoc->GetNextView(posView);

// 取得できたビューが指定されたビューならpDocをリターン
if (pDocView == pView)
return pDoc;
}
}
}
return NULL;
}
GetActiveDocument( )は使えないかな?
187173:02/03/03 11:10
>186
GetActiveDocumentはCFrameWndのメンバですよね。
こうなると今度はCFrameWndのとり方がわからなかったりします・・。
うーん結局問題は
自作クラスとMFCクラスとの連携かも・・・
自作クラスからMFCのViewクラス、Docクラス、Frameクラス
あたりのポインタを手に入れる方法がわかれば何とかなりそうなのですが・・
アプリケーション全体へのポインタならAfxGetApp()
で手に入れることができるのはわかるのですが・・・
しかし問題は自作クラスと、MFCクラスの連携にあるとすると、
メッセージハンドラを使った連携なども可能そうですね。
例えば自作クラスから任意のハンドラをアプリケーションに返したり
なんてことは出来るのでしょうか?
できるならWM_UPDATEを自作クラスから発信して
Viewクラスでそれを受けて更新処理をすればいいのではと思います。

CFrameWndはAfxGetMainWnd( )で取れます。
SendMessageもできますし、CMainFrameでキャストすれば
GetActiveDocumentできます。
189173:02/03/03 12:30
>188
ありがとうございます。
だんだん核心に近づいてきたかんじです。
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();
こんな感じでやってみました。
これでMainDocへのポインタを手に入れることが出来ました。
そして
pMd->UpdateAllViews(

しようとすると・・・・
UpdateAllViewsの第一引数pView pSenderが・・・・
入れるものがないです・・・。
Viewへのポインタが結局必要なのでしょうか・・・

SendMessageの方は
CWndから送れるようですので、
試してみます。
しかしWM_UPDATEってメッセージないんですね・・・
てっきりOnUpdateを呼ぶメッセージがあるきがしてたのですが・・・
とりあえず0でいいよ。
とりあえず0でいいよ。
とりあえず0でいいよ。
>>189
勘違いしてるようだけど、UpdateAllViewsの第一引数には
更新したいビューではなくて、更新したくないビューのポインタを入れる。
ビューを更新したいならNULLで。
192180:02/03/03 19:27
>>181,182
レスどうもです
しょうがないのでCTabCtrl使って自作しました
193173:02/03/03 21:19
190,191さん
どうもありがとうございます
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();
pMd->UpdateAllViews(NULL);
このようにしたらコンパイルをちゃんととおり
よーし!っと思って実行すると
こんどはUpdateAllView関数内の
POSITION pos = GetFirstViewPosition();
ここでエラーが出ている模様・・・・・・。
これはいったい・・・・・
全然確認しないで発言するけど
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
pMf->GetActiveDocument()->UpdateAllViews(NULL);
もできないかな?
ファイル名、フォルダ名両方とも取得できるダイアログボックスってないですか?
ちなみに1度に複数選択できるようにしたいです。

フォルダ名が取得できなかったりして困っております。
196173:02/03/04 12:41
>194
んーと、やっぱり同じ現象です。
どうやらGetActiveDocumentが
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
if (pMf == NULL){AfxMessageBox("error11");}
MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();
if (pMd == NULL){AfxMessageBox("error12");}
pMd->UpdateAllViews(NULL);


結局"error12"とメッセージボックスが開き
GetActiveDocument()がエラーを返す模様。
んーよく考えたらMDIだから
メインフレーム→子フレーム→GetActiveDocument()としなきゃならないのかもしれませんね。
CFormView内にエディットボックスを配置しましたが、
内容更新時に垂直スクロールバーが表示される場合のみ、以前のテキストが消されずに残ってしまいます。
また、その内容をスクロールしても、テキストが残されたままスクロールされ、ゴミが残ります。
正常な処理を行うには、

m_edit1 = cNewData;
UpdateData(FALSE);

だけではだめなのでしょうか?

m_edit1 = "";

を挟んでみたのですが、結果は変わりませんでした。
テキストの量がエディットボックス内に収まる場合(スクロールバーが現れない場合)は正常に更新されます。
更新のタイミングは、メッセージパンドラは拾わず、手動で行っています。
どうか、ご教示お願いします。

リソースエディタでは複数数行、垂直スクロール、改行を許可、境界線、にチェックを入れています。
初歩的な質問で申し訳ありません。よろしくお願いします。
>>196
MDIは作ったことないんだけど、
>MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();

MainDoc * pMd = (MainDoc*)(pMf->GetActiveDocument());
かなぁと。
あと、ドキュメントが複数あるようだけど、MainDocはアクティブになってるのかな??
199:02/03/04 16:22
>>197
>更新のタイミングは、メッセージパンドラは拾わず、手動で行っています。

これの意味が良くわからないけど、とりあえず
UpdateWindow()とかInvalidate()とかしてみるのは堂でしょおう

200197:02/03/04 16:45
>>199さん
ありがとうございます。
Invalidate()を使って更新時に正常に描写されるようになりました。
スクロール時にゴミが残るはまだ対処できていません。
OnCtlColor()でフォームビューの背景の色を変えていたのですが、この辺にも原因がありそうです。
こちらの方を、もう少し調べてみます。

>更新のタイミングは、メッセージパンドラは拾わず、手動で行っています。
説明下手で申し訳ありません。自分でも何を言っているのかわからなくなってしまいました。
201173:02/03/04 17:16
>198
どうもそれでもダメなようです。

もう一度整理してみます
フレームの構成としては
CMainFrame→CChildFrame
     →CChildFrame2
となっており
それぞれCChildFrameにMainDoc+MainView
CCHildFrame2にSubDoc+SubView
となっています。
このとき自作クラスCMyClassからMainViewに再描画の命令を出したいのです。

この場合はCMainFrameではなく
CChildFrameへのポインタを手に入れ
そこからGetActiveDocumentすればいいのではないかと、考えています。
しかし親フレームから子フレームのポインタを手に入れる、
もしくはアプリケーション全体へのポインタから特定の子フレームの
ポインタを手に入れる方法がわからず悩んでいます。
>201
自作クラスから View/Doc/Frame へのポインタを手に入れようとするから複雑になる。
自作クラスに View/Doc/Frameが自分へのポインタを自己申告すれば良いんでは?(初期化のときとかに)

あとは、自作クラスからやりたい放題。
見当違いだったらゴメンね。
203173:02/03/04 18:34
>202
ありがとうございます。なるほど発想の転換ですね。
自作クラスというのがサーバの情報をもつクラスなのですが、複数あり、
それがMainDocのメンバとなっています。
ですのでMainDocの関数の中から自作クラスのオブジェクトを作るときに
MyServer("www.***.com","80",this)//アドレス、ポート、MainDocへのポインタ
を渡してthisを
自作クラスのメンバpMainDocに代入したら、
pMainDoc->UpdateAllViews(NULL)で出来ました。
しかしこの場合、あるオブジェクトが自分を保持しているクラスの
ポインタがわからないから、あらかじめ教えてもらうという方法ですよね。

クラスA →メンバとして所持→ クラスB

という関係の場合AからBへのポインタはすぐ手に入りますが
BからAは難しいんですね。
204173:02/03/04 20:15
すみません。もうひとつ質問してよろしいでしょうか?
MDIアプリケーションで
子ウインドウが一つ開いていて
そこからもう一つ別の種類の子ウインドウを開くときにはどうすべきでしょうか?

先ほどと同じなのですが
CMainViewもしくはDocから
ChildFrame2+SubDoc+SubViewの組み合わせを
一つ新たに開きたいのです。

これが出来ればMDIについてだいぶ使えるようになるかと思うのですが・・・
DocumentTemplateに新たな子ウインドウへのポインタを追加すると
起動時に二つ(もしくは複数)のウインドウから選ぶ画面が出ますよね。
あのとき選ばなかった方を動的に作り出したいのです。
205173:02/03/05 01:58


ChatFrame *cFrm = new ChatFrame();
CRect cr = CRect(0,0,400,400);
cFrm->Create(NULL,"test",WS_OVERLAPPEDWINDOW,cr,(CMainFrame*)AfxGetMainWnd(),NULL);
cFrm->ShowWindow(SW_SHOW);

SubDocら強引にこんな感じで開いてみました。
すると
Warning: Creating a pane with no CDocument.
まあこれはエラーでるだろうな・・・と思ったのですが・・・
206173:02/03/05 03:44
むう悩みまくって知恵熱が・・・

いろいろ試行錯誤してようやく問題が整理できました。
つまるところMainFrameのメニューからウインドウ→新しくウインドウを開くを
するとウインドウを開くことが出来ますよね。
これをボタンかなにかでそのボタンを押したら動的にウインドウが開く
といった風にしたいのです。結局新しくウインドウを開くメニューでは
ID_WINDOW_NEWメッセージを送っているようですが、
これでは開くべきドキュメントテンプレートが複数あるときに
それを選択できませんよね?

MfcによるWindowsプログラミングと新VisualC++6.0入門を持っていますが、
MDIアプリに関する情報って少ないんですね。需要が無いんでしょうか・・・
207デフォルトの名無しさん:02/03/05 05:10
>>206
需要が無いわけじゃないんだろうが、よほどの事がないと今はMDIにしないな。
最近はSDI、ていうかもっとExplorerスタイルのスプリッタ画面が主流かも。
2chブラウザのギコナビとかもそうでしょ。
「MFCによるWindowsプログラミング」を持ってるならわかると思うが
MDIは推奨されてないってことになってるしな
209173:02/03/05 12:58
>207,208
そうですね。確かに推奨されてないというのは知っていました。
しかし、代替えの方式として提案されているものの作り方がわからないんですよ・・
こちらも情報が無い・・
「MFCによるWINDOWSプログラミング」の688ページ
(持ってない人すみません)に載ってるワークブックモデルが理想に近いのですが
(タブブラウザのようなものを想定しています)
MDIが作れるようになったら、こっちへ移行して〜っと思っていたのですが、
最初からワークブックモデルを目指した方がいいのかな・・・
タブブラウザのようなワークブックモデルのアプリケーションの解説って何かありませんでしょうか?
今手元にある書籍「mfcによる〜」「新Visualc++6.0、ビギナー編、シニア編」
「VisualC BlackBook」
のどれにも記載が無いのです。
「MFCによる〜」で言えばP657に自分でコントロールビューを
作る例としてタブ付きビューの作り方がちょこっと出てる。
たしか「Best of MSDN magazine 下巻」だったと思うけど、
その本にはExcelのワークシート風のタブウィンドウの作り方が載ってたような。
「VisualC++5.0プログラミング入門」というVC++5.0LearnigEditionに
付いてきた本(市販もされてるはず)には複数View&複数DocのMDI
アプリケーションの作り方が出てる。

あとはCodeGuruやCodeProjectにサンプルがないかなぁ。
211デフォルトの名無しさん:02/03/05 15:53
ダイアログやメニューのリソースだけを入れたDLLを用意して、DLLを切り替えること
によって多国語対応しているソフトありますよね?
これってどうやるんでしょうか?
一応外部DLLからダイアログを表示することはできたんですけどそのあとがわかりません。

CDialog dlg;
HINSTANCE hInst;
RSRC hDlgInit;

hInst = ::LoadLibrary("jpn.lng");
hDlgInit = ::FindResource(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),RT_DIALOG);
hResource = ::LoadResource(hInst, hDlgInit);

if (hResource != NULL)
{
LPDLGTEMPLATE lpTemplate;

lpTemplate = (LPDLGTEMPLATE)GlobalLock(hResource);
GlobalUnlock(hResource);
dlg.InitModalIndirect(lpTemplate);
}

dlgg.DoModal();

本当はCDialogクラスから派生したCAboutDlgでやりたいんですけど、InitModalIndirect()
呼び出したあとにASSERTでとまっちゃいます。
212デフォルトの名無しさん:02/03/05 16:10
ChildFrame2+SubDoc+SubViewの組み合わせを登録したCDocTemplateのポインタを
適当なところ(CXXXApp::m_pSubDocTemplateとか)に保存しておけばいいんじゃないか。

で、適当なユーザ定義メッセージ(WM_APP_OPENFRAMEとかなんとか)を定義して、
そのハンドラ(CXXXApp::OnAppOpenFrame())で
m_pSubDocTemplate->OpenDocumentFile(NULL);
するって感じではどうか。
213デフォルトの名無しさん:02/03/05 16:11
MFCの上でWinsockを使ってHTTP://へアクセスしたいんですけどどうすればいいでしょう
一応、WinMain()からDosで扱うのは、解ったのですが、
MFCに入れると、スレッドが作成できなかったり、エラーが出てどうしようもありません。

>>209
タブブラウザは、ただタブコントロール使ってるだけじゃん。
何が難しいの?
タブコントロールの使い方が分からんの?
タブコントロールの議論ではなくて、MDIの議論ですよ。
216デフォルトの名無しさん:02/03/05 16:20
MDIで、内側の子フォームをロードするときに、ダイアログボックスをロードすることって、できるんですかね。
そういやMFC7.0に新しいViewクラスって追加されたのかね。
MFCは7なの?
5,6どこいったよ!
219デフォルトの名無しさん:02/03/06 01:19
CsplitterWndを使ったViewで
一つのDocに複数のViewがあるとき
GetDocumentでDocへのポインタをえるにはどうしたらいいのでしょう?
AppクラスのInitInstanceのRUNTIME_CLASS
ではViewを一個しか指定できないですよね。
220173:02/03/06 01:39
>210
そのタブビューの作り方はやってみました。
でもそのタブの動的作成が難しそうだなあ・・と思って作っただけで放置してました。
もう一回チャレンジしてみます。

>212
ありがとうございます。
とりあえずその遣り方で解決しました。
正直、MDIで成功してるのはMSDEVか、Nifterm位なもん。
222デフォルトの名無しさん:02/03/06 02:53
>>219
どのViewからGetDocument()しても、
Documentへのポインタは取得できますが・・・
223173:02/03/06 02:58
やはりいろいろ難しいところがありますねMDIは。
結局TabViewでやることにしました。
まあタブビューも資料がそんなにあるわけではないですが、
とりあえず
Best of MSDN magazine 下巻
を買いにいきまっす。
基本的に不思議なのがタブビューは一つのビューですよね。
一つ一つのタブの中身を3分割してそれぞれにまた別のビューを割り当てる
ということがしたいのですが、その場合はビューの下にビューを作るということですよね。
そういうことは可能なのでしょうか?
うーーん。先は長そうだ・・・
>ビューの下にビュー
それはスプリッタウィンドウでいいのでは?
>>211
コンストラクタでリソースID渡してない?
その時点でリソースロードしちゃってるんだと思う。
クラスウィザードに吐かせたクラスはそうなってるはずだから
手で消せばいいかと思う。遅レスごめん。
>>211
>>225
追加。
CDialogから派生したクラスのコンストラクタで >>211
ようなことをやるようにして、他のソースの"CDialog"を
作ったクラス名で全部置換すれば動くべ。
227173:02/03/07 01:54
とりあえずいろいろ指向錯誤しまくりでまだMDIに挑戦中。
同じドキュメントテンプレートから生み出した複数Frameの区別って
どこでするものでしょう?
それと複数のフレームは単一のDocオブジェクトを参照すべきなんでしょうか?
それとも一つのフレームに付き1つのオブジェクトってのが自然なのかなあ・・・・
この辺のポリシーがわからないので、設計がめちゃくちゃになってきました・・・
MDIは今風のアプリ設計にはあわないぞ。

男らしく全部ダイアログですませ。
>>228
いや、MDI って発表された時から「糞」だの「吐き気がする」だの
散々叩かれてますが。
230173:02/03/07 03:07
>227,229
ぐへー。やはりそうですか・・・
とりあえずタブブラウザのMoonBrowzerのようなアプリが目標なんです。
例えばMoon Browzerとかはタブブラウザですが、
タブじゃないですよね。こういうのはMDIから作るのかなと思ってるのですが、
ちがうのですか・・・??
231デフォルトの名無しさん:02/03/07 03:16
うわ、レスついてる。遅レスなんてとんでもない、感謝感激です^^

早速、コンストラクでID渡してるところを削除しましたらASSERTでなくなりました。

CAboutDlg::CAboutDlg()// : CDialog(CAboutDlg::IDD); →ここをコメントにしました。
{
HINSTANCE hInst = ::LoadLibrary("JPN.lng");
HRSRC hDlgInit = ::FindResource(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), RT_DIALOG);
HGLOBAL hResource = ::LoadResource(hInst, hDlgInit);

if (hResource != NULL)
{
LPDLGTEMPLATE lpTemplate;
lpTemplate = (LPDLGTEMPLATE)GlobalLock(hResource);
GlobalUnlock(hResource);
InitModalIndirect(lpTemplate);
}else{
//jpn.lngがなかった場合、自前リソースを使用。
}

}

こうすると、ダイアログ呼ぶ方は何も変更しなくていいのでスッキリしますね。
で、ちょっとまだ検証中なんですが、外部リソースDLLがなかった場合自前の
リソースを利用するようににしたいと思ってます。

実は上のコードでも、FindResourceをNULLで呼ぶと自ファイルから検索するみたい
で、うまく機能します。
ただ、コメントにした" : CDialog(CAboutDlg::IDD)"を処理しなくていいのかは
もう少し調べてみます。

乱文失礼しました。
絵描き系とか音系のアプリにはMDI必須だと思うけどなあ。
ウィンドウパカパカ開くから、
SDIだとデスクトップや他のアプリのウィンドウが見えてしまって混乱する。
233232:02/03/07 10:56
ついでに、一つの作業プラットホームとして成立しているソフトは
MDIにすべし、という説を提唱してみるテスト
そうでなければむやみにMDIにすべきではないミタイナー
234デフォルトの名無しさん:02/03/07 13:56
プロパティシートにページを複数表示しているのですが、
タブを使用禁止にすることは出来るでしょうか?
シートのOnInitDialog()でGetPage(0)->EnableWindow(FALSE)
としてみたのですが、出来ませんでした。
何かいい方法はないでしょうか??
235デフォルトの名無しさん:02/03/07 14:34
>>230
ん?タブじゃない?
あれはどう見てもタブだと思うが。
236デフォルトの名無しさん:02/03/07 16:21
議題変えて悪いのですが、
C++(MFC)で作った実行ファイルの置いてあるディレクトリを取得
(自分のFullPathを取得)するのにはどうすればいいでしょう?
>>236
GetModuleFileName()
>232
同意。MDIが駄目かどうかはアプリのタイプによるから一概には言えない。

opera5は MDIだったが、なんか圧迫感があった。
(6になってSDI/MDI/タブが選べるようになったが)
ブラウザみたいに一つのウィンドウに多くの情報を提示するような
アプリだと MDIは向かないのかも。
EXCELがMDIなのはなんだかウザいよな
240デフォルトの名無しさん:02/03/07 16:48
申し訳ないです。
GetModuleFileName()で実行するとエラーばかり出て、
MSDNを見てもいまいち解決しません。
実行している自分自身のパスを取得するサンプルか何か教えていただけないでしょうか?
241デフォルトの名無しさん:02/03/07 16:56
242デフォルトの名無しさん:02/03/07 17:01
>>241
有難うございます。助かりました!
243デフォルトの名無しさん:02/03/07 18:37
>234
に追加です。
VBのTabEnabledのようなものがあればいいと思うのですが、
誰か知りませんか?
本当に困っているので、よろしくお願いします。
244デフォルトの名無しさん:02/03/07 20:30
INI ファイルを読み込むときに、

CString t1;char cs[100];
GetPrivateProfileString("window", "width", "0", cs, 0, spath);
t1.Format("%s", cs);

こう書いたのですが、まともに読み取れません。
解決法を知っておられる方はおられますか?
>>244
nSize が0じゃ何も読めないと思うがどうか。
MDIと見せかけてツールバーをフローティング表示とか言ってみるテスト。

>>243
「最新Windowsプログラミングテクニック ワンポイント・レッスン」
て本の1069ページに出てる。
247デフォルトの名無しさん:02/03/07 21:22
Cでの質問なのですが。。
ある文字列があって、その文字列の左からn番目の文字列を取得したいの
ですが、このような関数ってあります?
MSDN探しててもそれっぽい関数ないのですが・・・
文字列wchar_t *pで、n番目の文字は、p[n]
n番目からの文字列は、(n+p)
MultiByteCodeSet? 知らんね。
249デフォルトの名無しさん:02/03/07 22:46
VC++のダイアログボックスなどコントロールのプロパティのダイアログあるじゃないですか。
あのように、ダイアログの外をクリックしたら自動的に消えるようにしたいのですが、
どうすればよいか知ってるかたおられますか?
なぜここでCの質問をするのかと問いたい
>>249
フォーカスが無くなると自分自身を破棄するとか?
252173:02/03/08 01:06
>235
タブじゃないという言い方は変だったかもしれません、
プロパティとかに表示される耳のような部分がないので
そのように思ったのです、MoonBrowserのようなアプリは
MDIから作るのでしょうかSDIから作るのでしょうか?
>>252
つうか、あんた何も分からな過ぎ。
もうちっと色々調べてから挑戦しようや。

ちなみにあれは、タブコントロールのスタイル変えただけだよ。ボタン型に出来る。
Moonは使ったこと無いので知らんけど、親Windowの内部に複数Window表示できるタイプなら
MDIだろう。
しかし、今から新たにプログラム組むのに、MSが推奨しないMDI使うのはどうかと思うが。
何でわざわざMSがWordやExelをSDIに作り変えるなんていう手間をかけたか考えてみ。
>>247
strncpy(str1,str2+n,cn);
255254:02/03/08 01:17
すまん、ここはMFC専用スレか。
MFCはわからん。というかC++がわからん。
256デフォルトの名無しさん:02/03/08 01:43
ドキュメント+ビューアーキテクチャで
ビューからドキュメントを得るのは
GetDocument()で出来ますが、
その逆や親フレームのポインタはどのようにしたら取れるのでしょうか?
257デフォルトの名無しさん:02/03/08 09:48
>>246

レスありがとうございます。
早速、その本を探してみます。
なぜMSがMDIを推奨しないことになったのか、経緯を教えて欲しいナリ。
259デフォルトの名無しさん:02/03/08 13:32
>>258
MIDI音源が不安定だからさ
260VC++初心者:02/03/08 23:39
SelectObject関数が失敗してしまいます。
何が原因でしょうか?
詳しい調査の仕方を知ってるシト教えてください。

ASSERT(SelectObject([ビットマップへのポインタ])!=0)で
アサーションされるが、なぜかがまったくワカンネーーー
>260
まずだ、そこの ASSERT は VERIFY にしておけ。リリース版作ったときにハマるぞ。
そうそう、SelectObjectの返り値もちゃんと保存しとくように(後で戻すのに必要になる)。
次にだ、GetLastErrorでエラーコードを取得して、
VCの [ツール]-[エラーコード検索] で何のエラーか調べてみてくれ。
おおかた、ビットマップが変なんだろうと思うが。
なんだそのビットマップのポインタってのは。
ハンドルを渡せ。
いや、きっと本当は pDC->SelectObject と書いているのさ。ここMFCスレだし。
そうだよな。>260よ、そうだと言ってくれ。
264VC++初心者=260:02/03/09 01:42
訂正します。

CBitmap *pCBitmap;
ビットマップ初期化処理(略);
ASSERT(pDC->SelectObject(&pCBitmap)!=0);

>>261さんのアドバイスに従ってやってみます。

それでもだめならまたきます。
おやすみなさい。
SelectObject()はGetLastError()で調べられないぞ。
で、260はMSDN見たのか?ビットマップについて色々書いてあるぞ。
&pCBitmapの&ってなんだ。
>265
あれ、そうなの? たしかに、GetLastErrorでエラーとれるとは書かれてないけど……。
>264
本当に & って付いてる? もし付いてたらすぐさま外せ。
268デフォルトの名無しさん:02/03/09 16:56
もうしわけないっす。
Win32上の特定のファイルのサイズを取得するにはどうすればよいでしょう?
269親切な人:02/03/09 16:57

ヤフーオークションで、凄い人気商品、発見!!!

「高性能ビデオスタビライザー」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
270デフォルトの名無しさん:02/03/09 17:02
最近箱型選択が流行ってますが、何をすれば
箱型選択になりますか?
271VC++初心者=260 :02/03/09 17:28
ただいま戻りました。
丸投げしているみたいで申し訳ないとは思いますが、
VC++練習用のゲーム(パズルみたいなもの)なので公開しても問題ないと思います。
メニューから、「ピクチャーの読み込み」を選択して、
360*360以内の.bmpファイルを読み込み、終了するとSelectObjectがエラーを返してくれます。
問題が起こる場所は、
void CJigsawView::OnNewGame() の
pCBitmapWkd

= pDC->SelectObject(pCBitmap);
の部分です。


以下のURLに問題のプロジェクトがあります。(2行ですがつないでください)
http://jp.y42.briefcase.yahoo.co.jp/bc/aji_curry_x/lst?.dir=/Public&.view=l&.src=bc&.done=
http%3a//jp.y42.briefcase.yahoo.co.jp/bc/aji_curry_x/lst%3f.dir=/Public%26.src=bc%26.view=l

身勝手なことばかり書いて申し訳ありません。
>>268
GetFileSize
273VC++初心者=260:02/03/09 17:34
>>261さんへ

やってはみたのですが・・・・

エラーコードは「0」でメッセージは「この操作を正しく終了しました。」と、
言いつつ、pDC->SelectObject(pCBitmap)はしっかり0を返してくれます。
274デフォルトの名無しさん:02/03/09 20:28
>>270
そんなAPIは存在しない。自力で実装すれ。
275デフォルトの名無しさん:02/03/09 21:07
GetCompressedFileSizeを使いたいのですが、
アクセス権などはどのように取得するのでしょうか?
>>271
見てみたよ……色んな意味ですごいことになっているソースだな。
一つ重要なことを話しておこう。「ASSERT の中に書いたものは
リリース版ではきれいさっぱり消えてなくなる。」何でもかんでも
ASSERTにつっこんどくと後でえらいことになるぞ。

で、本題。SelectObjectできない理由は、pDCがメモリDCじゃないから
(ビットマップはメモリDCでしか選択できない)。
画面⇔メモリ間のビットマップ転送が目的なら、画面側のDCに
ビットマップを選択しておく必要はまったくない。
ビットマップのコピーが目的だったら、メモリDCを二つ作って
その間で転送しないとダメ。
277VC++初心者=260 :02/03/09 22:19
>>276
お答えいただきありがとうございます。
ここからはVC++できないので、帰って直してみます。
家は電話回線を繋いでないのです。

ところでデバイスコンテキストについてですが、
メモリDCとそうでないDCは何か見分け方があるのでしょうか?

そのプログラムを見ていただいてもお判りのように今ひとつ理解できてないのです。
そのプログラムは、参考書などを使って書きました。(MSDNも参考にさせていただきました。)
でも、デバイスコンテキストになると「紙に絵をかくように図形を描画する。」とか、
書かれていて、それがハードウェアとどう結びついているかの説明は見つかりません。

何か詳しい本とかHPをご存知ですか?
278デフォルトの名無しさん:02/03/09 23:35
はじめまして
http://techtips.belution.com/ja/vc/0023/
でDLLでデータを共有する方法があるのですが
このデータをクラスでもできるのでしょうか?

本などでは、すべてグローバル変数というか
このサイトで説明しているものばかりなんです。
同じようにクラスも宣言したんですけど
どうも、共有にデータをもってくれないんです。
誰か知っているかたがいればお願いします。
279デフォルトの名無しさん:02/03/11 09:02
特定の拡張子に関連づいているIconを取得してCListCtrlのIconとして
表示したいのですが、わかる人はおられますでしょうか?
SHGetFileInfoとは聴いたのですがまったく解らないので、
教えてください。
>>279
SHGetFileInfoで検索したら山ほどひっかかるじゃん。
なにがわからんのよ。
281デフォルトの名無しさん:02/03/11 11:19
>>279
SHFILEINFOへ代入する所までわかったのですが、
その値をCListCtrlへ受け渡す方法がわからないのです。


282デフォルトの名無しさん:02/03/11 12:30
>>281
CImageListに取得してたIconをぶち込んで
CListCtrl::SetImageListすればよかろう。
283デフォルトの名無しさん:02/03/11 12:36
>>282
いえ、CImageListへ取り込む方法がわからないのです。
284デフォルトの名無しさん:02/03/11 12:42
CImageList::Add
ででけへんの?
285デフォルトの名無しさん:02/03/11 12:55
1 番目の引数を 'struct _IMAGELIST *' から 'struct HICON__ *
に変換できないんですよ。Addだと。
HIMAGELIST、SHFILEINFO のどちらからも入れれないんです
286デフォルトの名無しさん:02/03/11 12:57
SHFILEINFO.hIcon ももちろん出来ないのです。
どうすればよいでしょう。
なんだそりゃ?
どういうコード書いているのか見せろ
288デフォルトの名無しさん:02/03/11 13:45
SHGetFileInfo(m_pathl + ch, 0, &shfi, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_LARGEICON);
CImageList mig;
mig.Add(shfi.hIcon);
m_listl.SetImageList( &mig, LVSIL_NORMAL);
mi.iImage = 0;

miはLVITEMで、SHFILEINFO shfi、CImageList il
こんな感じです。
CImageListがCreateされてないんじゃ
290デフォルトの名無しさん:02/03/11 19:42
mig.Create(32, 32, ILC_COLOR, 1);
for() {
SHGetFileInfo(m_pathl + ch, 0, &shfi, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_LARGEICON);
::CoUninitialize();
mig.Add(shfi.hIcon);
m_listl.SetImageList(&mig, LVSIL_NORMAL);
mi.iImage = 0;
CListCtrlへ代入
mig.DeleteImageList();
}
指摘いただいた通り書き直したのですが、まだ動きません。
というよりも、コンパイルエラーは出ないのですが、
そのプログラムが実行された瞬間に、エラーが出るのです。
デバッグしてみるとAddの部分に問題があるようなのですが…。
291あのう・・・・:02/03/11 21:59
大きい文字をピクチャボックスに書きたかったので
CFont myFONT;
myFONT.CreatePointFont(300,NULL,NULL);
myDC.SelectObject(&myFONT);

とやるとコンパイルもできてちゃんと文字も大きく表示されるのですが
実行時に必ずエラーが出るんです。無視すれば普通に動くのですが
どうしてこうなるのかがわかりません。どなたかご教授お願いします。
>>290
Createの引数が足りない。
>>290
ヘルプぐらい確認しなさい

>>291
それだけじゃ分かりません。
最低でもどんなエラーが出るか書いて下さい。
いちいちビルドしてチェックするほど皆ヒマじゃないんだぞ
>>291
予想の範囲で
CFont myFont, *pFont;
myFont.CreatePointFont(300, NULL, &myDC);
pFont = myDC.SelectObject(&myFont);

/* 描画処理 */

myDC.SelectObject(pFont);
myFont.DeleteObject();

後始末の問題かと思うが
295あのう・・・・:02/03/12 18:39
アドバイスありがとうございます

Microsoft VisualC++ Debug Library
------------------------------------
Debug Assertion Failed!

File:wingdix.cpp
Line:250
For information on hou your program can cause an assertion
failure,see the Visual C++ documentation on asserts

というようなエラーメッセージが起動直後に出るのです。
コンパイルは通るのですがなぜこうなるのかがわかりません。
デバッグしる。
297デフォルトの名無しさん:02/03/12 21:43
static LVITEM mi;
SHFILEINFO shfi;
CImageList il;

mi.mask = LVIF_TEXT | LVIF_IMAGE;
mi.iItem = 0;
mi.iSubItem = 0;
s = kFinder.GetFileName();
_tcscpy(ch, s);
mi.pszText = ch;
::CoInitialize( NULL);
HIMAGELIST himg= (HIMAGELIST)::SHGetFileInfo(m_pathl + ch, 0, &shfi, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_LARGEICON);
CImageList mig;
mig.Create(32, 32, ILC_COLOR, 1, 1);
mig.Add(shfi.hIcon);
m_listl.SetImageList( &mig, LVSIL_NORMAL);
mi.iImage = 0;
m_listl.InsertItem(&mi);

このように書いたのですが、ぜんぜん、画像が
CListCtrl(m_listl)に表示されません。どうなっているのでしょう?


そうくると思った。
スコープが外れるとmigが無くなるから。
migをメンバ変数にしる。

CImageList il; はどこに使われているのだろう?
299デフォルトの名無しさん:02/03/12 22:03
migは、メンバ変数にしました。(ilはmigの間違いでしたが)
それから、Createを使うのですから、DeleteImageListもいるんですよね?
そこまではかえたのですが、ぜんぜんCListCtrlにはアイコンが表示されません。
どうしてですか?

DeleteImageListしてるからです。
301デフォルトの名無しさん:02/03/12 22:36
有難うございます。
一つ聴いてよろしいですか?というのは、私を困らせたのは、Reportでのリスト化なんです。
long state = ::GetWindowLong(ma.GetSafeHwnd(), GWL_STYLE);
::SetWindowLong(ma.GetSafeHwnd(), GWL_STYLE,(state & ~LVS_TYPEMASK)|LVS_REPORT);
で、REPORTになるじゃないですか。
そうすると、アイコンが消えるのですか?
それで、試行錯誤がんばっていたわけです…。
まず日本語を勉強してこい。
SetImageListにLVSIL_SMALLを入れてください。
たしかに変な文だ。
305デフォルトの名無しさん:02/03/12 23:37
ファイルの末端にデータを追記しようと思って、fout.SeekToEnt()
を使ったのですが、
そうするとファイルを開いて、追記開始部分に変な文字が
つけられてしまうのですがどうにかならないんですかね?
306デフォルトの名無しさん:02/03/13 00:08
VC++のダイアログベースで作成しています.
再描画を追加したいのですが,初期設定やら,初心者なのでよくわかりません.
OnPrint関数を使って具体的にどのようにすればいいのでしょうか?
ボタンOnBotton1()を押したら,グラフを順番に描いてくれるものを作っています
CDC* pDC=this->GetDC();
書けばいいらしいのですが,それ以降がわかりません.お願います.


>>301
それMFC?

>>306
OnPaintでCDCのメンバ関数で描画しなさい。
>305
テキストファイルなら、末端のEOFを殺すのは義務です。
309デフォルトの名無しさん:02/03/13 19:14
ウィンドウの状態、位置を保存するために
MainFrm.cppのOnCloseでGetWindowPlacement、
CreateでSetWindowPlacementを使いましたが
次回起動したときに最大化や最小化が正しく反映されません。
最大化や最小化をしない場合は正しく位置が反映されます。
どうすればよいのでしょうか?
秀丸を見習えば?
閉じ際に一瞬開いて場所を保存。

最小化・最大化状態まで保存されたらかなりむかついて
即アンインストールだがな。

ああ、きっと、アンインストーラもないんだな。
ごめんごめん。
311デフォルトの名無しさん:02/03/13 22:50
CListCtrlのリストで、途中でサイズを変更してもアイテム自体の
行・列の数は変わりません。
最整列させるにはどうすればよいでしょうか?
>閉じ際に一瞬開いて場所を保存。
こんなの見習いたくないな
>>312
つーか秀丸の作者か?
あんぽんたん、とだけ言っておこう。
>>309
CFrameWnd::ActivateFrame()をオーバーライドしる!
>>309
ここみるとよいかもよ。314の言うように処理してます。
http://www.codeproject.com/dialog/windowpres.asp
>閉じ際に一瞬開いて場所を保存。
位置を保存するだけならこんなことしないでも
GetWindowPlacement、SetWindowPlacementでできるが。
>>311
Arrangeはやってみた?
> ああ、きっと、アンインストーラもないんだな。

「保存」と聞いて即レジストリを連想したんだろうな…
319デフォルトの名無しさん:02/03/14 10:24
CTreeViewで特定のディレクトリ以下のディレクトリを
取り扱いたいのですが、(コモンダイアログではなくて)
方法を知っておられる方はおられませんか?
何行ってるのかわからんけどFindFirstFileとFindNextFileでぐるぐる回しつつ
ツリーを自分で作れ。
最小化するときなどのアニメーションを止めたいんだけどどうすればいい?
322デフォルトの名無しさん:02/03/14 15:34
ファイルのドラッグ&ドロップを受け取るMFC ActiveX Controlを作成しようとしています。
通常のウインドウと同じ方式、(DragAcceptFiles()して、OnDropFiles())(COleDropTargetを持たせる方法)
でうまく動かないのですが、何か特別な手続き方法が必要なのですか?

間違ってPart2スレに書き込んでしまい、あげてしまいました。ごめんなさい。

今MFCでメモ帳を作ったんだが。
フォント変えたい。"MS ゴシック"のサイズ「9」にしたい。
CFontをSetFontしろと聞いたのでやってみたが、実行時エラーで落ちる。
どのクラスにどのタイミングでどの処理をやるのですか?
324デフォルトの七資産:02/03/14 16:45
静的分割ウィンドを作っているのですが,
分割の縁のサイズを変えた時に呼ばれるメッセージって
なんだかわかりますか?
それか, CFrameWnd::IsTracking をどのタイミングで
呼べばいいのか教えて下さい。 お願いします。
相談に乗ってください。
待ってます。
>>321
WM_SYSCOMMANDの SC_MINIMIZEを捕まえて、
 ::AfxGetMainWnd()->ShowWindow(SW_HIDE);
 ::AfxGetMainWnd()->ShowWindow(SW_SHOWMINIMIZED);
とかやると、できるっぽい。

SystemParametersInfo()を使って、SPI_GETANIMATION で現在の設定を保存、
SPI_SETANIMATIONでアニメーション切って、最小化後、設定を復元してやる
方法もあるが、これはちょっと問題アリな方法かも。

>>323
SetFontはいつでもいいが、CFontをメンバ変数にするか、newで作ってやる必要がある。
>>325
なるほど、別にアニメーション自体を切らなくてもいいわけだ。
327325:02/03/15 01:59
>326
いや、しかし ShowWindow()使う方法ではタスクバーの項目の順番が変わってしまうな(´Д`;)
SW_HIDEでタスクバーから一旦消え、SW_SHOWMINIMIZEDで再登録されるので。
328デフォルトの名無しさん:02/03/15 08:46
ダイアログをドラッグするとき、タイトルバーでドラッグできるじゃないですか。
では、タイトルバー以外でドラッグできるようにするにはどうすればよいのでしょうか?
329デフォルトの名無しさん:02/03/15 09:48
OnNcHitTest()でHTCAPTIONを返す。
>>328
そういうのは定番だから
「MFC タイトルバー 以外 ドラッグ ウィンドウ 移動」
みたいな単語でぐーぐればすぐ出てくるよ。
331デフォルトの名無しさん:02/03/15 12:49
ええ、WM_NCHITTESTを使うことは知っているのですが、
ClassWizardのメッセージにWM_NCHITTESTがのっていないので、
悩んでいるわけです。
初めからそう質問すればいいのに。
ClassWizardのメッセージフィルタをウィンドウにしる。
333デフォルトの名無しさん:02/03/15 13:22
有難うございます。
解決しました。
334デフォルトの名無しさん:02/03/15 16:31
ダイアログをモードレスで表示して、何らかの仕事を行うとし、
途中で別のダイアログを使う。
そのときに最初のモードレスのダイアログを終了したい。
なにか手段はないだろうか?
CloseWindow

ダイアログのコードに処理を埋め込んでいるなら
お前の設計ミス。
336デフォルトの名無しさん:02/03/16 00:21
うえで、気楽にいわれたのですが、エクスプローラのツリービューのようなものを
CTreeViewで実現したいのですが、ぐるぐるでは構造体の配列が
いくらあっても足りません。
どうすればよいでしょうか?
力を貸していただけませんか?
頑張って配列を作れ。
ぐるぐるとな。

ぐるぐるを忘れてはいかんぞ。
338 :02/03/16 01:08
>>336
何のための配列が欲しいのだ?
構造体(をnewしてそのアドレス)を、個別に対応するTVITEM のlParamに
ぶっ込んでやれば、配列のサイズがどうとか悩まずに済むと思うが。
>>336
ツリービューなんだから、データの持ち方もツリーする。
ごくアタリマエなことがなぜできんのだろう・・・
340デフォルトの名無しさん:02/03/16 11:05
RichEditのソースって公開してないん?
341 :02/03/16 12:40
チェックボックスコントロールが複数あるダイアログがあります。
そのチェックボックスの上をマウスが通過したときにチェックボックスの文字色や背景色を変更するにはどうすればいいでしょうか?
>>341
CButtonを派生してWM_MOUSEMOVEに対応するようにする。
343デフォルトの名無しさん:02/03/16 14:03
MFCプログラム内でCLSIDより、実行中に随時ActiveXを取り込み、
表示、使用することは可能ですか?
可能なら方法を教えてください。
344336:02/03/16 15:09
当たり前、といわれても私のような初心者にはさっぱりですよ。
なにか、参考になるページなり何かありませんか?
345341:02/03/16 15:20
>>342
派生クラスを作らないとダメでしょうか?
サブクラス化によってWM_MOUSEMOVEメッセージは検出することができるので、
問題はそのタイミングで色を変更するにはどうすればいいか、なのです。
>>344
「MFCによるWindowsプログラミング」\8800
ttp://www.codeproject.com/
ttp://www.codeguru.com/
>>345
OnCtlColorは?
348341:02/03/16 15:41
>>347
普通にそれを使ったらダイアログの作成時から色が変わってしまいます。
どうすればいいのでしょうか?
>>348
WM_MOUSELEAVE、WM_MOUSEHOVERメッセージで
マウスが離れた時と留まってる時がわかるので、
そのタイミングでシステムのデフォルト色と変更色を変えるとか。
win98以降じゃないとこのメッセージ使えないけど。
>>349に追記
ttp://www.codeproject.com/buttonctrl/hoverbutton.asp
にWM_MOUSELEAVE、WM_MOUSEHOVERを使って表示を切り替える
サンプルがある。
351341:02/03/16 16:20
ありがとうございます。
今からそのサンプル見てみます。
352349:02/03/16 17:05
フラグを用意して、OnSetCursor内でチェックボックスの上にカーソルがあれば
フラグをTRUE、カーソルがなければFALSEをセットするようにして、
OnCtlColorでフラグがTRUEなら色を変更する、という方法でもできたよ。
353Javaじゃないのね:02/03/16 17:42
www.cppdoc.com/example/mfc/mfc.html
既出だったらすいません。
世の中にはいろんなページがあるんですね。
そんなページがあったのか・・・
とりあえず作者のがんばりを誉めてあげたい。

しかしなぜそこまでしてJavaドキュメントに似せたかったのか・・・
メニューバーとかの色って勝手に自分のソフトだけで変えることって
出来るのかな…。
そういうときはオーナードローで…
オーナードロー!?詳しく教えてくれませんか?
358デフォルトの名無しさん:02/03/17 04:51
初歩的なことを聞いて申し訳ないのですが
CString→int型にするにはどうすればいいんですか?
逆ならformatでできるのですが
(int)やってもatoiやってもできないんで困っております。
>>358
そういや operator (int)() はあっても良さそうだね。けど無いのさ。
 atoi((LPCTSTR)str)
で、どうよ?
360デフォルトの名無しさん:02/03/17 13:14
ダイアログアプリでファイルのドロップ受け入れどうやりますか?
>>359
sscanfの方がエラーチェックできるから楽。
 CStringからってことなら _stscanf()

>>360
別に一緒だけど?
 ダイアログリソースのスタイルにD&D許可チェックついてる?
なんでお前ライチ位置キャスト寸の?
ゲボハハハ
363323:02/03/17 14:49
>>325
フォント設定解決しました。ありがとうございました。
364デフォルトの名無しさん:02/03/17 21:32
>>362
MFCはイイね。子供がキャストしなくても困らないように作ってある。
とりあえずUnicodeに手を出すのはやめとけ。
365sage:02/03/17 21:53
ウィンドウサイズを変えたくて
MoveWindow( 0,24,100,100, TRUE );
SetWindowPos( &wndTop, 0, 0, 100, 100, SWP_NOMOVE );
とか書いてもサイズは変わらず、
代わりにクライアント領域内でのこの範囲内だけが再描画の対象になって、
範囲外の領域は前のウィンドウの内容が残る──てなことになるんですが、
これの対処方法はどうすればいいんでしょ?
Web上で調べてみたんですが、普通、上のどっちかでウィンドウサイズは変えられるらしいんですけど。
ビューはCViewクラスで、とりあえずOnDrawに記述してみました。
特にこれといって難しいことはやってませんです。
WM_DRAWを処理中に描画以外のことは一切するなぼけ。
反省しる。
GDIにあやまり!
関係ないがWM_KILLFOCUS処理時にメッセージボックスをだすぬ!
反省しる!
USER32.EXEにあやまり!

デストラクタで例外を投げるくらい重罪だぬ!
>366
あれー? WM_PAINTメッセージの処理中はダメなの? タブー?
んじゃどこに書いておけばいいでしょうか。

どうでもいいけど、さっきの書き込みって名前だけsageてて全然下がってなかったよ。
なんかつくりてー
ウィンドウの初期表示サイズを変えたかったら
CreateWindow[Ex]のぱらめーたをいじるか
WM_NCCREATE(PreCreateWindow)を掴んで
CREATESTRUCTをいじるり!
>370
とちゅーで(プログラムの実行中、任意のタイミングで)変えたい……
とか言ってみていいっすか?
CREATESTRUCT構造体をどっかで捕まえてそこからいじれないかなあ、とも
考えてみたんですけど、あれってウィンドウの作成段階でしか使えなかったっけ。

VBで組んだソフトでそういうことやってるのを見たことはあるんですが、
VBでできることがVCでできないはずはないかなあ、と。
変えたいと思ったタイミングでやれ。
ただし
WM_PAINTとWM_KILLFOCUSではやるなぼけ。
任意のタイミングって例えばいつよ。
Doc/View使ってるなら例えばメニューに[ウィンドウサイズを2倍に汁]
という項目を作って、MainFrm.cppにそのハンドラ作って
SetWindowPosすればよいと思うが。
あどヴぁいす通りやってみました。
結果→ダメ。

今までと変わらずでおんなじ症状が出るー。むきーっ。
任意のタイミングってのが、クライアント領域をクリックしたとき、なんですけど、
前にOnLButtonDownに置いて試したときも同じ状態に。
これじゃウィンドウサイズっちゅーよりクライアント領域しかいじれない。

んー、どっか何かを見落としてんのかなあ。
お前*どのウィンドウ*にメッセージおくってんの?
それはViewでやってるからだろ。
MainFrm.cppにハンドラ用意するか、
Viewでやるなら
 AfxGetMianWnd()->SetWindowPos(〜);
ミアンウィンドウに乾杯☆
がーん。いや、気づいてくれるはず。きっと、きっと…
379デフォルトの名無しさん:02/03/17 23:44
ちょっと、お聞きします。
CWndClass…SDIのビューの基本クラスですが、
ここに、ハードディスク上の任意のビットマップを表示したいのですが、
(絶対パスで指定するわけですが)
取り込む方法がわかる方いますか?
まずScribbleチュートリアルをやれ。
で、お前がやりたいことは何なのかもう一度思い出せ。
それからCBitmapの使い方を調べろ。
>376
あはははー。そりゃそーだ。そりゃそーだわ。
これってViewのクラスでやってるからじゃないのかあー? とか思いつつも
いや、Viewでいいような気がする、ってずーっと考え込んでましたわ。
一発で解消。
絶対、くだらないことで詰まってるよ、とか思ってたらやっぱりその通りで力抜けまくり。

ともかくありがとうです。
382デフォルトの名無しさん:02/03/17 23:56
>>380
オレが思うに、CBitmapではリソース上のBitmapは扱えるけど、
ハード上のBitmapは無理なんじゃないの?
ちがった?
380に乾杯☆
>>382
ファイル名から一発で作る方法がないだけさ〜
ファイルを読んで、BITMAPINFOHEADER を読み出して、
BITMAP(構造体)をでっち上げて、CreateBitmapIndirect() で作る
とこまで自分でやるのさ。
「幸せは 歩いてこない だから 歩いてゆくんだね」ちゅうわけだ。
リストビューの使い方を教えてほしいです。
CFormViewにしてダイアログにコントロールを埋め込んで、CListCtrl型のメンバを関連づけて、
と、ここまではいいんですが、この後が。

ヘルプやHPを見て回ってわかったのは、LV_ITEM構造体にリスト用のデータを一時的に格納し、
それをInsertItemのパラメータに与えればいいらしい、てことぐらいです。
ただ、その構造体に関する箇所がヘルプでは英語しかないし、どこのHPを見てもいまいち意味が。

 項目、アイテム、サブアイテム、インデックス、ラベル、状態、state、mask。

もう用語からさっぱりわけわかりません。
それをここで一から教えろと?
本買った方が早いと思うんだが。
387デフォルトの名無しさん:02/03/18 23:38
ぎゃー。

classViewでViewクラスに自分で追加したメンバ関数を削除したら
classViewからViewクラス自体が消えちゃったよ・・・。
ファイル自体は生きてるんだけどclassViewには表示されないんです。
どうしたら直るんでしょうか。
388初心者:02/03/18 23:46
printf("%u/n",-1);

を出力したら 65535 となるのはなぜですか?
u はunsigned int型符号無し10進数らしいですが意味がわかりません。
くだらない質問ですみません。
389385:02/03/18 23:48
>386
やっぱりそれなりに長くなる話ですか。
しょーがない。本探すか。
390デフォルトの名無しさん:02/03/19 00:00
>>384
おれはいつもLoadImage()で、ファイル名から一発で
HBITMAPを作っていますが、何か?
>>387
.clw ファイルを削除してからプロジェクトを開くとどうなるでしょ。
>>388
スレ違いの予感。

>>389
というか、リストコントロールで何をしたいのか書いてないし。
>項目、アイテム、サブアイテム、インデックス、ラベル、状態、state、mask。
のそれぞれの意味と使い方の説明はめんどうで誰もしたくないと思われ。

>>390
一発で作る云々はCBitmapの話だと思われ。
393デフォルトの名無しさん:02/03/19 01:18
>>392

CBitmap bmp;
bmp.Attach((HBITMAP)::LoadImage(・・・));

これで一発。
394387:02/03/19 21:29
>>391
返事遅くなりました。ありがとー。clwファイル削除しても
直らなかったけど、「clw 拡張子」で検索したら同じ症状の人
居たみたいで、色々試した直りました。

サンキュー。
395デフォルトの名無しさん:02/03/20 01:56
::AfxLoadLibrary() と ::GetProcAddress() を使って、MFCで作成した DLLの
関数を呼びます。その関数の中では、モードレスダイアログを Createしています。

で、ここまでは良いんですが、このダイアログの PreTransrateMessage()が
どうも呼ばれていないみたいなんです。CToolTipCtrlでツールチップを表示
するんですが、Pre〜が呼ばれないせいでツールチップのが表示されません(´Д`;)

どうすれば良いんでしょうか...? DLLのモジュール状態とかって関係あります?
396395:02/03/20 02:32
これかー。MSDNにあったじゃん。

|ただし、DLL の CWinApp オブジェクトには、アプリケーションの CWinApp
|オブジェクトと異なり、メイン メッセージ ポンプがありません。DLL が
|モードレス ダイアログ ボックスを表示する場合、または独自のメイン
|フレーム ウィンドウを持つ場合は、アプリケーションのメイン メッセージ
|ポンプから、DLL がエクスポートしたルーチンを呼び出す必要があります。
|このルーチンが、さらに DLL のアプリケーション オブジェクトの
|CWinApp::PreTranslateMessage メンバ関数を呼び出します。
397デフォルトの名無しさん:02/03/20 17:37
STLのstringとMFCのCStringの互換が無く、困っています。
CStringをstringへ。
また、
stringをCStringへ変更する良い方法はありませんか?
398デフォルトの名無しさん:02/03/20 17:43
>>31と同じ質問を抱えてます。初めてCRichEditViewを使うので
多分単純なことが解ってないのだと思います。
CRichEditCtrl& Edit = GetRichEditCtrl();
FINDTEXTEX findtext;
::ZeroMemory(&findtext,sizeof(findtext));
findtext.lpstrText = new TCHAR[3];
この辺でfindtext.lpstrTextには漢字+\0を入れました
int nRet = Edit.FindText(FR_MATCHCASE,&findtext);
if( nRet !=-1 ){
TRACE("これが出ない\n");
}
確実に一致するものはあります。
>>397
const char* にすればOK

CString s1;
string s2;
s1 = s2.c_str();
s2 = (const char*)s1;
400デフォルトの名無しさん:02/03/20 17:54
CStringの手軽さは、stringじゃまねできないもんなあ。
CString向けに書いちゃったもんは仕方ないからそのまま使え。
401デフォルトの名無しさん:02/03/20 23:34
Scribble チュートリアルでCBitmapについてのページは見つけたのですが
(HelloWorld!と手書きで表示されているページですよね?)
あの、サンプルはどのようにして見るわけですか?
MSDNでサンプルの名前をキーにを探すと、ダウンロードのリンクが出てきてCD入れろと言われるから、入れろ。

MSDN起動するのが面倒ならMSDNのCDの何枚目かにあるSAMPLEディレクトリをごっそりコピーしておけ。

最近のVCの箱の中にはチュートリアルの本は入ってないのか?
急ぎでないならあれのソースを手打ちでもいいぞ。
CScrollViewがうんこなので、CViewからしこしこ作るぞ!
応援してくれ!
がんばれ。
405zxcvbnm:02/03/21 00:27
オーナードローリストビューのデータの取り方を誰か教えて下さい
今はWinbiffのひらめーるにあるようなリストビューが対象です
406デフォルトの名無しさん:02/03/21 08:52
RichEditについて質問させてください。

リソースエディタでRichEditコントロールを貼り付けて
対応する変数をm_rEditとしました。

View::OnInitialUpdate()
の所で
m_rEdit.SetBackgroundColorとかやると、色とか変わるんですが
m_rEdit.SetWindowText("初期");として、起動したときに
「初期」と表示したいんですけど、何も表示されません。
UpdateData(FALSE);
を最後に呼んでも変わらないです。
どうすればいいのでしょうか。
407デフォルトの名無しさん:02/03/21 13:04
>>406
ReplaceSel
408406:02/03/21 14:29
ごめん、自分のミスでした。
ReplaceSelでも出来なくって、これは自分が何処かで変なことやっている
と思って見直してみたら、DDX_ControlとDDX_Textで同じIDが
違うメンバ変数に割り当てられてた。

ClassWizardだと、ひとつしか割り当てられないと思ってたけど、
複数可能なんだ。混乱するから一つにしたけど。

レスしてくれてありがとう>407
394の現象がさっき自分のとこでも起こって、速攻で解決したけど、
直し方を書いてなかったからついでに書き込んどく。

ワークスペースに表示されなくなったクラスのヘッダファイル(****.h)を
メモ帳か何かで開いて内容を書き替えずに保存する(つまりファイルのタイムスタンプを変える)。
すると消えたクラスが復活する。(clwファイルは消さない方がいいような気がする)
410デフォルトの名無しさん:02/03/23 21:36
アプリケーションで、ディレクトリを選択するためのダイアログボックスを開き
たいんだけど、これって標準 (コモンダイアログボックス) みたいなのはない
の ? 自分で、作るしかないのかなぁ ?
MFCで
「あるフォルダにあるファイルとフォルダのリスト」を取得する
メンバ関数の含まれているClassはないでしょうか
おしえてください
ごめん自己解決
CFileクラス以降を見てた
CObject-CFileFindだったのね
413デフォルトの名無しさん:02/03/23 21:56
もしMSDNのMSLUを使った正常に動作するサンプルプロジェクトの場所を
知っていれば教えて貰えませんか。
今、けっこう必死で探しています。
>>411
なんかないみたいだね。素直に、FindFirstFile() 等を使うのが吉。
>>410
Win32APIでなら、::SHBrowseForFolderってのがあるよ。
MFCでそれをラップしてあるかどうかは知らないけど、
その辺から探ってみれば。
416411:02/03/23 22:05
例:
CFileFind finder;
BOOL bWorking = finder.FindFile("C:\\*.*");
while (bWorking)
{
bWorking = finder.FindNextFile();
cout << (LPCTSTR) finder.GetFileName() << endl;
}

ちなみに
僕は>>410さんとは別人です
なぜか同じことをやりたいようですねw
>>410
::SHBrowseForFolderで。MFCには無いよ。
以前検索したことあるけど、::SHBrowseForFolderをラップした
クラスを公開してる人が何人かいた。
>>415
サンクス !! できたよ。
でも、なんでディレクトリを指定するだけでこんなにしちめんどくさいん
でしょうね。CFileDialog にパラメータ指定するとか、CFolderDialog
みたいなクラスを作るとかしてくれれば良いのに...。
ともかく、ありがとう。
何かの拍子で妙なエラーが頻出するようになった。
ソースにまったくエラーがないのにコードを少しでも書き替えると

xxxxview.h(50) : error C2143: 構文エラー : ';' が '*' の前に必要です。
xxxxview.h(50) : error C2501: 'xxxxDoc' : 識別名を宣言するのに、型が指定されていません。
xxxxview.h(50) : error C2501: 'pXXXX' : 識別名を宣言するのに、型が指定されていません。
xx.exe の実行エラー

となる。
この3つは1つの同じ行で発生しているが、コンパイラのチェックにかかるような問題はない。
で、試しにこの1行を削除してみると、ここに書かれている宣言が必要な行からエラーが噴出しまくるが、
元に戻すとなぜか再びコンパイラを通って、何事もなかったかのように実行できる。
ただしまたソースを書き替えると同様の現象が起こる。
これと同じような状態になった人っているかなあ?

あと、なぜかブレークポイントの1つが消せなくなって、文末付近にゴミのように残る。
これも経験ある人いない?
なんて説明したらよいかわからないんですけど
システムのルートを取得するClassってないでしょうか
たとえば、A:,C:,D:,Q:という感じで
421デフォルトの名無しさん:02/03/24 13:11
>420
言いたいことはよくわからないけど、GetLogicalDriveStringsとか?
422デフォルトの名無しさん:02/03/24 14:37
>>420
ありがとうございます
やっぱり、MFCにはなかったんですね
結局スレ違いすんまそん
>>419
“プリコンパイル済みヘッダを使用しない”にしてリビルドしてみては。
424419:02/03/24 19:16
自己解決したので報告を。

ビューのヘッダファイルに、ドキュメントへのポインタを
メンバに持たせようとしてたんだけど、
ドキュメントのヘッダファイルをビューのソースでインクルードしてたのがいけなかったみたい。
ちゃんとビューのヘッダでインクルードしたら直った。


……って、すげえイージーミスじゃんよ。笑えねー。

それと相変わらずブレークポイントのゴミは消えてくれない。
とりあえず無効にしてるからジャマにはならんが、なんかうぜえ。
425sage:02/03/24 19:34
charの配列をCStringクラスの変数にコピーするのはどうしますか。
逆にCStringの文字列をcharの配列にいれるのはどうしますか。
char str[100];
CString a(str);
CString b = str;
CString c;
c = str;

strcpy(str, a);
427sage:02/03/24 20:39
>426
いやー、助かったわ。ありがとさん。
これでやっと納品できるわな。
正直お前見たいのに発注したくない。
429_:02/03/24 21:26
>>428
ネタにマジレス・・・
>「見たい」??
お前を見たいのに、発注はしたくないんだよ。
発注しないけど、面接に読んでもヨイですか?という意味だ。

きちんと嫁。

431427でも429でもないが:02/03/25 00:51
「面接に読んでもヨイ」

ニポン語、難シイネ。
>>430
電波を受信できない人には、あなたの発言を
理解するのは不可能でしょう。
433398:02/03/25 11:03
自己解決。範囲指定が必要だったのね。
VS.NETが出てから急にここが静かになったと思うのは気のせいだろうか。
そんな俺もC#のドキュメントを読んでたりするけど…
.NET Frameworkランタイム普及せんとVB,C#は…
やっぱC++がイイナ
ところで、VS.NETのCStringは、単体で使えると聞いたのだけど本当?
あのクラスと、CMap系を使いたいが為に今だにMFCに頼りっきりな漏れ。。。
437デフォルトの名無しさん:02/03/27 23:18
WTLのCStringは単独で使えるよ。
>>437
知らんかった。。。
どうもありがとう
439デフォルトの名無しさん:02/03/28 11:09
>>436
std::string と std::map じゃ不満?
440438:02/03/28 22:11
WTL使ってみました。確かに便利です。
しかし、なんでこれが流行らないのだろう。。。

>>439
STLも確かに便利なんだけど、すぐにインライン展開してコードが膨れるのであまり好きではないです。
もしかして使い方が悪いだけかな?
インライン化を抑制しろ。
442デフォルトの名無しさん:02/03/29 11:16
CreateCompatibleDCして作成したメモリデバイスコンテキストに、
元のDCのクリッピング領域情報が引き渡されずに困ってます。
というか空になっちゃうんですが、何とかして上手く引き渡す方法は
ありませんでしょうか?

クリッピング領域はRECTじゃないからGetClipBox→SelectClipRgnも
使えないし、ていうかそもそもなんでGetClipRgnでクリッピング領域が
取得できないんだとか、MFC&Win32APIの愚痴になってしまいがちですが。
443デフォルトの名無しさん:02/03/29 11:49
CreateScalableFontResourceの第1引数に1指定して読み取り専用埋め込みフォント作って
その後AddFontResourceしても目的のフォント得られないんじゃボケェ

CreateFontで渡すフォント名はハードコーディングしても得られないんじゃぁ

第1引数に0指定しておくとちゃんと取れるんじゃハゲェ


どなたかご存知ですか?
444デフォルトの名無しさん:02/03/29 14:32
リーソスでダイアログを追加して、
グループボックスを三個、
それぞれのグループボックスの中にラディオボタンを3つずつ配置しました。
ところが、ラジオボタンが正常に動きません。
どこかにチェックを入れるとグループボックス関係なく
ダイアログ上でひとつにしかチェックつけられません。
どうしたらいいでしょうか?
>>444
グループボックスの一般>グループのチェックは入れましたか?
それと、レイアウト>タブオーダーはちゃんと設定しましたか?
446444:02/03/29 14:48
>>445
設定されていなかったので、ご指摘のところを設定しました。
でも、症状はかわりませんでした。

ラジオボタンのグループ、タブストップのところは
チェックしなくてもいいのですか?
447455:02/03/29 15:00
>>446
タブオーダーはちゃんと番号が続くようにしましたか?

この場合だと、グループボックス1→ラジオボタン1→ラジオボタン2→ラジオボタン3
→グループボックス2→ラジオボタン4→ラジオボタン5→ラジオボタン6
→グループボックス3→ラジオボタン7→ラジオボタン8→ラジオボタン9
のように番号を設定しましたか?
448高官:02/03/29 15:07
はじめまして.

MFC(CEditView)でエディットビューの背景に対し
カラーダイアログを実装させたいのですが,うまくいきません.

まず,COLORREF型m_BkgndとCBrush型m_brBkgndをエディットクラスに
追加して,Resourceビューのメニュー(ID_VIEW_COLOR)の関数を追加します.

void CTestView::OnViewColor()
{
CColorDialog colDlg;
if (colDlg.DoModal()==IDOK){
m_Bkgnd = colDlg.GetColor();
Invalidate();
}
}

そして,=WM_CTLCOLORハンドラを追加.
if( nCtlColor == CTLCOLOR_EDIT ) {
pDC->SetBkMode(OPAQUE);
pDC->SetBkColor(m_Bkgnd);
return (HBRUSH)(m_brBkgnd.GetSafeHandle());
}
return m_brBkgnd;
}

これを実行すると
文字を入力した行のみが変更されてしまいます.
背景色全体を変更するにはどうしたらよいのでしょうか?
449444:02/03/29 15:17
>>447
ありがとうございます。おかげで解決しました。

450デフォルトの名無しさん:02/03/29 15:28
>>448
WM_ERASEBKGND 背景を塗りつぶすときに発生するメッセージ
自力で塗りつぶせば大丈夫
>>448
ブラシも同じ色のを作って渡してやれ。
452デフォルトの名無しさん:02/03/30 12:29
メニューバーの色を変えるにはどうすればいいですか?
454デフォルトの名無しさん:02/03/30 23:36
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/5989/mfc02.html
↑のサイトを参考にして、自作クラスのインスタンスをシリアル化して書き出したのですが、
読み込むにはどうすればいいのでしょうか?

CHoge hoge;//CHogeは自作クラス(上のサイトに従ってSerialize関数を継承しています)
CArchive ar;
(省略)
ar << &hoge;

↑のようにして書き出せたのですが、

CHoge hoge;
CArchive ar;
(省略)
ar >> &hoge;

↑で読み込もうとすると、

error C2679: 二項演算子 '>>' : 型 'class CHoge *' の右オペランドを扱う演算子は定義されていません。(または変換できません)

と出ます。
なにが間違ってるのでしょうか?
そもそも何故operator<<(CHoge*)がないのにar << &hoge;が通ったのかがわからないのですが…
455デフォルトの名無しさん:02/03/30 23:51
> そもそも何故operator<<(CHoge*)がないのにar << &hoge;が通ったのかがわからないのですが…
operator << ( CArchive&, CObject*& ); が存在するゆえ。

型がCHogeであるとわかってるオブジェクトなら、 << とか >> を使わないで
直に CHoge::Serialize を呼んだ方が良いなり。

from MSDN
> つまり、シリアル化可能クラスでメンバとして埋め込みオブジェクトを
> 定義している場合は、CArchive 演算子 <<および>> を使えないので、
> 関数Serialize を呼び出す必要があります。また、シリアル化可能
> クラスのメンバとして CObject (またはその派生オブジェクト) への
> ポインタが定義されていても、そのオブジェクトが自身のコンストラクタに
> よって構築されるときは、Serialize を呼び出す必要があります。
456デフォルトの名無しさん:02/03/31 00:28
>>455
レスありがとうございます。

>operator << ( CArchive&, CObject*& ); が存在するゆえ。
あ、この行見逃してました。でもなんか難しい…
operator>>(CArchive& ar, CObject*& pOb);
もあるということは(形が同じだから)、本来ar >> &hoge;で行けませんか?

MSDNのは読んだんですが、Serialize関数で書き込むと<<で書き込んだのとは
フォーマットが変わりますよね?
他のフリーソフトの設定ファイルを書き換えたいという用途なので、
ファイルのフォーマットは変えられないんです。
そのファイルのフォーマットは間違いなく <<演算子で書き込んだものです。
というわけで<<で読み書きしたいのです。

あと、VC++5.0Learning(w です。
457455:02/03/31 08:52
そりならば
CHoge* m_pDynObj;
ar >> m_pDynObj;

かな。operator << って、型の情報まで書き込んでおいて
operator >> の時にはそこで動的に作成するもんなので。
MFCのAfxBeginthreadを使ったのだけど、Releaseビルドの時にSuspendさせても
サスペンド出来なかった。。。
動作も妖しいし、DLL開放時に激しく0x05例外出すし。。
(DLLでの話)

悩んだ挙句_beginthreadを使うと、すんなりと動いた。。。
とりあえずこれで解決したのだけど、MFC的にスレッドを立てる場合は_beginthreadって正しい?
どう思われますか>ALL
459454:02/03/31 12:17
>>457
なるほど、CHoge宣言時に読み込むサイズが予測できないから
operator>>中でメモリを動的に確保する(確保し直す?)必要があるところが
operator<<と違って、それを注意されていたわけですね。

実装してみたところ、すっきり解決しました。
本当にありがとうございました。
Caps、NumLock、カナの状態はどうやって取得しますか?
461デフォルトの名無しさん:02/03/31 21:02
>>458
どうせつかうなら_beginthreadex。
AfxBeginThread使うならm_bAutoDeleteをFALSEに。
_beginthread系で作ったスレッドからMFCオブジェクトは使用禁止。
463デフォルトの名無しさん:02/04/02 17:01
CInternetSessionってドキュメントにはEnableStatusCallbackで
非同期にできるって書いてあるんだけど、実際にコンストラクタで
INTERNET_FLAG_ASYNCを指定するとアサートする。
ドキュメントは間違い?
464sin:02/04/02 17:40
コンピュータ名をMFCを使って所得する方法ありますか。
GetComputerName()の場合、win98系だと取得できず困っています。
getenv("COMPUTERNAME")も win98系だと駄目みたいだし。。
>>464
GetComputerNameはWin95以降に対応してるってあるけど?
466デフォルトの名無しさん:02/04/02 18:45
>GetComputerName
Win95、Win2000でやってみたけど両方ともちゃんと取得できたよ。

MSDNより引用
>Windows 95/98:入力サイズが MAX_COMPUTERNAME_LENGTH + 1 未満で
>ある場合、GetComputerName 関数は失敗します。

こんな感じの初歩的なミスの可能性は。
467 :02/04/02 21:41
>466
2000 xpだと動いて98だとダメなんです。サイズの方変えてみます どうもでした。
468デフォルトの名無しさん:02/04/02 23:23
CSocket::CancelBlockingCallはどのように呼び出せばよいのでしょうか?
ブロッキング操作をキャンセルするため「キャンセル」ボタンを押した時に
CancelBlockCallを呼び出そうとしても、ブロッキング時は
そのキャンセルボタンが押せません。
469デフォルトの名無しさん:02/04/03 00:34
>>419
>>あと、なぜかブレークポイントの1つが消せなくなって、文末付近にゴミのように残る。
>>これも経験ある人いない?
複数のプロジェクトを同時に扱ってない?
もしそうならブレークポイントが消せないソースファイルがロードされている
プロジェクトをアクティブにしてブレークポイントを削除してみて
470Disca ◆NAfP6znE :02/04/03 03:20
CMSFlexGrid ActiveX を使ったソフトウエアを作っています。
再配布するときには、どうすれば良いのでしょうか。
471Disca ◆NAfP6znE :02/04/03 03:21
↑ActiveXコントロールも一緒に配布しなければいけないのでしょうか…。
それとも、リンクさせる方法があるのでしょうか…。
お願いします。
>469
回答ありがとう。VCは1つしか起動していないのでそれは違うかと。
でもいつの間にか消えてたからとりあえず解決。
473デフォルトの名無しさん:02/04/03 15:52
CBitmapで画像を使うときに、画像自体を暗くしたりする加工ってどうするんですか?
474デフォルトの名無しさん:02/04/03 16:12
OnMouseMove中にDrawDragRectを使用して矩形を描画してるのですが
画面をスクロールさせながら行うとうまくいきません。
どなたか良い方法を知っていたらお願いします。。。
>>473
あらかじめ暗い画像をよういしとくってのは?
476デフォルトの名無しさん:02/04/03 16:24
いえ、どんどん暗くなっていくようにしたいので、くらい画像を用意するときりがないんで…。
>>476
CreateDIBSectionでビットマップ作って、
直接画像いじるしかないかな?
>476
ぱれっとあにめーしょん(ワラ。
479デフォルトの名無しさん:02/04/03 16:39
2つの画像を合わせていく…すなわち黒の画像を少しずつ割合を上げて
ミックスする方法があった気がするが、というか使ったことあるが、
誰か覚えてないか?
P.S>478とか、むかつくし
480デフォルトの名無しさん:02/04/03 16:50
あの〜CreateDIBSectionの使い方、教えていただけますか?
そのくらい検索しろや。
482478:02/04/03 17:18
つか、AlphaBlendとか、TransparentBLTつかえばいいだけでわ。
483デフォルトの名無しさん:02/04/03 17:24
僕、僕!ちょっと待ちたまえ、AlphaBlendや、TransparentBLTはWin2000以降
でないと、使えないのだよ!
>>483
ヘルプには98以降って書いてあるよ?
485478:02/04/03 18:32
>483
Oh!X 2001春号をみていませんな。
486463:02/04/03 18:49
レス無しか・・・
487なんとなく哀れを誘ったので:02/04/03 19:09
>>486
知らん物だがちょっと調べてみた。
こんなことが書いてあるのな

http://www.microsoft.com/japan/developer/library/vccore/vcconlibraryimplementationchanges.htm
----------------------------------------------------------
CInternetSession
バッファの正当性チェックの強化
MFC のインターネット関連のすべての関数で、メモリ バッファのポインタ引数の正当性チェックが強化されています。

非同期処理の非サポート
MFC では、INTERNET_FLAG_ASYNC がサポートされていませんでした。このフラグを設定すると、MFC のデバッグ ビルドでアサートします。
----------------------------------------------------------
488474:02/04/03 19:24
(ノ_<。)うっうっうっ
>>488
ちょい待ってて
490デフォルトの名無しさん:02/04/03 19:56
すみません
CIPAddressCtrl
等でBYTEでIPアドレスを取得すると
BYTE型でIPアドレスが受け取れるのですが、
このBYTE型、例えば16進数で64を
 ・Stringで"64"に変換したり、
 ・int型で64に変換する
にはどうしたらいいでしょうか?
491489:02/04/03 20:01
待ちます!!
リロードボタン連打して待ってます!!!
o(^^o)(o^^)o わくわく
492デフォルトの名無しさん:02/04/03 20:05
>>490
sprintf
>>487
ありがとう。
ワーカースレッドに入れるしかないか・・・
494いやーははは:02/04/03 23:00
>>489
思わずいろいろ試していてしまった。
http://www06.u-page.so-net.ne.jp/ga2/toku/VC/Doc/Doc007.html
ココを見て変形したスクロールビューを使ったもの↓
http://members.tripod.co.jp/g54g45g/efedewView.txt

結局上手い方法は思いつかず、スクロール画面位置の原点を座標計算に
加えてみただけ。なんかアレなのでこの際丸投げ

ライコスメールで

ID:【g54g45g】
PASS:【7ftakr】
の受信トレイに入れときます
”efedew.lzh”の”efedewView.cpp”

役に立つかどうか・・・

495デフォルトの名無しさん:02/04/03 23:17
VC++sp4での話です。

MFC AppWizardで作成したSDIプロジェクトで、ウインドウを4つにスプ
リッタし、それぞれにCRichEditViewを貼り付けたいのですが、ClassWizardで
「クラスの追加(&L)...」→「新規...」を選択した後に表示される
「基本クラス(&B):」のコンボボックスの中にCRitchEditViewが表示されません。

MFC AppWizardの6/6で基本クラスにCRichEditViewを指定すると、一つ目のスプリッタ
ウインドウにはCRichEditViewが貼り付けられるのですが、残りのスプリッタウインドウ に貼り付ける為のCRichEditViewをClassWizard等を使い簡単に作成する方法ってないで
しょうか。
496デフォルトの名無しさん:02/04/03 23:29
すみません 少々教えていただきたいのですが
 クラス間でデータ等のやりとりを行うには
 どのような関数を使用すればいいのでしょうか?
それはまた非常に哲学的な問題だな。
>>495
適当なクラスから派生させて、基本クラスを書き換える。
499495:02/04/04 01:01
>>498
ありがとうございます。
500500:02/04/04 03:36
⊂(゚ε゚⊂ )⊃≡ 500取ったけどキニシナイ!!
>>494
いいヤツだなお前
502デフォルトの名無しさん:02/04/04 12:13
496です

 具体的に言うとデータの入出力用のクラスがあって、
 インスタンス化した元のクラスに対して「出力準備完了」など通知
 したいんですが・・・・・・


  呼び出し元  ーーーーーーーー>  入出力クラス
          インスタンス化           

  呼び出し元  <−−−ーーーーー  入出力クラス
         入出力準備完了通知    


こんな感じでできないでしょうか?
 スレッドとかプロセス同士だとできそうなんですが、
 入出力用のクラスを気にせずに呼び出せるようにしたいもので・・・・
>>502
お好きなようにやればよいではないか。

class MsgHandler {
public: void io_ready();
};

class IO {
MsgHandler* pMHan;
public: IO( MsgHandler* p ) : pMHan(p { /* ... */ pMHan->io_ready(); }
};

class Yobidashimoto : public MsgHandler {
/* 略 */
};
504503:02/04/04 12:46
いかん間違えた。中途半端にJavaの癖が…
public: virtual void io_ready() = 0;
とかでよろしこ。
インスタンス化後、入出力準備完了まで戻ってこないとか。
506デフォルトの名無しさん:02/04/05 12:27
>>503

 おおおそうやればいいのか! 
 今まではUNIXでCとかやってたんですが
 子供が親の参照もってるのがちょっとなんか違和感あるなあ

 でもこれでうまくいきそうです。ありがとうございます。
507 :02/04/05 16:06
.NETに付属のMFC7.0はWIN95では動作しないのですか?
モードレスダイアログ上の仮想リストビューを
DefWindowProcのパラメータで動かしているけど、
ダイアログ外の操作で生じた変更を、
すぐにリストビューに反映させるにはどうしたらいいかなぁ。

一応、試しに親からUpdateData(FALSE)とかやってみたけどやっぱダメだった。
>509
RedrawItems呼んでみるとか。
>510
うん、これだ。助かったぜぃ。
512デフォルトの名無しさん:02/04/06 09:10
FrontPage2kで作成したサイトをリソースとして.exe内に取り込んだら、
内部リンクが全て効かなくなってしまいました。リンク部分を"res://〜"で
書き直せばいいのですが、自動的に書き直すようなことってできますか?
LINE INから入力したアナログの音をエフェクト処理(エコーなど)して、
タイムロス無しでそのままWAVE OUTから音を出すソフトってVISUAL C++で
作れますか?
既に保存してあるWAVEファイルを加工するソフトは結構ありますけど
そういうのじゃなくてギターなんかのアナログエフェクトと同じ事がしたいんです

ちなみに僕はまったくプログラムできません(C言語がほんの少しだけ。)
出来るか出来ないかだけでいいので教えてください。

多分

line in→標本化→アナログ/デジタル変換→エフェクト処理→
デジタル/アナログ変換→wave out(waveファイルじゃなくて音が出したい)
(line in→wave out の間にタイムロスほとんどなし)

みたいなことをしたいんですけど…
人がほとんど感じないようなタイムロス(5ms以下?)を実現するなら、
通常アプリケーションでは難しい、というかほとんど無理。

カーネルモードで動くドライバならばできるかもしれないけど、
素人にはおすすめできない。
無理ですか。。もし出来るのなら勉強して作りたかったんですけど。。
516デフォルトの名無しさん:02/04/06 14:34
CView派生クラスの中に項目数に応じて自動的にスクロールバーが付くものがありますが、
スクロールバーが付く瞬間に送られているメッセージを知りたいのですが、
何のメッセージが送られているのかspy++でもよくわかりませんでした。

あと、DelphiでいうStringGridのようなものはないのでしょうか?
FlexGridというActiveXコントロールがあるようですが、
ActiveXではなくて、MFCのようにソース付のものがあれば教えてください。
とりあえずcodeguru逝け
518デフォルトの名無しさん:02/04/06 17:01
ピクチャボックスってサブクラス化できないのですか?
519518:02/04/06 19:33
自己レスです。

ピクチャボックスのIDを
IDC_STATICからIC_PICT_ONEにしたらできました。
520仕様書無しさん:02/04/06 20:20
>>513
RTOSからつくるこった。
5μmsから応答するぞ。
521デフォルトの名無しさん:02/04/06 20:33
小もない質問ですが、ダイアログベースのソフトをVC++で作ってます。
で、配布するときにMFCのDLLを付けて配布しないといけないじゃないですか。
(無いと実行できないからですよね。)
で、そのDLLを実行ファイル(EXE)に組み込めないでしょうか?
>>521
スタティックリンクでやればいいんじゃなかったかな?
>>520
DOSモードで動かせばいいじゃん。
割り込み応答だけ速くてもしょうがないし。
524Disca ◆NAfP6znE :02/04/06 21:39
プロジェクト>設定Win32Release>MicrofundationClass
スタッティックライブラリ

問題解決デス^^
>スタティックリンク
Professional以上のEditionでないとダメなのでそこんとこ注意だ。>>521
526デフォルトの名無しさん:02/04/07 02:13
vc6でダイアログベースでプログラムを作っています。
http://techtips.belution.com/ja/vc/0012/
を参考にして常にアクティブなアプリにしようと思いましたが、
どうもアクティブになりません。

F:\Vc\HukumaDen\HukumaDenDlg.cpp(239) : error C2065: 'SPI_GETFOREGROUNDLOCKTIMEOUT' : 定義されていない識別子です。
F:\Vc\HukumaDen\HukumaDenDlg.cpp(241) : error C2065: 'SPI_SETFOREGROUNDLOCKTIMEOUT' : 定義されていない識別子です。

とエラーがでます。なにかヘッダ等をインクルードしなけらばいけないのでしょうか?
 
>>526
winuser.h
#if(WINVER >= 0x0500)
#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000

つーか、grepしる!
で、OSが98の場合はそのまま書いちゃえ。

528デフォルトの名無しさん:02/04/07 12:33
MDIを作成すると自動的に子ウィンドウが出来るんですけど、
それとはまた別に、独自のダイアログを挿入したいのですが、
(もちろん、MDIのMainFrameからはみ出さないように)
どう書くべきですか?
529526:02/04/07 13:27
>>527
ありがとうございます。

>つーか、grepしる!
grepってなんですか?
と思ってしらべてみたら、すごい便利なものですね。
VCの中にあるのかな?探してみます。
スレの趣旨とは関係ないかもしれんが、

XPでVC++使っててデバッグしようとすると
良くとまるのですが。SPとかもでてないし。

どのPCでもとまるぞ
531デフォルトの名無しさん:02/04/08 06:13
リストボックスについて質問です。
リストにアイテムを加えていくとき、addstring()でやっていくと
1アイテム一行になりますが、1アイテムにつき二行以上を使って、
選択時もそのアイテムをクリックすると二行以上選択できるように
したいんです。AddString("aho\r\nbaka")で試しましたができません
でした。そんな風なことはできるんでしょうか?
>>531
オーナードローでしこしこする。
それかcodeguruやcodeprojectでさがす?
533デフォルトの名無しさん:02/04/08 07:34
ありがとうございます。探してみます・・
その前にまた問題が・・
ひとつのダイアログ画面に三つリストボックスを入れたいんですが
二つ目を入れてコントロールのメンバ変数を作ると、ダイアログを閉じた
時に強制終了してしまうんです。何が原因と考えられますか。
534デフォルトの名無しさん:02/04/08 09:17
533です
プレコンパイルヘッダーを削除してビルドしたらしっかり
動いてくれました・・いったいなんだったんだ。
>>534
は?
それってコンパイラオプションと作り方が違ってたってことか?
ってゆーかエラーコードくらい書け!
536デフォルトの名無しさん:02/04/08 17:45
ソケットについて教えて下さい

CAsyncSocketクラスを使用してインスタンスをつくり、
read関数を使って受信したデータを読み込もうとしているのですが

 例えば
CAsyncSocket Sock;
BYTE *buf;
と定義されていて
Sock.read(buf,2000);
とした場合、
 実際に受け取ったデータが1500バイトぐらいだった場合
 1500バイトであるというのを確認するにはどうしたらいいでしょうか

また、read関数でデータを取り出した際に全てのデータを取り出せて
 いなかった場合、通知などは行われるのでしょうか?
 
 詳しい方教えて下さい〜
>>536
CAsyncSocketにreadなんてメソッドあったっけ…
Receive()なら受信バイト数を返してくれるけど。

> また、read関数でデータを取り出した際に全てのデータを取り出せて
>  いなかった場合、通知などは行われるのでしょうか?

ネットワークプログラミングスレにもあったような気がするけど、ストリーム型では
「どこがデータの終端か」をライブラリが知ることはできないので、アプリ側でデータ
の区切りを指定する必要がある。
ということで、終端にEOFをつける決まりにしておくとか、HTTPみたいに
Content-Lengthを送っておくとか。

データグラム型なら基本的にパケットが勝手に結合されたりすることはないので、
ReceiveFrom()で受信した時点で完了。1パケットのサイズを超えるデータを扱う時
には、TCPがやってるようなことを自前で処理。
538sage:02/04/08 18:43
オブジェクト名は小文字推奨
型名は最初大文字推奨
539デフォルトの名無しさん:02/04/08 19:32
VS6で
CString a="draemon";
CString b;

b.Format("%d",15);
a += b;


CString a = "doraemon;

a += new CString.format("%d",15);
こんな風に簡潔にできないでしょうか?
 コンパイルエラーで怒られる・・・・・
OnItemchangedで項目の選択状態が外れたことを知りたいんだけど、
NM_LISTVIEのiItemの値が「-1」になってダメ。
なら選択状態が外れる前に取得しようか、とOnItemchangingをハンドルしてみたけど、
今度はこの関数が呼ばれない。「〜ed」の方は反応するのに。なぜ?
VFC-LINK逝ってヨシ!
>>539
CString a = "doraemon; では、右側の '"' がないぞと言うのと、CString は
format() じゃなくて Format() だぞと言うのは、おいとくとして...。

CString a;
a.Format("%s%d", "doraemon", 15);

じゃダメなの ?
>>539
CString a(_T("doraemon15"));
>>541
ワラタ。はげしく同意だ。
プロパティページにリストビューコントロールを貼り、

// m_listはCListCtrl
m_list.SetExtendedStyle(LVS_EX_INFOTIP | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);

としてツールチップを表示させようとしたのですが、
なぜかツールチップがプロパティシートの後ろに表示されてしまいます。
どうすれば通常のようにリストビューの前に表示されるのでしょうか?
546デフォルトの名無しさん:02/04/08 23:35
>>542

なんか書き方が悪かったっす

void nobita::ayatori(CString shizuka,int kaisuu)
{
CString suneo;

UpdateData(TRUE);
suneo.Format("%d",kaisuu);
m_doraemon = shizuka += suneo;
UpdateData(FALSE);
}


コード的にこんな感じになっちゃうんですが
 これはこれで仕方ないんでしょうか?
suneoが消せたらすっきりするかなーと思ったんですが

m_doraemon = shizuka += new CString.Format("%d",kaisuu);

 昔こんな感じのコードみた記憶があったんで・・・
VCじゃなくてJAVAだったのかなぁあれは・・・・・・
m_doraemon.Foramt(_T("%s%d"), shizuka, kaisuu);
じゃダメなんか?
(LPCTSTR)shizuka, kaisu);みたいに、明示キャストしないと
...でオブジェクトがそのまま渡ってキケンでわ?
void nobita::ayatori(LPCTSTR shizuka,int kaisuu)
いっそこうしよう
>>548
CStringに限って言えばそのまま渡しても問題ない。
551デフォルトの名無しさん:02/04/09 17:47
VC++のヘルプについているサンプルのスクリーンセーバサンプルに、
ビットマップを表示するプログラムを書き足しました。
bm1にリソースから、画像をロードしてからのプログラムです。
スクリーンセーバですから、ループするわけですが、10000回目ぐらいで、
エラーが出ます。しかも、C++の実行では出ず、
時間がたてば起動するようにセットしたときに起こります。
どう直せばいいでしょうか。知恵を貸してください。

void CDrawWnd::Draw(CDC& dc, int nWidth)
{
...........

CDC mDC, *pDC = this->GetDC();
mDC.CreateCompatibleDC(pDC);

CDC mDC, *pDC = this->GetDC();
mDC.CreateCompatibleDC(pDC);
CBitmap *ob = mDC.SelectObject(&bm1);
dc.BitBlt(100, 100, 100,&mDC, 0, 0, SRCCOPY);
...........
]



>>546
void nobita::ayatori(CString shizuka,int kaisuu)
{
UpdateData(TRUE);
m_doraemon = shizuka += CString().Format("%d",kaisuu);
UpdateData(FALSE);
}

suneoをテンポラリオブジェクトにした。これでどうよ?
553552:02/04/09 20:29
って待てよ。「shizuka +=」ってのはバグにしか見えないんだが。
shizukaも変更するってのは、ホントに意図したものなんか?
>>553
その前に、お前は CString().Format() の型を知っているのかと小一時間...
>>553
まあ、>>539 見ると本人は意図してるみたいね。また、MSDN にも...

次の例は CString::operator += の使い方を示しています。

// CString::operator += の例
CString s( "abc" );
ASSERT( ( s += "def" ) == "abcdef" );

なんて書いてあるぐらいだから、変じゃないのかもね。

inline CString Format(LPCTSTR pszFormat, ...)
{
TCHAR szBuf[1024];
va_list arg;
va_start(arg, pszFormat);
_stprintf(szBuf, pszFormat, arg);
va_end(arg);
return CString(szBuf);
}

どうしてもスネオが嫌いで足し算が大好きなら、
これヘッダに張っとけ。
っていうか、VBじゃだめなの?
>>556

_vstprintf()でした。偉そうにいってごめん。
>>557
つーか、CString::FormatV() じゃダメなのか ?
何より質問者が出てこないんじゃ・・・
560デフォルトの名無しさん:02/04/10 01:15
どうも >>539です

 >>552さん
そそそそうそれです!そんな感じの・・・・
 テンポラリオブジェクトってやつなんですね
 でも今ちょっとやったところなんかコンパイルないっぽい・・・・

 他にも
 >>547さん
 のおっしゃられているようにm_doraemon.Foramt(_T("%s%d"), shizuka, kaisuu); でも同じようにできるんですね

sprintfを調べて、
 自分が未熟だと気づくまで小一時間
 気づいてからもう小一時間
 やっとなんとかできそうです!

 答えていただいたみなさんありがとうございました
テキストファイルの下から5行目を取得したいときにはどうすればよいのでしょう?
CFile::Seekを使えばできそうな気がするのですが、
下から5行目というのをどう判断すればよいのかがわかりません。
>>561
改行
>>562
どんなコード書けば下から改行を数えられるのかがわかりません・・・
tailのソース嫁
565デフォルトの名無しさん:02/04/10 18:00
560です

 いろいろ調べたりしてて思ったんですが、MSのヘルプって分かりにくい・・・
 自分の質問もなんか初歩的なものだったみたいだし・・・・

 他に参考書のスレッドがあるのを承知でお伺いしたいんですが、
 ここのスレッド的に「せめてこれ読んでから質問せいよ ゴルァ!」
 のありますか?あったら教えて下さい
 
 お願いします
>>565
MSのヘルプ
VCLの方が使いやすいよ。
568デフォルトの名無しさん:02/04/10 18:18
たとえば、const・・・これは初期化以後の代入を不可にしますが、これを
アセンブラに直すとどういう風になっているのでしょうか?代入をブロック
するっていうのはなんかフラグを立てて一度代入をするまえにフラグが
たっていれば代入不可になるみたいな処理がおこなわれているのですか?
>>568
書き換え不可のメモリ領域に配置するとか。

「const指定に違反したコードをコンパイラがチェックしてエラーにするだけ」
で、コンパイルされた後には違いがないという場合が多いと思うが。
>569
>書き換え不可のメモリ領域に配置するとか。
それは‥‥const_castとかmutableとか、初期化とかに
いろいろ問題がでそう‥‥
>>570
const_castはそもそもそういう危険を承知した上で使うキャストだが。
えっと・・・果たしてMFCスレに相応しい話題なのかなぁ、と・・
573554:02/04/10 20:38
>>560
> そそそそうそれです!そんな感じの・・・・
> テンポラリオブジェクトってやつなんですね
> でも今ちょっとやったところなんかコンパイルないっぽい・・・・

おいおい、>>554 は、見てくんねぇのかよ。

> 他にも >>547さんのおっしゃられているように
> m_doraemon.Foramt(_T("%s%d"), shizuka, kaisuu);
> でも同じようにできるんですね

お前は、shizuka にも代入したいんと違うかいと小一時間 (もう飽きた...)
>>568
最近の子は、ハードウェアを全然知らんのか ? CASL/COMET ぐらいやっといた方
がいいぞ。
575デフォルトの名無しさん:02/04/10 23:50
今MFCについて学んでいるのですが、C++の勉強という意味で
その内部の構造についても勉強したいと思っています。

C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include(うちの環境)
にある afxwin.h に色々なクラスの定義があるとこは分かったのですが、
実際のメンバ関数本体はどこにあるのでしょうか?

C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
の中にあるのではないかと思い探しているのですが、最近MFCを始めたばかりで
難しい名前が沢山並んでいるのでどこにどのクラスのメンバ関数本体があるのか分かりません。

ファイル名とクラス名には何か関連性があるのでしょうか?
実際に使いたいものは CRect と CPoint と CSize なのですがどこか分かりません。
どうかよろしくお願いします。
デバッガで追ってけばいつの間にかMFCのソースの中に。
デバグ汁
つか調べたい関数名で検索しる!
もしかするとCEditViewのスクロールバーってはがせませんか?
さっきからウィンドウスタイルに「!WS_HSCROLL」とかやって頑張ってみてるんですが。
.inlファイルかな?
>>563
なぜ下から数えようとするの?
全行数から取得したい行を減算する方法はだめなの?
>>579
それをやるなら style & ~WS_HSCROLL
ただし、すでに付いてしまったスクロールバーを外す効果しかない。
最初からスクロールバーが出ないようにしたいんだったら
ES_AUTOHSCROLL を外すという方法がある(かわりにウィンドウ右端で
折り返されるようになるけど)。
>581
400Mのファイルの下40行とかで死にますがなにか。
>>582
両方試したんですが消えないす。
一応、OnCreateとPreCreateWindowの2カ初でやってみたんですが。
言い忘れてましたがCEditViewは分割ウィンドウに入ってます。
共有スクロールバーはもちろん外してます。
後ろからそれっぽい量(40行で40Kこえることはまずあるまい)
読んで数えて足りなければまた読んで・・・
Win XPのせいなのかMFC7(ただし当時β2)のせいなのかしら無いけど、フローティングツールバーの位置を、セーブしてロードすると場所が4pxくらいずれてるんだよ;´Д`)
マジ萎えた。
そうだその意気だ。もっとMFC7の話題を聞かせてくれ。
588561:02/04/11 02:30
Seekで下から一個ずつ検索して改行を数えてできました。
>>575
1.VC立ち上げる
2.[編集]メニューかツールバーで[ファイルから検索]を出す
3.調べたい名前を入れる(「CPoint」とか「CSize」)
4.ファイルの種類をソースとかヘッダにする − 4'.[単語単位]にチェック
したりする − 4''.[サブフォルダも探す]にしておく
5.[検索するフォルダ]に
”C:\Program Files\Microsoft Visual Studio\VC98\MFC”あたりを選ぶ
6.[検索]ボタンを押す

以上
>>584
BOOL CMyEditView::PreCreateWindow(CREATESTRUCT& cs)
{
 BOOL bPreCreated = CEditView::PreCreateWindow(cs);
 cs.style &= ~(ES_AUTOHSCROLL | WS_HSCROLL); // 水平スクロールバーを出さない
 cs.style &= ~(ES_AUTOVSCROLL | WS_VSCROLL); // 垂直スクロールバーを出さない
 return bPreCreated;
}

という風にやれば出なくなるはずだけど。
ちなみにAppWizardの作ってくれたスケルトンほとんどそのまま。
>590
ありがとうございます。いや、やっと消えましたよ。
やれやれだぜ、です。
592デフォルトの名無しさん:02/04/12 00:29
バッチ処理的なプログラムを組んでるんですが
ウィンドウ作らずにCWinAppに関数組み込んで作ってるんですが
注意する点は何かありますか?
>>592
なんでWinMainからにしないのかと問い詰めたい。
594デフォルトの名無しさん:02/04/12 01:01
>>593
あっ、やっぱりそうですか。MFCは使いたかったんです。
それで、
MFCを使ってSDKを組むって気づいたのが、
プログラムがなかなか出来上がってときだっだんです。
app.Run()がしたいだけなんちゃうかと..
596592:02/04/12 01:14
CWinApp::InitInstance
でバッチ処理の関数読んで
関数抜けたらそのまま終了。って感じなんですがそれでいいのかなと、
CWinApp::InitInstanceって初期化関数なので。
なんで初期化中に全部の処理が終わってるんだ?
なんで初期化中に全部の処理が終わってるんだ?
なんで初期化中に全部の処理が終わってるんだ?
なんで初期化中に全部の処理が終わってるんだ?
なんで初期化中に全部の処理が終わってるんだ?

お前が小説読み始めたとき、「序文」で物語が終わってたら
どうおもうんだ?
それで済む処理しかしないんだろ。
599デフォルトの名無しさん:02/04/12 03:18
WIN2KとBCB6とVS.NET

MFC7使ってるんだけど、ビルドしようとすると
このユーザーのセキュリティ設定が原因で、プロセスを作成できません。これらの設定はビルドで必要です
というエラーが出てビルドできねっす(^_^;;
win2kのセキュリティ関係らしいんだけど、ユーザーのグループはVSデベロッパーでアドミンなのに・・・
VC++系だけ駄目で、VBやVC#ではビルドできます
おまけに統合環境のプログラムがCPU100%食ったままになって、タスクマネージャで殺さないと残ったままになるし

同じ2kでもノートでやってみるとちゃんとビルドできるんです
BCBとの相性が悪いんだろか?

同じような事になった人居ませんか?
解決策求ム
601デフォルトの名無しさん:02/04/12 11:09
幾つかのアルゴリズムの実行速度を比較する為に,
10万回の繰り返しにかかった時間を計測する.
のような事をしたいのですが,どうすれば良いのでしょうか.
どこかにサンプルはありませんでしょうか?
変数1=時間を取得();
 アルゴリズム10万回実行();
時間を取得()−変数1;
>>601
>>ms-help://MS.VSCC/MS.MSDNVS.1041/vclib/html/_crt_clock.htm
604SSE2:02/04/12 13:26
Windows Media Audio and Videoを語ろう【part2】
http://pc.2ch.net/test/read.cgi/avi/1018368846/

Windows Media Audio and Videoを語ろう【part1】
http://pc.2ch.net/test/read.cgi/avi/976722195/

オフィシャルサンプルビデオ
http://www.microsoft.com/japan/windows/windowsmedia/WM8/video.asp

Windows Media エンコーダ 7.1
http://www.microsoft.com/japan/windows/windowsmedia/WM7/encoder.asp

Windows Media エンコーダ 7.1 日本語FAQ
http://www.microsoft.com/japan/windows/windowsmedia/WM7/encoder/faq.asp
Windows Media 8 Encoding Utility(英語のみ)
http://www.microsoft.com/japan/windows/windowsmedia/download/default_1.htm
Windows Media 8 Encoding Utility アスロンXP_SSEパッチ
http://www.geocities.co.jp/SiliconValley-Oakland/8071/wmv.html
Windows Media 8 Encoding Utility GUI
http://www.abdn.ac.uk/~u71ds/wm8egui/
http://www.alcv.f2s.com/file/WM8EUtl_GUI.lzh

WindowsXP用のWindows Media Bonus Pack
http://www.microsoft.com/presspass/press/2001/Dec01/12-13XPBonusPackPR.asp
http://www.microsoft.com/windows/windowsmedia/download/bonuspack.asp

コーデック
http://codecs.microsoft.com/codecs/i386/wmv8ax.cab
wme Batch Encoding
http://users.hoops.ne.jp/marumesoft/soft02.htm#03
上下逆さまのファイルができるのを解消できるレジストリファイル。
http://www.abdn.ac.uk/~u71ds/wm8egui/VerticalYUVFlipOn.reg

Windows Media Player 7.01 for Mac
www.microsoft.com/japan/windows/windowsmedia/download/mac7.asp

Asftools
ttp://cool.sj.net.cn/~souxin/software/asftools230-souxin.exe
ttp://go.to/asftools

flaskmpgのwmv変換
ttp://www.dvd-digest.net/downloads/files/flaskmpeg/wmvcreator.zip

M4U -MPEG4U-
ShortURL: http://m4u.uni.cc
RealURL: http://www.oak.dti.ne.jp/~oak/m4u/

Corona関連ニュース
http://pcweb.mycom.co.jp/news/2001/12/12/27.html
http://www.watch.impress.co.jp/av/docs/20011212/ms.htm
http://www.watch.impress.co.jp/pc/docs/article/20011212/ms.htm

dvdチップメーカーのWMV対応発表
http://www.zdnet.co.jp/news/0112/12/e_dvd.html

605599:02/04/12 18:27
>>600
この通りにやっても出来んのよ

もしかして俺だけ?(汗
606599:02/04/12 19:03
ウィンドウの分割についてだけど、
左右に分割してそのどちらか一方をさらに上下に分割する方法はうまくいく。
たとえば左側が1行右側が2行。
でも右側を3行や4行に増やすとエラーになるのはなぜ?
CreateView()の記述は右側の行数分増やしてあるのに。
608607:02/04/13 01:13
早くも自己解決。

↓この例を見て
CreateStatic( this , 1 , 2 );
CreateStatic( &this->m_wndSplitter1, 2, 1, ...

↓こうする物だと勘違いしてた。
CreateStatic( this , 1 , 4 );
CreateStatic( &this->m_wndSplitter1, 4, 1, ...

↓これが正解だね
CreateStatic( this , 1 , 2 );
CreateStatic( &this->m_wndSplitter1, 4, 1, ...
エディットボックスに変更があると「保存する必要の可能性あり」っていうフラグが自動的に立って
「保存しますか」って聞いてきますけど、これって自由に変えられないんでしょうか?
未保存でも警告を出さないようにしたりとか、逆に変更がなくても出るようにしたりとか。

あと「保存する必要の可能性を示すフラグ」って何か名称あります?
610デフォルトの名無しさん:02/04/14 06:46
>>609
CDocument::SetModifiedFlag()
CDocument::IsModified()
CDocument::SaveModified()
エディットボックスだから
CEdit::GetModify
CEdit::SetModify
612デフォルトの名無しさん:02/04/14 22:45
教えてください
 ファイルから、
"CMD(5,7)\n"を取り出しました
5の部分をATOIでint型にするにはどうしたらいいでしょうか?

ヘルプをみるとatoiはconst char*を受け取るようになっているみたいなんで
5文字目である'5'を指定するように
atoi(FileString[4]);
とすると怒られてしまいます
 どうしたらいいでしょうか?
 ご教授お願いします
MFCを使う前にCを理解してくれ・・・
C++からはじめても平気とかいうバカがいるからこうなるんだろうな。
ダイアログ内のチェックボックスを無効にしようと思い、
以下のようなコードを記述しました。

void CPropertyDlg::DisableCheckBox()
{
CWnd *pWnd;

pWnd = GetDlgItem( IDC_CHECK1 );
pWnd->EnableWindow( FALSE );
}

これをリストビューから呼び出すために

CPropertyDlg dlg;
dlg.DisableCheckBox();

としていますが、
pWnd->EnableWindow( FALSE );
を実行した時点で強制終了してしまいます。

pWndが正しく取得できていないようなんですが、
原因がわからず困っています。

皆様の知恵を貸していただけないでしょうか。
よろしくお願いします。

開発環境はVC++6.0 SDIです。
>>615
最低限pWndのNULLチェックはしとけよ。
>>615
dlgを宣言しただけではダイアログはできていない。
当然その上のチェックボックスもまだ存在しないナリよ。
618609:02/04/15 01:00
>>610 - 611
助かったです。
ヘルプを見てみましたが、フラグには特に名称はないようですね。
>>615は定番だね。
620デフォルトの名無しさん:02/04/15 12:10
SDIのMFCプログラム作ってるんですけれど、
IEみたいにメニューをCoolBarの中に入れる方法がわかりません。
CoolBarの上にメニューが表示されるカタチになってしまいます。
どうしたらいいんでしょ?
(VBスレでも同じ質問があったような ^^;)
>>620
http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/faq/iemenubar.asp
IEは、Windows標準のメニューを使っていません。
あのメニューは、Coolbar内のバンドの1つです。
622デフォルトの名無しさん:02/04/15 15:06
MFC初心者ですが
ダイアログ上のコントロール(チェックボックスやボタン等)に
フォーカスが移った時にそのコントロールの説明をスタティックテキストで
表示したいんですけどやり方がわかりません。
メニューやツールバーならプロンプトで簡単に出せるんですけど
それ以外のコントロールだとお手上げです。
SPYで見てもへんなメッセージ(WM_KICKIDLEとか)しか来てないみたいです。
どうしたらいいんでしょうか?
> メニューやツールバーならプロンプトで簡単に出せるんですけど

プロンプト?
624622:02/04/15 15:14
>>623
リソースエディタでプロパティを開いてプロンプトという項目を書いてやると
それがステータスバーに出てくるんです。
名前よくわかりません。
625622:02/04/15 15:33
解決したかもしれないです。
サブクラス化とかいうのをやれば良いようです。
ただ、コントロールが沢山あるので大変です・・。
コントロールの種類ごとにサブクラス化しなきゃならないんでしょうか。
もっと良い方法は無いでしょうか。
NM_SETFOCUS
627622:02/04/15 16:21
>>626
ありがとうございます。
とりあえずClassWizardでOnNotifyを追加してみたんですけど
色々触ってみてもそこに実行が移りません。
なにか設定が必要でしょうか?
>>627
コントロールのスタイルの「通知」にチェック
629622:02/04/15 17:08
>>628
それでもダメなようです・・。
チェックボックスやボタンコントロールで試しています。
>>629
WM_NOTIFYではなくて、WM_COMMAND で BN_* が来てるハズ。
631622:02/04/15 17:41
>>630
BN_SETFOCUSで動きました。大感謝です。
これでコントロールごとに関数分けられたら最高なんですけど
WM_NOTIFYをサポートしてるのは最近のコントロールだけなんですね・・
ともかく長々とありがとうございました。
> これでコントロールごとに関数分けられたら最高なんですけど

普通、コントロールごとにハンドラ分けられてしまうのが
鬱陶しいんだけど。
で、まとめて処理する方法が載ってたりするんだけど。
633デフォルトの名無しさん:02/04/15 18:41
CStatusBarCtrlの境界線を無くすにはどうしたら良いですかね?
634622:02/04/15 21:28
>>632
コントロールごとに処理が違うんで
自分でswitch/case書くよりは
ClassWizardでやれたほうが楽かなと思って。
635デフォルトの名無しさん:02/04/15 21:51
リソースエディタで作成したリソースをLoadToolBarで作成したCToobBarですけど
このツールバーのボタンをラジオボタンのように使いたいのですが
どうすればよいですか?
>>635
どれかが押されたら、それのメッセージハンドラで他のものを戻しちゃだめ?
MFCのフレームワークで作業しているなら、
OnUpdate〜(CCmdUI* pCmdUI)
で処理しても良いのでわ?
637635:02/04/16 17:41
>>636
ありがとうございます。(遅くなったけど)
なんかグループ化して他のボタンが押されるまで押下状態を保持するとかフラグがあるんですが
どうも設定しても上手く動かないので・・。メッセージハンドラで他のモノを戻す方法を試そうと思います
638デフォルトの名無しさん:02/04/16 21:36
スクリーンセーバを作成しているのですが、画面のプロパティースクリーンセーバーー設定
をクリックしたときのセーバーの設定はどのようにしてクリックされたと検出するんですか?
というか、設定をクリックしたときに実行されるプログラムはどうかくのですか?
639デフォルトの名無しさん:02/04/16 23:06
ScreenSaverConfigureDialog
昔はMSDNにWIN32スクリーンセーバの作成方法が日本語で載ってたんだが。

[画面のプロパティ]の[スクリーンセーバ]から↓の様に起動(コマンドライン)される。
(scrsaver.scrがWinnt、Windowsのフォルダにあるとする)

[設定(T)]をクリック
scrsaver.scr /c:hWnd 
         ダイアログHWND(多分)を10進表記
 
プレビューwnd(上中央の小さいスクリンセーバ画面)
scrsaver.scr /p hWnd
         プレビューwndのHWNDを10進表記

スクリーンセーバ(本番:自分で全画面を取得する)
scrsaver.scr /s

パスワード(使ったことないので良く知らん)
scrsaver.scr /a 

scrsaver.scr は自分で作成したscrsaver.exe を単純にリネームすればOK。
コマンドラインは、main(argc, argv)でもCCommandLineInfoでもGetCommandLine()受けとれる。
それからVC6のMSDNにはSAVERというサンプルがある。こっちの方が参考になるかもしれん。
(他にscrnsave.libを使う方法があるが、良く知らん)
641620:02/04/17 03:15
>>621
サンクスです。
こんなダイレクトな記事があったなんて、見落としてた…鬱
642デフォルトの名無しさん:02/04/17 03:42
MFCのダイアログベースアプリケーションを作ろうとしてます。

[プロジェクト]→[プロジェクトへ追加]→[コンポーネント及びコントロール]で、
「Microsoft Coolbar Control, version 6.0.lnk」を挿入。
それをダイアログに貼り付けてとりあえず実行したところ、
例外処理 (初回) は BBSExpDlg.exe (KERNEL32.DLL) にあります: 0xC000008F: Float Inexact Result。
という例外が発生しているようです。(アウトプットウィンドウにて)

プロパティをみても「このコントロールはContainedControlsコレクションをサポートしていません」と
言われてしまうのですが、ひょっとしてVCからは使用できないのでしょうか?
だとしたらどうすりゃいいんだろう…

VC6.0(SP5)+Win2k
643デフォルトの名無しさん:02/04/17 03:45
FormViewで表示するダイアログの切り替えってできます?
Show/Hide駆使するしかないかなあ…
644デフォルトの名無しさん:02/04/17 03:50
コマンドラインといえば__argvと__argcで十分。
>>643
codeprojectにサンプルがいくつかある
646643:02/04/17 04:15
>>645
サンクスです。
codeguruもあったっけ、そいえば…
647麗恵香:02/04/17 07:50
魔法のiらんどでつくったHP不正に改ざんされてパスワード変えられた。誰か不正アクセスの仕方とか教えてください。お願いします。
648えいこ:02/04/17 11:43
たすけてください。いま、MFCで自作のプロパティーシートのコンボボックスに
デフォルトで設定されているプリンタの用紙サイズと用紙の向きを取得するという
プログラムを組んでいるのですが、超初心者なので、まったく、どこをどうしたら
いいのかもわからずに悩んでいます。わかる方がいらっしゃたら、詳しく教えて
いただけないでしょうか?よろしくおねがいします。
こいつはネカマに一票。
650デフォルトの名無しさん:02/04/18 17:04
CWinApp::GetPrinterDeviceDefaults()
651デフォルトの名無しさん:02/04/19 07:10
以前質問したんですがまた聞きます

CToolBarでボタンをラジオボタンのように使えないでしょうか?

ツールバーのスタイルにTBSTYLE_CHECKGROUPというのがあって、これが使えないか?と思い
ウイザード(SDI)が最初から作り出すツールバー(m_wndToolBar)にボタンを追加してみました。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_ALTDRAG , WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // 作成に失敗
}
//ここから追加
TBBUTTON button[5];
for(int i = 0 ; i < 5 ; i++){
button[i].fsState = TBSTATE_ENABLED;
button[i].fsStyle = TBSTYLE_CHECKGROUP;
button[i].iBitmap = 0;
button[i].idCommand = m_wndToolBar.GetItemID(10);
button[i].iString = 0;
}
CToolBarCtrl &ToolBarCtrl = m_wndToolBar.GetToolBarCtrl();
ToolBarCtrl.AddButtons(5,button);
//ここまで

これだと一応他のグループのボタンが押されるまで押下状態をキープしてくれるみたいです。
ただし、ボタン一つ一つが一つのグループになっているらしく、
グループに他のボタンがないので結局押したら押しっぱなしらしいです。
問題はどうやって複数のボタンをグループ化させるのか?だと思うのですが。。。
どなたか教えてください。
はずしてるが、こういう情報ってツールバーにもたせるより
自分で持って、updateハンドラで処理したほうがいいんじゃない。
メニューとかと整合が取れなくなるし、

それにこういう情報って、MFCのフレームワークの中で勝手に
いろいろしててうまく言ってないってことも考えられるし。
653651:02/04/19 09:51
>651です。

スタイルがTBSTYLE_CHECKだとチェックボタンになってくれます。
なのでTBSTYLE_CHECKGROUPも使い方がちゃんとあると思うのですが。
654652:02/04/19 12:00
>button[i].idCommand = m_wndToolBar.GetItemID(10);

とりあえず、IDが同じじゃまずいと思う。

for(int i=0; i<5; i++){
m_wndToolBar.SetButtonStyle(i, TBBS_CHECKGROUP);
}
または
ボタンの更新ハンドラでCCmdUI::SetCheckを使ってチェックの制御。
656635:02/04/19 15:08
>>655
ありがとうございます。
それでできました。
ところでグループを複数に分けたりとかもできるんでしょうか?
できます。
658635:02/04/19 15:30
>>657さん
どうやったらできるのですか?
グループごとにセパレータで分けれこの野郎。
660635:02/04/19 15:38
なるほど。どうもありがとうございます
661652:02/04/19 17:58
ん?
AddButtonsだろうが、SetButtonStyleだろうが
ボタンのIDが同じだったら、チェックグループ
なんて動かないんじゃないの?
だからインデックス変えてるやん

> for(int i=0; i<5; i++){
> m_wndToolBar.SetButtonStyle(i, TBBS_CHECKGROUP);
> }
663デフォルトの名無しさん:02/04/20 01:40
インデクスとIDは違う。
いや、だからー
> button[i].idCommand = m_wndToolBar.GetItemID(10);
はループでインデックス10のIDしか取ってない(=同じID)でしょ。
だから
> for(int i=0; i<5; i++){
> m_wndToolBar.SetButtonStyle(i, TBBS_CHECKGROUP);
> }
でインデックス変えてるから問題ないだろって言ってんの
>> button[i].idCommand = m_wndToolBar.GetItemID(10);
>はループでインデックス10のIDしか取ってない(=同じID)でしょ。
これが問題だっていってんの。
他のボタンいじったってしょうがないだろ。
だからその問題はコードを
> for(int i=0; i<5; i++){
> m_wndToolBar.SetButtonStyle(i, TBBS_CHECKGROUP);
> }
に変更することで解決したっての。
iの値は質問者がボタンに合わせて変えてるはずだろ。
だから>>656で「できました」って言ってんだろ。
SetButtonStyleはIDなんて変えないの。
だから、iの値をちゃんと設定したって直らないんだよ。

直るってんならソースみせてくれ。
IDなんて変える必要ないんだよ。
リソースエディタでボタン作ってそれぞれにユニークなIDつけて
それをグループ化するだけなんだから。
ソースはさっきから載せてるから実際やってくれ。
> for(int i=0; i<5; i++){
> m_wndToolBar.SetButtonStyle(i, TBBS_CHECKGROUP);
> }
だからそのソースのiは0からだと、違うボタンになるから
AddButtonsしたボタンをさすように変更するんだろ。

AddButtonsではIDを同じに設定してるんだから
直らないっていってんの。
おまえはわからんやつだな。
AddButtonsなんか使わないって言ってんだろ。
> //ここから追加
> TBBUTTON button[5];
> for(int i = 0 ; i < 5 ; i++){
> button[i].fsState = TBSTATE_ENABLED;
> button[i].fsStyle = TBSTYLE_CHECKGROUP;
> button[i].iBitmap = 0;
> button[i].idCommand = m_wndToolBar.GetItemID(10);
> button[i].iString = 0;
> }
> CToolBarCtrl &ToolBarCtrl = m_wndToolBar.GetToolBarCtrl();
> ToolBarCtrl.AddButtons(5,button);
> //ここまで
の部分を
> for(int i=0; i<5; i++){
> m_wndToolBar.SetButtonStyle(i, TBBS_CHECKGROUP);
> }
に変えるんだよ。
iの初期値は10か?それでi<15か?
さっきも言ったがこれらの値は質問者が
グループ化したいインデックスに直してコーディングしてるはずだろ。
>AddButtonsなんか使わないって言ってんだろ。
ハァ、話すりかえんなよ。
AddButtonsしたボタンをどうやってグループさせるかって
問題だろ。

リソースで追加してるならちゃんと動くに決まってる。
違う違う。質問の趣旨を把握できてないのはおまえ。
>>651をよく読め。
AddButtonsしなければならないなんてどこにも書いてない。
問題は「ラジオボタンのようにしたい」ってことだ。
AddButtonsは質問者がたまたま最初に使っただけ。
現に質問者が解決してるんだからAddButtonsなんて必要条件には入ってない。
>>651をよく読め。
良く読めば、問題はIDが同じってだけなんだよ。

暗黙のうちにリソースなんて持ち出して、SetButtonStyle
して解決するまでもないだろ。
あーそうだよ。IDが同じなのが問題だ。
でも質問者はSetButtonStyleの方法を選んでそれでできたんだとよ。
そんなもんどっちの方法を使うかなんて質問者の勝手だろ。
どうせコード量が少なくて済むとかそんな理由じゃねーの。
つーか解決してんのにどうしてその方法にこだわるのかが謎。
長生きしろよ
ぶぶぶ
676651:02/04/20 04:15
すみません。私が至らないばっかりに。。。
> for(int i=0; i<5; i++){
> m_wndToolBar.SetButtonStyle(i, TBBS_CHECKGROUP);
> }
をやって、追加したボタンではなくindex=0〜4の元からあるボタンでラジオボタンになってることを
確認したんです・・。
ご両人には感謝してますので、お騒がせしました。
話が落ち着いたところで、質問いいかな?

Staticコントロールを派生させて
コントロール(クラス)一個作ったんですど
(これをCStaticXとします)

このクラスに MouseMoveやDown のハンドラ作っても
取れないんでしょうか?

Paintはとれていて意図した描画は行うのですが・・・

やっぱり親(ダイアログ)で処理しなくちゃ
駄目なんでしょうか?
サブクラス化(Win32)しる。
679デフォルトの名無しさん:02/04/23 22:59
CPenを使って直線を書いたのですがスクロールしても場所が移動しません。
クライアント座標の同じ位置に再描画されて真っ黒になってしまいます。
普通にスクロールしたいのですが、どうしたらよいのでしょうか。

CSclollviewクラスを使っています。

わかるかたおられましたらよろしくおねがいします。
こんな感じで書いております。
CClientDC dc(this);
CPen pen, *pOldPen;
pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
pOldPen = dc.SelectObject(&pen);
dc.MoveTo(0, 20);
dc.LineTo(50,20);

dc.SelectObject(pOldPen);
pen.DeleteObject();
>>679
五郎や、そういうときにはOnDrawを使うのですよ。
681デフォルトの名無しさん:02/04/24 00:23
返事ありがとうございます。
OnDrawの中に書いているのですが・・・・また違うのでしょうか??
表示はできています。
682デフォルトの名無しさん:02/04/24 00:25
OnDrawにはPrepareDCされたpDCが与えられるんじゃなかったかな
おいおい問題点が違うぞ

スクロールされた座標とDCの座標は違うんだよ。
スクロール分足して座標を指定しろ。
>>683
おまえの方が問題点が違う。

OnDrawに

CPen pen, *pOldPen;
pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(0, 20);
pDC->LineTo(50,20);
pDC->SelectObject(pOldPen);

と書くだけでできるが。
685デフォルトの名無しさん:02/04/24 20:13
OnDraw()ではスクロールされた量だけずらして描画するようにして
スクロールが起きたらInvalidate(FALSE)とかやればいいと思うよ?

MFCってのはそう言うやり方をするのです。
大きなファイルをEDITに開きたいんですが。
どうすればうまくいくのでしょうか?
CreateWindow(
TEXT("EDIT") , NULL ,
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
ES_AUTOHSCROLL | ES_AUTOVSCROLL |
ES_LEFT | ES_MULTILINE ,
0 , 49 , 290, 70, hwnd , (HMENU)EDIT_ID1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);


EDITは64kバイトの制限があるよ。たしか。。
つーかまず何がうまくいかなかったのかくらい書けよ。。
689686:02/04/24 20:21
>>687
そうなのそれ(64K)制限にぶち当たっているんです。
どうすればいいの?
リッチエディット!!
691686:02/04/24 20:24
>>688
失礼しました。
うまく問題なく動いてるんですが。
VBのRichTextみたいに、大きなファイルも表示させたいんですけど、
64Kまでしか開かないので、どうするのかなと思いまして、
692686:02/04/24 20:27
>>690
もしかして、それが答えですか?
693デフォルトの名無しさん:02/04/24 20:56
なあ、もうVC使う意味ないだろ・・・
じゃあなにつかうんだよえ?
こたえてみろよ
いえねーだろ
そうだよな
おまえもVCつかってんだから
695686:02/04/24 21:30
フリーコンパイラBCCだったりする。(w
スレ違いを自慢してるのですか?
>>695
もうアフォとしか言いようがないな
698相談室2の941:02/04/25 10:51
検索サイトとかのURLエンコード(日本語が%21%5A%C2とかになるやつ)を
楽にやる方法ありませんか?
>>698
URLエンコードは、IE5以降が入っている環境ではUrlEscape()。IE4以前なら自前で。
その前に文字コードを変換する必要があるなら、適当な変換ライブラリを拾ってくる。
700698:02/04/25 14:00
>>699
サンクスです。早速やってみます。
701旅行者:02/04/26 02:21
>>692
95/98 はそれが限界。
NT系なら EM_SETLIMITTEXT でもっといっぱいOK。
という、95系の悲しい事実
702いつでもどこでも名無しさん:02/04/26 05:03
すいません。どうしてもわからないので質問させてください。

CSplitterWnd を使って分割ウィンドウを作ったのですが、
分割したウィンドウそれぞれに異なった ツールバー を付けたいのです。

フレーム作成時( CFrameWndの派生クラス内の OnCreateClientメンバ )に
CSplitterWnd::CreateStaticして
CSplitterWnd::CreateView でヴューを作成後に
CToolBar::CreateEX 引数に CSplitterWnd::GetPane(0,0) とかして
いるのですが、
コンパイルは通り、動きはするのですが、
分割ウィンドウ内にはビューしか表示されず、目的のツールバーが表示されません。

どなたかご存知の方、宜しくお願いします。
素直にCToolBarCtrlを使う。
704デフォルトの名無しさん:02/04/26 15:43
ダイアログに二つ以上のスピンボタン配置すると
おちるんですが、そういうものですか?
そういうものです
706デフォルトの名無しさん:02/04/26 16:14
>>705
ヲイヲイ…
>>706
ぉぃぉぃ
708デフォルトの名無しさん:02/04/26 16:30
>>707
はいい奴だ。
709デフォルトの名無しさん:02/04/26 17:14
タブコントロールの文字の色は変更できますか?

できない
711709:02/04/26 17:17
>710
サンクス。やっぱりそうっすか!ってレス速いよ(笑

ちなみにボタンの文字色はオーナードローでどうにかってことでOK?


つか、むやみに色換えるなってことか?
オーナードローすればー。
ツールバー上にEditBoxを作ったのですが、これに文字列をセットするには
どのタイミングでやればよいのでしょうか?
OnCreateでやっても実行するとエラーが出てしまいます。
>>711
>>710は嘘。タブコントロールはオーナードロー出来なかった気がするけど、
WM_CTLCOLOR系をいじれば変えられた気がする
715709:02/04/26 17:33
>714
って〜ことは、サブクラス化しないと駄目ってことですか?
716709:02/04/26 18:09
>715の発言は無し。勘違い。

>714
CTLCOLOR定数にタブ無いんだけど…
やっぱむりっぽい?
>>714
TCS_OWNERDRAWFIXED
>>713
OnCreateで自分自身に適当なメッセージをPost。
そのメッセージが届いたところで初期化する。
718702:02/04/26 23:09
>>703
すばやいレス有難うございます。
お返事遅れて申し訳ありません。

さっそく試してみます。
719713:02/04/27 06:45
>>717
ありがと。それでうまくいった。
720デフォルトの名無しさん:02/04/28 11:16
あほな質問かもしれませんが
CString型の文字を16進コードに変換するにはどうすればいいですか?
sprintfみたいなことをしたいのですが
CString a = "ABCDFG";
CString b = CString().Format("%02x %02x %02x", str[0], str[1], str[2]);

CStringは普通の文字列ポインタと同じような読み出しができるようになっている。
ってお父さんに教わらなかったのか?

MSDNしっかり嫁。
入門本なんか読むなバカ。
722720:02/04/28 12:45
>>721
おお〜すばらしいっすね
ありがとうございました。
確かに入門書ばかり読んでました
>>721
しっかり読めよ。
724デフォルトの名無しさん:02/04/29 01:59
>721のaの意味がよく分からないのですが・・・
>>724
それよりFormatの使い方が・・・
多分説明用に書くときにミスったんだと思うが。
726デフォルトの名無しさん:02/04/29 02:08
>721
>>724
CString に文字列リテラル (const char *) を代入できることを説明してるんでしょう。
それならこう説明したほうが・・・
CString a = _T("ABCDFG");
CString b;
b.Format(_T("%02x %02x %02x"), a[0], a[1], a[2]);
729初心者:02/04/29 10:58
初めまして。初心者なのですが分からないことがあるのですが、
教えてもらえますか?スピンコントロール2個を連動させるという
設定をしようと思っているのですが、どうもうまくいきません。
合計の最大値が決まっていて最大値から片方のスピンの値をマイナスした
値がもう一方のスピンの最大値になる、という形を作りたいんです。
今のところ下記のようなコードを書いたのですが、なぜかエラーが・・・
どこか間違っている所などあったら教えてください。
BOOL CDialog2::OnInitDialog()
{
CSpinButtonCtrl* pSB1 = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN1);
CSpinButtonCtrl* pSB2 = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN2);
pSB1->SetRange(0,40);
pSB2->SetRange(0,40);
return FALSE;
}

void CDialog2::OnKillfocusEdit1()
{
max1 = GetDlgItemInt(IDC_EDIT1,NULL,FALSE);
mm_max2 = 40-max1;
pSB2 -> SetRange(0,mm_max2);//ここで問題が起きてるみたい・・
}
void CDialog2::OnKillfocusEdit2()
{
max2 = GetDlgItemInt(IDC_EDIT2,NULL,FALSE);
mm_max1 = 40-max2;
pSB1 -> SetRange(0,mm_max1);
}
長くなってしまってすいません・・・よろしくお願いします。
いつものことだけど、エラーってコンパイル時?実行時?
>pSB2->SetRange(0,mm_max2);//ここで問題が起きてるみたい・・
単に
CSpinButtonCtrl* pSB2 = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN2);
pSB2->SetRange(0,mm_max2);
にするってことじゃなくて?
731初心者:02/04/29 11:21
実行時にエラーが出ます。コンパイルは普通に通ります。EDITから値を
取れているようだし、SetRangeの実行時になにやら問題があるようで・・
>>731
実際にそのコードを(max1などはint max1などとして)書いてやってみたけど
問題なくできたよ。
別の部分に原因があるか、それかリビルドしてみるとか。
>>729
俺はMFCをまったく触ったことないから、もしかしたらまるで見当はずれかもしれんけど。

>pSB1->SetRange(0,40);
>pSB2->SetRange(0,40);

ってことは、二つとも、範囲が0〜40なんだろ?
んで、

>合計の最大値が決まっていて最大値から片方のスピンの値をマイナスした
>値がもう一方のスピンの最大値になる、という形を作りたいんです。

ってことは、

>mm_max2 = 40-max1;

これは、80-max1が正しいんじゃないのか?
734初心者:02/04/29 11:40
おお、そうですか・・・ありがとうございます!よかったぁ・・
悩み続けてここだけに20時間ほど付きっきりだった(笑)
他の部分をチェックしてみようと思います。ほんとうにありがとう。
735初心者:02/04/29 11:44
>>733
えっと、どちらも合計の最大値が40で、一方のスピンが30まで行った場合
だったらもう一方がRangeを(0,10)にするという意味でした。分かりづら
かったかもしれないです。わざわざレスありがとうございました。
736初心者:02/04/29 12:36
先ほどスピンの質問をした初心者です。ありがとうございました。
立て続けに質問で申し訳ありません・・・。
CPropertyPageの派生クラスCDialog1でpublicに宣言された
int m_radio;の値を返す関数Getm_radioの戻り値を

public:
int m_radio;
int CDialog1::Getm_radio();
//class CDialog1 : public CPropertyPageで宣言
__________________________
int CDialog1::Getm_radio()
{
return m_radio;
}

という関数を使って戻り値をCFrameWndの派生クラスCMainFrameから

void CMainFrame::OnOpenDialog()
{
int m_radio = CDialog1::Getm_radio();
//(以下略)

こんな感じで呼び出そうとコーディングしているのですが、
コンパイル時に"error C2352: 'CDialog1::Getm_radio' :
静的でないメンバ関数の中で呼び出しが正しくありません。"

と言うエラーが出てしまいます。あまりに初心者なので根本的に
何か大間違いをしている可能性があるような気がするのですが・・・
問題などありましたら教えてください。お願いします。
737デフォルトの名無しさん:02/04/29 12:38
test
738デフォルトの名無しさん:02/04/29 12:39
C++の勉強の勉強はやったんだけど、
どうやってWinのソフトウェアを作ればいいのか全然わからない。
Visual C++を使ってなんか作りたいんだけど、
どのように勉強したらいいでしょうか?
お勧め本とかホームページ教えてくれますか?
↑スレ間違えた。
>>736
public:
int m_radio;
//↓int CDialog1::Getm_radio();
int Getm_radio();

//class CDialog1 : public CPropertyPageで宣言
__________________________
int CDialog1::Getm_radio()
{
return m_radio;
}

という関数を使って戻り値をCFrameWndの派生クラスCMainFrameから

void CMainFrame::OnOpenDialog()
{
//↓int m_radio = CDialog1::Getm_radio();
CDialog1 dlg;
int m_radio = dlg.Getm_radio();
//(以下略)

俺ならこんな感じに書く
741デフォルトの名無しさん:02/04/29 13:27
エディットボックスをクリックすると
ボックス内の文字列を選択するようにしたいのですがいい方法ありますか?
SetFocusメッセージでCEdit.SetSel(0,-1)をやってみましたが
だめみたいっす・・・クリックのメッセージないし・・
>>741
CEdit派生クラスのOnLButtonUpでSetSel(0,-1)
743741:02/04/30 07:10
>>742
レスありがとうございます。
たすかりました。
744sin:02/04/30 10:03
カレンダーコントロールで月の初めの方の日や最後の日をクリックすると
月が変わってしますがこれを出来ないようにする方法はありますか。
NewMonthメッセージで対応しようとしても月が変更されたことを取得できず
どうしていいのやら分かりません。
745デフォルトの名無しさん:02/04/30 13:43
WINCORE.CPPに「C++オブジェクトを他のスレッドに渡すのは危険だ」とあるので、
ワーカースレッド作るときに CHogeWnd (:CWnd)の thisポインタを渡す代わりに、
this->m_hWnd を渡してやって、ワーカースレッド側で
 CHogeWnd* m_pHogeWnd = (CHogeWnd*)CWnd::FromHandle(hWnd)
とやって CHogeWndオブジェクトへのポインタを取得します。

ワーカスレッド内では「ずーっと」このポインタで CHogeWndのメンバを呼び出し
たりしています。これってもしかして危険? NG大将?

というのも、CHogeWndのメンバ変数に m_pHogeWnd->m_xxx とアクセスすると、
おかしな値になっているんです。テンポラリオブジェクトとか、パーマネント
オブジェクトとかその辺の絡みですか?
>>745
C++インスタンスとHWNDのマップはスレッドローカルなので、
>>CHogeWnd* m_pHogeWnd = (CHogeWnd*)CWnd::FromHandle(hWnd)
こんなことしても、インスタンスのポインタは取得できないと思うYO。
747デフォルトの名無しさん:02/04/30 16:29
MFCのバイブルみたいな本教えて。
わたくし初心者本で一通り勉強したけどほとんど初心者です。
MFC internal
>>747
これ。
http://www.ascii.co.jp/books/detail/4-7561/4-7561-1749-X.html
基礎部分を網羅的に教えてくれる。
これ読んでから、ウイザード無しでも組めるようになった。
>749 ありがとうございます。
よさげな本なのにamazonで調べたら在庫がないよー。
探してみる。
751745:02/04/30 16:58
>>746
なるほど。
じゃ、親(CHogeWnd)のメンバ変数にアクセスしようと思ったら、CHogeWnd の this ポインタを渡してやらないとだめだけど、それが危険だ(?)、ということですね。

//WINCORE.CPP には CWnd::FromHandle を使えというコメントが書かれているんで、それを使えば万事OKと思っていたんですが。

まぁ、今は親の HWNDにメッセージを送っていろいろやってます。
752デフォルトの名無しさん:02/05/01 00:44
>>744
SetRange で選択できる範囲を制限すればいいんじゃない?
>>745
FromHandleで返ってくるポインタはDeleteTempMapで殺されるから、で正解?
以下、MSDNの CWnd::DeleteTempMap の解説。
「CWinApp オブジェクトの入力待ち処理から自動的に呼び出され、
 FromHandle メンバ関数で作成された一時的な CWnd オブジェクトを削除します」
754 :02/05/01 09:22
終了させるときexit(0)で終了させたりしたらまずいですか?
755超初心者:02/05/01 11:48
hello windowsをやりたくて、以下のプログラムを書きましたが、
エラーが出てしまいました。どうしても原因が分かりません。
スペルミスでないのなら原因を教えてもらえませんか?

プログラム:
#include <afxwin.h>

class CHelloWindow : public CFrameWnd
{
public:
CHelloWindow();
void OnPaint();
DECLARE_MASSAGE_MAP()
};

class CHelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};

BEGIN_MASSAGE_MAP( CHelloWindow, CFrameWnd )
ON_WM_PAINT()
END_MESSAGE_MAP()

CHelloApp theApp;

CHelloWindow::CHelloWindow()
{
Create( NULL, "My Hello!!" );
}

void CHelloWindow::OnPaint()
{
CString s = "こんちわ WINDOWS!!";
CPaintDC dc( this );
CRect rect;
GetClientRect( rect );
dc.SetTextAlign( TA_BASELINE | TA_CENTER );
dc.TextOut( (rect.right / 2), (rect.bottom / 2), s );
}

BOOL CHelloApp::InitInstance()
{
m_pMainWnd = new CHelloWindow();
m_pMainWnd->ShowWindow( m_nCmdShow );
m_pMainWnd->UpdateWindow();
return TRUE;
}
756超初心者 :02/05/01 11:49
エラーメッセエージ:
--------------------構成: hello_windows - Win32 Debug--------------------
コンパイル中...
hello_windows.cpp
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(9) : error C2143: 構文エラー : ';' が '}' の前に必要です。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(18) : error C2065: 'OnPaint' : 定義されていない識別子です。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(18) : error C2440: 'type cast' : 'int *' から 'void (__thiscall CWnd::*)(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(18) : error C2143: 構文エラー : ';' が '}' の前に必要です。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(18) : warning C4508: 'BEGIN_MASSAGE_MAP' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(18) : error C2143: 構文エラー : ';' が ',' の前に必要です。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(19) : error C2143: 構文エラー : ';' が '{' の前に必要です。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(19) : error C2447: グローバルスコープで中カッコ ({) が見つかりましたが、対応する関数ヘッダーがありません。
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(19) : error C2143: 構文エラー : ';' が '}' の前に必要です。
cl.exe の実行エラー

hello_windows.obj - エラー 8、警告 1
デスクトップか…。
758超初心者:02/05/01 12:01
フォルダ作るのめんどくさかったんです。
1.マクロ関数の行末にセミコロンが足りない。
2.void型なのにreturn;が無い。(この場合は不定なint値が返るのでエラー。)
なのか?
つーか俺も初心者なので良くわからん。
結局のところ試行錯誤だ!
>スペルミスでないのなら原因を教えてもらえませんか?
スペルミスですが何か?
>2.void型なのにreturn;が無い。(この場合は不定なint値が返るのでエラー。)

...
763デフォルトの名無しさん:02/05/01 12:22
764デフォルトの名無しさん:02/05/01 12:22
スペルミスなんですね。どもです。
探してみます。
765超初心者:02/05/01 12:28
すんまそん。どこのスペル間違ってるんですか?
わかりませんでした。
スペルミスまで丸投げかよ
> 2.void型なのにreturn;が無い。(この場合は不定なint値が返るのでエラー。)

・・・・・・・・・・・。
void *の間違いだろうか・・・・・
768デフォルトの名無しさん:02/05/01 12:32
>>765
C:\Windows\デスクトップ\hello_windows\hello_windows.cpp(9) : error C2143: 構文エラー : ';' が '}' の前に必要です。
たとえば、
こういうエラーメッセージがあったら、hello_windows.cppってファイルの9行目に
エラーがあるってこと。
9行目とその前後をチェックしてみ。
スペルミス直したらプロジェクトの設定でリンクタブのプロジェクトオプションの
/subsystem:console を /subsystem:windows に直してビルドだ。
それで動いた。
初心者でも超でも丸投げはどんなもんよ。
そして永遠に綴り間違いには気付かないという罠。
MS-IMEのカタカナ語英語辞書を有効にしておけよ…。
771初心者:02/05/01 12:36
見つかりました。DECLARE_MESSAGE_MAP()でしたね。
みなさまが優しくてほんと助かりました。ありがとうございます。
超が取れたことに一体何人が気付いているのだろう。
773 :02/05/01 17:25
例えば、
CString b;
b.Format(_T("%02x %02x %02x"), a[0], a[1], a[2]);
のように_T は付けた方がいいんですか?
俺はつける。
他はしらん
>>773
UNICODEとMBCSで同じコード使いたかったらつけろ。
UNICODEにするつもりが無いならつけなくてもいいし。
776デフォルトの名無しさん:02/05/01 17:51
質問です
 リストビューを表示する前に項目をあらかじめ選択させたいのですがどうしたらいいでしょうか?
 以下の2つの方法を試したのですがうまくいかないんです
 ・アイテムをInsertする前に
  InsertするLV_ITEM構造体のstateにLVIS_SELECTEDをセットする
setItem.state |= LVIS_SELECTED;
 ・int SetSelectionMark( int iIndex );を使用する

 どうしたらいいでしょうか?
 あと、CPropertySeatでウィンドウの下にあるヘルプのボタンを隠したいのですが
 m_psh.dwFlagsのPSH_HASHELPをオフにするにはどうしたらいいでしょうか?
>>776
CPropertySeat ってなんだ ?
オフにする?
m_psh.dwFlags &= ~PSH_HASHELP
か?
>>776
表示更新を停止した状態で作成して選択。
その後、更新する。

やり方忘れたんで、わかる奴書いてくれ
WM_SETREDRAWだな。
最初(アイテムを追加する前)にこれで更新停止しておいて、
追加後、選択。それからまたWM_SETREDRAW
781デフォルトの名無しさん:02/05/01 22:09
MDIのプログラミングをしているのですが、VC++みたいに、ツールバーと
同様にツリービューや、エディットボックスを組み込むにはどうすればいいでしょうか?
782デフォルトの名無しさん:02/05/01 22:16
たくさんあるチェックボックスを配列に代入(?)したいのですが
クラスウィザードのメンバ変数の追加でやろうとするとうまく行きません。
要は
while(i<20){
if(m_chk1[i]){...}
i++;
}
という感じでチェックボックスが
チェックされているか判定したいわけなんですが、どうしたもんでしょうか
ID配列を作ってループ、チェック状態を配列に格納しる。
>>728
なぜ for() 文使わんのかと小一時間...。i の初期化も忘れないように。
チェックボックスの IDを連番に(resource.h編集して)しておけば、
ID配列要らないから、いいかもね。
>>782
ウィザード使わずに自分でやれば?
787デフォルトの名無しさん:02/05/02 07:03
ビットマップを読み込みコンパチなCDCを作成し、保持するクラスを作ったんですが、
このクラスのメンバCreate(CDC *pDC)にクライアントのDCポインタを渡したいのです。

これはアプリ起動時に一回しかCreateしません。こういうのは何処に持つべきでしょうか?
ドキュメントに持ったとしてCreate(CDC*pDC)を呼び出すタイミングって??
あとCDocumentやCWinAppやCMainFrameからViewクラスのオブジェクトってどうやって参照するんですか?
そもそもView派生クラスのオブジェクトって何処にあるの??
788デフォルトの名無しさん:02/05/02 07:32
SDIアプリにツールバーを二つつけました。
この二つのツールバーの状態をファイルに保存/復元するには
どうすればよいのでしょうか?

SaveBarState/LoadBarStateではレジストリまたはプライベートiniに
保存することになるので、
CFile fileWrite;
if(fileWrite.Open(_T("state.ini"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite)){
CArchive ar(&fileWrite, CArchive::store);
CDockState state;
GetDockState(state);
ar.WriteObject(&state);
ar.Close();
fileWrite.Close();
}
などとして状態を保存してみたのですが、これを
CFile fileRead;
if(fileRead.Open(_T("state.ini"), CFile::modeRead)){
CArchive ar(&fileRead, CArchive::load);
CDockState* state = (CDockState*)(ar.ReadObject(RUNTIME_CLASS(CDockState)));
SetDockState(*state);
ar.Close();
fileRead.Close();
}
で復元すると二つのツールバーの位置が逆になってしまうのです。
789782:02/05/02 08:32
>>783,>>784,>>785,>>786
レスありがとうです。
なんとか
CButton* m_chk[0]=(CButton*)GetDlgItem(IDC_CHECK1)
CButton* m_chk[1]=(CButton*)GetDlgItem(IDC_CHECK2)
:
:
でできましたが、ID配列てどうやるんでしょうか。
なんか便利そうなので良かったら教えてください。>>783
それとIDが連番なら配列的に使えるんですか?どのように?>>785
790785じゃねーけど:02/05/02 09:27
>>789
> それとIDが連番なら配列的に使えるんですか?どのように?>>785
「どのように ?」と来たか、応用が利かない奴と見られてちょっと痛い
ぞ。

ID 配列作る時でも...

for(i = 0; i < ...; i++){
CButton* m_chk[i] = (CButton *)GetDlgItem(IDC_CHECK1 + i);
}

と書けるだろ ? ちょっとした操作だけなら、配列に入れる必要もないよ
な。
791ひよこプログラマ:02/05/02 09:43
Visual C++6.0でメーラを作ろうと思ってるんですが、
そこの表示部分にCHtmlViewを使って横着しようと考えて悩んでいます。
CHtmlViewのターゲットとなるURLは、リソースかファイルか、
あるいはネット上に存在しなければならないとありますが、
これを、「何か文字列を与えればそれをHTMLと解釈して表示してくれる」みたいな
使い方はできないものでしょうか?

今のところ、テンポラリファイルに一度書き出して
それをfile://で読み出しているのですが、
どうも格好が悪いものです。
なんとかなりませんかねぇ?
static int id_hairetu[] = {
IDC_CHECK1,
IDC_CHECK2,
IDC_CHECK3,
};

int i;
for (i = 0; i < sizeof(id_hairetu) / sizeof(id_hairetu[0]) ++i)
{
;
}

コントロールのIDをきちっと整列しておけばわざわざ配列を作らなくても
連番で処理できるってだけ。
コントロールも全部自分で作成してるなら、IDをそろえるのが楽。
共同作業とかでやってるなら、どんな変更が入るかもしれないから
ID配列みたいのをわざわざ作って確実に処理をする。

連番もいいけど、今まで見た中で最悪だった社内ライブラリ(藁)では
BOOL GetCheck(BOOL **fCheckTbl, int idStart, int idCnt);
みたいのあった。

ID連番にしなきゃいけねえだろばか
結果は結局配列で受け取るんだろばか
いちいち中でGlobalAllocすんなばか
なかんじ

くれぐれもこんなばかなのつくらんように。

Wizardの作ったコントロール名をそのまま使うのやめれ。

>>792
GetCheck() てーのは、何を返すんだろう ?
俺なら BOOL *GetCheck(int idStart, int idCnt); にするが...。
連番にするかは、プロジェクトのポリシーだと思うから、連番にすると決
めてあるなら、これでも良いとおもう。
結果を配列にするかどうかは、結果の使い方しだい。どれか一つでも
チェックされていたらとか、5 個以上チェックされていたらとかいろいろ
やるなら、とりあえず配列で返すのが良いとおもう。

要は、これだけ見て良いか悪いかは >>792 以外にはわからん。
794789:02/05/02 11:56
>>790,>>792
レスサンクスです。勉強になるです。
795788:02/05/02 22:38
レス付かなかったけど一応やりたいことはできたので書いておく。
二つのツールバーのそれぞれのCreateExの第5引数でIDを指定すると、
>>788のコードで保存/復元ができた。
もっと簡単な方法はないかな?
796デフォルトの名無しさん:02/05/02 22:42
MFC勉強中なんですが
手書きでプログラム組めた方が良いのでしょうか?
>>796
普通手書きじゃない?
>>796
まず、
MFCで出来あがるアプリを見て、
それで満足するのならば、それを使え。
>>796
手書きでコーディングしても、結局はキーボードで打ち込まないとビルドできないから
最初からキーボードを使ったらいいんじゃないですか?
800デフォルトの名無しさん:02/05/03 00:39
OCR...
ああもう、つまらんネタカキコはやめれ。
(´-`).。oO(MFC専用のコーディングシートってないのかなあ?)
>>802
なんだ MFC 専用ってのは ? C++ 専用って言うんだったらまだわかるが...。
804787:02/05/03 03:47
CDocumentからViewを得る方法はありますか?
まただ。またこの質問だ。
俺は疲れている。
GetFirstViewPosition>GetNextView
807デフォルトの名無しさん:02/05/03 05:08
Viewのオブジェクトは何処にあるのですか?
無論、メモリ上にあります。
ほかにどこにあると思うのですか?
809デフォルトの名無しさん:02/05/03 05:13
>808
かわいそうに。知識が無くてそんなことしか書き込めないんですね。
スレ違いならともかくなぜ>805や>808のような書き込みをするのか?
>810
本当に理由が知りたいわけでもないのに、
そんな質問をするのと同じ理由からですよ。
 素直に、>>801というとか、あなたが的確な
答えをだしてあげればよろしかろうに。
>811
それはちがうな。スレと関係ないことを書くなって意味だよ。質問スレで
「その質問は飽きた」これを弁護して、>810を非難する神経ならスレから出てってくれ。
>>807=804=787か?
それだったら、GetNextViewで得たビューがViewオブジェクトだから、
目的の(CView派生)クラスにDYNAMIC_DOWNCASTをするべし。
>812
「張り紙するな」という張り紙のある壁を見た思いです。
>>814
たしかにそうだが、言いたい放題の奴より注意する奴が文句言われるのは何か違う
>814
張り紙するなと言う張り紙はしても問題ないよバカ
>>814
張り紙するなとラクガキしてください
818デフォルトの名無しさん:02/05/03 17:38
MDIで、メニューの中に独自のものを足すじゃないですか。
そのときに、起動するとどうしても淡色表示になってしまいます。
あれを、なくすにはどうすればいいでしょうか。
819デフォルトの名無しさん:02/05/03 17:53
>>818
その前に何が作りたいの?
「〜みたいなアプリケーションのウィンドウが作りたい」
っていった方が絶対わかると思われ。
例えば、
「フォトショップの横っちょに出るウィンドウみたいなのが
作りたいです。」
とか。
820デフォルトの名無しさん:02/05/03 18:39
>>818
クラスウィザードなりで
そのメニューのハンドラ作れば
淡色表示じゃなくなる
>>819
それだとそのアプリ持ってない人にはわからないと思われ。
つーか>>818みたいな簡単な質問ならそんなこと聞かなくても(略
822デフォルトの名無しさん:02/05/03 19:04
ファイルの説明を取得するにはどうしたらいいのでしょう?

前にどこかのHPで見たのですが・・・
検索しても見つかりませんでした。
CFile::GetStatusのこと?
824デフォルトの名無しさん:02/05/03 19:16
>>823
違うんです。

例えば
拡張子がdocだとMicrosoft Word 文書とかです。
>>824
SHGetFileInfo
>>826
レスありがとうございます。

SHGetFileInfoを調べてみたのですがアイコンの取得しかありませんでした。
サンプルじゃなくてMSDN嫁
>>828
分かりました。

けど英語しかなっかた・・・
まあがんばってみます!
830822=824=827=829:02/05/03 21:36
皆さんありがとうございました。
SHGetFileInfoで目的のことが出来ました。
831デフォルトの名無しさん:02/05/03 21:38
dfsdfsdfsdfせgれgれgれgれgれgれgれgれgれgrっっっっっw
832デフォルトの名無しさん:02/05/04 00:25
>>821
でもさ、MFCの一番最初にぶつかる壁に、
「まず、VC++のドッキングウィンドウや
フォトショップの小さいウィンドウやフラッシュの小さいウィンドウは
実はViewじゃなくてControlBarです。」
っていう最強の罠がはってあるジャン。
いまじゃ、みんなの共通の知識になってるみたいだけど
始めたばっかりのころはいろんなMFC関連の書籍をあさっても
全然のってなかったことに激怒したよ。
んでさ、見た目に複数のウィンドウがあるアプリをみると
MFC初心者の人達はMDIで作ろうとするんだけど上手くいかないし、
そもそもアプローチがまじぃっつーところから教えてほしいなと、
あの頃は思ったわけよ。でもいらんおせわだったらすまんこ。
833デフォルトの名無しさん:02/05/04 10:37
age
ウィンドウを静的に、下の図のよう形で分割するには
どんな方法があるだろうか?

■■□□
■■回回
■■回回
○○回回
CHOCOAみたいな分割だな。


縦に二つ -> 左右を上下に分割
836うと:02/05/05 00:31
あるモーダルダイアログで、ショートカットキーを定義したくて
ダイアログでPreTranslateMessageを継承して、WM_CHARで処理した
んですが、最初はちゃんと動くんですが、その内にWM_CHARがこなく
なってしまいます。
どうしたら良いのでしょうか、なんかが根本的に違うような気も
するんですが。なにかヒント欲しいです。
837デフォルトの名無しさん:02/05/05 00:54
>>836
ショートカットキーの実現にはWM_CHARじゃなくてアクセラレータを使う
ダイアログでアクセラレータを使う場合は
PreTranslateMessageでTranslateAcceleratorを呼び出す
838うと:02/05/05 01:08
>>837
ありがとうございます
調べに逝ってきますです
>>836
そもそもPreTranslateMessageにWM_CHARはこないのでは?
でも最初は動くんですか?
WM_CHARてのはTranslateMessageして生成されるもんだと
思ってたんですが、違う?
840デフォルトの名無しさん:02/05/06 10:30
ラジオボタンにデフォルトでチェックを入れたいのですが、どうしたら良いでしょう?
>>840
SetCheck()
842デフォルトの名無しさん:02/05/06 11:00
>>841できました。ありがとう。
843sage:02/05/06 14:50
キホンでしょう。この位は本とかwebみようよ。
844デフォルトの名無しさん:02/05/07 07:34
>843
うるさい。ばか
>>843-844
その位sageていこうよ。
846デフォルトの名無しさん:02/05/07 10:59
.(DOT)の仮想キーコードってあるんですか??
0xBEみたいなんですけど、ヘッダにはありませんでした。
KeyPadの.ならVK_DECIMALがあるらしいですけど・・・
>846
VK_PERIOD
もともとドットは.じゃなくて・だし。
849846:02/05/07 17:08
>>847
それ見当たらないですよ??
たしかVJ++ではVK_PERIODはあったような気がするんですけど・・・
WINUSER.Hでいいんですよね??
>>849
存在しないなら、決まってないと言うことだ。
たとえば、;の仮想キーコードも106/101で違ったはず。
その辺はキーボードドライバでWM_CHARに変換される
VK_Dとかは何ヘッダに書いてあるの・・?
>849 >851
#define VK_OEM_PERIOD 0xBE // '.' any country

WinUser.h の VK_ を define してるとこのコメント、ちゃんと読もうぜ。
>>852
あんたこそ嫁
OEMはインプリメントに依存する
つーか、MSDNにはVK_OEM_PERIODってWin2k限定って書いてあるぞ
>>846
ASCIIコードと同じヤツはヘッダに無いから
'.' か '>' のどっちかでよかったハズ
>>854
9xのDDKドキュメントにも「VK_OEM_PERIOD 0BEh」って書いてあるぞ。
857856:02/05/07 19:59
WinUser.h でも #if(_WIN32_WINNT >= 0x0500) になってないし
最新の SDKじゃないと定義されてないっぽい < VK_OEM_PERIOD
859デフォルトの名無しさん:02/05/09 15:09
ダイアログアプリでアイドルタイム処理をしたいのですが、
OnIdleをClassWizardで追加してもOnIdleが呼ばれてないようです。
(OnIdle内でTRACEして確認。)
どうすればアイドルタイム処理ができるのでしょうか。
メッセージループを自分でまわしてその中でOnIdle呼べば?
861デフォルトの名無しさん:02/05/09 15:40
ADO扱った本や、
サイトありませんか?

ハマっちゃて・・・
862デフォルトの名無しさん:02/05/09 16:05
>>859
MSDN で WM_KICKIDLE を検索すれば何か見つかるかも
WM_KICKIDLEハンドラで
UpdateDialogControls(this, TRUE);
とやってもON_UPDATE_COMMAND_UIがSDIアプリのように来ないんですよねぇ。
ダイアログアプリでもメニュー更新ハンドラで
pCmdUI->SetCheck(1);
のようにしたいだけなんですけど。
864デフォルトの名無しさん:02/05/09 17:51
>>864
それやるならWM_INITMENUPOPUPでいいんじゃないかってのと、
同じcodeguruのdialogカテゴリで言うならなぜ
ttp://codeguru.earthweb.com/dialog/dialog_updateui.shtml
の方法(>>863と同じ方法)ではできないのかと。
前者は無し、勘違い。
後者のttp://codeguru.earthweb.com/dialog/dialog_updateui.shtml
ができないのはなぜ?
あぁまたしても勘違い…
UpdateDialogControlsはコントロール向けか…
ぐだぐだになったけど要するに>>864で解決ってことで。
868デフォルトの名無しさん:02/05/09 18:52
メモリの解放について質問します。
ボタンを押すごとに前に描いた線を消して、新しい線を描きたいのですが、
それを 200 回くらい繰り返すと途中でメモリが足りなくなってしまいます。
今は、背景と同じ色で塗りつぶしてから新しい線を描いています。
他によい方法があれば教えてください。
よろしくお願いします。
とりあえず、コードだせ。
400回ぐらいMoveTo LineToしても全然平気だけど。
penとかDCとかブラシとか開放わすれてません?
メモリの解放について質問って言ってるから開放の仕方がわからないのでは。
872デフォルトの名無しさん:02/05/09 19:17
>>869 これがソースです。よろしくお願いします。

CDC* pDC;
pDC = GetDC();

CPen newPen;
CPen *pOldPen;

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, 520, 200);

CBitmap *pMemBmp=MemDC.SelectObject(&MemBitmap);
MemDC.BitBlt(r_t_x, r_t_y, 520, 200, pDC, r_t_x, r_t_y, SRCAND);
MemDC.SelectObject(pMemBmp);

pDC->SelectStockObject(NULL_PEN);
pDC->Rectangle(rx, ry, lx, ly);
pDC->SelectStockObject(BLACK_PEN);

newPen.CreatePen(PS_DOT, 1, BLUE);
pOldPen=pDC->SelectObject(&newPen);

pDC->MoveTo(x_r_x, x_r_y);
pDC->LineTo(x_l_x, x_l_y);
pDC->MoveTo(y_t_x, y_t_y);
pDC->LineTo(y_u_x, y_u_y);

MemDC.SelectObject(&MemBitmap);
pDC->BitBlt(r_t_x, r_t_y, 500, 200, &MemDC, r_t_x, r_t_y, SRCAND);
MemDC.SelectObject(pMemBmp);

MemBitmap.DeleteObject();
MemDC.DeleteDC();

newPen.DeleteObject();

ReleaseDC(pDC);
pOldPenをSelectObjectし忘れ?
874デフォルトの名無しさん:02/05/09 19:43
>>873
忘れてました…
できました。
ありがとうございます。
なんでGetDCしてんの?
AppWizard の SDI で作ってます。
適当なファイルを読んだ後にタイトルにファイル名を表示させたいのですが、
ドキュメントの Serialize の読込みの後、CDocument::SetTitle() では
違うのでしょうか? 変更されない……。

877876:02/05/10 14:29
age よう。
878876:02/05/10 14:31
age てなかった……
879876:02/05/10 14:57
CMainFrame に OnUpdateFrameTitle を書いて、
SetWindowText するという方法で目的は達成できませした。

が、OnUpdateFrameTitle を MSDN で引いてみると COleClientItem の
メンバとなっているようなのですが、CMainFrame の親と COleClientItem って
何か関係あるんでしょうか?
>>879
CFrameWndのドキュメントが不完全なだけ。
ありがち。
(一応MFCのバージョンが変わったら、そこが変わってないかどうか
確認する必要がある)
881デフォルトの名無しさん:02/05/11 18:02
既出かも知れないけど

複雑な図形上をマウスで押した際の判定に
CRgnとPtInRegionを使っているんだけど
Win2KではOKなのに、Win98、Meじゃだめでした。

直前にViewに対してFillRgnで描画を行っているんだけど
それはちゃんと表示されてます。

原因がつかめず、難儀してます。
お知恵を拝借
>>881
引数にPOINT構造体を渡してみたらどう?
883デフォルトの名無しさん:02/05/11 23:22
ステータスバーの中にプログレスバーをつけたいのですが、
CStatusBarCtrlの中からCProgressCtrlをCreateすれば上手くいきます。

ただ、できればApp Wizardの作ったスケルトンを大幅に変えないで
実装したいのですが、どうするのがスマートでしょうか?

CStatasBarの派生クラス内からCProgressCtrlをCreateできればいいのですが
上手くいきません。

見当違いのことを書いているのかもしれませんが、その指摘も含めて
よろしくお願いします。
884デフォルトの名無しさん:02/05/13 10:09
MFCでvectorとかlistのコンテナって
使えないんですか?
すんません
ヘッダーファイルをインクルードしたらでけますた
886デフォルトの名無しさん:02/05/13 11:59
ダイアログ上のCEDit内でTabが全文選択になってしまってこまっています。
どう設定すればTab文字が入力出来ますか?
ダイアログベースのアプリで
シリアライズってどーやるんだ。。。。
888デフォルトの名無しさん:02/05/13 17:51
あの、VCのようにMDIでも1つのプロジェクトしか実行できないものがあるじゃないですか。
この手のものは、MDIの子ウィンドウに複数の種類がありますでしょう?
ソース用のテキストだったり、コントロールデザイン用であったり…。
新規作成を押すと、そのあたりが全て初期化されますよね。
そのような、MDIのアプリケーションの複数の子ウィンドウの取り扱いはどのように
すればよいのでしょうか?
888
したいことがよく判らんが取りあえずこのあたりでも読んでみれば?
http://www.microsoft.com/JAPAN/developer/library/jpbkgnd/TechArt/VTools/vc/MFCFAQ.htm#mfcfaqdocs
>>888
Documentをツリー上にして出来たよ。
>>889
面白そうなので読もう、いまさらMFCとか言われそうだけど・・・
何をすればいいのか教えてください。
892デフォルトの名無しさん:02/05/13 19:53
>>889
用は、VC++のようにMDIの子ウィンドウに複数の種類を持たせたいのです。
そして、それを取り扱いたいわけです。
DocTemplateを複数登録すれば?
894887:02/05/13 20:16
すんません
シリアライズは実装したんですが、
実際にファイルのオープンや書き込みは
ダイアログベースではどの関数でやればよいのですか?
CFileDialog
896887:02/05/13 20:48
ファイル名まで取得して、
その後なんですが・・・・ウウウ
フレームワーク使わないなら素直にfprinfとfscanf使おう
 @CFileDialogからファイル名を取得
 ACFileでオープン
 BCArchive ar
 CCxxDocと関連
 DオブジェクトのSerialize ar<< CObjectxx
898887:02/05/13 21:05
ありがとうござんすっ
899デフォルトの名無しさん:02/05/13 21:58
っていうか.NETのこの時代にMFCを真剣に学んでる
奴等って....(゚д゚)ポカーン
まあ...時代の風に乗り遅れるなよとしか
言いようがないが....
>>899
.NETではドライバは書けません。
そう言うことです。
MFCだとドライバ書けるのかと聞きたい
>>901
.NETでCPLは書けません。
新しモノ好きなだけ〜
904デフォルトの名無しさん:02/05/13 22:07
っていうかもはやMFCはクライアント
サイドで.netに取って代わられるんでしょ?
つまりMFCはデバドラでもしこしこ書いてろ
ということでよろしいか?
>>904
MFCはともかくネイティブコンパイラは残るでしょ。
取りあえず.NETを支えてるのがWin32である以上。
ngen=ネイティブコンパイラ?
だったら.NETでもいいと思われ
905
Win32が残る以上、皮一枚のMFCは残るでしょう
908デフォルトの名無しさん:02/05/13 22:12
>>905
.NETのクラスライブラリは最終的には
Win32APIを呼び出しているということですか
>>908
そらそうでしょう。Widowsプログラミングとはそう言うものでしょう。
最終的にはBSDのシステムコールを呼び出す実装もあるようだが?
911デフォルトの名無しさん:02/05/13 22:47
WindowsXPの浸透率≒.NETの浸透率
は成り立つか?
XPとNETは何の関係も無い。
.NETつかってみてーなぁ
とうとう900突破かぁ
CPropertySheetでDoModalして、処理が戻ってきたら
GetActiveIndex()を使ってアクティブだったpageのインデックスを
取得したいんだけど、なぜか0しか返ってこない。
SetActiveIndexなら、DoModal前に指定すればちゃんとそのpageが
アクティブになって表示されるのに。なぜ?
SetActiveIndexって何
917デフォルトの名無しさん:02/05/15 18:10
すいません。
MDIでChildWindowにダイアログで設計したものを挿入することは出来ますでしょうか?
SDIでは出来るんですけども、MDIではどうにもなりません。ソースとして挿入できれば
便利かなと思います。
Θ_Θ ・・・
>>915
DoModalが終わった後ではすでにプロパテーシートが消えてるからじゃない。
920デフォルトの名無しさん:02/05/16 00:02
プリンタへの印刷について質問です。
・途中で用紙サイズを変更することは可能でしょうか(同じスプールにです)
->Wordとかは出来るようなので可能かとも思うのですが
・各企業は自社プリンタ用の拡張機能の仕様を公開しているのでしょうか
>>919
かなぁ? じゃあどうやって取得したらいいんだろう。
ぐーぐってもヒット数は10件に満たない数だし。

それとSetActivePageだったね。Indexじゃなくて。
>>921
GetActivePageじゃ取れないんだね?

だったらプロパティシートのOnOKハンドラとかで
GetActivePageでもしてメンバ変数m_nIndexとか作って
その変数に入れておけばいい。それで
if(sheet.DoModal() == IDOK){
  int nIndex = sheet.m_nIndex;
}
とか。
923デフォルトの名無しさん:02/05/16 01:08
COLORREF color;
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// デスクトップを取る
CWnd* pwndDeskTop = GetDesktopWindow();
CDC* pDeskTopDC = pwndDeskTop->GetDC();
// 自分の領域にデスクトップからコピー
dc.BitBlt( 0,0, 200, 200, pDeskTopDC, 0, 0, SRCCOPY );
pwndDeskTop->ReleaseDC(pDeskTopDC);

これでデスクトップの画像を取得し,表示。
この後に、

for(j=0;j<yh;j++)
for(i=0;i<xw;i++){
color=pDC->GetPixel(x0+i,y0+j);
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
c=(r+g+b)/3;
pDC->SetPixel(x1+i,y0+j,RGB(c,c,c));
}
のような操作で白黒化を試したのですが、
1度ワークスペースに描写してからGetPixelでは
無駄な処理(ワークスペース内に描写)があって効率が悪い気がします。

デスクトップ上から直接RGB値をとりこみ、メモリ上で処理(この場合は白黒化)、
その後にワークスペース内に描写させるにはどうすれば良いのでしょうか?
質問ばかりですいません。
924デフォルトの名無しさん :02/05/16 01:43
age
>>922
CPropertySheetにはOnOKはないので、DestroyWindow時にメンバ変数に格納してみた。
で、DoModalから処理が戻ってきたときにそれを指定、で成功。蟻が父さんっ。
>>923
DIB
927デフォルトの名無しさん:02/05/16 18:17
リストビューコントロールで、インストールシールドのダイアログ選択のように、
各リストにチェックボックスを表示するにはどうすればいいですか?
CListCtrl& list = GetListCtrl();
list.SetExtendedStyle(LVS_EX_CHECKBOXES);
のこと?
929デフォルトの名無しさん:02/05/16 18:27
有難うございます。試してみます。
930デフォルトの名無しさん:02/05/17 14:09
すいません。このチェックボックスにソースからチェックを入れたり、
チェックされているかどうか調べるにはどうすればいいですか?
931デフォルトの名無しさん:02/05/17 14:12
TreeViewを使って、エクスプローラのようなものを作ろうと思ったのですが
最初に全フォルダを調べてViewに登録しようとすると、ありえないと思いますが
フォルダが数万とかあった場合に、マズイ気がします。
何か他にやり方はないものでしょうか?
途中で追加しる。
>>930
自己解決しました。
モーダルダイアログにWM_KICKIDLEメッセージハンドラを実装して
アイドル処理を行い、その経過をダイアログ上にプログレスバーで表示しています。
メッセージハンドラ内で処理が終了したらEndDialog()を呼びたいのですが
ASSERTにひっかかって落ちてしまいます。
どうしたらうまく処理を抜けるんでしょうか?
935934:02/05/17 14:52
タイマーで監視して終了すればうまくいきました・・。
でもなんか納得イカン!!
936931:02/05/17 15:36
>>932
やっぱりそれしかないですか。
でも結局、大量にフォルダがあるフォルダや下層に行くほどヤバくなってきそうですけど
回避方法は無いんですか?
>>934
処理が終わったらユーザ定義メッセージをポストするとか
>>936
IEの「お気に入り」みたく、開いてるフォルダ以外は全て閉じるとか。
つまりフォルダを開くときだけサブフォルダを走査する。

フォルダの階層って制限あったような気がするけどなぁ。
939934:02/05/17 16:21
>>937
そんな方法が・・!
それでばっちり動きました。
そっちのがキレイなんでそうさせてもらいます。
ありがとうございました!
900も中盤にさしかかったので新スレです。

■ VisualC++(MFC限定)相談室 4■
http://pc.2ch.net/test/read.cgi/tech/1021620974/
941デフォルトの名無しさん:02/06/06 22:51
 
■ VisualC++(MFC限定)相談室 4■
http://pc.2ch.net/test/read.cgi/tech/1021620974/
943旧スレ埋め:02/06/26 09:19
■ VisualC++(MFC限定)相談室 4■
http://pc.2ch.net/test/read.cgi/tech/1021620974/
■ VisualC++(MFC限定)相談室 4■
http://pc.2ch.net/test/read.cgi/tech/1021620974/