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

■MFC相談室 mfc11.dll■

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/

関連リンクは >>2-10 の辺り。
0855デフォルトの名無しさんNGNG
>>853
だから>>844-845の二つともやらせたら、だってば。
0856デフォルトの名無しさんNGNG
>>854
で、「タスクリストからしか終了できません。どうすればいいですか。」って質問が来そうだなって話だ
0857デフォルトの名無しさんNGNG
>>856
そんなら来てからでええやん
来ないかも知れないし
0858デフォルトの名無しさんNGNG
タスクリストってなんんですか?
0859デフォルトの名無しさんNGNG
いや、そんなくだらない質問来て欲しくないから
予防線として>>845は同時にEndDialogも書いた方がいいという主張をしたかったんだろう。>>847は。
0860デフォルトの名無しさんNGNG
で、>>843の質問には誰が答えるんですか?
0861デフォルトの名無しさんNGNG
直後に答え出てますやん
0862なぜが?NGNG
なぜがご存知の方、教えてください
なぜがご存知の方、教えてください
なぜがご存知の方、教えてください

 
0863デフォルトの名無しさんNGNG
Q. ダイアログがEnterキーで終了してしまうんです。なぜですか?
A. OnOK()をコメントアウトで終了しなくなります。

すごい回答だ。つーか、こんな回答でWindowsのダイアログの作法を無視しまくる
変なアプリが増えないことを祈る。
0864デフォルトの名無しさんNGNG
>>860
>>849
0865デフォルトの名無しさんNGNG
>>863
模範回答よろしく
0866デフォルトの名無しさんNGNG
863じゃないけど、ここにやり方書いてあったと思ったけど、サイトが壊れてるのか開けない。
ダイアログボックスをリターンキーやエスケープキーで閉じないようにするには?
http://web.archive.org/web/20030415014307/techtips.belution.com/ja/vc/
0867デフォルトの名無しさんNGNG
エスケープキーでキャンセルできないダイアログボックスは 【 う ざ い 】
0868デフォルトの名無しさんNGNG
OKで閉じないダイアログもうざいけどね。
0869デフォルトの名無しさんNGNG
OKじゃないや、enterだ。
0870デフォルトの名無しさんNGNG
いろいろやり方あるけど、MFCならこの辺じゃないか?
void CxxxDlg::OnOK()
void CxxxDlg::OnCancel()
void CxxxDlg::OnClose()
0871デフォルトの名無しさんNGNG
頼むから話の流れを読んでから書き込んでくれ。
0872デフォルトの名無しさんNGNG
しかも終了手段がなくなる罠。
0873デフォルトの名無しさんNGNG
キャンセルを押してもこの話題が終わらないのですが、どうすればいいでしょうか。
0874デフォルトの名無しさんNGNG
>>873
なんで? いつでも EndDialog できるやん。
0875デフォルトの名無しさんNGNG
thisThread->EndDialog('終了');
0876デフォルトの名無しさんNGNG
error(875) : no matching EndDialog(const char*) in CthisThread
0877デフォルトの名無しさんNGNG
そんなエラーが出るわけねえだろうがクソ野郎
0878デフォルトの名無しさんNGNG
843です。ご回答いただきありがとうございます<m(__)m>
私の理解では、
ESCやENTERでプログラムが終了するのはダイアログベースの仕様であり、
終了させるためには、OnCancel()、OnOK()をオーバーライドすればよい。

実際にやってみたところ、ESCやEnterでは終了せず、右上のバツでは終了できました。
ありがとうございました!!

しかしながらEnterでプログラムが終了する仕様は問題ありですね、、、
0879デフォルトの名無しさんNGNG
>>しかしながらEnterでプログラムが終了する仕様は問題ありですね、、、

