■MFC相談室 mfc11.dll■
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG前スレ
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/
関連リンクは >>2-10 の辺り。
0704デフォルトの名無しさん
NGNG0705yara ◆SSLypP3Luo
NGNG0706デフォルトの名無しさん
NGNGhttp://www.codeproject.com/miscctrl/simplebrowserformfc.aspを参考にして
メモリ上のHTMLを書き込むと言うプログラムを作成いたしました。
このプログラムはCListView上のキーダウンのタイミングでCHtmlViewを書き換えるものです。
これは上手くいったのですが、問題が出てきてしまいました。
CHtmlViewをクリックしたあとに、CListView上にクリック等で戻りキーダウンすると
FocusがCHtmlViewに移動してしまうのです。
このときにメモリ上のHTMLファイルを書き込んでおりまます。
どうやら、HtmlViewをクリアする所あたりで問題が起きているようなのですが。
また、CHtmlViewをクリックを一度もしない場合においては問題なく動いております。
SetFocusでCListViewにセットし直しても、上手く動かないようです。
何か良い案、参考情報へのリンクなどお知りでございましたらご教授ください。
0707デフォルトの名無しさん
NGNGSetActiveViewとかどうよ?(試してないが)
ついでに
>お尻でございましたら
「ご存知でしたら」じゃね?
0709デフォルトの名無しさん
NGNGC○○ViewのOnInitialUpdateで
CTabCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 200, 80), this, 100);
を呼び出すと、SDIだと上手くいったんですがMDIでは何故かタブが生成されません。
エラーが出る訳でもなく、thisをGetWindow(GW_CHILD)に変更するとMDI子ウィンドウに生成されるので、
指定するウィンドウか生成するタイミングが間違っていると思うのですが色々試しても分かりません。
原因の分かる方、教えて下さい。
0710デフォルトの名無しさん
NGNG0711デフォルトの名無しさん
NGNGコンボボックスのエディットコントロールでテキストを変更した場合、OnCbnEditchangeXXXXが呼ばれますが、
このエディットコントロールのテキストの内容を取得する方法を教えてください。
0712デフォルトの名無しさん
NGNG「テキストの内容」ってなんだ?
GetLBText()じゃないの?
つーかリファレンスでメンバ関数のチェックぐらいしたんだろうな?
0713デフォルトの名無しさん
NGNG失礼しました。
誤)テキストの内容
正)エディットボックスの内容
その関数だとリストボックス内のテキストです。
エディットボックス内のテキストを取得する方法が見つかりません。
0714デフォルトの名無しさん
NGNG0716デフォルトの名無しさん
NGNGIEコンポーネントを使ってネット上からhtmlファイルを取得し、
解析して保存したいのですが、
ブラウザ画面を表示させたくはありません。
IEコンポーネントのうちURLからコンテンツを取得する機能と
htmlコンテンツを解析する機能を使いたいのですが
どのようにすればよいのでしょうか?
0717デフォルトの名無しさん
NGNG「解析」というのが何を指しているのか分からないね。
IEコンポーネントを使うって書いてあるけど、ブラウザ・エンジンを使うってのは
普通レンダリングさせるためであって、ファイル内容をHTMLコードとして見る
だけなら必要ないことのはずだが?
0718716
NGNGレスありがとうございます。
> 「解析」というのが何を指しているのか分からないね。
テーブルで表示されてる表などを整形してリスト表示したり
したいです。
> IEコンポーネントを使うって書いてあるけど、ブラウザ・エンジンを使うってのは
> 普通レンダリングさせるためであって、ファイル内容をHTMLコードとして見る
> だけなら必要ないことのはずだが?
ごもっともです。
・URLからhtmlコードを簡単に取得できそう。
・IE対応のページを確実に解析できそう
というのが理由です。
htmlの解析という視点に立つと他の手段はあるのでしょうか?
0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNGそうです。
でもXMLパーサーでは解析できませんよね?
一応試して見ましたができなかったので
IEコンポーネント使えば確実だろうと思いました。
0721デフォルトの名無しさん
NGNG0722デフォルトの名無しさん
NGNG中身をデータとして扱いたいならCHttpXXX系やCAsyncSocketなんかを使って
ファイル・データをもってきて自分で使いたいように加工するもんだと思う。
0723デフォルトの名無しさん
NGNG0724デフォルトの名無しさん
NGNG自分でparseしたくないって話だっただろ。
GetHtmlDocumentでドキュメントインターフェイスの取得できるし。
0725デフォルトの名無しさん
NGNGIEコンポっていうか MSHTML っていうのが MS の html エンジン。
IE も WebBrowser Control もコレ使ってる。
使い方のサンプルは以下にあるよ。
データを持ってくるところは自分でやることになるような気がするけど。
http://msdn.microsoft.com/archive/en-us/samples/internet/browser/walkall/default.asp?frame=true
0726720
NGNG>> 721,725を見ましたが
この二つの組み合わせでうまくいきそうです。
感謝しています。
0727初心者D
NGNGOKを押したら、その値を元にCPenの絵が動くっていう
ソフトを作ってます。
ダイアログを表示するのはクラスCxxxAppに、
CPenで書かれた絵はOnDrawじゃなくCxxxViewクラスの中にpublic:として
HogeDraw()(OnDrawじゃないっす)を作ってあります。
ダイアログの関数に
if( Hoge.DoModal() == IDOK ){
クラスCxxxViewのメンバ関数HogeDraw(ダイアログの値を引数にする)
}
としたいのですが、どう記述すれば良いのですか?
参考になりそうなサンプルとかあったら教えてください。
対処できずにはや3日ほど経ちました…
0728& ◆RdmUjfVKqQ
NGNGCxxxViewのHogeDraw(引数あり)を使いたいんですが、
どう変数を宣言すればいいのか、どうポインタを渡せば良いのか
分からないってことです。
すいません、お願いします。
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNG0732デフォルトの名無しさん
NGNG再質問します。
677 名前:デフォルトの名無しさん :04/09/09 22:52
ライブラリに依存する質問になってしまいますが、MFCのCAsyncSocketのOnXXX()は、
どういう仕組みで呼び出されるのでしょうか?
もし、メッセージポンプを経て呼び出されるのなら、OnXXX()の中では長時間の処理が
出来なくなりますが、皆さんどう対処しているのでしょう?
678 名前:677 :04/09/09 23:38
ソース見てみました。
カレントスレッドのメッセージポンプを利用するみたいですが、あってますか?
もしかしてスレ違いでしょうか?
0733732
NGNGこれを利用すればいいのでしょうか?
0734デフォルトの名無しさん
NGNG処理をスレッドに配置してスレッド起動をして、そのままメッセージハンドラを抜けてしまえばいいんじゃない?
ってか何をするのかによる。本当に長い計算をするのならスレッドにすればいいと思う。
何かを待つのなら・・・何を待つのか聞きたい。
0735732
NGNG例えば子プロセスの終了を待つとか。
0736732
NGNGソケット側のちょっとした挙動の変化でGUIを止めたくないのです。
こういう要求って変ですか?
0737デフォルトの名無しさん
NGNGそのスレッド内部でWaitFor系APIで子プロセスの終了イベントを待つ。
(たぶんその子プロセスのハンドルかなんかがそのままイベントとしてWaitできると思った。)
そんで、WaitForSingleObjectを抜けたらメインスレッドにメッセージをポストしてスレッドはそのまま終了。
というのはどう?
0738デフォルトの名無しさん
NGNGおそらくそれが正当な方法なんでしょうね。
Microsoftのサンプルもそういう形が多いです。
ところで、複数のサーバが合わさった形のプログラムはどうインプリメントするべきなんでしょうか?
たとえば、HTTP、FTPなどが組み合わさっているようなものです。
もし、あるサーバで異常が起こった場合、タイムアウトなどによって回復されるまでの期間
GUIが重くなる事態は避けたいと思います。
各サーバごとにUIスレッドを分けるといいのかな?などと妄想しましたが、
普通はどうするものなのでしょうか?
HTTP、FTPというのはあくまでもたとえです。
0739デフォルトの名無しさん
NGNG0740ディフォルトの名無しさん
NGNG動作しないなんてあるのでしょうか?
日本語版や英語版のWINDOWS環境では問題なく動作していたんですが
ドイツ版のWINDOWSでは動くPCと動かないPCが出てきました
動かないPCは、コンストラクション後にInitdialogに入らずにそのまま、
そのダイアログが終了してしまうという現象でした。
このようなことってあるんでしょうか?
0741デフォルトの名無しさん
NGNGプロセス間通信にもソケットを使おうとしています。
俺は異常でしょうか?
0742デフォルトの名無しさん
NGNGワーカスレッドでバークレーソケットを使うなら
UIのスレッドとは別にサーバAとサーバBを別々のワーカスレッドにして
おのおのでソケットを作ってlistenしたりすると思う。
そしておのおののサーバスレッドはイベントをUIに通知するためにPostMessageして
メインスレッドと交信する。もしどっちかが死んだり固まったりした場合でリスタートしたいなら
仕切りなおしの同期の処理を設計する必要があるでしょう。
0743デフォルトの名無しさん
NGNG実は、そういう形で作っていたのですが、非同期に切り替えることにしました。
以前は、各ソケットにスレッドを割り当ててブロッキングしていたのですが、
非同期にするに当たってATLあたりからメッセージポンプをいただいて
自前のソケットクラスを拡張するか、MFCを使うか考えました。
そして簡単そうなMFCを使うことにしたわけです。
一つのプロセスでUIスレッドを複数使うのはあまり一般的ではないのでしょうか?
0744デフォルトの名無しさん
NGNGCWinApp派生::InitInstanceでDoModal呼ぶ前に抜けるコードパスも存在する場合がある。
ソケットを使うための初期化処理(Wizが自動インプリメント)に失敗したとか。
0745デフォルトの名無しさん
NGNG別に普通だけど?
0746デフォルトの名無しさん
NGNG素直とは言えない作りに驚きました。
これだったら、自分で作り直したほうがいいのではないかとさえ思うのです。
皆さんはどう思いますか?
0748デフォルトの名無しさん
NGNG既存のものの問題がもしブロッキングとかだったら正しくselectを使うなど
すれば回避できると思う。しかしそのブロッキングの解決策としてCAsyncSocketを使うのは
結局同じ問題に到達するかもしれない上に変なアーキテクチャのために振り回されるかも。
0749デフォルトの名無しさん
NGNGやった分には責任を持たなくちゃいけないことになる。それを踏まえてどこまで
自分で「できる」のか判断して決めるしかないのでは?
0750デフォルトの名無しさん
NGNGOnXXX で(自らなにか)時間のかかる処理をするなら、
非同期でソケットを使う利点はまるでないと思うけど。
>ソケット側のちょっとした挙動の変化でGUIを止めたくないのです。
ちょっと状況が想定できないけど、どんなときにそういう問題がおきますか?
0751デフォルトの名無しさん
NGNGDDXでぐぐれ
0752デフォルトの名無しさん
NGNG0753デフォルトの名無しさん
NGNGCxxxViewクラスのポインタをグローバル変数かどっかに保存しておけばよろしいかと。
0754デフォルトの名無しさん
NGNGビュークラス内からダイアログを起動すればいいだけの話でしょ?
0755デフォルトの名無しさん
NGNGビュークラスにメッセージ飛ばして、その先でHogeDraw()を実行する。
WM_APPなどでググってみれ。
ダイアログの値を渡す方法はいくらでもある。
グローバル変数でもCxxxAppのメンバ変数でも良し。
そのときはHogeDraw()はpublicじゃなくてもオッケ。
0756初心者D
NGNG皆さんありがとうございます。
結局、>>754さんのやり方でやりました。
CxxxViewクラスの中でメニューの項目からダイアログを出すっていう
関数を作ったのがなんか「?」って感じになってますが…。
>>755さんの
>ビュークラスにメッセージ飛ばして
をもうちょっと勉強してからやってみます。
勉強し直してきます…。
0757デフォルトの名無しさん
NGNGIEでもFFFTPでも挙動がおかしいときがありますよね?
操作を受け付けない時間が有りますよね?
自分の作るプログラムがそういう挙動を示さないとは思えないのです。
0758デフォルトの名無しさん
NGNG>操作を受け付けない時間が有りますよね?
…ないと思われ。OSがWin9xとか。
0759デフォルトの名無しさん
NGNGNT系でも同様だよ。
「操作」の定義があまりにもシェル寄りだね、その見方だと。
0760デフォルトの名無しさん
NGNG>>>755さんの
>>ビュークラスにメッセージ飛ばして
>をもうちょっと勉強してからやってみます。
せっかくMFC使ってるのに、そんな面倒なことしなくてもよし!
単に View にそのメニューのコマンドハンドラを追加すればいいだけだよ〜。
0761デフォルトの名無しさん
NGNGそれは非同期ソケットの問題じゃないと思うけど。
漏れの経験ではそれなりに非同期っぽく作ったネットワークアプリが無反応になるのは、
gethostbyname を不用意に呼んでブロックしているケース、socket が connect / shutdown中で、
他スレッドから close しても停止できないケースが大半なんじゃないかな。
0762デフォルトの名無しさん
NGNGcloseで停止できなかった場合に無反応になるのだとしたら、
何故無反応になるのですか?
0763デフォルトの名無しさん
NGNG>>761が正しいかどうか知らんが、デッドロックが起きてるとかでは?
0764デフォルトの名無しさん
NGNG0765デフォルトの名無しさん
NGNG0766デフォルトの名無しさん
NGNGprotectedになるのは何故ですか?
特にデストラクタがそうなる理由がわかりません。
Microsoftのサンプルは全てpublicになっていました。
よろしくお願いします。
0767デフォルトの名無しさん
NGNGスレッドを少なく出来る部分に魅力を感じます。
Windowsでもpoll出来ますか?
出来るならそっちを使いたいです。
よろしくお願いします。
0769デフォルトの名無しさん
NGNG「何故」について考えることに意味があるかどうかだ。
しょせん同じ人間が用意したウィザードだぞ。
答えをいうなら、ウィザード作成者が徹夜明けだったからとしか答えようがない。
0770デフォルトの名無しさん
NGNGバグですかね?
たぶん意味があると思うのですが。
は!
わかったかもしれない!
もしかして、CWinThreadを継承したクラスは自分をマネージしないといけないんですか?
だとすると納得いく。
ちょっと実験してみます。
0771デフォルトの名無しさん
NGNG専門用語?それともカッコイイっぽいから使ってるだけ?
0772デフォルトの名無しさん
NGNGカッコイイから使ってみました。
0773デフォルトの名無しさん
NGNG動的生成されることを前提にしてるからprotectedにしたほうが安全だと想ったんじゃない。
IMPLEMENT_DYNCREATEとかCRuntimeClassあたりで。
0774デフォルトの名無しさん
NGNG0776デフォルトの名無しさん
NGNG「コイツ、話を誤魔化してる。もしくは何も判ってない。」と思われるだけ。
0777デフォルトの名無しさん
NGNGはい。誤魔化していました。
素直にわかりませんって書けばよかったです。
>>773
そうみたいです。
でも、デストラクタはどうしてなんですかね?
破棄するときどうなるのだろう?
0778デフォルトの名無しさん
NGNGnew/deleteで生成すると書いてあったか?
0779デフォルトの名無しさん
NGNG0780デフォルトの名無しさん
NGNG0781デフォルトの名無しさん
NGNG0782デフォルトの名無しさん
NGNGマスクパターン
0783デフォルトの名無しさん
NGNGスレッドを自殺させたあとにメモリーをチェックするとリークしていると報告されるのですが、
これは何故なんでしょう?
0784デフォルトの名無しさん
NGNGTerminateThreadを使ったのか?
0785デフォルトの名無しさん
NGNGPostQuitMessageしてみました。
0786デフォルトの名無しさん
NGNGだれがどのタイミングで?
0787デフォルトの名無しさん
NGNG根本的に間違っているような母艦
0788デフォルトの名無しさん
NGNG0789デフォルトの名無しさん
NGNG0790デフォルトの名無しさん
NGNGMFCよくわかんないけど (じゃあなぜこのスレにいるんだつーツッコミは禁止だ)
Win32APIレベルで考えると、ボタンを押されたら親ウィンドウに
WM_COMMAND をポストされるよな。BN_CLICKED と コントロールID と
ご丁寧にボタンのウィンドウハンドルまでつけて。
コントロールID やウィンドウハンドルで選別すればヨロシけれ。
もれ普段MFC使わずにナマで書いてるけど、いちいちコントロールID設定するの面倒なんで
ウィンドウハンドルで選別してるw
究極のDQNグラマとはもれのことよw
0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNGMFCのトリックをパクったりするのが有効だからだろ。
0793デフォルトの名無しさん
NGNG0794デフォルトの名無しさん
NGNGっていうか、マウス操作している人が一番良く知っているはずだが。
0795デフォルトの名無しさん
NGNGあるメニューの項目で、UPDATE_COMMAND_UIメッセージの
イベントハンドラを(CxxxDlgクラスへ)追加し、その関数内で、
pCmdUI->SetCheck(1);
と記述したのですが、チェックが付いてくれません
同じ事をシングルドキュメントでやると、上手くいくのですが・・・
ダイアログベースでメニューのチェックを制御するには
なにかコツがあるのでしょうか?
0796デフォルトの名無しさん
NGNG0797デフォルトの名無しさん
NGNGスレッド自身が任意のタイミングで。
0798740
NGNGFLEXGRIDを使用していたのですが、OCXファイルはあったのですがClassIDの方に登録
されて居なかったので、その段階でダイアログが開かずに落ちていました。
このClassIDってどのようにして登録すればよいのでしょうか
>>742
ありがとうございます
0799デフォルトの名無しさん
NGNG0800デフォルトの名無しさん
NGNG0801デフォルトの名無しさん
NGNG"\r\n"
0802795
NGNG■ このスレッドは過去ログ倉庫に格納されています