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

■MFC相談室 mfc11.dll■

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Microsoft Foundation Classライブラリ専用スレです。

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

関連リンクは >>2-10 の辺り。
0756初心者DNGNG
>>727-729です。
皆さんありがとうございます。
結局、>>754さんのやり方でやりました。
CxxxViewクラスの中でメニューの項目からダイアログを出すっていう
関数を作ったのがなんか「?」って感じになってますが…。

>>755さんの
>ビュークラスにメッセージ飛ばして
をもうちょっと勉強してからやってみます。

勉強し直してきます…。
0757デフォルトの名無しさんNGNG
>>750
IEでもFFFTPでも挙動がおかしいときがありますよね?
操作を受け付けない時間が有りますよね?

自分の作るプログラムがそういう挙動を示さないとは思えないのです。
0758デフォルトの名無しさんNGNG
>>757
>操作を受け付けない時間が有りますよね?

…ないと思われ。OSがWin9xとか。
0759デフォルトの名無しさんNGNG
>>758
NT系でも同様だよ。
「操作」の定義があまりにもシェル寄りだね、その見方だと。
0760デフォルトの名無しさんNGNG
>>756
>>>755さんの
>>ビュークラスにメッセージ飛ばして
>をもうちょっと勉強してからやってみます。

せっかくMFC使ってるのに、そんな面倒なことしなくてもよし!
単に View にそのメニューのコマンドハンドラを追加すればいいだけだよ〜。
0761デフォルトの名無しさんNGNG
>>757
それは非同期ソケットの問題じゃないと思うけど。

漏れの経験ではそれなりに非同期っぽく作ったネットワークアプリが無反応になるのは、
gethostbyname を不用意に呼んでブロックしているケース、socket が connect / shutdown中で、
他スレッドから close しても停止できないケースが大半なんじゃないかな。
0762デフォルトの名無しさんNGNG
>>761
closeで停止できなかった場合に無反応になるのだとしたら、
何故無反応になるのですか?
0763デフォルトの名無しさんNGNG
>>762
>>761が正しいかどうか知らんが、デッドロックが起きてるとかでは?
0764デフォルトの名無しさんNGNG
非同期ソケットが便利なのは他のイベントと一緒に待てる点?
0765デフォルトの名無しさんNGNG
KFC最高。KFCあったらMacなんかイラネ
0766デフォルトの名無しさんNGNG
ウィザードでCWinThreadを継承してクラスを作るとコンストラクタとデストラクタが
protectedになるのは何故ですか?
特にデストラクタがそうなる理由がわかりません。
Microsoftのサンプルは全てpublicになっていました。
よろしくお願いします。
0767デフォルトの名無しさんNGNG
>>764
スレッドを少なく出来る部分に魅力を感じます。
Windowsでもpoll出来ますか?
出来るならそっちを使いたいです。
よろしくお願いします。
0768デフォルトの名無しさんNGNG
>>756
暮らすウィザードを一日中眺めていれば活路が見出せるはず。
ヒントは>>760
0769デフォルトの名無しさんNGNG
>>766
「何故」について考えることに意味があるかどうかだ。
しょせん同じ人間が用意したウィザードだぞ。
答えをいうなら、ウィザード作成者が徹夜明けだったからとしか答えようがない。
0770デフォルトの名無しさんNGNG
>>769
バグですかね?
たぶん意味があると思うのですが。
は!
わかったかもしれない!
もしかして、CWinThreadを継承したクラスは自分をマネージしないといけないんですか?
だとすると納得いく。
ちょっと実験してみます。
0771デフォルトの名無しさんNGNG
マネージってなんだよ。
専門用語?それともカッコイイっぽいから使ってるだけ?
0772デフォルトの名無しさんNGNG
>>771
カッコイイから使ってみました。
0773デフォルトの名無しさんNGNG
>>770
動的生成されることを前提にしてるからprotectedにしたほうが安全だと想ったんじゃない。
IMPLEMENT_DYNCREATEとかCRuntimeClassあたりで。
0774デフォルトの名無しさんNGNG
ビットマップリソースをスタティックテキストに表示する方法を教えてください
0775 ◆HsptrkZmYk NGNG
>774
vrubyでググろう
0776デフォルトの名無しさんNGNG
カッコイイだけでカタカナ語使うのは馬鹿だと思われるよ。
「コイツ、話を誤魔化してる。もしくは何も判ってない。」と思われるだけ。
0777デフォルトの名無しさんNGNG
>>776
はい。誤魔化していました。
素直にわかりませんって書けばよかったです。

