トップページ⇒tech
961コメント299KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
VisualC++相談室はすでにあるようですが
MFCに限ったお話をしましょう。

ルールを提案。
Qは高度なものからくだらないものまで何でもOK。

Aは「知ってるつもり君」、「えらそうに解説する人」お断りと
いうことで。
0552デフォルトの名無しさん01/09/03 01:03ID:nepQwT9I
>>551
AfxWinInit()
0553_01/09/03 02:02ID:HWCzgSAM
>>552
お返事ありがとうございます。
教えていただいたAfxWinInit関数をWinMainに置き、
グローバル変数にCWinApp winApp;と置いたら
成功しました。
どうもありがとうございました。
0554デフォルトの名無しさん01/09/05 02:53ID:9DGwApwE
MDIベースで、「新しいウインドウを開く」
ときに何が起こっているのか教えてください。
ビューのインスタンスがコピーされるってことで
いいんでしょうか。
05554701/09/05 03:12ID:kiU7d71A
spy!!
0556デフォルトの名無しさん01/09/05 16:07ID:pDzmJoSY
MFC AppWizardで作成したプログラム(SDI)を
単にある処理をした後にプログラムが終了するには
どのようにすればいいでしょうか?
0557デフォルトの名無しさん01/09/05 16:29ID:iHP9cOK2
お馬鹿な質問ですみません
いまVCでチャット作ってますが、ほぼ完成したところで、マルチスレッドにしないとサーバーに
多数のクライアント繋いでる時に不具合出るって言われた。
入門書にあまり載ってないしまったく分からないので聞きたいのですが、絶対必要でしょうか?
Webでそれなりに探したがあまり詳しく説明してるところが無くて、かなり困ってます(汗
オススメの本やページありましたら教えてください m(_ _)m
0558デフォルトの名無しさん01/09/05 16:38ID:3xtzV.Hc
>>557
その条件でつないでみてそのままでいいのかどうか自分の目で判断しろ。
055955701/09/05 19:13ID:pDzmJoSY
補足:
「ユーザがオペレーションを行わないで」という事です。
056055601/09/05 19:14ID:pDzmJoSY
>>559
間違い(鬱
0561デフォルトの名無しさん01/09/05 21:05ID:yo/DrG8Y
たとえば、

[default]
PROJECT_NUM=10
LAST_UPDATE=20010905

のように、連想配列をファイルに読み書きしたいんだけど、
使えるクラスとかありますか?
0562デフォルトの名無しさん01/09/06 14:45ID:5pS2jHq6
>>558
うむ、逝ったね。
どう頑張ってもサーバー作れん。
ウツダシノウ
0563デフォルトの名無しさん01/09/06 15:11ID:lC87f1l6
>>561
http://www5.wisnet.ne.jp/~mercury/program/windows/etc/inifile.html
0564デフォルトの名無しさん01/09/06 17:00ID:DJLsxQNI
>>554
CMDIFrameWnd::OnWindowNew()
0565デフォルトの名無しさんNGNG
>>563
さんく〜♪
0566デフォルトの名無しさんNGNG
OLEドラッグアンドドロップのドロップターゲットのほうを実装しているのですが、
COleDropTarget派生クラスのOnDropで、COleDataObjectから取得した
グローバルメモリハンドルは、::GlobalFreeしなければならないのでしょうか。

いろんなサイトを見てみたのですが、解放してたりしてなかったり、果ては
COleDataSourceの方で解放していたりと、まちまちです。
0567デフォルトの名無しさんNGNG
初心者向けのメーリングリストとか無いですか?
検索してみたけど、どれがいいのかさっぱり分からないです。
0568デフォルトの名無しさんNGNG
CTreeViewを左に置いてエクスプローラ風にしようと思ったんだけど、
アイテムを右クリックでポップアップメニューを出すってのがどうしてもうまくいきません。
WM_CONTEXTMENUのハンドラで出してるんですけどうまく出ません。
誰か作ったことある人がいたら教えてください。
0569デフォルトの名無しさんNGNG
>>567
VC関連の初心者向けコミュニティーは無さそう
(普段からいろいろ漁ってるけど)
たぶん、みんなプライド高いんだろね
その点、VBは初心者サイト、腐るほどあるんだけどな
0570デフォルトの名無しさんNGNG
VCPPMLは?
なんか、嫌な感じの信仰があったりするけど、
礼儀正しくしてれば基本的に親切に接してくれます
0571デフォルトの名無しさんNGNG
VC++ML (Programming with VC++)
http://mfc.acty-net.ne.jp/ml/mfc/
0572デフォルトの名無しさんNGNG
>>569-571
ありがとうございます(ぺこり)
VCPPMLにまず入ってみました。
VC++MLも入ってみます。
0573デフォルトの名無しさんNGNG
MFCを使ったアプリケーションでネットワーク上にファイルをしていったん保存した後、変更を加えて上書きしようとするとCDocument::OnSaveDocumentでエラーになってしまいます。

CDocument::OnSaveDocument
CDocument::ReleaseFile
CMirrorFile::Close
でエラーになるのですが、ReplaceFileに失敗して、CFile::Renameを呼んで例外がスローされます。
ローカルのファイルだと、ReplaceFileが成功します。

どのような原因、対策が考えられるでしょうか?
0574デフォルトの名無しさんNGNG
age
0575デフォルトの名無しさんNGNG
ウィンドウのタイトルバーをドラッグ中に(連続して)
なんらかの処理を行いたい場合
(具体的には、ほかのウィンドウを同時にセットでMoveWindowで移動させたいのです)
どのへんを乗っ取って処理すればよいのでしょうか?

WindowProc内で、なにかメッセージを感知して、、、というのは想像
つくのですが、具体的にわかりません。

どうかご教授ください
0576デフォルトの名無しさんNGNG
>>575
WM_MOVINGとかWM_MOVEとかでは?
0577デフォルトの名無しさんNGNG
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE
05781RubyユーザNGNG
あなた達には分からないでしょうが、Rubyは素晴らしい言語です。
オブジェクト指向スクリプト言語として他のスクリプト言語を圧倒する性能と美しい言語仕様を持っています。
例えば、SchemeやSmallTalkなどは比較的美しい言語だと言われていますが、後発である優位さでRubyは
さらなる美しさと実用性を備えています。
もちろんPerlやPythonなど問題外です。
日本語との親和性ではRubyしか選択肢がないでしょう。

LinuxのディストリビューションもRubyの採用例が増えてきています。
1年後には全てのディストリビューションがRubyを標準採用するでしょう。
Rubyは未来のスクリプト言語なのです。

長くなりましたが、コピペではありません。
賛同していただける方はRubyの事を分かっていただけない人に出会ったら、
この発言をコピペしていただければ幸いです。
VC++なんて糞の極ですがね(大爆笑)
0579デフォルトの名無しさんNGNG
┏━━━━┳━━━━┓
┃      ┃      ┃
┃      ┃      ┃
┣━━━━┫      ┃
┃      ┃      ┃
┃      ┣━━━━┫
┃      ┃      ┃
┃      ┃      ┃
┗━━━━┻━━━━┛
このように分割されたウィンドウはどうすれば上手く
出来るのでしょうか?

SplitterWndをOnCreateClientでネストして使用し
・まず左右に分割
・次に左を上下に分割
・最後に右を上下に分割
とやってみたのですが、左の領域の幅が
何故かゼロ(分割線が左端に寄ってしまう)に
なってしまい、悩んでいます。

左右のどちらか一方が分割されないような三分割は
検索すると結構見つかるのですが、この形態の四分割は
参考例が見つからないので、識者の知恵をお借りしたい次第です。
0580 NGNG
>>575 クラスウイザードで適当なメッセージをFrameクラスあたりに
引いてくれば?
0581デフォルトの名無しさんNGNG
>579
Delphiならすぐ出来るんだけどね
0582デフォルトの名無しさんNGNG
>>579
分割位置を指定したいだけならCSplitterWnd::SetColumnInfo()は?
3分割が分かるんならすぐだと思うんだけどなあ。
0583 NGNG
一度分割したら次に分割する前に一度サイズ指定する、だと思う。
0584 NGNG
補足:
サイズ指定されていないウインドウを分割しようとすると

>とやってみたのですが、左の領域の幅が
>何故かゼロ(分割線が左端に寄ってしまう)に
>なってしまい、悩んでいます。

まさにその状態になります。
ちなみに私はMoveWindow()でサイズ指定してます。
0585579NGNG
左右に分割した直後にSetColumnInfoを使えば良かったのですね。
上下にも分割した後にサイズを変えようとしていたのが問題だったようです。
ありがとうございました。
0586デフォルトの名無しさんNGNG
>>579
LineToで線を引く。
0587デフォルトの名無しさんNGNG
>>579
         
Rubyはクソです。ゴミ箱逝きです。

いじょ
この発言をコピペしていただければ幸いです。
0588-NGNG
その画像ならココ
http://members.tripod.co.jp/bingo852/
0589Ruby!NGNG
>C++
>いろいろと有名なオブジェクト指向言語であるC++と
>Rubyを比較すると:

>* C++なぞ問題外.^^;;;

http://www.ruby-lang.org/ja/compar.html

Rubyを知ってもらうためにもこの文をコピペしてください。
0590デフォルトの名無しさんNGNG
―――――――――――――――――――――――
それでは次のコーナーです
__  ____________________
    .|/   ‖      ‖ ____   
        ‖      ‖ | ON AIR.|
   ∧ ∧ θ     ‖  ̄ ̄ ̄ ̄
   (,,゚Д゚)__ /[] ̄ ̄θΛ_Λ
  ||(.  つ_/    //(´∀` )/|  
  ┗┳ /      ̄/⊂    ||_/
    ┻| ̄ ̄ ̄ ̄ ̄|  (  ━┳┛      
      |_____| /ヽ」┘┻
____________|\____

「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
0591デフォルトの名無しさんNGNG
質問です
AppendMenuでダイナミックに追加したメニュー項目を処理する方法を
教えてください

あと、AppendMenuで与えるメニューIDで、Resource.hで既存のものと
ぶつからないようにするにはどうすればよいでしょうか?
(+1ずつ加算していくにしても、そもそもどこから開始させればよいのか・・)


以上、よろしくおねがいいたします
0592 NGNG
DeveloperStudioの表示>シンボルブラウザでID登録
クラスウイザードで関連付けしてソース生成
だったかなあ?

シンボルブラウザでぶつからないか確認・・・。なのかなあ?
0593デフォルトの名無しさんNGNG
>>591
Webを調べてみたら、
http://www.kab-studio.com/Programing/Codian/MFCTips/05.html

ぶつからないように、できるだけ大きい値をあらかじめ割り当てておく
って書いてあるけど、
これでほんとにいいのかな・・・
0594デフォルトの名無しさんNGNG
あげ
0595デフォルトの名無しさんNGNG
既存のMFCのソースでCSocketを使いたいのですが

#include <afxsock.h> // MFC のソケット拡張機能

と

if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}

を追加してもうまくいきません。
この他にも設定するものがあるのでしょうか?
0596sageNGNG
質問が漠然としすぎていて誰も答えられないと思われ。

1)そりゃあ、それだけじゃ動かんだろ。
2)うまくいかないって何?
0597デフォルトの名無しさんNGNG
WebBrowserオブジェクトを埋め込んでブラウザ画面をコントロールする
プログラムを作っているのですが、gifアニメや、flash動画を
任意のタイミングでロック(静止)させておきたいのです。
何かよい方法はないでしょうか?
よろしくご教授ください
0598デフォルトの名無しさんNGNG
>>595
#include <afx.h> が要るんじゃない? 試してないけど。
0599デフォルトの名無しさんNGNG

CInternetSession
のOpenURLでウェブページ(HTTP)にアクセスする際に、
URLが不正だったり、指定のURLのサービスが利用できない際に
それを知る方法はありますか?

インターネットそのものにアクセスできない場合は、例外をcatch
することでわかるようなのですが。

どうか教えてください
0600デフォルトの名無しさんNGNG
age
0601デフォルトの名無しさんNGNG
今ビットマップを表示するプログラムを作っています。
ビットマップを表示したら、ウィンドウのサイズを自動的に
ビットマップのサイズと同じにしたいと思っています
MoveWindowでビットマップの幅と高さを指定したんですが
うまくいきません。マッピングモードはテキスモードです
画面上の1ピクセルとビットマップの1ピクセルはサイズが違うのでしょうか?
0602デフォルトの名無しさんNGNG
んなわけない。
ウィンドウサイズと表示領域は確か違ったはず。
あとディスプレイ設定より大きくは出来ないはずだね。
0603デフォルトの名無しさんNGNG
>うまくいきません
これじゃわからん。
具体的にどうなったか報告しろ。
0604くだらない質問ですがNGNG
AppWizardが吐いてるコードは、なんか全てのクラスが
CxxxAppクラスを知ってる(#includeしてる)のが気に入らなくて、
それらをCxxxAppから独立させて(絶縁して)組んでます
こういうことしてる人っていますか?
0605デフォルトの名無しさん NGNG
>>604
そういうことが気になる人はAppWizardを使わないのでは?
0606601NGNG
えっと何か根本的にかんちがいしていたみたいでした・・・

そこで質問なんですが
GetClientRectで得たクライアント領域の座標を
デスクトップ上の絶対座標に置き換えるにはどうしたらいいのでしょうか?
0607デフォルトの名無しさんNGNG
CWnd::ScreenToClient()
0608デフォルトの名無しさんNGNG
>>606
俺だったら <windowsx.h> の MapWindowRect 使うぜ。
0609デフォルトの名無しさんNGNG
>>607
それは画面座標をクライアント座標に変換するの。
正解は API の ClientToScreen()
0610606NGNG
ありがとうございます
ClietToScreenを使ってクライアント領域とウィンドウサイズの差をとって
うまく設定することが出来ました。
こんなかんじです。

CWnd* parent = GetParent();
CRect win,client;

GetClientRect(client);
parent->GetWindowRect(win);
ClientToScreen(client);

parent->MoveWindow(win.left, win.top,
w + client.left - win.left + win.right - client.right,
h + client.top - win.top + win.bottom - client.bottom );

wとhはそれぞれ画像の高さと幅です
0611デフォルトの名無しさんNGNG
>>610 その最後の部分、移項して整理すると
w + (win.right - win.left) - (client.right - client.left),
h + (win.bottom - win.top) - (client.bottom - client.top)
ですよね。ClientToScreen(client)の必要ないと思う…。
0612デフォルトの名無しさんNGNG
「最近使ったファイル」の使用方法がわからんです。

CxxxApp::AddToRecentFileList(filename);
で登録できることは分かったんですが・・・
最近使ったファイルを選んだ時の関数OnFileMruFile1()で
どのようにそのファイル名を取得したらいいのですか?

#やっぱりOnFileOpen()を自分で実装せず
#シリアライズを素直に使うものなのでしょうか?
0613デフォルトの名無しさんNGNG
>>612
CDocument::OnOpenDocumentを引っかけるのが正解。
0614611NGNG
>610
ほんとだ。なんでこんあこときずかなかったんdろう。。。
鬱氏!
0615CEditNGNG
突然スンマセンです

SDIのスケルトンからクラスウィザードで
最上位フレームのOnCreate引っこ抜いてきて
グローバル
CEdit *e;

OnCreate(){
  :
e=new CEdit;
e->Create(.....);
  :
}
って感じでメインフレームのクライアント領域いっぱいに
CEdit貼り付けると
中身が編集できなるっす
スクロールバーつけたらそれも弄れない

んで
WS_MAXIMIZEを指定したり
e->SetWindowPos(&wndTop...);
とかでCEditをTOPに持ってくると
こんどは編集できるけど表示がおかしくなるっす

いったい、どうしたらよいのでしょう?
0616デフォルトの名無しさんNGNG
SDIスケルトンはフレームとビューの両ウィンドウが依存しあってるからなあ。
ビューウィンドウを隠して、別のCEditを表示させるなんてことは、やめたほうがいい。

AppWizardでビューウィンドウの基本クラスをCEditViewにしとくのが無難だよ。
0617616NGNG
どしてもCEditを貼り付けたいなら、フレームじゃなくて
ビューウィンドウに貼り付けるといいんじゃない。。。
0618615NGNG
なるほど、、
SDK風にはっつけても駄目っすか
もう少し素直になることにします

Thxです
0619612NGNG
>>613
ありがとうございます
おかげで一歩前へ進みました。

えっと次の問題なんですが・・・・
CMainFrame::PreCreateWindowで
cs.cx = 200;
cs.cy = 350;
としてもこの大きさになりません
cs.x = 0;や
cs.style &= ~(WS_MAXIMIZEBOX | WS_THICKFRAME | WS_VSCROLL | WS_HSCROLL);
は反映されるのに....
AppWizardでSDIで作ってます。
よろしくお願いします
0620デフォルトの名無しさん NGNG
>>619
あなたのプロジェクトのrcファイルをテキストエディタで見てご覧...

ウィンドウが出来てからSetWindowPosで変更すればOK。
0621デフォルトの名無しさんNGNG
わからないことがあって困っています。
MFC AppWizardで作成したアプリで、子ウィンドウのサイズを変更したときの
描画の更新指示はどこで行われているのでしょうか?
更新リージョン内の背景を消去しないようにしたいのです。OnSize()に記述
(Invalidate(FALSE))しても効果なしで。
0622デフォルトの名無しさんNGNG
test
0623デフォルトの名無しさんNGNG
>>621
OnEraseBkgnd、背景ブラシ ??
0624デフォルトの名無しさんNGNG
>>621
OnDrawで更新してるんでは?
僕的には、常に描画はバックバッファに対して行い、
それをBitBltして全部再描画してるけど(簡単なゲームみたいなプログラム
たしかRegisterWindowに渡す引数次第では
ずっとクライアント領域を保存しておくことができた気も。
ちなみにRegisterWindowに渡す引数は、
PreCreateWindowをオーバーライドして変更するyo
0625デフォルトの名無しさんNGNG
MFCは、
LRESULT WndProc(,,,,,,){
switch(...){

case WM_PAINT:
OnPaint();
break;
}
return DefWndProc(.,...)
}
calss a{
virtual void OnPaint()
}
こういうことをやっているのですか?
0626デフォルトの名無しさんNGNG
>>625
MFCのソース見て自分で確認しる
0627625NGNG
確認汁って、どんな汁ですか?
0628デフォルトの名無しさんNGNG
ちょっと冷めてるけどソースが多め。
一本一本ほどいて喰え。
0629625NGNG
へー、ソースが入ってるのですか。
明日、家族にその確認汁を作ってあげたいんですけどどうやって作ればいいですか。
0630デフォルトの名無しさんNGNG
VCのライセンスを家族の人数分買ってから料理しなさい。
0631625NGNG
VCのライセンスを買わないと駄目なんですか。
CD−Rに僕のVCのライセンスを譲渡しようと思うのですが駄目ですか。
0632デフォルトの名無しさんNGNG
ダメ
食べたい人の人数分ライセンスを買いなさい
0633625NGNG
食べてから売りに出していいですか
0634デフォルトの名無しさんNGNG
当店の食品はすべて使用許諾契約契約を結んでいただくことになっておりますが、
他人への譲渡は出来ない契約になっております。

買われた当人が、最後までお食べくださるようお願いします。
0635デフォルトの名無しさんNGNG
食べた後、ゲロすればおけ。>633
0636デフォルトの名無しさんNGNG
>>626-635
クソスレが急に良スレになったな。
0637デフォルトの名無しさんNGNG
CInternetSession
のOpenURLでウェブページ(HTTP)にアクセスする際に、
URLが不正やリンク切れだったり、指定のURLのサービスが利用できない際に
それを知る方法はありますか?

インターネットそのものにアクセスできない場合は、例外をcatch
することでわかるようなのですが。

どうか教えてください
0638637NGNG
637の補足なのですが、
アクセスしたURLがリンク切れだったりしても、

Not Found
The requested URL /xxx.htm was not found on this server.

のようなHTMLがゲットされてしまって、あたかも正常に
ダウンロードできたっぽい結果になるんです。
0639デフォルトの名無しさんNGNG
>>638
httpヘッダ解析しる。
ていうかまずRFC読んでhttpそのものについて勉強した方がいいど。
0640デフォルトの名無しさんNGNG
CDialogから派生させたクラスで
生成したモードレスダイアログなんですが、
アクティブな状態でエンターキーを押すと
ウィンドウが消えてしまいます。

どうやらDestroyWindow()は呼ばれていないようなのですが
実体はお亡くなりになっている気配で、これを抑止するために
OnKeyDownをオーバーライドしてみたのですがこれも
呼ばれていないようで効きません。

モードレスダイアログ特有の現象に見えるのですが、
どなたか原因&解決抑止方法をご存知の方、いらっしゃいませんでしょうか?
0641デフォルトの名無しさんNGNG
>>640
それはEndDialogが呼ばれてしまっているのです。CDialogのアホ。
解決策はCDialog::OnOk()のドキュメント読んで。
それとCDialog::OnCalcel()も。
0642デフォルトの名無しさんNGNG
>641
ありがとうございます。
でも、OnOk()もOnCancel()もPostNcDestroy()も
オーバーライド済なんです。
ウィンドウシステムメニューの閉じるボタンを押したときは
きちんとOnCancelを通ってDestroyしているようです。

試しにEndDialogをオーバーライドしてみましたが変化なしです。
一体どこでリターンキーコードを受け取って動いているのでしょうか・・・
0643621NGNG
>>623 >>624
OnEraseBkgnd()を空にして(いいのだろうか・・・)解決しました。
ありがとうございました。
0644641NGNG
おっとOnOK対処済みでしたか。そうなるとわからんなー。
ウィンドウが消えるあたり(OnClose?)にブレークポイントを入れて
止まったところでコールスタックを見たら原因わかんないかなあ。
0645デフォルトの名無しさんNGNG
>644
それらしきものは試してみたのですが、
OnClose、OnOk、OnCancel、OnShowWindow、
すべて素通りでした。しくしく
0646637NGNG
>639
ヘッダ解析は面倒ですね。やはりそれしか方法はありませんかね。

では、指定したURL下のディレクトリ(ファイル)一覧を
ゲットする方法ってありますか?
(要は普通にFTPソフト実行したときのように)

参考になるプログラムとかあれば是非教えてください
0647デフォルトの名無しさんNGNG
>>645
> OnClose、OnOk、OnCancel、OnShowWindow
実はCDialog::OnOK(OKは大文字)がオーバーライドできていない、
なんてことはないよね。
うーん。考えにくいか。
0648sageNGNG
>647
うっきゃーそれでした!!(大恥)
大馬鹿に付き合ってくださってありがとうございました・・・
逝ってきます・・・
0649デフォルトの名無しさんNGNG
しかもさげそこねてるし(二重大恥)
0650デフォルトの名無しさんNGNG
タブコントロールのタブのテキスト取得しようとしてるんですが
うまくいきません。
根本的に間違ってのでしょうか?

TC_ITEM TabCtrlItem;
memset(&TabCtrlItem,0,sizeof(TabCtrlItem));
TabCtrlItem.mask=TCIF_TEXT;

m_tabctrl.GetItem(0, &TabCtrlItem );
return TabCtrlItem.pszText;
0651デフォルトの名無しさんNGNG
>>650
pszText用のバッファは自分で用意するんでないの。
0652デフォルトの名無しさん NGNG
>>650
根本的に間違ってよ
Cからやり直したほうがイイよ
■ このスレッドは過去ログ倉庫に格納されています