んなこたあない。
ダイアログがどうゆうものか、もちっと勉強してくれ。
0880デフォルトの名無しさんNGNG
ところが世の中にはenterでダイアログが終わるとバグ扱いになる所も。。
0881デフォルトの名無しさんNGNG
うちは「仕様です」で押し切るな。
0882デフォルトの名無しさんNGNG
ダイアログクラスをベースにして、ダイアログではないプログラムを作る。
ダイアログクラスを使わないで、ダイアログを作る。
0883デフォルトの名無しさんNGNG
ダイアログクラスをベースにして、ダイアログではないプログラムを作る。
→Enterでプログラムが終了するのは好ましくない。
ダイアログクラスを使わないで、ダイアログを作る。
→Enterでプログラムが終了しないのは好ましくない。
0884デフォルトの名無しさんNGNG
OKボタンに相当するものがあってボタンがそれだけならEnterでOnOKを受けて
終了するのは自然な動作だが、ダイアログ・ベースでもそんな簡単なものばかり
じゃないからね。ものに合わせて変えるのは当然だろ。
0885デフォルトの名無しさんNGNG
ダイアログが閉じた後、さらに別のGUI操作が続く場合は、Enterクローズは便利だけど、
ダイアログが閉じて、アプリ終了した場合やGUI操作がない場合は、Enterクローズは不安感に襲われる。
0886デフォルトの名無しさんNGNG
>>863
ダイアログの作法?
ダイアログを作ってるんじゃなく、
ダイアログを"ベース"にアプリを作っています。
0887デフォルトの名無しさんNGNG
質問させてください。
CSocketで通信するプログラムを作ってるのですが、Connectで止まってしまいます。
動作試験中なのでサーバ、クライアントともに同じマシンであり、
"127.0.0.1"にコネクトするようにしています。

サーバ:Create(1500) → Listen() → Accept(socket) ここで止まる
クライアント:Create() → Connect("127.0.0.1", 1500) ここで止まる
各CreateとListenが成功しているのは戻り値で確認しています。

不可思議なのは、別のマシンではちゃんと動くことです。
自分のマシン:Win XP Pro(SP2当ててない),
       ファイアウォール・アンチウィルス停止中
別のマシン:Win 2000 Pro

どんな原因が考えられるでしょうか。(ポート番号が良くないとか?)
0888デフォルトの名無しさんNGNG
>>887
127.0.0.1がちゃんと解決されているか確認。
netstat /an でポート番号が重複してないか確認。
0889デフォルトの名無しさんNGNG
ダイアログアプリケーションでAfxMessageBox()などのモーダルダイアログが表示されているときに
別のアプリケーションからPostMessage()されると、そのメッセージは破棄されてしまうのですか?

どうも拾えないメッセージがあってそれが原因かなと考えているのですが・・・
0890デフォルトの名無しさんNGNG
XP自信もファイヤーウォール持ってるけど関係あるかね?
0891デフォルトの名無しさんNGNG
>>887
どうでも良いけどテストで使うにしろ1500ってポートはあんまり使わないところ
とりあえず5000オーバーの空いてるところとか使っとけよ
0892デフォルトの名無しさんNGNG
みなさんありがとうございます。

>>888
127.0.0.1が解決できているかどうかの確認ですが、
とりあえずpingは返ってくるようです(他に確認方法ってありますか?)。
またnetstat /anで確認したのですが、特にかぶっているポートはありませんでした。

>>890
OSのファイヤーウォールの項目もチェックしてみましたが、
どの接続にもファイヤーウォールのチェックは入っていませんでした。

>>891
そうします。Winがどのあたりのポートを使っているか
よく知らなかったもので。
0893デフォルトの名無しさんNGNG
telnet 127.0.0.1 1500
0894デフォルトの名無しさんNGNG
>>893
接続中: 127.0.0.1...ホストへ接続できませんでした。 ポート番号 1500: 接続に失敗し
ました

となりました。これは解決ができていないのでしょうか?
ためしにnetstat /anで出てきたLISTENING中のポートに
telnetしてみても同じ結果になりました。
0895デフォルトの名無しさんNGNG
>>894
そのリスニング・ポートはちゃんと0.0.0.0か127.0.0.1にバインドされてるの?

システム・サービスの場合、リストに出てても接続を受けないものもあるから
ちゃんと動く何かの簡易サーバ-クライアント・ソフトを持ってきて実験して
みたら?

それでもダメなら接続をブロックするファイアウォールか何かが動いてる
そのシステム固有の問題ってはっきりするから。
0896デフォルトの名無しさんNGNG
何故、1500?
もし他のポートで試せるのなら試すべき。
0897デフォルトの名無しさんNGNG
XPならファイアーウォールの設定をしないとダメなのでは?
>>892を見るとテストするポートの設定をしてないように思える。
0898デフォルトの名無しさんNGNG
>>889
破棄されない。
MessageBox APIの中でメッセージループが回ってるから。
0899デフォルトの名無しさんNGNG
>>895-897
ご回答ありがとうございます。
>>895さんのおっしゃる通り、アンインストールしたと思っていた
ファイヤーウォール(Zone Alarm)が残っていたようです。
アンインストールしたら正常に接続できました。
言い訳をさせていただくと、以前はフィルタ状況のモニターがポップアップで
表示されており、現在は出現しないのでアンインストールしたと思い込んでいました。
(思い込みは良くない・・・)