>>773
そうみたいです。
でも、デストラクタはどうしてなんですかね?
破棄するときどうなるのだろう?
0778デフォルトの名無しさんNGNG
おい、CWinThreadの質問してるヤシ、ドキュメントちゃんと読んでるのか?
new/deleteで生成すると書いてあったか?
0779デフォルトの名無しさんNGNG
ピクチャコントロールでビットマップを透過したいのですがどうすればいいですか?
0780デフォルトの名無しさんNGNG
動的生成=newじゃねーよ、そもそもデストラクタがprivateならユーザーが明示的にインスタンスを作成できない。
0781デフォルトの名無しさんNGNG
もちろん内部じゃnewとかしてるけど、そういうどうでもいいところに突っ込むなよ。
0782デフォルトの名無しさんNGNG
>>779
マスクパターン
0783デフォルトの名無しさんNGNG
>>778
スレッドを自殺させたあとにメモリーをチェックするとリークしていると報告されるのですが、
これは何故なんでしょう?
0784デフォルトの名無しさんNGNG
自殺のさせ方が悪かったのだろう。
TerminateThreadを使ったのか?
0785デフォルトの名無しさんNGNG
>>784
PostQuitMessageしてみました。
0786デフォルトの名無しさんNGNG
>>785
だれがどのタイミングで?
0787デフォルトの名無しさんNGNG
ナンーカ
根本的に間違っているような母艦
0788デフォルトの名無しさんNGNG
ボタン1とボタン2で同じハンドラ関数を呼び出してるんですが、どちらが呼び出したか判定する方法ありませんか?
0789デフォルトの名無しさんNGNG
GetCurrentMessage
0790デフォルトの名無しさんNGNG
>788
MFCよくわかんないけど (じゃあなぜこのスレにいるんだつーツッコミは禁止だ)
Win32APIレベルで考えると、ボタンを押されたら親ウィンドウに
WM_COMMAND をポストされるよな。BN_CLICKED と コントロールID と
ご丁寧にボタンのウィンドウハンドルまでつけて。
コントロールID やウィンドウハンドルで選別すればヨロシけれ。

もれ普段MFC使わずにナマで書いてるけど、いちいちコントロールID設定するの面倒なんで
ウィンドウハンドルで選別してるw
究極のDQNグラマとはもれのことよw
0791デフォルトの名無しさんNGNG
じゃあなぜこのスレにいるんだ
0792デフォルトの名無しさんNGNG
SDKでプログラムしていてもWindowsアプリっぽくするためには
MFCのトリックをパクったりするのが有効だからだろ。
0793デフォルトの名無しさんNGNG
まぁDQNは放置しておいて、ON_COMMAND_RANGE使え。
0794デフォルトの名無しさんNGNG
>>788
っていうか、マウス操作している人が一番良く知っているはずだが。
0795デフォルトの名無しさんNGNG
ダイアログベースでメニューを追加しました
あるメニューの項目で、UPDATE_COMMAND_UIメッセージの
イベントハンドラを(CxxxDlgクラスへ)追加し、その関数内で、
   pCmdUI->SetCheck(1);
と記述したのですが、チェックが付いてくれません
同じ事をシングルドキュメントでやると、上手くいくのですが・・・

