1 名前:デフォルトの名無しさん [2009/08/22(土) 14:34:39 ] Microsoft Foundation Classライブラリ専用スレです。 前スレ ■MFC相談室 mfc20d.dll■ pc12.2ch.net/test/read.cgi/tech/1230219816/
2 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 14:37:12 ] ■MFC リファレンス■ msdn.microsoft.com/ja-jp/library/d06h2x6e (VS.80).aspx
3 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:31:30 ] >>1 乙FC
4 名前:デフォルトの名無しさん [2009/08/22(土) 16:45:11 ] >>1 さん、お疲れ様です(><;)
5 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 17:29:24 ] まさかのdat落ちいちおつ
6 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:11:22 ] MFCなんてまだ需要あるの?
7 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:38:55 ] 重要性はかなり低くなったね。 リソースがいっぱいあって、実行速度もそれほど気にしないけど、 多機能なアプリを開発したいって人には.NETとC#の方がコストパフォーマンスが良いし、 (C++/CLIは本来のC++を無視した気持ちの悪い独自拡張が多すぎる…) 軽量・高速が重要なネイティブアプリにはATL/WTLが使われるようになったから。 実際、MFCの関連書籍も大半は6.0でとまっていて もう7.0以降にはほとんど需要がない事実を物語っている。
8 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 09:53:10 ] 7.0以降でCStringが急激に強まった事実が殆ど知られていのは一寸悲しい。 未だにA2Wとか書いてそうだ。 >リソースがいっぱいあって、実行速度もそれほど気にしないけど、 >多機能なアプリを開発したいって人には.NETとC#の方がコストパフォーマンスが良いし、 その為か、9.0SP1(VS2008SP1)で進化が極端な方向に進み始めたな。 元々GUIアプリの基本的な機能を提供するという目的ではあったけど、 今や、表示テーマの変更や、キーボードショートカットのカスタマイズUIまで、 初めから提供されるようになった。 VS2010以降もやる気満々らしいし。開発チームの暴走発言かもしれないけどw ttp://blogs.msdn.com/dd_jpn/archive/2008/12/04/9174764.aspx
9 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 12:45:39 ] 個人的なことを言えば、.NET とか C# とかいった新しいものをマスターする時間がない & もったいないのでMFCを使っているのが現状。 ATL/WTL にも興味はあるが、やはりマスターするには時間的なものが・・・。 もっとも、単純なプログラムは なんちゃってMFC 的な独自のクラスを使って書いている。 実質 100KB 程度の実行ファイルが MFC をスタティックリンクしただけで 3MB超になるんじゃ、どっちが主役かわからないもの。(笑)
10 名前:デフォルトの名無しさん [2009/08/24(月) 00:36:02 ] 漏れの親父がパソコン30万だして買ったけど なんもできんので、機能をごく必要なものに限って、 ブラウザとメーラーとワープロつくってやったよ。 喜んでくれた。別に質問じゃないけど、MFC使って作ったから・・誰かに報告したくてね。 すれ汚しスマソ。
11 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:59:10 ] >>9 afxcontrolbars.h はずせばそんな巨大なサイズにならないんじゃない?
12 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 19:59:49 ] >>9 3MB超はデバッグビルドだべ?リリースでも1Mぐらいあるけど まぁ最近の環境だと昔ほど気にする必要がなくてよいかなよいかな
13 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 20:13:41 ] リボンインターフェース用のリソース入れちゃうからでかくなるんじゃないの?
14 名前:デフォルトの名無しさん [2009/08/24(月) 20:40:48 ] button = new CButton[button_num]; button[0].Create(・・・); こんな感じでボタンを動的に生成して、Viewに配置した時に ボタンのイベントをViewで受け取るにはどうすれば良いですか? (ボタンの数は、動的に変化します。) ド素人の僕にご教授お願い致します。
15 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:00:09 ] >>12 いや気にするよ。新しい機能なにも使ってないようなダイアログベースのちょっとした アプリで実行ファイルメガ単位って嫌すぎる。まぁ、無駄な機能使わなければ小さくも 出来るからいいんだけど。 >>14 ビューのメッセージマップにON_BN_CLICKEDで出来るんじゃない?
16 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:05:22 ] WM_NOTIFYで通知受け取って捌くしかないんじゃね? BN_CLICKEDとかボタンから親ウィンドウに通知してくる ボタンコントロールはWM_NOTIFYじゃなくてWM_COMMANDだったかもしれん またはCButtonの派生クラス作ってBN_CLICKEDマップして自前で通知送る
17 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:18:09 ] >>14 ボタンの親を当然ながら View にしておいて、View のメッセージマップに ON_CONTROL_RANGE( BN_CLICKED, 最初のボタンのID, MAXで作成されたときの最後のボタンのID, OnControlRange) と書く。 Viewのヘッダに下記を追加 afx_msg void OnControlRange(UINT nID); あとは View で処理。 void CxxxView::OnControlRange(UINT nID) { if ( nID == xxx) ToDO... }
18 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 01:49:26 ] エディットボックスから文字列を取得する際、 GetWindowTextを使うと思うんですが、データ型は必ずCStringになってしまうのでしょうか? ここでCharを使う事って出来ますか?
19 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 02:01:10 ] >>18 CWnd::GetWindowText には下記の二つがある。前者を使えばいい。 int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount) const; void GetWindowText( CString& rString) const; exp. TCHAR sz[128]; GetWindowText( sz, 128);
20 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 02:10:38 ] >>19 レスありがとうございます 例でTCHARとなっているところはcharでも問題ないですよね・・? また、LPTSTRが引数になるということは、エディットボックスの中身がcharポインタに入るってイメージでいいのでしょうか? すみません勉強不足で変な表現があるかも知れませんが
21 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 02:28:13 ] >>20 プロジェクトの設定で Unicode 文字セットを使っていないなら char でいい。 「Unicode 文字セットを使用する」にしている場合は char は使えない。 >エディットボックスの中身がcharポインタに入る まあ、そんな感じのイメージ。難しく言うと、「エディットボックスの中身が、配列 sz の先頭要素のアドレスが示すメモリエリアに入る」
22 名前:デフォルトの名無しさん [2009/08/26(水) 09:14:48 ] FormViewにボタンやMSFlexGridを配置しました。 このFormViewを印刷するにはどうしたら良いですか?
23 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 10:59:21 ] 普通のFormViewと同じようにどうぞ。
24 名前:デフォルトの名無しさん [2009/08/26(水) 21:56:36 ] >>22 です >>23 ボタンをどう印刷すれば良いのか、全く解りません。 MSFlexGridについては、pDCを使って線とテキストで あたかもMSFlexGridをそのまま印刷してるような感じに出来る事は解ったのですが・・・ よろしくお願い致します
25 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 22:47:15 ] >>25 pDCを使って線とテキストで描く。 あるいはそれ用のビットマップリソースを用意して貼り付ける。
26 名前:25 mailto:sage [2009/08/26(水) 22:48:14 ] って、自分に言ってどーする。^^; >>25 は >>24 へのリプライ。
27 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 16:38:44 ]
28 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 12:22:49 ] ・・・行ってきた♪
29 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 10:12:20 ]
30 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 17:57:10 ] すいません質問があります. VC++のダイアログ形式でプログラムしているのですが 下記のプログラムで myDLG.DoModal() を行うと最初からあったOKボタンを押してもプログラムが死に切っていないようなのですが どのようにすればいいのでしょうか. ググったら無限ループとか永久に待機してるとかっぽかったんですが解決法が良く分かりませんでした. プログラム開始→OKボタン 普通に終了する プログラム開始→ボタン8→ファイル選ぶ→OKボタン ダイアログは消えるがプログラムは完全に死んでないみたい といった状況です. void CtestDlg::OnBnClickedButton8() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 //ファイルダイアログを表示してファイル指定する CFileDialog myDLG(TRUE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "AVIファイル(*.AVI)|*.AVI||"); if(myDLG.DoModal() != IDOK)return; }
31 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 18:42:07 ] >>30 おそらく問題は、示されたコード以外の場所にある
32 名前:30 mailto:sage [2009/09/07(月) 18:57:41 ] if(myDLG.DoModal() != IDOK)return; をコメントアウトすると問題なく動いていたのでここがだめなのかと思っていたのですが… ダイアログウィンドウがきえてもプログラムが終了しきれてないのはどういったのが考えられるのでしょうか
33 名前:30 mailto:sage [2009/09/07(月) 19:11:50 ] さすがにそれはエスパーすぎるか… んーなんなんだろ… そして何故かボタンをダブクリしても関数つくれなくなった…クラスウィザードとかいうのが立ち上がる…
34 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 19:27:17 ] >ダイアログウィンドウがきえてもプログラムが終了しきれてない 何を根拠として、こう判断したのかな?
35 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 19:30:39 ] >>34 画面下部のウォッチと出力のウィンドウが残ったまま タスクマネージャでみるとtest.exeが起動中 の2点からです. そして今ダイアログのボタンとか配置する画面で ボタンをクリックして右のプロパティのところを雷マーククリックして管理イベント開きたいのに そこが真っ白になってて操作できないという新しい問題が… 作ったボタンダブルクリックしてもMFC クラスウィザードとかいうのが立ち上がるし…
36 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 21:25:48 ] >>35 プロジェクトのフォルダにある *.ncb *.suo *.user を一度削除してみろ。
37 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 22:17:51 ] MFCは良く知らんけど、Win32APIではモーダルダイアログの終了には return の前に EndDialog を明示的に呼び出す必要がある。 これはモーダルダイアログのウィンドウプロシージャはOSの内部にあるからだ。 (アプリケーションのウィンドウプロシージャがアプリ自身の中にあるのと異なるという意味ネ) で、MFCにもCDialog::EndDialogがあり、OKとキャンセルではデフォルトで呼ばれるけど それ以外の場所から終わるときにはこれを呼ぶ必要があるとmsdn様が…
38 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 22:21:55 ] あと、ちょっと思ったけど、IDOK っていう定数マクロが TNOK って見えちゃうこと、よくあるよね?
39 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 16:33:28 ] >>36 消したら関数の追加などはできるようになりましたありがとうございます. >>37 OK キャンセル などのボタンは最初に出来ているものでやってます. ダイアログの×をクリックしても終わらないみたいです.
40 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 16:44:12 ] そのtest.exeが残ってるときにデバッグの中断して スタックトレースみるとどうなってるよ?
41 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 16:59:51 ] スタックトレースってどうやってみるんでしょうか? VS.NET 2005ですが… google-glogとかいうのいれなきゃむりなんかな?
42 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:02:00 ] ・・・まさか 『実はそのダイアログはモードレスでした』 なんてオチじゃないだろうなあ。
43 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:12:03 ] 特にいじってないはずなのでモーダルだと思います. 2つファイル名取得して画像の合成とかやってるんですが 画像の合成の関数とかは普通に動くんですよね. ただダイアログのOKボタン押してもexeが終わらないと….
44 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:18:44 ] >2つファイル名取得して画像の合成とかやってるんですが >画像の合成の関数とかは普通に動くんですよね. 問題なのはこのあたり以降のコトだろうから、>>31 だと言っている。 回答者はエスパーじゃないんだぞ。
45 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:47:05 ] 今試しにファイルネームの読み込みを 上にかいたようなものでなく 最初からプログラムにかいておいて上記の関数を呼び出さないでやってみると 処理が終わった後OKボタンをクリックすると無事にexeが終了しました. ファイルネーム取得関数になんかしらあるとしか思えないのですが… んでもってファイルネーム取得関数を後半部分コメントアウトして どの行を行うと終了しないかやってみたところ if(myDLG.DoModal() != IDOK)return; を書くと終了しなくなってしまうようでした….
46 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:54:57 ] if(myDLG.DoModal() == IDOK) だった場合はどう処理しているのか? >>30 にはそのあたりのことが書かれていないんだが。
47 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:55:56 ] void CtesthaloDlg::OnBnClickedButton7() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 //ファイルダイアログを表示してファイル指定する CFileDialog myDLG(TRUE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "AVIファイル(*.AVI)|*.AVI||"); @ } void CtesthaloDlg::OnBnClickedButton6() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 filename1=("C:\\Documents and Settings\\…\\videocamera3.avi"); filename2=("C:\\Documents and Settings\\…\\videocamera4.avi"); gousei(filename1,filename2); } ならOKで@のところにif(myDLG.DoModal() != IDOK)return;をいれると終了しないと言った感じ なんか複合的に問題が発生してそうでエスパーじゃなきゃむりそうですね… 一回プロジェクト作り直してみて確認してみようかな
48 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:58:05 ] >>30 のコードをそのままコピペして試したけど、ウチでは何の問題もないよ。
49 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 18:02:33 ] >>46 今はコメントアウトされてます 本来なら画像を取り込んでピクチャーコントロールに表示する感じです. >>48 やっぱりDoModalの問題じゃなさそうですね… プロジェクト作り直してやってみます
50 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 18:29:06 ] もう意味が分からなくなってしまった. 新しいプロジェクトで >>30 作る 終了できた!(ボタン1) 二つ目のボタン作る こっちでも>>30 まではできたので画像読み込みもやる やっぱ終了しない… >>30 まで戻すが何故か終了せず いやな予感してボタン1を試してみるとボタン1も終了しなくなってた なんだろう.なんかデバック情報が変な事になるんだろうか ボタン1については出来た後いじってないのになぁ エスパーじゃないと無理そうなのであきらめることにします.
51 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 18:37:15 ] そうだね。君の言っていることをすべて理解するのはエスパーじゃないと無理そう。
52 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 19:31:39 ] 付き合ってくださった方ありがとうございました.
53 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 12:00:35 ] スタックトレースはVC++だと呼び出し履歴とかの名前であるだろ
54 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 18:58:50 ] VC++.net 2002で猫でもわかるに掲載されているサンプルコードをビルドすると リンクエラーとなるのですがなぜでしょうか? #include <afxwin.h> class CMyWindow : public CFrameWnd { public: CMyWindow(); }; CMyWindow::CMyWindow() { Create(NULL, "猫でもわかるMFC", WS_OVERLAPPEDWINDOW); } class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMyApp MyApp; エラー error LNK2019: 未解決の外部シンボル __endthreadex が関数 "void __stdcall AfxEndThread(unsigned int,int)" (?AfxEndThread@@YGXIH@Z) で参照されました。 error LNK2019: 未解決の外部シンボル __beginthreadex が関数 "public: int __thiscall CWinThread::CreateThread(unsigned long,unsigned int,struct _SECURITY_ATTRIBUTES *)" (?CreateThread@CWinThread@@QAEHKIPAU_SECURITY_ATTRIBUTES@@@Z) で参照されました。
55 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 19:19:16 ] >>54 プロジェクトの設定が間違っている。
56 名前:54 mailto:sage [2009/09/09(水) 21:21:08 ] >>55 有難うございました
57 名前:54 mailto:sage [2009/09/09(水) 21:38:46 ] 、「ファイル」「新規作成」「プロジェクト」で 「Win32 Application」を選択して アプリケーションの設定でWindowsアプリケーション、空のプロジェクトで設定しているのですが どこが間違いなのでしょうか?
58 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 21:45:18 ] >>57 おまえウザイな。 自分で勉強するこ覚えろよ、屑
59 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 21:48:44 ] >>57 参考にしている「猫」のページに書いてある。
60 名前:54 mailto:sage [2009/09/09(水) 21:59:11 ] >>59 見落としてました。有難うございました!
61 名前:デフォルトの名無しさん [2009/09/09(水) 22:23:41 ] afxbeginthreadでAとBを生成しました。 AでnewしたデータをBに渡して、Bが使い終わったらBの中でdeleteしています。 そうするとBがdeleteした時にheapエラーで落ちるのですが。 どうしてなのか、全く解りません。 Aの中でdeleteしているような個所やB内で2度deleteを実行しているような所 初歩的なバグはありません。 教えて下さい
62 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 22:45:01 ] 悪い例 A:「作ったよ」 B:「ありがとう。・・・使い終わったから削除するね♪」 A:「・・・私が作ったのに勝手に削除しないでよ!この甲斐性なしっ!」 良い例 A:「作ったよ」 B:「ありがとう。・・・使い終わったよ♪」 A:「ん、じゃ削除するねっ」
63 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 23:08:38 ] ホントこのAで作ったもんをBで削除するプログラムを書こうって奴の気がしれない ふつーに特になんの経験もなく気持ち悪いと思わないのか? センスねぇなマジでw これ結構経験ある奴でもやるんだよね manko(new chinko); みたいにnewで作ったもんしか引数うけつけねーようなクラス書くキチガイ ポインタで渡すと中で強引にdeleteしようとしやがるのw なんでこんなもん作るんだマジでw センス0野郎の書くPGは本当にわからないw
64 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 23:12:50 ] マウスをドラッグ&ドロップするとき 新しいGDIオブジェクトを生成したとき …などなど、MFC(というよりWin32APIのせいなんだろうが)は RAIIの原則をしばしば無視する。 だからその感覚が染み付いている人は マルチスレッドについても 作る場所と壊す場所が別々で当たり前と感じてしまうのかもしれない。 っていうか、MFCはC++的に見るとキモい使わせ方するライブラリ多いよね。
65 名前:デフォルトの名無しさん [2009/09/09(水) 23:20:55 ] >>61 バグがあるんじゃね? >>62 組み込みでOS使ってたりするとタイミングとか生存期間が非常にしびやな時が多くて タスク同士の同期をとってたりすると、もうグダグダな〜時が多いから 悪い例の方を使う事が多い ウィンドウズの場合は、new、deleteする代わりにvectorとかStringとか使って データの完コピする場合が多いからね〜
66 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 23:32:29 ] 確かに組込みでは、ポインタを渡して相手に全てをほおりなげる場合が多いね。 ウィンドウズも昔はCPU、ソフトが非力だったから相手に後処理を任せて終わりと 昔からの流れが残ってるんだと思ってる。 マルチ・スレッド/タスクで、相手が使い終わったのを待ったりとか 意識しようとすると無駄な時間が多くなる。
67 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 23:47:51 ] うろ覚えでなんだが、会社の新入りがこんなコードを書いてきた。 -- if (pCombo->getCurSel()) { pCombo->setCurSel(pCombo->getCurSel() - 1); pCombo->deleteString(pCombo->getCurSel() + 1); } else { pCombo->setCurSel(pCombo->getCurSel() + 1); pCombo->deleteString(pCombo->getCurSel() - 1); } -- 私みたいにXlibの時代から書いている人間にとって、値を取得してからセットして もう一回取得するなんてどう見ても待たされそうな処理はなんとももにょってしまう。 それも然り乍ら、なんとも胡乱な振る舞いをさせようとすることよ。 彼奴の頭の中を覗いてみたくもあり、覗きたくなくもあり。
68 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 00:05:55 ] 63が、特になんの経験もない事はよく解ったwwwwwww
69 名前:デフォルトの名無しさん [2009/09/10(木) 00:20:59 ] >>62 まともな経験がある人ならば、どれが良くてどれが悪いとは安易には言えないはず。 どこで誰がどう削除するかはそのシステムに合わせてインターフェースを きっちり決めとけば良い話。 A:「頼まれていた会議の書類を作成して、印刷しておきました。」 B:「ありがとう」 ↓ (B会議終了) ↓ B:「書類返すよ」 A:(てめーで、捨てろや死ね)
70 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 00:32:49 ] その例は、Bに「まともな経験」がないだけの話。
71 名前:デフォルトの名無しさん [2009/09/10(木) 00:35:43 ] 62=70
72 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 00:48:48 ] 結局はモジュール間で決めとけば、どうでも良い 俺はくみこみ知らんが、ポインタ投げて終了の仕組みも作る時もある こっちはもう使わないのに相手の顔色見ながら、返却待ちのタイミングを 伺うなんてアホらしい 以上、終了
73 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 01:03:21 ] すみません、>>61 です 色々とお騒がせして、申し訳ございません 私の考えは、>>72 さんと同じ考えでした それぞれが非同期で動いてる場合、同期をとる仕組みを入れるのが面倒ですし もう必要ないから、B側で削除してもらっていました もう少し詳しく言うとスレッドが10個ほどあり、使った奴が削除すると言った仕組みで 動いています AはBに渡す Bは使わないならCへ、CはDへと・・・ だからこそ、使った人に削除して貰いたかったのです それとvectorの話が出ていましたが、vectorとかを使ってデータをコピーしても 構わないと言えば構わないのですが データサイズが大きい時はそれなりのサイズになってしまうので データをコピー(newして代入)なんて言う無駄な処理とメモリのフラグメンテーションを 起こすような処理はさせたくなかったのでポインタでやってました
74 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 06:35:29 ] >>72 >こっちはもう使わないのに かどうかはわからないよね? もし、使いたくなっとしても使わないんじゃなくて使えない状態じゃん しかも、それがわかるのは組んだ自分だけだろ? 下手糞実装ってことは認識して使えよ
75 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 08:56:32 ] MFCだったらdelete this が常識
76 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 18:36:15 ] >>53 呼び出し履歴のことでよかったんですか教えてくださってありがとうございます. ntdll.dll!7c94e514() [下のフレームは間違っているか、または見つかりません。ntdll.dll に対して読み込まれたシンボルはありません。] ntdll.dll!7c94df5a() kernel32.dll!7c8025cb() kernel32.dll!7c802532() ole32.dll!769f5532() ole32.dll!769e3551() ole32.dll!769e34c1() ole32.dll!769d4ecc() msvcr80.dll!78132bd9() ole32.dll!76984212() > highgui110.dll!_CRT_INIT(void * hDllHandle=0x10000000, unsigned long dwReason=4038497417, void * lpreserved=0x00000001) 行 412 + 0x9 バイト C highgui110.dll!__DllMainCRTStartup(void * hDllHandle=0x10000000, unsigned long dwReason=0, void * lpreserved=0x00000000) 行 512 + 0x8 バイト C highgui110.dll!_DllMainCRTStartup(void * hDllHandle=0x10000000, unsigned long dwReason=0, void * lpreserved=0x00000001) 行 462 + 0x11 バイト C 上から数行だとこんな感じで highfui110〜の3行が黒文字,他灰色文字になってました. .dllばっかりならんでてよくわからないですが
77 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 19:06:41 ] >>76 だからなんだよ。 いい加減、ウザイから氏ね
78 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 22:38:32 ] >>72 音声のRTPパケットだから二度と使わないし、使いたくなる事は100%ありえない 使いたい頃に使ったら、プロトコルに違反するし、音声がめちゃくちゃになる 二度と使えないのは、仕様書にしてあるから、チーム全員知ってる なんで、そんなに自分の考えが完璧だなんて、ゴリ押しするんだ お前はどんだけ偉いんだ どうせ、お前みたいな奴なんて、そこらへんの派遣野郎だろ
79 名前:デフォルトの名無しさん mailto:sage [2009/09/11(金) 11:00:37 ] Producer - Consumer Pattern だと、 Producer で new, Consumer で delete するのが素直。
80 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 15:47:55 ] >>74 て、アホだね 生きてて恥ずかしくないの?? 早く死ねば良いのに 一番自分が下手くそなのにWWWWWWWWWWWWWWWWWWW
81 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 16:26:24 ] >>80 (訳:論破されちゃった!くやしい!ビクッビクッ!) 笑
82 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 12:13:25 ] CScrollViewのOnInitialUpdate()でCToolTipCtrlクラスをm_cToolTipCtrl.Create( this ); ってやると落ちる。。。 これってダメ?
83 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 12:18:51 ] >>82 OnInitialUpdateが呼ばれるのは一度だけじゃない。 よって、何度も作ろうとするからエラーになる。
84 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 12:26:37 ] >>83 ありがとう。 なるほどねー…。 久々にMFCやったから気づかなかった。。。 とりあえず if( !cToolTipCtrl ) { m_cToolTipCtrl.Create( this ); } ってしたらいけた!
85 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 17:04:34 ] Visual Studio 2005 Pro/Visual C++/MFCで開発をしています。 IPアドレスコントロール(CIPAddressCtrl)の背景色を変更したいのですが、 CIPAddressCtrlのサブクラスとしてCMyIPAddrCtrlを作成し、 以下のようにコンストラクタとOnCtlColorをオーバーライドしても、 背景の一部の色しか変更できません(リンク先の画像を参照ください)。 CMyIPAddrCtrl::CMyIPAddrCtrl() { m_Brush.CreateSolidBrush(RGB(255, 0, 0)); // m_Brushはヘッダーで「CBrush m_Brush;」と宣言済み } BEGIN_MESSAGE_MAP(CMyIPAddrCtrl, CIPAddressCtrl) ON_WM_CTLCOLOR() END_MESSAGE_MAP() HBRUSH CMyIPAddrCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CIPAddressCtrl::OnCtlColor(pDC, pWnd, nCtlColor); pDC->SetBkColor(RGB(0, 255, 0)); pDC->SetTextColor(RGB(0, 0, 255)); // 試しにテキスト色も変更しています return m_Brush; } 結果:ttp://nukkorosu.80code.com/img/nukkorosu11151.png 上記画像で白色になっている部分の色を変更するにはどうしたらよいでしょうか?
86 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 21:16:40 ] 一寸試してみたけど、結局OnPaintをオーバーライドするしかないっぽい。 まあ、普通のテキストボックスに変えてしまうのが一番だろうね。
87 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 21:26:08 ] >>85 IP アドレスコントロール は複数のウィンドウからできているので、そのコードでは 子ウィンドウであるエディットコントロールの部分しか変更できない。 白い部分の色を変えるには OnPaint() をオーバーライドして自前で背景を塗りつぶすしかないが、 このときは数値の間にあるドットも自前で描画する必要がある。 >m_Brush.CreateSolidBrush(RGB(255, 0, 0)); // m_Brushはヘッダーで「CBrush m_Brush;」と宣言済み >pDC->SetBkColor(RGB(0, 255, 0)); ・・・背景色と背景ブラシの色が違うなんて。
88 名前:87 mailto:sage [2009/09/16(水) 21:29:43 ] >>86 すまん、かぶったね。 >普通のテキストボックスに変えてしまうのが一番 そう、それが一番。
89 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 00:48:35 ] 他プロセスのリストコントロールに表示されている数値を監視するプログラムを作ってます。 ぐぐったらVirtualAllocExとLVM_GETITEMTEXTメッセージを組み合わせれば良いとわかったので、以下を繰り返して取得しています。 相手ウィンドウのHWNDからpidを求め、PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITEでOpenProcessする ↓ VirtualAllocExで、アドレス指定はNULL、MEM_COMMIT、PAGE_READWRITE、サイズは文字列バッファ(64バイト固定長)+sizeof(LVITEM)ぶんのメモリを確保 ↓ ローカル変数でLVITEM変数を宣言、ゼロクリアした後以下を代入 iItem,iSubItem←必要なマス目の座標(いつも同じ場所) pszText←上記確保したメモリ+sizeof(LVITEM) cchTextMax←64 ↓ そのLVITEM変数のポインタから確保した先頭アドレスにWriteProcessMemoryする ↓ LVM_GETITEMTEXTをSendMessageする ↓ 確保したメモリの先頭+sizeof(LVITEM)を64バイトReadProcessMemoryして文字列ゲット ↓ 確保した先頭アドレスを指定、MEM_RELEASEにてVirtualFreeExする ↓ プロセスハンドルをCloseHandleする 実際、おおむねこれで取得できているのですが、数十回ほど取得を繰り返すと相手側が「Visual C++ RunTime Error! Abnormal Program Termination」と表示して落ちてしまいます。取得するたびSleep(100)などしてみましたが駄目でした。どなたか解決策をご存知ないでしょうか?
90 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 01:17:53 ] >>89 自分の書いた処理内容をよく見て、デバッガで追え。 悪いのはおまえだ。
91 名前:85 mailto:sage [2009/09/17(木) 10:29:06 ] >>86 >>87 ご回答ありがとうございます。 挙動から入力部分のウィンドウの下にもう一個ウィンドウがあるように 見えたのですが、やっぱりそうだったのですね…。 OnPaintのオーバーライドまでするとなるとちょっと手間なので、 おっしゃるとおりテキストボックスで実装してみたいと思います。 > ・・・背景色と背景ブラシの色が違うなんて。 このほうが何を書いたらどこが変わるかわかりやすいかなぁと思ったので(^^; 実際には同じ色で塗りつぶします。
92 名前:85 mailto:sage [2009/09/17(木) 20:25:10 ] 85です。ちょっと気になったのでOnPaint()のオーバーライドに挑戦してみました。 あまり考えずに>>85 に下記のコードを追加したら、それっぽいのができました。 BEGIN_MESSAGE_MAP(CMyIPAddrCtrl, CIPAddressCtrl) ON_WM_CTLCOLOR() ON_WM_PAINT() END_MESSAGE_MAP() void CMyIPAddrCtrl::OnPaint() { CPaintDC dc(this); CRect rect; GetClientRect(&rect); dc.FillSolidRect(rect, RGB(255, 255, 0)); int w = rect.Width() / 4; for (int i = 1; i < 4; i++) { dc.SetPixel(w * i + 1, 11, RGB(0, 0, 0)); dc.SetPixel(w * i + 1, 12, RGB(0, 0, 0)); } } これでなんとか目的の動作を組み込めそうです。本当にありがとうございました!
93 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 21:03:24 ] そしてディフォルトじゃない色の設定にしている環境で阿呆を見ると。 あーフォントサイズもやばいかなw
94 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 01:16:05 ] > int w = rect.Width() / 4; もうちょっと真面目に計算すべしw >dc.SetPixel(w * i + 1, 11, RGB(0, 0, 0)); >dc.SetPixel(w * i + 1, 12, RGB(0, 0, 0)); RGB( 0,0,0) → ::GetSysColor( COLOR_WINDOWTEXT)
95 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:11:36 ] AfxSetAllocStop の使い方を超知りたいのに、MSDNに載ってないってどういうことよ^^;;;
96 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:26:21 ] >>95 _CrtSetBreakAlloc() を呼んでいるだけだから、使い方はそっちを参照すればよろし。
97 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:39:54 ] >>96 おぉ、すばらしい!載ってました! サンクスです。^^
98 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 12:34:57 ] SetTimer()でセットしたタイマを 残り時間を保持したまま一時停止や再開する方法はありますでしょうか。 別のダイアログをDoModal()で出して待っている最中も WM_TIMERが発生するようなので、その間はタイマを止めておきたいのですが、 いったんKillTimer()で止めてしまうと待ち時間が戻ってしまい、 タイミングによっては延々と発生しない状態になってしまいます。
99 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:02:50 ] >>98 もっとも簡単な方法は、DoModal() する前にある種のフラグをたててタイマー処理を回避し、 制御が戻ってくればタイマー処理を復帰させればいい。 CMyDialog dlg; m_bDisableTimer = TRUE; dlg.DoModal(); m_bDisableTimer = FALSE; CxxWnd::OnTimer( ...) { if ( m_bDisableTimer) return; // ToDo... }
100 名前:98 mailto:sage [2009/09/28(月) 15:15:03 ] >>99 ありがとうございます。 やっぱりそういう方法になるのですね。 この場合もダイアログ表示のタイミングによっては ToDoのところまで行かない状態が続いてしまいますが、 タイマでやっている以上は避けられないのかな。
101 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 16:22:33 ] >この場合もダイアログ表示のタイミングによっては >ToDoのところまで行かない ダイアログが表示された時点( WM_INITDIALOG を処理する時点)で、 m_bDisableTimer = TRUE; にする。
102 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 21:21:33 ] 久々に見たが、>>74 のアホ具合が際立っててワロタ >>74 は、ハヨー死ね、
103 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 00:43:13 ] >>100 タイマー+カウンターでやる、という手もある。 例えば5000msなら500ms×10カウントとか。 で、OnTimerはこんな感じで。 if ( (counter += (counter < 10)) < 10 ) return; if ( m_bDisableTimer ) return; // なんか色々処理 counter = 0; WM_TIMER直後かつ500ms以内にダイアログを開きなおす、 とかやらなければ実行されるはず。
104 名前:98 mailto:sage [2009/09/29(火) 09:28:18 ] >>101 >>103 ありがとうございます。 自腹でカウンタ処理をやれば、一時停止に近いことはできますね。 タイマ自体を一時停止する方法は無さそうですし、 タイマ+モーダルダイアログって、 やってることはモードレスダイアログっぽくなってしまうんですね。 うかつにメッセージボックスも出せないってことだったのか。
105 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 09:36:41 ] 残り時間を保持とか言ってるから根本的に勘違いしてる。
106 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 14:12:42 ] >>104 ↓ 知ってる? The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue.
107 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 20:56:34 ] 皆様に質問です。 Visual Studio 2008 MFC FeaturePackを調査していますが、 追いきれない箇所があったので投稿します。 MFCのSDIで作成したフレームワークで CFrameWndのメンバにm_wndMenuBar(CMFCMenuBar型)ってのがあります。 これから、m_wndMenuBar.GetHMenu()でメニューハンドルを取得し DeleteMenu、EnableMenuItem、ModifyMenuなど 今までどおりCMenuと同等な操作をしても、 表示されているメニューバーに変化が無いのです。 何かやり忘れの処理とかあるんでしょうか? それとも、そういうものなんでしょうか? ※たとえば、DeleteMenuの実行結果はTRUEを返し、 メニューバー[表示(V)]→[ツールバーとドッキング ウィンドウ(T)]→[カスタマイズ...]の カスタマイズダイアログのコマンドからは消えていますが、 メニューバーの一覧からは消えないのです・・・ 何か、コツがあるんでしょうか? 知っている方、情報を願います・・・
108 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 21:40:23 ] >>107 CMenuをいじった後で、CMFCMenuBar::CreateFromMenuで戻してやると反映するけど。
109 名前:107 mailto:sage [2009/10/05(月) 23:53:12 ] たとえば、CMainFrame::OnCreateの最後に { HMENU hMenu = m_wndMenuBar.GetHMenu(); if (hMenu){ BOOL bRet = ::DeleteMenu(hMenu, ID_EDIT_CUT, MF_BYCOMMAND); m_wndMenuBar.CreateFromMenu(hMenu); } と入れてみたけど変化なし。 OnCreate時じゃダメなんですかね?
110 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 00:08:43 ] >>109 ほんと馬鹿は始末に負えないな。 ここまで教えてもらって、なんで自力で解決しようとしないのか。 できない馬鹿だからこそ質問を繰り返すんだろうが、そんな自分は屑だと自覚しろ。
111 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 00:25:45 ] >>109 >BOOL bRet = ::DeleteMenu(hMenu, ID_EDIT_CUT, MF_BYCOMMAND); 言っておくが、ポップアップメニューの項目を削除したいなら CMFCMenuBar をいじってもダメ。 CMFCPopupMenu::RemoveItem() を使う。
112 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 00:35:19 ] でもわからんでもないな ホントMFCって意味不明なとこあるものな 正直、はじめはなんかのサンプルをコピペして作っていくしかないと思うな んでメッセージの流れとか覚えたらそういうのやっとチョボチョボ手が出せるようになる 1度動くもんとコードを誰かに一致させてもらわない限り 人に聞くしかねぇだろうな 俺もサンプル漁るたびにそう思うわ 自分でヘルプ読みながら研究すると大抵糞くだらないことでも1日作業 このフレームワークだりぃよw 最近、VBでは楽にできるらしいエクセルなんかの機能を組み込め的要求がウゼェ
113 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 02:06:36 ] >>112 ドキュメントも読めない、サンプルソースもおえないアフォは氏ねば? ヘルプ読みで1日とか、調べ方もしらないんじゃその方がいいだろ。
114 名前:デフォルトの名無しさん [2009/10/06(火) 08:00:34 ] 過去そうやって偉そうなこと言ってて いざやらせてみると時間かかる人ばっかりだったからお前も似たようなもんだと思う(笑) 微妙なところで時間くうだろ?
115 名前:107 mailto:sage [2009/10/08(木) 08:20:16 ] CWinAppEx::CleanState()を実行したら反映されました。 どうも、メニューカスタマイズ情報とか保持してるようですね・・・ みなさまありがとうございます
116 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 22:10:53 ] >>112 オートメーション? であれば、MFC関連ドキュメント探すよりVBAのヘルプ見た方が速いよ
117 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 23:29:27 ] 日本語版MSDN読んでる限りはMFCは躓きの連続だろうね。 英語版と比べると情報省きすぎ。^^;;;;;;;;;;;;;;;;;;;;;オコルゾ
118 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 02:10:21 ] >>117 英語版読みなさい^^;;;;;;;;;;;;;
119 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 11:30:20 ] たいていのことはソース読めばわかる
120 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 21:02:37 ] ドキュメント・ビュー・アーキテクチャを使っている場合で、読み書きする ファイルの拡張子を設定するには、どのような方法があるでしょうか?
121 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 21:13:36 ] CDocument は、ドキュメントの新規作成、読み込み、保存のような標準の操作をサポートします。 フレームワークは、CDocument で定義されたインターフェイスを使って、ドキュメントを操作します。
122 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 21:47:49 ] >>120 CWinApp::OnFileOpen() と CDocument::OnFileSaveAs() を 好きなようにオーバーライドすりゃいい。
123 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 23:11:51 ] >>120 ワークスペース新規作成時のメニューをよく観察する事 >>122 CDocument::OnFileOpen()と CDocument::OnFileSaveAs()じゃね?
124 名前:122 mailto:sage [2009/10/16(金) 00:11:13 ] >>123 >CDocument::OnFileOpen() 残念だが、こういうメソッドはない。 CDocManager::OnFileOpen() と書きたかったのかもしれないが、 これとて、ファイルオープンダイアログを表示して得られたファイル名を CWinApp::OpenDocumentFile() に 渡しているだけなので、CWinApp::OnFileOpen() 内でこの操作をすれば、回り道する必要は何もない。
125 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 00:14:34 ] いつもダイアログベースでドキュメントクラスなんて使ったことねーけど なんかいいことあるの?
126 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 01:31:36 ] void PleaseReadExplanation() { 『ドキュメント/ビュー アーキテクチャが適さない場合もあります。たとえば、次のような場合です。 ・C で記述された Windows 対応のアプリケーションを移植していて、アプリケーションにドキュメント/ビューのサポートを 追加することよりも、移植作業自体を完了することの方が先である場合。 ・簡単なユーティリティを作成していて、ドキュメント/ビュー アーキテクチャは不要と判断できる場合。 ・元のコードで既にデータ管理とデータ表示が混在している場合。』 } MFCのドキュメント・ビュー・アーキテクチャがいい悪いは別にして、 MVC的な手法のほうがコードがごちゃごちゃしなくていい場合も多々。
127 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 06:21:17 ] CDocTemplate アプリケーションはサポートするドキュメントの型それぞれに 1 つのドキュメント テンプレートを持ちます。 たとえば、アプリケーションがスプレッドシート (表計算) とテキストのドキュメントをサポートしていれば、 アプリケーションは、2 つのドキュメント テンプレート オブジェクトを持ちます。 それぞれのドキュメント テンプレートは、対応する型のすべてのドキュメントの作成、管理を行います。 ドキュメント テンプレートは、ドキュメントの型とともに使われるリソース (メニュー、アイコン、アクセラレータ テーブルなど) の ID を保持します。 ドキュメント テンプレートは、またドキュメントの型についての付加情報を持つ文字列も持っています。 これらは、ドキュメントの型の名前 (例 : "Worksheet")、ファイルの拡張子 (例 : ".xls")、そしてオプションで、 ファイル マネージャや OLE などのユーザー インターフェイスで使われる文字列などを含みます。
128 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 06:27:19 ] そんなアプリねーよーなぁ?w VCだって設計微妙だしなw ええーwそこでこの構造使うの〜?w的なw
129 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 14:08:29 ] CMap<CString, LPCTSTR, CString, LPCTSTR> と CMapStringToString って、 やってることは結局まったく同じですか? それとも、効率や安全などの面でこっちを使うべきとかありますか?
130 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 17:49:00 ] MFCは慣れればすんごい便利なんだよな。ウチみたいに組み込み系で UI付きツール作ってくれってときにね。いろんなC++のSDK使うから C#とかも使えない。 それよりも困ってるのがリソースかな。特にアイコン。 もっとカッコいいのとか、統一されたデザインとか要求されて困る。 ここはアニメーションさせてくれとか言われると泣きたくなる。 みんなはどうしてる?有料でもいいんでビジネス用途で使える アイコン集ってものはないかな?ぐぐればいろいろ出てくるけど どうにも種類が足りなくて。
131 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 18:28:44 ] >>130 種類は豊富なんだが、商用利用となると・・・。 www.iconspedia.com/
132 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 19:40:45 ] 具満タンとかイラ満タンとかなら商利用可能じゃよ。
133 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 01:23:09 ] >>131 ここは知らなかったな〜。ありがと。 >>132 パッケージは販売終了してるね。絵 単品高すぎる。 ttp://jp.infragistics.com/netadvantage/icons.aspx#Overview ここのがなんかパッケージでなんかよさげなんだけど、サンプル見ると 同じアイコンにショートカット矢印みたいのが付いたのも含めて数に カウントしてるみたいなんで、11000種類って書いてあっても実際には 1/10くらいなんだけろうなって感じがする。
134 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 19:53:46 ] >>125 使い捨てツールを作る場合に便利だな。あんまし余計な事を考えなくて済む。 本体となるとさすがに自作ライブラリを優先するけど。
135 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 22:10:55 ] 2010でスタンダードエディションなくなるってさー。 今までupg15kで便利なMFCが使えてたけど これからはupg55k必要。ますます絶滅方向だ。
136 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 14:38:26 ] CClientDC dc(this)でクラスを作り、 デストラクタでリリースされるにもかかわらず、 this->ReleaseDC(&dc);としたらどうなりますか? 逆にリークの原因になったりしますか?
137 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 15:23:09 ] 試せばわかるので質問するよーなことではないと思うが、いちおう応えておく。 答はNO。 デストラクタでの ::ReleaseDC() が失敗するだけ。
138 名前:デフォルトの名無しさん [2009/10/26(月) 01:39:34 ] CDialogを親クラスに持つクラスで、OnPaint()以外の場所でdcを取得したいときはどうすればいいんでしょうか?
139 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 02:07:56 ] GetDC()、ReleaseDC()。 CWnd::GetDC, CWnd::ReleaseDC
140 名前:デフォルトの名無しさん [2009/10/26(月) 02:23:37 ] CDC *pDC=CWnd::GetDC(); CWnd::ReleaseDC(pDC); とするとコンパイルできるのですが、実行するとエラーが出てしまい困ってるんです。
141 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 02:35:00 ] そのエラーの原因は別のところにある
142 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 10:09:16 ] CWnd::GetDC()という書き方は・・・ スタティックな関数じゃないんだし、CDialogはCWndの派生クラスだし そのままGetDC()と書けるだろう
143 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 20:36:50 ] むすどん読んだ限りではGetDCはvirtualじゃないから 理屈としてはCWnd::GetDC()でも通るんじゃないか? 実験してないけど。w
144 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 21:04:24 ] >通るんじゃないか? 通るよ。だから、あえてそこは指摘せずに「原因は別にある」と書いた。
145 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 21:40:39 ] WS_EX_APPWINDOWの属性を持つウィンドウで、 最小化したときに右下では無く、左下にアニメーションさせることって可能? なんかコツあるんですかね?
146 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 21:58:52 ] それやってるのMFCなのか?
147 名前:145 mailto:sage [2009/10/27(火) 22:02:06 ] ごめん逆 左下を右下への間違い
148 名前:145 mailto:sage [2009/10/27(火) 22:11:10 ] >>146 MFCでいじっています。 MFCのCMainFrame::OnSize(UINT nType, int cx, int cy)にて、 苦戦中。
149 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 08:38:29 ] SetWindowPlacementでできる
150 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 09:53:22 ] タスクバーを右にしてるオレの環境だと左下にいかないけど
151 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 09:54:33 ] そもそもタスクバーにある最小化したアプリの場所にアニメーションするな、Vistaだけど
152 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 11:17:28 ] CMainFrameの拡張ウィンドウスタイルで WS_EX_APPWINDOWを外し、WS_EX_TOOLWINDOWを加える んで、最小化する手前で // タスクバーのハンドル HWND hTaskbar = ::FindWindow(_T("Shell_TrayWnd"), NULL); // タスクトレイのハンドル HWND hTasktray = ::FindWindowEx(hTaskbar, NULL, _T("TrayNotifyWnd"), NULL); hTasktrayにGetWindowRect使えば位置がわかる。 ※隠れていてもその位置が求まる。 あとはGetWindowPlacementで現在値を取得し、 WINDOWPLACEMENTのptMinPositionを差し替え、 flagsにWPF_SETMINPOSITIONをセット。 SetWindowPlacementで更新って感じ
153 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 23:22:17 ] 質問です、文字列を扱う場合MFC使いの皆さんは、 またはchar* なのでしょうか? std::string は使わない派ですか?
154 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 23:25:13 ] 訂正です 質問です、文字列を扱う場合MFC使いの皆さんは、CString またはchar* なのでしょうか? std::string は使わない派ですか?
155 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 10:02:51 ] CString使う前提で設計されてる
156 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 10:15:00 ] MFCを使う関数では大抵CStringで済ませるが、文字列処理をする関数ではstd::stringを使う。
157 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 10:42:57 ] おいらはCStringでstlは使わないに統一 サイズ可変配列もCArray<>とかCTypedPtrArray<>とかで まぁ個人で作ってるものだからだけど
158 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 19:01:20 ] >>154 です レスサンクスです stl を多用したtemplate 非MFCのライブラリがあるのですが そのライブラリへCString を渡す場合、何か注意すべきところがあれば教えて頂けないでしょうか?
159 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 20:01:16 ] 渡さないほうが良い stringへのらっぱー書く方が良い
160 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 20:09:24 ] >>158 そのライブラリがconst char * を受け取るならそのまま渡していいと思う。 そのライブラリがstd::stringを受け取るなら、std::stringのラッバを用意した方がいい。
161 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 21:07:22 ] >>154 です ありがとう。
162 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 08:11:44 ] >>154 です。おはようございます、 ラッパークラスを意識して書いたことが無いので、勘違いをしている可能性があるので 駄目出し、及びご指導お願いします。 /** * @brief std::stringからCString(MFC)へ変換 * @date 2009/11/7 * @param[in] std::string str * @return str.c_str() */ class ConvertToCString { public: ConvertToCString() : str_("") {} const CString operator()(std::string str) const {return str.c_str();} private: std::string str_; }; /** * @brief CString(MFC)からstd::stringへ変換 * @date 2009/11/7 * @param[in] CString cstr * @return static_cast<LPCTSTR>(cstr) */ class ConvertTostring { ConvertTostring() : cstr_("") {} const std::string operator()(CString cstr) const {return static_cast<LPCTSTR>(cstr);} private: CString cstr_; };
163 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 10:43:16 ] おかしいな? std::string str = "CString_convert"; CString cstr = ConvertToCString(str); cstr = "std;;string_convert"; str = ConvertTostring(cstr); こうすると error C2440: '初期化中' : 'ConvertToCString' から 'ATL::CStringT<BaseType,StringTraits>' に変換できません。 何処が悪いのでしょうか? CString cs("Hello"); std::string s((LPCTSTR)cs); std::string ss("Hello"); CString ccs(ss.c_str()); これは動くので、簡単にできると思ったんですが・・・・
164 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 15:08:39 ] >>163 一応、↓で出来るとは思うが、どうせ c_str() の呼び出しか LPCTSTR へのキャストで済むんだから、 わざわざクラスまで作る必要はないと思う。 コードを見た感じだと、Unicode文字セットを使っている訳ではないようだし。 class ConvertToCString { public: ConvertToCString(std::string str) : str_(str) {} operator CString() const {return str_.c_str();} private: std::string str_; }; class ConvertTostring { public: ConvertTostring(CString cstr) : cstr_(cstr) {} operator std::string() const {return static_cast<LPCTSTR>(cstr_);} private: CString cstr_; };
165 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 18:33:27 ] >>164 ありがとう、やっぱり勘違いしていました^^; >わざわざクラスまで作る必要はないと思う。 そうですね、自分もそう思います、ただ一点お聞きしたいのですが ラッパークラスのイメージといいますか、認識はこのような感じでいいのでしょうか?
166 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 23:34:49 ] お前は物事の一部だけを見て すべてを分かったつもりになる香具師なのか?
167 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 23:48:47 ] 一を聞いて十を知る、それがわたしです。
168 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 23:59:58 ] 一を聞いて十を知ったつもりになる、の間違いでは?
169 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 00:02:11 ] おまえは俺の何を知っているのだ。
170 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 23:19:35 ] CWinAppExでレジストリを使わないようにする方法ある?
171 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 10:14:27 ] 自動生成されるコードの該当部分を消せばいい
172 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 16:13:44 ] InitInstanceのあの1行さえ消せばIniファイルが使われるようになる
173 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 18:08:05 ] 余談でCWinAppExで追加されたCleanStateメソッドってのがある。 MFC Feature Packの影響で、レジストリ情報との差異による問題とかでてきたら、 コマンドラインとかで呼び出せる様にした方がいいかもね。 (それこそ、InitInstanceのあの1行の次の行あたりで)
174 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 23:46:57 ] オーナードローでXPやvistaのような外観のボタンにするにはどうしたらいいでしょうか?
175 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 00:24:48 ]
176 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 00:27:01 ] >>174 ::OpenThemeData() でテーマハンドルを取得したのち、::DrawThemeBackground() でパーツを描画する。
177 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 15:19:08 ] VC2005でMFCで画面つくってますが ボタンを押したときにOnButtonで呼ばれる処理を ボタン押し続けで連続処理させるいい方法ありませんか?
178 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 15:34:31 ] ボタン関係のメッセージで可能
179 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 15:55:05 ] >>178 具体的にどんか感じですか? ボタン押し続けだと1回しかメッセージきませんよね?? 連続にできるってことですか?
180 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 15:58:53 ] タイマー起動して押してある間、適当なメッセージ送りつづけるとか。
181 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 16:09:22 ] >ボタン押し続けで連続処理させるいい方法 (1) ボタン押す→WM_LBUTTONDOWNがボタンに飛んでくる。 (2) ボタン放す→WM_LBUTTONUPがボタンに飛んでくる。 →(1) のタイミングでタイマなりを動かして、一定間隔で親にWM_COMMANDを送る。 →(2) のタイミングでタイマを切る。 ボタンを押さえたままウィンドウが非アクティブになるとWM_LBUTTONUPは飛んでこないから それなりに工夫は必要。
182 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 16:21:20 ] タイマー等で自分で実装するしかないんですね もう少しスマートな方法があるといいんですが…
183 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 16:23:31 ] >>177 ttp://www.codeproject.com/KB/buttons/autorepeat.aspx 評価は微妙だし、非アクティブ対応も甘そうだし、キーボードにも対応していなさそうだけど、 >>181 の実装例。
184 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 16:32:43 ] >>183 見たところ、確かに非アクティブ対応は甘いね。 OnLButtonUp() では、ReleaseCapture() だけ実行すればいい。 その他の処理は WM_CAPTURECHANGED を捕まえて、そこで実行する。
185 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 16:34:46 ] PeekMessageを使ってWM_LBUTTONDOWNのみNOREMOVEなループの中で処理したらどうだ? 割り当て可能なすべてのアイドル時間がボタンダウンのために処理されるから ものすごい勢いだぞ^^
186 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 17:14:52 ] 押した時と離した時しかメッセージ発生しないから タイマー嫌なら離したメッセージが来るまで永遠にループさせるしかないな。
187 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 17:22:44 ] キーみたいにリピート設定できた気がするんだが忘れ散った
188 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 17:30:10 ] ゲームマウスでも買って好きなように設定して使え。
189 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 17:47:58 ] キーボードもハードの方でタイマー使ってるようなもんだしな
190 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 18:33:10 ] MFCがサポートしてない機能はスレ違い
191 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 23:06:24 ] Win32APIスレで聞いた方が良いと思う
192 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 16:03:27 ] CListなどのPOSITION値って、 その値を取ったあとに追加や削除などの操作を行っても 当初の場所を指す値としてずっと有効のままなのでしょうか? それとも、CWnd::GetDlgItem()などのように どこかのタイミングで無効になるのでしょうか?
193 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 17:25:25 ] 動かさなければ同じ場所に留まり続けると思うが。GetDlgItem()もまた然り。
194 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 09:34:20 ] > 動かさなければ同じ場所に留まり続けると思うが。 これはMSDNのどこかに明示されていますでしょうか? 「ブックマークとして使うと、リスト内の位置を保持できます」 という説明はあるのですが、要素を追加したり、 他の要素を削除をしても対象要素のPOSITION値自体は変わらないものなのか、 そのへんの記述を見つけられません。 > GetDlgItem()もまた然り。 CWnd::GetDlgItem()の説明には 「返されるポインタは、一時的なポインタです。 後で使用するために保存しておくことはできません。」 と書いてあり、実際、アイドル時だかどこかで無効になります。 ダイアログクラス内にDDXメンバとして実体があれば常に有効かもしれませんが。
195 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 10:28:18 ] >POSITION 型の変数はリストのキーとして使います。 だからキーが使えなくなったらキーの意味ないだろ 心配ならソースついてるんだからMFCソース読めよ
196 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 23:32:01 ] ダイアログベースで、ファイルを指定したフォルダにコピーするソフト を作っています。(ウォークマンにmp3をランダムに転送するため) SHFileOperationAを使ってコピーを行っているのですが、 ダイアログにコピー処理を書いているので、コピー中にダイアログの操作ができません。 コピーの時間が30〜60分と長いので、もどかしいです。 コピー中もダイアログの操作ができるようにするにはどうすればいいでしょうか? (コピー用のスレッドを作って、そこでコピー処理をすればいい?
197 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 00:17:39 ] yes we can
198 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 12:31:39 ] これで君もワーカースレッド使いにレベルアップだ
199 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 13:46:35 ] お茶くみとコピーばかりはもう飽きた!
200 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 13:54:24 ] ボタンにビットマップを設定し、 ビットマップの白色に部分は透過させて表示したいので ネットで調べた結果以下のプログラムを描いてみましたが 透過になってくれません 何か間違っていますか?正しい方法を教えてください 環境はXPのVS2005(MFC)です COLORMAP cm; cm.from = RGB(255,255,255); cm.to = GetSysColor(COLOR_3DFACE); m_bmp.LoadMappedBitmap(IDB_BITMAP, 0, &cm, 1); m_btn.SetBitmap(m_bmp);
201 名前:デフォルトの名無しさん [2009/11/16(月) 15:35:40 ] お頼み申しageます
202 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 17:18:10 ] 自己対応メモ VS2008でメニューのフォントが変だったので悩んだ。 takabosoft.com/20090812235606.html にて書いている人がいたが、この人の方法だとOnCreateの時点ではフォント情報が取得できず、メニューが化ける。 blog.csdn.net/codewarrior/archive/2008/09/11/2911209.aspx にて書いている方法なら正しく表示された。 MFCがBCGControlBarを使うようになったから、その対応も使えるのだな。
203 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 17:23:33 ] 正しく表示されたコード m_wndMenuBar.Createのあとで、 LOGFONT logfont = {0}; ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0); CMFCMenuBar::SetMenuFont(&logfont);
204 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 18:55:37 ] >201 たまたま見つけたコードを意味もわからずいじって見たけど動きません。 だったら関わるだけ時間の無駄。
205 名前:デフォルトの名無しさん mailto:sage [2009/11/16(月) 20:18:38 ] >>200 そのコードは、透過ではなく特定の色をボタン表面の色に変更して載せてるだけ。 透過させたかったらCButton::SetImageListを使え。 これならVista以降の徐々に色の変わるようなボタンでも正しく透過で描画される。
206 名前:デフォルトの名無しさん mailto:sage [2009/11/17(火) 14:20:07 ] >>202 >この人の方法だとOnCreateの時点ではフォント情報が取得できず、メニューが化ける。 WINVER >= 0x0600 に設定して、そのプログラムを Vista 以前の環境で実行すると ::SystemParametersInfo( SPI_GETNONCLIENTMETRICS,,,) が失敗するというのは知ってる?
207 名前:デフォルトの名無しさん mailto:sage [2009/11/17(火) 21:32:59 ] >>196 そのとおり、コピー用スレッドを作れば良い。 また、一個一個が小さいコピーをたくさんやっているなら、 コピーの合間にメッセージループをはさむ方法もある。 メッセージループの具体形はぐぐれば出てくる。
208 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 17:37:27 ] スタティックコントロールでCenterImageしてるんですが その場合は\rつけても改行されてくれません 改行可能なCenterImageって方法ありませんか? 余白を設定できたりも考えましたが見つかりません オーナードロー以外でなにかいい案ありましたら お願いします
209 名前:196 mailto:sage [2009/11/18(水) 22:16:48 ] なんとか、スレッドで処理させることで、コピー中もダイアログを操作できるようにできました。 ありがとうございました。 >>198 裏で処理をさせるのをワーカースレッドっていうんですね。 >>207 コピーの時にOS標準のコピーダイアログを出したかったので SHFileOperationAを使ってのコピーです。 コピーは全部SHFileOperationAに任せますので、メッセージループは使いませんでした。
210 名前:デフォルトの名無しさん [2009/11/19(木) 19:13:35 ] MFCでも.NETアプリ動くようにしてくれればいいのにね。
211 名前:デフォルトの名無しさん [2009/11/19(木) 19:14:42 ] C#の方が簡単。どの環境でも動く… MFCで作るのがいやんなるよ…
212 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 19:14:32 ] リソースとして埋め込んだリッチテキストファイルをRichEditCtrlに読み込ませようとして苦戦しております 外部ファイルの読み込みに関してはEDITSTREAMのコールバック関数を設定して出来ましたが、リソースからRTF形式で読み込むのは難しいのでしょうか?
213 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 19:33:37 ] LockResourceしてデータを取り出せば良いんじゃね?
214 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 19:45:46 ] >>212 HRSRC hResInfo = ::FindResource( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDF_RICHTXT), RT_HTML); HGLOBAL hResData = ::LoadResource( AfxGetInstanceHandle(), hResInfo); DWORD dwData = ::SizeofResource( AfxGetInstanceHandle(), hResInfo); LPVOID lpData = ::LockResource( hResData); CString strBuf( reinterpret_cast<TCHAR*>( lpData), dwData/sizeof(TCHAR)); m_wndRichEdit.SetWindowText( strBuf);
215 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 20:17:37 ] エクスプローラでファイルを詳細表示したときにファイル一覧の上に「名前」「サイズ」といった 区切りが表示され、その表示幅を自分で変更できたりしますが、この機能は標準で付いてる ものなのでしょうか? 使ってるヴァージョンはVisual C++.net Version2003です やりたい事はテキストファイルの一覧を表示して、その幅を自分で調整したいと考えています。 _____________________ | 名前 | 電話番号 | 住所 | | 山田 03-xxxx 東京都xxxx 最初から表示されているダイヤログエディタのコントロールを見ても使える様な物が 見つからないので、後から追加できるものなのかそれとも自分で作らなければならない 物なのでしょうか?
216 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 20:54:40 ] 手元にVS2008しかないからそれで説明すると、 そのコントロールは「List Control」という表記なっている。 プロパティでViewを「レポート」に変更すると、そのようなヘッダの付いた表示形式になる。 VS2003でも大体同じような感じだったと思う。 試しに張ってみて、黄・赤・緑とかのアイコンが表示されるならそれでほぼ間違いない。 そういえば、このアイコンはVC4から殆ど変わらないよなあ。
217 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 21:13:19 ] >>216 List Controlに欲しい機能が付いておりました。 ただ追加した時点では色のアイコンがあるだけで、それらしい機能は 持っていないと思ってしまっていました。 レポートに変更したら上の方に区切りの付いたバーが表示されました。 ありがとうございます。
218 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 19:42:26 ] >>213 >>214 返答が遅くなりましたが無事読み込ませることが出来ました、ありがとうございます てっきりリッチテキストそのままだと読み込めないものだと思っていたので意外でした
219 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 21:09:36 ] >>62 A:「作ったよ」 B:「ありがとう。こっちで作ったのにコピーさせてもらうね」 A:「ん、じゃとりあえずBの仕事が終わるまで待ってるね」 B:「ありがとう。終わったよ〜」 A:「ん、じゃこっちの仕事も終了するねw」 B:「じゃあAの仕事が終わったらこっちで作ったものは削除するね〜」 A:「こっちはもちっと仕事があるから終わったら削除するよ〜」 B:「あれ、いつの間にやらCStringのヒープニオイタモノガコワレテr」 orz
220 名前:219 mailto:sage [2009/11/26(木) 21:10:39 ] (windows ce用アプリ)
221 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 21:14:43 ] A:「作ったよ」 B:「ありがとう。こっちで作ったのにコピーさせてもらうね」 A:「・・・ああん、バカ。コピーするならポインタじゃなくて実体をコピーしてよん」
222 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 10:43:51 ] なにそれ、エロい
223 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 16:28:22 ] えっ
224 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 18:00:15 ] えっ
225 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 18:25:59 ] , - , -─ - 、 /:::::::::::::::::::::::::::::::::`‐、 /::::::::::::::::::::::::::::::::::::::::::::::\ /::::::::::;:ィ::::::::';:::::::::::`ヽ::::::::::::::ヽ ,'::::::;':::/ l:::i::::::ヽ:::\:::::::';:::::::::::::::', i:::l::::i:/ ';:::';:::::::',\::ヽ:::::::::::☆::: l::l::;イ__, ヽ、ト、::::ヽ、\:',ヽ〃l:::::: ';l l::l ` ‐- l:::::l:::::: こ、ここ、これ読んで下さいっ! l::::l == 、 ,.ィ== l:::::l::::::::: l:::::li //////////// l:::::l:::::::::: , -ーl::::lヽ、 r....::´`ヽ /l:::;'> 、::::: , -ー 、'´`ヽl::::l// ` ‐-r‐ァ' ´ ,':/ー、 '; / , ノ ` l::::l li /ニく /⌒ヽ \.i , └ '´  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / ノ__ ', ,イ: / \ (⌒⌒) , └ '´ / i/ / ヽ / ー ' / /,.イ ∠ __ / / /  ̄ ̄ ̄ ̄ ̄─── -------/-‐'´ /
226 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 18:52:05 ] ィ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;゙t, 彡;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ イ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r''ソ~ヾ:;;;;;;゙i, t;;;;;;;リ~`゙ヾ、;;;;;;;;;;;;;;;;;;;;ノ i,;;;;;;! / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ゙i,;;;;t ヾ-‐''"~´_,,.ィ"゙ ヾ;;f^! / お嬢ちゃん、ここはMFCの相談室だぜ。 ト.;;;;;》 =ニー-彡ニ''"~´,,...,,. レ')l. < その手紙をMFCで書いて出直しな。 t゙ヾ;l __,, .. ,,_ ,.テ:ro=r''"゙ !.f'l. \_______________ ヽ.ヽ ー=rtσフ= ; ('"^'=''′ リノ ,,.. -‐ゝ.>、 `゙゙゙゙´ ,' ヽ . : :! / ~´ : : : : : `ヽ:. ,rf :. . :.: j 、 . : : ト、.、 : : : : : : : : : : ヽ、 /. .゙ー:、_,.r'゙: :ヽ. : :/ ヽ\、 :f: r: : : : : : : : !丶 r-、=一=''チ^ ,/ !:: : :`丶、_ : /: : : : : : : : :! ヽ、 ゙ ''' ''¨´ / ,i: : : l!: : : : :`ヽ、 〃: :j: : : : : : : ゙i `ヽ、..,,__,, :ィ":: ,ノ:: : : : : : : : : : : :\ ノ: : : : : : : : : : :丶 : : ::::::::: : : : /: : : MFC : : : : : : : :\
227 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2009/12/01(火) 08:38:38 ] CPaneDialog派生させたオブジェクトをドッキングで使ってるんだが、 何故かボタンコントロールだけディスエーブルされるのは、仕様?バグ? チェックボックスとかは全く問題ないんだが・・・・OnCreate()内でEnaqbleWindowやっても 効果無し。MFCのソース バックグラウンドの更新も変だ・・・・ダイアログアイテムにちゃんとメッセージがポストされてない気がする。 2008で拡張されたMFCは便利だけど、どうも問題が多いし、肝心な情報が公開されてない 気がする。いい加減にM$は、開発環境ぐらいソースを全公開して欲しいよ。w
228 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 09:02:48 ] >>227 ダイアログバーのときは、コマンドハンドラやON_UPDATE_COMMAND_UIが無いと ボタンは無効になってたけど、それとは関係無いですか?
229 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2009/12/01(火) 09:30:00 ] >>228 それだ!!ありがとうございます。ボタンの件はそれでした。
230 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 14:23:20 ] ダイアログバーはメッセージマップがMainFrame側に実装される謎仕様とかあったな
231 名前:デフォルトの名無しさん [2009/12/04(金) 16:51:04 ] リストコントロールについて質問です。 レポート形式で使用しています。(VC2005) (1) リスト行数100で1ページ表示5行で 現在10ページ目の1番目の項目が選択されています。 この状態で一度全ての項目を削除し再入力して 新たに10ページ目の1番目の項目を選択させたいので SetItemStateなどで選びなおしました。 しかし、10ページ目の1番目が選択されているようですが 表示は1ページ目になっています。 これを10ページ目にしたくてSetScrollPosをしましたが うまくいかず、表示が変になります どうやったら10ページ目の表示にできるのでしょうか? (2) 拡張スタイルにLVS_EX_GRIDLINESを使用していますが スクロールしたときにグリッドラインの残像が残ってしまいます この残像を綺麗にけすのはどうしたらいいのでしょうか?
232 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 17:01:29 ] >どうやったら10ページ目の表示にできるのでしょうか CListCtrl::EnsureVisible() >この残像を綺麗にけすのはどうしたらいいのでしょうか ウチでは残らないけど? 何か変わったコトしてない?
233 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 19:56:54 ] 俺も昔LVS_EX_GRIDLINESで残像が残った記憶があるな。 市販アプリでも普通に残像が残っていたので、環境依存なのかもなあ。 昔なった時は、IE3.x時代のだからMSもまともにサポートする気無いのか、 という程度に思っていたのだけど。.NETだと自前で正しく描画していたし。
234 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 09:06:09 ] >>231 2はOSのバグの問題と同じかも。 support.microsoft.com/kb/813791 昔ブックマークしていた場所で、ページ自体は無くなってるけど、 このアドレスでググると同じ問題の書き込みがいくつか残ってた。
235 名前:231 mailto:sage [2009/12/08(火) 13:26:25 ] 返事がおくれてすみません 1は232で解決しました 2は画面のプロパティのデザインで治りました
236 名前:231 mailto:sage [2009/12/08(火) 14:11:12 ] 来客が来て途中送信してしまいました。 改めて、 返事がおくれてすみません 1は232で解決しました 2は画面のプロパティのデザインの効果の 次のアニメーション効果をメニューとヒントに使用するのチェックを外すと 治りました。 ありがとうございました。
237 名前:デフォルトの名無しさん [2009/12/09(水) 15:29:32 ] CButton でクイックされたらそのまま凹んだまま、押しボタンのように動きにしたいのですが、 (もう一度クリックすると元に戻る) どのようなコードでできるでしょうか?
238 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 15:45:59 ] >>237 チェックボックスのスタイルをBS_PUSHLIKEにすればいいかも
239 名前:237 mailto:sage [2009/12/09(水) 18:10:21 ] >>238 ありがとうございます。 ためしてみますm(_ _)m
240 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 22:48:44 ] エラーで困っているので助けてください。 error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です。 error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です。 error LNK2019: 未解決の外部シンボル "public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ) が 関数"public: virtual int __thiscall CprototypeApp::InitInstance(void)"(?InitInstance@CprototypeApp@@UAEHXZ) で参照されました とエラーが出ていますが、原因がわからず困っています。 同じソースを別の人の環境で実行すると何もエラーも出ずにコンパイル・リンカーが通ります。 私も昨日までは通っていましたが、コーディングを設定ファイル?とかがおかしくなってしまったのか、 昨日のデータを使ってもリンカーエラーが出て困っています。 環境として、 自分 VisualStadio 2008 VC++(MFC) 別の人 VisualStadio 2008 VC++(MFC) 本当に困っています。何か知っている方がいらっしゃったら力を貸してください。
241 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 23:02:46 ] 出力ファイルを全て消してリビルドしる。 C/C++関係はそれで解決することが良くある。
242 名前:240 mailto:sage [2009/12/10(木) 00:07:23 ] >>241 出力ファイルとは、Solution内のDebugフォルダ内のことをさすのでしょうか? 昨日から勉強を始めたため、ほんとにわからないことが多くてすみません。
243 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 22:12:26 ] MFCにライブラリパスが通ってないんだろ。 ライブラリパスはソースではなく、コンパイラの設定だから PCが変われば設定が違う可能性がある。 ちょっと2008が手元にないんでアレだが2005で見ると ツール→オプション→プロジェクトおよびソリューション→VC++ディレクトリ→ライブラリファイル で設定できる。2008も似たようなもんだろ。 その設定をコンパイルが通るやつに合わせてみろ。
244 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 22:23:09 ] 何だマルチだったのか
245 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 10:27:42 ] CWnd使ってVSの入力候補みたいな小窓を表示させたいんだけど、 popupで表示して小窓がアクティブ状態になると、メインウィンドウが 非アクティブ状態になってしまいます。小窓がアクティブ状態になっても メインウィンドウがアクティブ状態を失わないようにするにはどうしたら良いですか?
246 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 12:49:33 ] WS_EX_PALETTEWINDOW
247 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 16:52:41 ] >>246 レスありがとう。ただ、WS_EX_PALETTEWINDOW指定しても、メインウィンドウが 非アクティブになってしまいます。何か他の設定が悪いのかも? ダイアログベースで以下のような感じ //CtestAppの中でウィンドウ登録 WNDCLASSEX wndclass; wndclass.lpszClassName = L"TESTWINDOW"; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = DefWindowProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = m_hInstance; wndclass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); wndclass.lpszMenuName = NULL; wndclass.hIcon = LoadIcon(IDI_APPLICATION); wndclass.hCursor = LoadCursor(IDC_ARROW); wndclass.hIconSm = LoadIcon(IDI_APPLICATION); RegisterClassEx(&wndclass); //ボタン押された時にウィンドウ表示 void CtestDlg::OnBnClickedButton1() { CRect cr; GetWindowRect(&cr); m_cwnd.CreateEx(WS_EX_PALETTEWINDOW, L"TESTWINDOW", L"", WS_VISIBLE | WS_POPUP, cr.left, cr.top, 50, 50, GetSafeHwnd(), NULL, NULL); }
248 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 19:16:14 ] 戻してやればいいだけの気がするけど MFCなんだからドッキングツールバーのソースでも読んで勉強すればいいよ
249 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 01:15:06 ] ツールウィンドウで作るんじゃなかったっけ?
250 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 01:42:47 ] #define WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
251 名前:245 mailto:sage [2009/12/12(土) 09:54:12 ] とりあえずソース読んで勉強してみます。レスしてくれた人たちありがとう。
252 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 10:12:06 ] メインウィンドウは非アクティブでいいんじゃね? 手持ちのアプリの動作でいうと VC6はアクティブがどうであろうとメインもツールウィンドウもアクティブになりっぱなしでおかしい VC2008はアクティブによってメインもツールウィンドウもちゃんと切り替わる ってなってる 俺もツールウィンドウ作ったときにメッセージのやり取りがおかしくなったときに VC6みたいにアクティブになりっぱなしになったことあるから VC6ってバグりっぱで放置してあるだけだと思う
253 名前:245 mailto:sage [2009/12/12(土) 12:39:18 ] >>252 確かにVS2008だとアクティブ状態が移動しますね。ただ、作りたいのがツールウィンドウではなく、 VS2008で例えると、入力候補ウィンドウみたいなヤツなんです。これポップアップで出ますが、 フォーカスが移っても、親ウィンドウのアクティブ状態は変化ないですよね。 248さんが言ってた”戻せばいい”というのをヒントに、親ウィンドウの WM_NCACTIVATEとWM_ACTIVATEAPPで細工したら希望通りの動作になりました。
254 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 13:11:45 ] WS_EX_NOACTIVATEは使えないか?
255 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 15:00:48 ] どなたかXPでマルチモニタ環境のあるかたに試していただきたいのですが、 VS2005やVS2008でダイアログベースのプロジェクトを作り、 標準で用意される2つのダイアログ(メインとバージョン情報)に 「サイズ変更枠」と「最大化ボタン」のプロパティをセットしてビルド。 デバッグ開始し、メインダイアログを最大化。 ↓ 特に問題無い。 そのままバージョン情報ダイアログを出してこっちも最大化。 ↓ セカンダリモニタにほんのちょっとウィンドウ枠がはみ出る。 という現象が発生するのですが、 他のかたの環境でも発生しますでしょうか。
256 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:46:45 ] 特に問題無い
257 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:26:08 ] >>256 あれ、発生しませんか。 社内ではXPマシンすべてで発生するんです。 同じモニタだから、ハードウェア的な問題なんだろうか。 ありがとうございます。
258 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:28:00 ] 画面端同士で同じ場所参照してそうな仕様だな それだと他のウィンドウでも同じ現象が出るか
259 名前:ぷれ [2009/12/16(水) 23:51:16 ] はじめまして、画像ビューアを作ろうと思っているのですが CWinthreadにCScrollView派生クラスのハンドルを渡してスレッド側から、 CScrollViewのOnPrepareDC(&dc)をコールすると以下でエラーが発生します。 CWnd::AssertValid() CHandleMap* pMap = afxMapHWND(); ASSERT(pMap != NULL);//<--ここでエラー どうすれば問題解決するでしょうか。 よろしくお願いします。(関連するソースは以下) CThreadxxx ::CThead(HWND hwnd) { m_pMainWnd = AfxGetMainWnd(); m_pView = (CScrollViewxxx*)CWnd::FromHandle(hwnd); } int CThreadxxx ::Run() { while (WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT){ if(m_hWndView){ CClientDC dc(m_pView); m_pView->OnPrepareDC(&dc); m_pView->Render(&dc);//計算描画処理(重い) } } }
260 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 08:52:31 ] MFCのドキュメント・ビューアーキテクチャ関数はワーカースレッドから呼ぶとエラーになるものあるんだよね ワーカースレッドからはユーザーメッセージ定義してメッセージハンドラで凌いでた SendMessage()で渡せばメインスレッドで処理されて帰ってくる
261 名前:ぷれ [2009/12/17(木) 09:20:35 ] >>269 回答ありがとうございます。 メッセージで処理してみましたが遅くなってしまいました。 早くする方法はありますでしょうか?ソースは↓みたいな感じです。 int CThreadxxx ::Run() { if(m_hWndView) { PostMessage(m_hWndView,WM_USER_START_RENDER, 0, 0); if(WaitForSingleObject(m_hEventEndRender,10000) == WAIT_TIMEOUT)); { return ; } } BOOL CScrollViewxxx::PreTranslateMessage(MSG* pMsg) { CDC *pDC = NULL ; CClientDC dc(this); switch (pMsg->message){ case WM_USER_START_RENDER: OnPrepareDC(&dc); SetOrigin(&dc); Render(&dc); //m_pThreadRender:スレッド SetEvent(m_pThreadRender->m_hEventEndRender); break; } }
262 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 10:25:02 ] Render()はワーカースレッドに置いたままでいいんじゃないのか? こんなイメージ int CThreadxxx::Run() { while(WaitForSingleObject(m_hEventEndRender,10000) == WAIT_TIMEOUT)){ if(m_hWndView){ CClientDC dc(m_pView); m_pView->SendMessage(WM_USER_START_RENDER, 0, (LPARAM)(CDC*)&dc)) //制御待たせるためにSendMessage m_pView->Render(&dc); } } } LRESULT CScrollViewxxx::WindowProc(UINT msg, WPARAM wParam, LPARAM lParam) { switch (pMsg->message){ case WM_USER_START_RENDER: { ASSERT_KINDOF(CDC, lParam); CDC* pDC((CDC*)lParam); if(pDC->GetSafeHdc() != NULL) { OnPrepareDC(pDC); SetOrigin(pDC); } return 0; } return CView::WindowProc(msg, wParam, lParam); }
263 名前:ぷれ [2009/12/17(木) 11:33:51 ] >>262 ありがとうございます。 早速試してみます。
264 名前:ぷれ [2009/12/17(木) 12:58:42 ] >>262 試してみましたがまだ遅いです。メッセージ処理を改良すべきだとは思うのですが何か案はございますでしょうか? 試したソースはこんな感じです。 int CThreadxxx::Run() { if(m_hWndView) { CClientDC dc(m_pView); m_pView->SendMessage(WM_USER_START_RENDER, 0, (LPARAM)(CDC*)&dc); CRenderInfo renderInfo; m_pView->Render(&dc); SetEvent(m_hEventStop); } } LRESULT CGdsView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { CDC* pDC = (CDC*)lParam; switch (message) { case WM_USER_START_RENDER: ASSERT_KINDOF(CDC, pDC); if(pDC->GetSafeHdc() != NULL) { OnPrepareDC(pDC); SetOrigin(pDC); } return 0; default: break; } return CScrollView::WindowProc(message, wParam, lParam); }
265 名前:ぷれ [2009/12/17(木) 13:01:47 ] ↓見たいな処理をどこかに入れ込めばいいと思うのですがどのタイミングに埋め込むべきか 判断に迷ってます。 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ if(msg.message == WM_USER_START_RENDER) { CDC* pDC = (CDC*)lParam; ASSERT_KINDOF(CDC, pDC); if(pDC->GetSafeHdc() != NULL) { OnPrepareDC(pDC); SetOrigin(pDC); } }else{ TranslateMessage(&msg); DispatchMessage(&msg); } } }
266 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 20:12:13 ] ワーカースレッドでDIBを作らせれば済む話じゃないの? 何か無駄に話を難しくしているように見えるぞ。
267 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:16:15 ] クラス A CListBox m_listA クラス B CListBox m_listB クラス C fnCommon() クラスA、クラスBの処理が共通なので、 クラスCの関数を共通処理関数としようと思っています・ クラスCの関数に、クラスAのm_listAなどのメンバを引数に渡せなくて 困っています。どうやればいいでしょうか? クラスAの処理 { クラスC: :fnCommon( m_listA ); } クラスCの処理 クラスC::fnCommon( ClistBox a) { a.set・・・(); } ではうまくいきませんでした、どうすれば別のクラスのメンバを引数として渡せるのでしょうか? 最近はじめたばかりでググっても解決策が見つかりません。 よろしくお願いします。
268 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:11:08 ] >>267 ポインタを渡す、もしくは、CListBoxの派生クラスを作ってそこで処理する。 ClassC::fnCommon(&m_listA); クラスC::fnCommon(CListBox* a) { a->set・・・(); } CMyListBoxクラス内にfnCommon関数を宣言・定義 クラスAの処理 CMyListBox m_listA; m_listA.fnCommon();
269 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:52:40 ] Windowsのコントロールって複数のウィンドウで同時に共用できないんでしたっけ? 具体的にはCPropertySheetで作成したコントロールを複数のCPropertyPageに貼りつけて 共用するとか。これができると、CListCtrlやCTreeCtrlやカスタムコントロールで便利なもんで・・・・ 試しにやってみたら1枚目には貼れるのですが、2枚目以降は駄目でした。(表示されない。エラー は無し。)
270 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:05:05 ] コントロールはただのウインドウだからどこにでも張り付くし、後から移動することも可能。
271 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:20:50 ] 左側のツリーで右側のプロパティページを切り替えるのはよくあるな
272 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:50:40 ] >>270 >>271 サンクス。OnSetActive()の段階でコントロールにSetParent()したらイベントが行く様に なったんだけど、開始ページ以外のCTreeCtrlの文字が表示されない。(マウスクリックすると 表示される。)コントロールにUpdateWindow()などしても更新されないから、更新イベントが CTreeCtrl内のコントロールに行き渡ってないみたいだ・・・・
273 名前:268 mailto:sage [2009/12/21(月) 00:01:39 ] >>267 親切にありがとうございました。 無事解決しました。
274 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 00:06:53 ] MFC SDI のプログラムで、このように取得したドキュメントの文字を、CString 型の変数に取得し、 配列へ格納したいのですがどうしたらできますでしょうか CxxxDoc *pDoc = (CxxxDoc*)((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument();
275 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 00:52:33 ] >このように取得したドキュメントの文字を どのように取得したって? 取得できてないじゃん。
276 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 01:06:20 ] >>257 >>254 です、 一応これでエディットビュー のドキュメント(テキスト)が 取得できるようになったのですが、このままでは256 文字がべたで配列に代入されてしまいます 一行づつ取得して、配列へ格納するにはどうしたらいいでしょうか? CxxxDoc *pDoc = (CxxxDoc*)((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument(); void* P = m_viewList.GetHead(); char buf[_MAX_PATH]; CEdit* pE; pE = (CEdit*) P; pE->GetWindowTextA((LPTSTR)buf,_MAX_PATH);
277 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:42:00 ] 一行づつ切り分けて取得して、配列へ格納する。Enterの文字列で切り分ければ良い。
278 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 08:41:46 ] 1行の読み込みを、 pE->GetLine(i, (LPTSTR)buf); として、得ることにしたのですが、当然のことながら、改行コード以降にゴミが入っています sizeof(buf); とかstrlen(buf); でサイズを得たいのですが上手く行きません 目的のデータ(文字列+改行コード)を得るコードを教えてもらえませんか?
279 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 09:11:09 ] CEditのメンバ一覧に目を通す時間すらないとは大変ですね。 あと、CEdit::GetLine(nIndex, lpszBuffer)は lpszBufferの中身の先頭WORDにバッファ長が入っていることが前提だ。
280 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 09:55:09 ] CEditはCString と相性いいから簡単に扱えたはずだけど わざわざ手間がかかるやり方でやってないか? 行数がとてつもなく多いとか、効率考えて普通と違う方法でやろうとしてるならいいけど
281 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 10:43:27 ] どうもみなさん、thxですこんな感じでできましたが、もう一息です、pE->ReplaceSel(result.c_str());で置換をしているのですが 置換後の文字列を置換前の文字列の位置に上書きしたいのですが、今のままだと、置換前、置換後の文字列両方表示されています、どこがおかしいでしょうか? >>280 CString を使いたいのですが、<boost/regex.hpp> が使いたいので、文字列は*char かstd::string の方がベターなのです char szBuf[256]; const int nRow = pE->GetLineCount(); for(int nIdx = 0; nIdx < nRow; ++nIdx) { // テキストデータ取得。 const int iSize = pE->GetLine(nIdx, szBuf, sizeof(szBuf) - 1); szBuf[iSize] = '\0'; reg_ex = "<.*?>"; result = re.RegularTagReplace(szBuf, reg_ex);// <boost/regex.hpp> でHTML タグを削除している const int end = pE->GetWindowTextLength(); pE->SetSel(end, end); // 一番最後に持ってくる result += "\r\n"; pE->ReplaceSel(result.c_str()); }
282 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 12:22:33 ] いちいち質問しないと解決しない問題とは思えないが
283 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:09:55 ] pE->SetSel(0, 0); とかやってみるができないorz
284 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 15:18:25 ] 全然関係ないけど、行単位でTAGを取り除く意味あるのか? HTMLは特別な場合を除いて改行を無視するから TAGのカッコの途中で改行が入ったりしてる場合もあるわけだが
285 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 16:37:33 ] >>284 行単位でタグを取り除くのには、他に目的があります、改行の必要な部分は、あとで <br> をつけます、しかし上手くいかんな・・・
286 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:47:25 ] >>281 です 他で聞いてみます。
287 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 23:43:33 ] 質問です。 いろんなファイル形式の画像ファイル(特に48bitカラー)を読み込んで、データストリーム (ピクセルごとのRGB情報)を取得したいと思ってます。 いまはGDI+のImageクラスで画像ファイルを開いて、Image.SaveでIStreamにデータ ストリームをコピーした後、IStream.Writeでunsigned char[]にコピーするというコードを 試しているんですが、IStreamからunsigned char[]へのコピーがうまくいきません。 Writeの返り値はOkになってるし、コピーされたバイト数も正しいのに、配列は全て 0が入っているという状態です。 考えられる原因は何でしょうか? あるいはもっと確実な方法があれば、お教えいただけると助かります。
288 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 00:31:42 ] >>287 IStream::Writeは、IStreamに書き出す、という意味だぞ。 取り出すならIStream::Read。引数の型で気付かなかったのか?
289 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 01:01:41 ] >>288 ありがとうございます。 明日試してみます。
290 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 01:43:31 ] VisualStudio2010のMFCってもう仕様変わらなそうかな。 主力は.netだろうしRCやRTMに向けてはそっちの調整だろうな。 リボンアプリの案件が来てて困ってる。2010はデザイナが付いてるし、 βで作っても問題なさそうな気がする。そう思いたいだけなんだけどね。 納期は5月だからβで作ったのを引き継げればいいのだが・・・。
291 名前:デフォルトの名無しさん [2009/12/30(水) 01:47:52 ] >リボンアプリの案件 需要あんのか
292 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:02:55 ] OfficeはOffice2007、2010で始めて触りましたって人や Win7が始めて使ったWindows(ペイントなんかがリボンアプリ)ですって人が大勢を占めるようになったら 需要としては結構出てきそう。 市販アプリでもPerfectDiskなんかは既にリボンUI採用してるね。
293 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:10:15 ] 見た目の問題っぽい。客先は来年末までにWindows7にするみたいだし、 Officeも2010にもするらしいから、見た目を同じにしたいらしい。 個人的には今までのツールバーみたいに、他の処理と無関係なアイコンが 並ばなくていいという点だけは評価できる。ツールバー消したりとか しなくていいし。機能別にタブみたいなグループでまとめちゃえばいいし。 ただ無駄に高さを取るのがどうしても馴染めない。
294 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 20:34:39 ] 馬鹿は使うな! 以上!
295 名前:デフォルトの名無しさん [2010/01/05(火) 08:20:54 ] VC6から2008に以降したら文字列でえらい苦労した。 出来上がったソフトを他のPCで動かそうとしたら起動せず、 イベントログでSideBySideエラーになっていた。 他の人に送ったらマニフェストがどうたらこうたらとか・・・ わけわかんないのでもう一台のPCでコンパイルしようとしたらエラーが出る。 そうか、ExpressにはMFCが入っていないんだね。 最近、自分が浦島太郎に思えることが多いですよ・・・
296 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 11:41:56 ] MFC付きの有料のを買えばいいだけですよ。
297 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 19:12:30 ] VC6のランタイムはXP以降ならOS標準で入っているからな。 まあ2008の場合はWinSxSへのコピーのみでマニフェストでアクセス、 という今までと違う変則的な方法だから解り難くてもしようがない。 不評だったのか、2010ではシステムフォルダにもコピーされる仕様に戻るらしい。
298 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 09:16:31 ] VC2008でMFCダイアログベースなどのプロジェクトを作ると、 メッセージマップのところに //}}AFX_MSG_MAP というものが入っているのですが(閉じるほうのみ)、 これってVC6などでClassWizardのために入っていたものですよね? VC2008でもなにか意味のあるものなのでしょうか? それともテンプレートの残骸?
299 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 10:02:34 ] ISAPIフィルタでレスポンスの内容を編集したく OnSendRawData()ではレスポンスを返さないようにするために pRawData->cbInData = (DWORD)0; pRawData->cbInBuffer = (DWORD)0; として OnEndOfRequest()で pfc->WriteClient() で編集した内容を返そうとしています。 しかし、OnSendRawData()で pRawData->cbInData = (DWORD)0; pRawData->cbInBuffer = (DWORD)0; を入れるとOnEndOfRequest()でWriteClient()をしてもレスポンスが 返されません。 なぜこのような結果になるのでしょうか?
300 名前:299 mailto:sage [2010/01/06(水) 10:11:46 ] わかりました。 WriteClient()を呼ぶとOnSendRawData()が発生するんですね。
301 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 14:38:28 ] CInternetSessionのメンバの GetFtpConnectionとかでタイムアウトを設定できないでしょうか?
302 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 23:15:39 ] 試したことないから知らんけど設定自体はあるね
303 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 01:38:21 ] ミューテックスオブジェクトについて、質問です。 環境は、VC6でMFCダイアログベースです。 2つのアプリケーションAとBを作っているのですが、 以下の処理をそれぞれ追加します。 A:ボタン押下でBをミューテックスオブジェクトを使って排他的に呼出す。 B:ミューテックスオブジェクトを保持。 @Aにあるボタン押下でBだけは呼出せたのですが、ミューテックスオブジェクトを 使って排他的な呼出し方にする方法が分かりません。 ABでミューテックスオブジェクトを保持する方法が分かりません。 自アプリケーション の2重起動禁止の場合、CreateMutexを使っていたのですが、 上記の場合、AとBをどのようにすればいいでしょうか?どなたか宜しくお願いします。
304 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 08:01:24 ] >>303 Aからボタン押下でBを起動、 ただし以前Aから起動した事のあるBが残っている場合は 新たに起動はしない、ってことでOK? そういうのだったら、B起動時にそのプロセスハンドルを残しておいて、 次のボタン押下時にGetExitCodeProcessで以前起動したプロセスが終了したか確認、とか。 手動でならBを複数起動できる、という必要性がないならBの二重起動禁止で十分だけど。
305 名前:デフォルトの名無しさん [2010/02/03(水) 10:08:47 ] CStringArrayのシリアライズ化で、ファイル保存はできたのですが、 これを読み込んでCStringArrayに再格納できませんでした。どのようにすればいいのでしょうか? //シリアライズ CStringArray aBuf; aBuf.Add( _T("aaa") ); aBuf.Add( _T("bbb") ); aBuf.Add( _T("ccc") ); CFile f; BOOL bRet = f.Open( _T("hoge.txt"), CFile::modeCreate | CFile::modeWrite ); if( bRet == FALSE) { return true; } // アーカイブを作成 CArchive ar( &f, CArchive::store ); TRY { aBuf.Serialize( ar ); } CATCH_ALL(e) { ar.Close(); f.Close(); return 0; }
306 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 11:52:32 ] >>305 読み込むほうのソースを出さないと誰もわからない。
307 名前:305 [2010/02/03(水) 15:41:45 ] >>306 失礼しました。 サンプルをみて書いたのですが、以下のコードになります。 try{ CStringArray m_saMyArray; CFile in(_T("hoge.txt"), CFile::modeRead); CArchive ar(&in, CArchive::load); CString buffer; m_saMyArray.SetSize(0); for(int i = 0; ar.ReadString(buffer); i++) { m_saMyArray.Add(buffer); } ar.Close(); in.Close(); } catch(CFileException e) { AfxMessageBox(_T("Read Error !!")); } ar.ReadString(buffer)で bufferにすべてのデータが格納されました。 根本的に、読込み方法が間違っているのでしょうか? ご教授おねがいしますm(_ _)m
308 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 16:25:07 ] >>307 CStringArray::Serialize()で保存したものは CStringArray::Serialize()で読み込まないとダメ。 > CString buffer; > m_saMyArray.SetSize(0); > for(int i = 0; ar.ReadString(buffer); i++) { > m_saMyArray.Add(buffer); > } m_saMyArray.Serialize(ar);
309 名前:305 mailto:sage [2010/02/03(水) 18:14:02 ] >> 308 ありがとうございます(>< ためしてみます。。
310 名前:303 mailto:sage [2010/02/05(金) 21:42:09 ] >>304 GetExitCodeProcessを使ってやってみます。 ありがとうございました。
311 名前:デフォルトの名無しさん [2010/02/06(土) 13:24:05 ] CToolBarのボタンのイメージはリソースからしか設定できないみたいなんですが、 iconファイル(拡張子ico)を読み込んでイメージを設定する方法ってありますか? サイトアイコン(favicon.ico)をダウンロードして、動的にツールバーボタンにイメージ登録するようなことがやりたいのです。
312 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 14:06:52 ] >>311 の件の自己レスです。 icoファイルから読み込む方法は下記のようにできることが分かりました。 HICON hIcon; ICONINFO iconinfo; ExtractIconEx(_T("favicon.ico"), 0, NULL, &hIcon, 1); GetIconInfo(hIcon, &iconinfo); m_toolbar.SetBitmap(iconinfo.hbmColor); DestroyIcon(hIcon); しかしこれでは1種類のアイコンイメージしか使えません。 複数のイメージを使いたい場合は、横方向に連結した1個のbitmapを作る必要があるようです。 どうやって連結するかはまだ分かりませんが、ものすごい不便ですね。
313 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 15:36:47 ] コントロールは汎用的に作られてるから 気に入らなかったら自作すればいい。
314 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 15:45:38 ] TBBUTTON配列受け取るAddButtons()とかなかったっけ?CToolBarCtrlだったか?
315 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 18:02:15 ] >>314 CToolBarCtrlというのがあったんですか。 これだとAddBitmap()で1個ずつ追加できそうですね。 ありがとうございました。