休日にみなさんの貴重な時間を割いていただいてありがとうございます。
問題の特定の仕方や、問題になりそうな部分の勉強になりました。
今後も精進します。
0900デフォルトの名無しさんNGNG
ドッキングツールバーという仕組みは、ReBarのようなものを自前で実装しているという理解でいいですか?
0901デフォルトの名無しさんNGNG
良く分からん表現だな
0902デフォルトの名無しさんNGNG
特に問題の無かったアプリのダイアログにボタンを追加したんですが、
そのボタンにクラスウィザードを使おうとしたところ、

 ソースファイル(C:\〜\TestDlg.h, C:\〜\TestDlg.cpp)の
 クラス"CTestDlg"は重複する挿入ブロックが存在します。

というメッセージが出てクラスウィザードが使えなくなってしまったのですが
どうやったら直りますか?環境はXP(SP1)、VC6SP6です。

いったんVCを終了してncb, opt, clw ファイルを削除した後にもう一度
試してみたんですがやはり同じ症状です。
0903902NGNG
すんません。解決しますた。

ダイアログベースでデストラクタが無いので手動で追加したんですが
それを消してから上記の3ファイルを削除・再構築したところ直りました。
0904デフォルトの名無しさんNGNG
宿題に困っています。
お分かりの方、いらっしゃいましたら、よろしくお願いします。

1.iniファイルで指定されたフォルダにあるファイル名(例:abbccc)を取得
2.ファイル名を分解(例:a bb ccc)
3.msdnの行にadoを使ってインサートする(例:a bb cccとフィールドを分けて)

0905デフォルトの名無しさんNGNG
>>904
スレ治外。
0906デフォルトの名無しさんNGNG
まあ、もしかしたらスレ違いじゃ無いのかもしれないけど、
msdnにadoでインサートするのはMFCじゃ無くても無理だろうなあと。
0907デフォルトの名無しさんNGNG
ClassViewで右クリックを使ってクラスにメンバ関数を追加するとき、
デフォルトの引数を設定して、一番最後の引数の型をLPCTSTRにして
デフォルト値=NULL にすると宣言と定義が違うという旨のダイアログが
出て実際に定義の部分の引数部分が削られてしまうのですが、これって
どういうことなんでしょうか?

手動で直すとClassViewの該当関数をダブルクリックしても、ソースの
該当関数部分にジャンプしなくなって「インプリメンテーションが見つからない」
なんて警告されます。

class CTest{
  CTest();
  ~CTest();
  
  BOOL SetData(DWORD dwData=0, LPCTSTR pStrName=NULL);  ←コレ
protected:
  DWORD m_dwData;
  CString m_strName;
};

BOOL CTest::SetData(DWORD dwData)      ←宣言と異なる
{
  m_dwData=dwData;
  if(pStrName==NULL)
    m_strName="";
  else
    m_strName=pStrName;
  return TRUE;
}
0908デフォルトの名無しさんNGNG
>>907
バージョンくらい書こうや。
0909デフォルトの名無しさんNGNG
>>908
すみません。VCのですよね。
VisualC++Ver6、サービスパックもVer6です。

ちなみにconst char * に置き換えると直るには直るのですが
これ(宣言と定義で違うようにすること)は一体どういう意図なのかがわからないです
0910デフォルトの名無しさんNGNG
バグかなぁ?
VC.NETじゃちゃんと同じになるんだけど・・・
0911デフォルトの名無しさんNGNG
>>907
ウィザードで作った後、手作業でデフォルト引数書くとかするしかないんじゃないかなぁ。
デフォルト引数のある関数にジャンプしないのは俺もよくある。
近くの関数にジャンプしてからスクロール…っていつもしてる。
こういう仕様なんだとあきらめてるよ。
0912デフォルトの名無しさんNGNG
>>909
同じ環境でやってみたけど、CLASS VIEWがおかしいみたい。
コンパイルは通る。
0913デフォルトの名無しさんNGNG
クラスビューは、あくまで作業の参考・手助け。
見た目が破損しててもコンパイル・ビルド作業への影響は一切ない。
0914907NGNG
>>910-913
意味は分かりませんがやっぱり仕様ですかねえ。
とりあえずUNICODEは使わないのでconst char *
でやっときます
0915デフォルトの名無しさんNGNG
CStringの中のTabSpaceの見分け方を教えて下さい。
削除したくて、Trimで色々やってみたのですが、うまいこといきません、
教えてエロイ人。
0916915NGNG
CString::Remove( '\t' );
で、解決しました・・・。
Trimに拘った、私が悪かったみたいです。
ご迷惑おかけしました〜。
0917デフォルトの名無しさんNGNG
VC6だったら、CString::Remove はバグあるから気をつけてね
0918デフォルトの名無しさんNGNG
どういうバグ?
0919デフォルトの名無しさんNGNG
>>918
2バイト文字が考慮されないっていうやつだろ、多分。
0920デフォルトの名無しさんNGNG
流れを壊すようですいません。
MFCはじめたばかりの初心者です。
質問ですが、ウインドウの背景を画像ファイルとして保存するにはどうすればいいのでしょうか。
いろいろ調べたのですが結局分かりませんでした。
環境はこのとおりです
OS:WindowsXP SP1
VC++.NET 2003