ダイアログベースでメニューのチェックを制御するには
なにかコツがあるのでしょうか?




0796デフォルトの名無しさんNGNG
FAQキタ━━━(゚∀゚)━━━ !!
0797デフォルトの名無しさんNGNG
>>786
スレッド自身が任意のタイミングで。
0798740NGNG
原因の方は判明しました
FLEXGRIDを使用していたのですが、OCXファイルはあったのですがClassIDの方に登録
されて居なかったので、その段階でダイアログが開かずに落ちていました。
このClassIDってどのようにして登録すればよいのでしょうか

>>742
ありがとうございます
0799デフォルトの名無しさんNGNG
regsvr32
0800デフォルトの名無しさんNGNG
エディットコントロールで'\n'が適用されないのですがどうすればいいですか?
0801デフォルトの名無しさんNGNG
>>800
"\r\n"
0802795NGNG
環境はVC.NET 2003です
0803デフォルトの名無しさんNGNG
FAQマタキタ━━━(゚∀゚)━━━ !!
0804デフォルトの名無しさんNGNG
>>803
fuck you 股来た 目がビーチクでターンエーがオメコで括弧が足
0805795NGNG
>>803
私のことでしょうか?FAQとは?
0806デフォルトの名無しさんNGNG
ターンエーと呼ぶ馬鹿ハケン
0807デフォルトの名無しさんNGNG
ユーザ定義のメッセージを処理するのはCWnd::WindowProcとCWnd::DefWindowProcと
どちらでやったらより良いですか?またなぜ、そのほうがより良いといえるのですか?
0808デフォルトの名無しさんNGNG
どっちでもない
ON_REGISTERED_MESSAGE
もしくは
ON_MESSAGE
ハンドラで
0809デフォルトの名無しさんNGNG
>>800
ソフトラインブレーク で調べてみんさい
0810デフォルトの名無しさんNGNG
MFC三日目の初心者です、
いくらでもたたいてくれて結構です
画像を加工して保存がしたいのですが
HDCで保持するのとDIBデータを扱う2つがあるのですが
この2つについての、違いをご教授願いたいのです。
よろしくお願いします
0811デフォルトの名無しさんNGNG
>>810
推奨スレ
http://pc5.2ch.net/test/read.cgi/tech/1092524669/

・・・とは言っても、おそらく API と MFC の境もわからんだろうな。
こっちとあっちで、ちゃんと同じ自己紹介しとくといい。
0812デフォルトの名無しさんNGNG
モードレスダイアログ上にテキストボックスを配置して、
テキストに変更がある度に処理を行いたいのです。

ClassWizard(VisualC++ 6.0)を使用して、
CEdit型の変数、m_EditXをエディットボックスに対応させ、
EN_CHANGEメッセージのハンドラを作成しました。

void CSelectDlg::OnChangeEditbox()
{
  char buffer[5];

  m_EditX.GetLine(0, buffer, 4);

  ・
  ・
}

実行してみると、ダイアログがオープンした途端、
CEdit::GetLine内部でAssertionが発生して止まってしまいます。
どうやらエディットボックスが有効になる前(?)に
EN_CHANGEメッセージが送られてくるようです。

http://www.flounder.com/getdlgitem.htm#Uninitialized%20Controls
これを避けるために、OnInitDialogが実行済みかどうかを
格納しておくBOOL変数を持たせる方法というのがあるそうです。

ただ、こういった処理をしたい場合、これが定番な書き方なのでしょうか?
もうちょっとスマートなやり方がありそうな気がするのですが。。
0813812NGNG
あ、テキストボックスにメッセージが送られるのは、
スピンボックスから自動関連付けしているのが原因っぽいです。
関連付けを外したらダイアログは普通に表示されました。
0814デフォルトの名無しさんNGNG
>>812
スマートかどうかは知らないけど、とりあえずピンポイントその状況だけ避けるなら
if (::IsWindow(m_EditX..m_hWnd)) とかで判定する手もあると思う。
0815812NGNG
>>814
正直、それを考えてましたw
Assertionがその条件で発生してるんですが、
IsWindowの意味自体があやふやで自信がありませんでした。

メンバ変数を増やすよりはマシってことで、それでやらせていただきます。
0816デフォルトの名無しさんNGNG
どなたか795お願いします
0817デフォルトの名無しさんNGNG
>>795>>816
wndfrm.cpp にあるように、メニューの UPDATE_COMMAND_UI を処理するのは CFrameWnd クラス。
( CFrameWnd::OnInitMenuPopup を参照 )
よってダイアログベースの場合自分で似たような処理を書くか、単純に自力でメニューアイテムをSetCheck すること。

あるいは単に SDI で FormView 使うって手もある。たぶんこっちのほうが簡単。
0818デフォルトの名無しさんNGNG
OnInitMenuPopupでチェックするのがFAQ。
0819デフォルトの名無しさんNGNG
>>814
MFC的には if (m_EditX.GetSafeHwnd()) だな。
0820デフォルトの名無しさんNGNG
>>819
GetSafeHwndはポインタ経由で this が 0 のときにもアクセス違反にならないというだけの関数。
(要は return this ? this->m_hWnd : 0 ってな実装)。
ポインタでもないメンバ変数に使うのは無意味。

m_hWnd って直中身見るのは行儀悪くてイヤーンっていう非MFC人なら常時使ってもいいかもね。
0821デフォルトの名無しさんNGNG
operator HWND
ってあまり使ってませんかそうですか
0822795NGNG
>>816
えっと、どなたか存じませんが、ありがとう。

>>817
FormView使った方が、早そうですね。
参考になりました。
ありがとうございます。
0823デフォルトの名無しさんNGNG
MFCが無くなっちゃうって本当ですか?
0824デフォルトの名無しさんNGNG
>>823
なくなりません。
MFCがテンプレートになる可能性があるだけでしょう。
その場合、ClassWizardなどのIDE機能の変更があると思います。
0825デフォルトの名無しさんNGNG
いや、すぐにとは言わんがMFCもATLもなくなるだろ。
0826デフォルトの名無しさんNGNG
そりゃタイムスパンのレベルと何をもって「なくなる」とするかによるだろうけど
少なくとも現行OS(winXP以下)が現役で動いているうちは確実に使えるだろ
0827デフォルトの名無しさんNGNG
Longhornでも確実に使えると思うね。
MSがOSを出し続ける限り使えると思う。

それ以前に、MSにとってMFC/ATLをなくすメリットは何かあるの?
0828デフォルトの名無しさんNGNG
新しいライブラリを売る。
0829デフォルトの名無しさんNGNG
>>828
こんどこそ驚きのプゲラ仕様がないライブラリを求む
0830デフォルトの名無しさんNGNG
プゲラですめばいいけどね。大抵真っ青。
0831デフォルトの名無しさんNGNG
リストビューの表示を高速化する方法について教えてください。

大量(最大1万件)のデータをリストビューに表示させるのですが、一番下のアイテムを選択表示させデータの流れる様子を、画面に表示させたいのです。

SetRedrawを用いてInsertItemを行っています。1万件を超えるとDeleteItemを用いて先頭のアイテムを削除しています。現在表示速度が遅いのかデータが溜まっています。さらに画面がちらついてしまいます。

画面のちらつきはOnEraseBkgndを用いて、描画を省いているのですが上手く画面のちらつきがおさまりません。