お願いします。どなたか教えてください。
0921デフォルトの名無しさんNGNG
>>920
読み出しなら ::LoadImage でできるが
書き込みのサポートはないから、思いっきり自力で書くことになる。

http://pc5.2ch.net/test/read.cgi/tech/1092524669/883-
0922デフォルトの名無しさんNGNG
>>920
CImageにアタッチすれば、CImage::Save()で保存出来るよ。
今ホットなGDI+を使うことになるけど。
0923デフォルトの名無しさんNGNG
>>921-922
ありがとうございました m(_ _)m
0924デフォルトの名無しさんNGNG
MFC ActiveX Controll WizardでActiveXコントロールを作っています.
作成したコントロールはVBでFormなどに貼り付けて使う予定です.
コントロールは実行時に他のDLLやファイルなどを読み込む必要があり,
ターゲットとなるexeのカレントパスを取得してファイルなどを読み込む処理を
コントロールのクラスのOnCreateメソッド(?)に書きました.
しかし,OnCreateではVBなどでコントロールをFormに貼り付けた時点で
実行されてしまうため,実行時のexeのパスを取得する部分を利用して
ファイルなどを読み込む処理でエラーが起きてしまいます.
プログラムが実行されるときに
一度だけ処理されるメソッドやイベントはあるば教えて頂きたいのですが.

環境 VC6.0 VB6.0 WinXP