良い方があれば教えてください。
0832デフォルトの名無しさんNGNG
>>831
リストビューで表示が間に合わないような頻度で書き換わるデータを本当にリストビューで
1万件もためて表示する意味があるのかという疑問が・・・。
0833デフォルトの名無しさんNGNG
>>831
仮想リストビューを使いなさい。
0834デフォルトの名無しさんNGNG
>>831
大量データを扱う場合は仮想リストコントロールを使うというのが定石だけど、
「流れる様子」とか言ってあんまり頻繁に更新する場合は頻度によって多少
のちらつきが出るかも。
0835デフォルトの名無しさんNGNG
仮想リストビューなんて要るの?
コモンのリストコントロールなら必要ないと思うけど。
描画に必要なインデックス情報しか処理要求してこないようにできたはず。
MFCの場合は知らないけど。
0836835NGNG
>>835で書いたヤツだと、自分で能動的にリストを更新したい場合は、
WM_PAINTを送るだけでいいから楽だよ。

LVN_GETDISPINFOとか、LPSTR_TEXTCALLBACKでググって見れば?
MFCでも逝けるはず。試してないけど。
0837835NGNG
修正します。

WM_PAINT送信での更新だと、InvalidateRect()もあらかじめ必要かも。
0838デフォルトの名無しさんNGNG
普通に(仮想でなく)ListCtrlで1万行出してましたが。
尤も、ログ機能なんで更新は最高でも1秒に一回程度。
有り得ない上限として1万行の仕様になり、ランテストした次第。
0839デフォルトの名無しさんNGNG
リストコントロールは、表示よりもむしろアイテムの挿入・削除に時間がかかるので、
あらかじめ上限数のアイテムを作っておいて、無効アイテムに空文字を返せば、
動的にアイテム数が増減しても高速処理できる。
ただし、見た目は件数が数件でもスクロールバーが出てしまうけど。
0840デフォルトの名無しさんNGNG
つーかなぜそこまで泥臭いことをして仮想リストコントロールを避けるのか分からない・・・
0841デフォルトの名無しさんNGNG
>>831
ttp://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200409/04090044.txt
0842デフォルトの名無しさんNGNG
>>835
> 仮想リストビューなんて要るの?
> コモンのリストコントロールなら必要ないと思うけど。

コモンのリストコントロールを使わずに仮想リストビューを使うって、どういうこと?
0843デフォルトの名無しさんNGNG
MFCのダイアログベースのプログラムを作ってみました。
プログラム自体は動くのですが、Enterを押すと勝手に終了してしまいます。
なぜがご存知の方、教えてください<m(__)m>
0844デフォルトの名無しさんNGNG
>>843
ダイアログクラスのOnOk()をオーバーライドし
CDialog::OnOK();
をコメントアウトして下さい
0845デフォルトの名無しさんNGNG
>>843
聞かれる前に追加。
Escキーでも終了してしまうので、
OnCancel()も>844同様に呼び出されないようにすべし。
0846デフォルトの名無しさんNGNG
それは対処法の先回りであり、843の疑問に対する答えにはなっていないな。
0847デフォルトの名無しさんNGNG
しかも終了手段がなくなる罠。
0848デフォルトの名無しさんNGNG
CHtmlViewを利用しているプログラムを作成しております。
Proxyの動的な変更方法が判りません。

Sleipnirの様にプログラム中から変更を行いたいと思っております。
参考になる文献などでも良いのでご存じの方ご教授お願い致します。
0849デフォルトの名無しさんNGNG
>>843
ttp://www.athomejp.com/goldfish/mfc/dialog/nonesc.asp
0850デフォルトの名無しさんNGNG
>>847
なんで? いつでも EndDialog できるやん。
0851デフォルトの名無しさんNGNG
何も知らない奴に>>844-855を教えただけじゃ終了できなくなるって意味だろ
0852デフォルトの名無しさんNGNG
>>844-845を教えただけじゃ、だ
0853デフォルトの名無しさんNGNG
>>852
844は終了できなくならんだろ。
0854デフォルトの名無しさんNGNG
>>851
そんなん言い出すなら、タスクリストがあるやん
0855デフォルトの名無しさんNGNG
>>853
だから>>844-845の二つともやらせたら、だってば。
■ このスレッドは過去ログ倉庫に格納されています