0925デフォルトの名無しさんNGNG
>>924
DllMain()でやればいいんじゃないの。
0926924NGNG
>>925
なんか,あまり一般的では無さそうですね>DLLMain
「DLLmain OCX」でぐぐってみましたが,50件も出てきませんでした.
0927デフォルトの名無しさんNGNG
>>926 (;´Д`)・・・
0928デフォルトの名無しさんNGNG
mfc-mlで同じ質問・・・
0929デフォルトの名無しさんNGNG
デバッグ版とリリース版ってメモリ領域の確保(解放)の仕方が違うんですかね?

new演算子で確保したメモリ領域を解放する処理は明示的に行っているんですが、
デバッグ版⇒CWinApp::Exitinstanceが実行される前に(明示的記述したタイミングで)、
      メモリ解放処理が完了する。
リリース版⇒CWinApp::Exitinstanceが実行された後に、メモリ解放処理が完了する。
上記のような動きをしているみたいなんです。

メモリ解放処理後に、終了コードを各プロセスを管理しているプロセスに通知しているため
リリース版では管理プロセスが終了コードを受信した時にも、
対象のプロセスが動き続けていることになってしまいます。

こんな現象に関してご存知の方いらっしゃいましたらぜひご教授をお願いします。
0930デフォルトの名無しさんNGNG
パス
0931デフォルトの名無しさんNGNG
>>929
ソース読んでみれば?
0932デフォルトの名無しさんNGNG
>>929
デバッグ版 DEBUG_NEW を定義せず
リリース版 最適化全てオフ
でテストしてみそ
0933デフォルトの名無しさんNGNG
PostMessage()でメッセージを順番に送るとき、受け取る側で順番が入れ替わったり
する事はありますか?
0934デフォルトの名無しさんNGNG
キューなんだからそんなことないはず。
0935デフォルトの名無しさんNGNG
>>933
あるらしい

>>934
メッセージにも優先順位があるらしく、マウスイベントが
他のイベントより優先される場合もあるらしいよ
0936デフォルトの名無しさんNGNG
>>935
マウスイベントはメッセージキューを通らないで直接ウィンドウプロシージャへ行くメッセージじゃないか?
0937デフォルトの名無しさんNGNG
>>936
そうかも
「PostMessageでは試したことないけど」って言うの忘れた
0938933NGNG
どもです。
同じ系統のメッセージの順番のみが問題ですんで、他のメッセージの割り込みは問題にならないです。
とりあえず大丈夫なものとしてやってみます
0939デフォルトの名無しさんNGNG
>>936
へ?
0940デフォルトの名無しさんNGNG
BITMAPINFOに256カラーのビットマップ、256色のグレースケールのパレットを用意しました。
このBITMAPINFOとビットマップの高さが増すにつれパレット番号を増加させるデータをもちいて
CreateDIBitmapにセットしてグラデーションのビットマップを作りました。(作ったつもり。)

これをメモリデバイスコンテキストでSelectObjectしてからディスプレイ(24bit)のDCにBitBltしたのですが、
この場合256カラー(パレットあり)を変換して24bitカラーのビットマップになってくれるとおもったのですが
どうもパレットデータはシステム内部のものをつかって描画してるっぽいんですがなぜですか?
そういうものですか?
0941デフォルトの名無しさんNGNG
「つもり」の部分が間違っていると思われ。
0942デフォルトの名無しさんNGNG
ビットマップの中のDLLを呼び出したいんですが、

HINSTANCE hInst;
hInst = LoadLibrary("Graphics.dll");

HBITMAP hBitmap;
hBitmap = LoadBitmap(hInst, "IDB_BITMAP1");

とやっても、hBitmap == NULLになってしまってビットマップを読み込めません。
僕のどこが間違ってるんでしょうか。
0943デフォルトの名無しさんNGNG
dllはMFC用のやつですハイ
0944デフォルトの名無しさんNGNG
>>942
全体的に間違ってると思います。1行目とか。
その DLL には本当に "IDB_BITMAP1" というビットマップが入ってますか?
MAKEINTRESOURCE(IDB_BITMAP)の間違いではないのですか?
0945デフォルトの名無しさんNGNG
>>944
1行目書きなおしたら変になってしまいました
自分で作ったDLLなんで IDB_BITMAP1 が入ってるのは間違いないはずなんですが、どうもそれだと読みこめなかったみたいで、
MAKEINTRESOURCE(1000);
と直接リソースIDで指定してもう一度やってみたら読み込めました。
なんでこれだとできるのか分かりませんが、とりあえず解決したみたいです。ありがとうございました。
0946デフォルトの名無しさんNGNG
>なんでこれだとできるのか分かりませんが

それがわかるまで先に進むな
一歩たりとも
0947デフォルトの名無しさんNGNG
>>9
MFCなんか嫌いだぁ

>>933
キューの中では順序通りでも PeekMessage で優先して取り出せるでしょ
DispatchMessageが中で何してるかは知るか。

>>940
パレットは別に CreatePaletteとSelectObjectでセットするんだったような
GDI+への対応はいつになるんだ?

>>945
まず無理だろうが、Graphics.dllのソースの中にある resource.h をインクルードしてみるといい。
これがMFCというやつだ。
0948デフォルトの名無しさんNGNG
>>947 初心者のかたは、回答はお控え下さい。
0949デフォルトの名無しさんNGNG
>>945
断言していい。
入ってない。
そういうあいまいな認識でコード書くと周りに甚大な被害を及ぼすからやめてくれ。

>>947
引っ込め。
0950デフォルトの名無しさんNGNG
>>947
これほど的外れな回答も珍しいな。
0951デフォルトの名無しさんNGNG
ピクチャーボックスに表示されている画像を取り込んで保存しているのですが
どうも一回目は保存されなく2回目から保存されます。
いろいろと設定しているですがうまくいきません
どなたか教えてくださいませ
ソフト visualstadio 6.0
OS  win xp

ビットマップインフォを作成する
DDBを作成してウィンドウからビットマップをコピー
メモリ割り当ててビットマップからデータを取得
ビットマップファイルヘッダーを作成
データをファイルへセーブ の手順でやっています
hfile = CreateFile(fn,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
WriteFile(hfile ,&bmfh,sizeof(bmfh),&tmp,NULL);
WriteFile(hfile,&pbmi->bmiHeader,sizeof(pbmi->bmiHeader),&tmp,NULL);
if(pbmi->bmiHeader.biBitCount <= 8)
{
WriteFile(hfile,pbmi->bmiColors,sizeof(COLORREF)*(1<<pbmi->bmiHeader.biBitCount),&tmp,NULL);
}
SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
WriteFile(hfile,pbits,pbmi->bmiHeader.biSizeImage,&tmp,NULL);
CloseHandle(hfile);
0952デフォルトの名無しさんNGNG
MFCをこれから勉強しようと思っていますが
オススメの書籍等あれば教えていただけませんでしょうか?
0953デフォルトの名無しさんNGNG
>>951
・1回目に保存処理が走っているのか確認
・各APIの戻り値を確認
0954デフォルトの名無しさんNGNG
>SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
これ?
レス数が950を超えています。1000を超えると書き込みができなくなります。