1 :
デフォルトの名無しさん :
2007/08/01(水) 06:23:28 Microsoft Foundation Classライブラリ専用スレです。
3 :
前スレ986 :2007/08/02(木) 21:54:39
前スレ>987 遅レスだがサンクス
GUIの設計が大変すぎるんだが 例えばVCLでいうStringGridみたいなもの作りたいとき MFCだけでやろうとするとListBoxとかListViewとかをベースに しこしこつくっていくわけなんすかね
だからMFCは基本的にWin32のラッパなんだと何度言ったら(ry StringGridって割と便利みたいだし、誰かMFCで実装した奴いるんじゃね? いなけりゃ、自前で実装して公開すれば皆に喜ばれるよ。
6 :
デフォルトの名無しさん :2007/08/11(土) 09:45:34
ダイアログの中にマウス関連のイベントやグラフィック表示を扱う 独自のコントロールを置きたいのですが、 ・CWndの派生クラス(カスタムコントロール)として作成 ・CStaticの派生クラスとして作成 この両者で作り勝手などに違いはありますか? どちらが妥当な方法でしょうか?
8 :
デフォルトの名無しさん :2007/08/14(火) 06:33:44
CListView(report)とCDocumentの質問なんですが、 CDocumentに、オブジェクトの配列obj[10]を作って、それを配列の引数順にリストに表示させているのですが、 リストでソートしたときに、リストの表示とCDocumentのリンクのさせかたが分かりません。 つまり、リストのどの行に、オブジェクト配列obj[10]の何番目が入っているのか、どうやってリンクさせればいいんでしょうか?
>>8 CListCtrl.SetItemDataでインデックス・ポインタ等を関連付けておく。
UI上でのインデックスは、GetItemData用と割り切って考えるといい。
>>9 レス有難うございます。
やってみたのですが、SetItemDateは、 LVITEM 構造体の lParam メンバの値を設定するもののようなのですが、
で、ソートするときに、このlparamの値を、itemの値と同じ通し番号にしているので(他から引っ張ってきたソート用
のコードで、なんでこうしているのかわからないのですが・・・)、
初めにセットしたlParamの値がソートすることで消えてしまいます。
ソートのコードがおかしいのでしょうか?
どうすればよいのでしょう。
11 :
デフォルトの名無しさん :2007/08/14(火) 07:36:31
>>9 CompareFuncの中もobjを使って比較すればよいのですね。
わかりました。
ありがとうございました。
>>10 ちゃんと頭を使ってドキュメントを読めば、そんな引っ張ってきたロジックに頼らずに
自分でソートくらい書けるようになりますよ。
尤も、SetItemDateなんてTypoやっているようじゃお郷が知れますがね。
お郷が知れます(w
日曜大工ならず、夏休みプログラミングなもんで・・・ スレ汚し勘弁
>>10 lParamの値からFindItemを使ってアイテムのIndexを取得してソートに利用
すれば良いでしょう。そうすれば、後からソートをし直してもIndexは
変わってもlParamの値は変わらないので、配列に関連付けて使う事が可能です。
この場合lParamはアイテム挿入時に一度セットしたら後から変えないで下さい。
16 :
デフォルトの名無しさん :2007/08/16(木) 20:44:02
テキストエディタとかにルーラー(目盛り)ついてますが あれと同等のことをやりたいです。下にスクロールしても常に表示するみたいな CScrollViewと CDC::IntersectClipRectつかってもうまく行きそうにない・・・。 CViewとIntersectClipRectでスクロールは自前でやるしかないのでしょうか? # CSplitterWndでルーラー部と本体部の2つのViewってのもありでしょうか・・・
18 :
デフォルトの名無しさん :2007/08/17(金) 00:39:30
>>7 その程度のものなら自前で作ってもたかがしれてる
ドキュメント読んで使い方を覚えるほうが面倒だよ
すいません。質問です。 ダイアログのクラスの名前を間違えたので、 ダイアログのクラスを一旦削除して、同じ名前のダイアログのクラスを再度作成すると以下のエラーがでます error C2374: 'classCDialogXXXX' : 再定義されています。2 回以上初期化されています。 'classCDialogXXXX' の宣言を確認してください。 error C2084: 関数 'CRuntimeClass *CDialogXXXX::GetRuntimeClass(void) const' は既に本体を持っています。 'GetRuntimeClass' の前の定義を確認してください ・・・ grepしてもclassCDialogXXXXは一箇所しか見つかりません・・・ 同じ名前のクラスを再度作るにはどうすればいいですか?
>>19 単に、消し忘れた場所があるだけのような気もするが……
リビルドとかいう基本的な話じゃないよな?
MFCのソフト1つで、次の場合はダイアログとSDIのどちらが適切ですか? メニューバーはありで、ツールバーは使いません。 ドキュメントを1つ扱います。 ビューでは、8割がボタンなどで、2割が独自の描画をします。 ビューの一部だけを独自描画の時に、どちらを選ぶのが適切か教えて下さい。
>>21 画面の一部のみ独自で描画したいというだけなら
DialogでもSDIでもどっちでも構わない。
メニューありでボタンが一杯という所を見る限り
自分ならSDIでViewの種類をCFormViewにする。
漏れなら可能な限りダイアログだ。
24 :
デフォルトの名無しさん :2007/08/17(金) 23:34:25
ダイアログの何が便利なのかさっぱりわからん 大体、CViewから派生させ、すべて自前で描画したほうが 客の理不尽な要求に応じれる。
配置がリソースエディタで弄れる
CFormViewでもいじれるやん
>>24 の条件でCFormViewって反則じゃね?
>>24 >ダイアログの何が便利なのかさっぱりわからん
ビューとドキュメントをわざわざ分離するまでもない場合、コード量が減る。
29 :
デフォルトの名無しさん :2007/08/18(土) 22:57:02
>>28 その程度のプログラムを作成する必要があるのかしらん?
必要がある、と答えられたらそれまでだな。 プログラムの規模とその必要性に関連は無いし。 MFCで小規模アプリ組むの禁止〜! ってな決まりもないしね。
31 :
デフォルトの名無しさん :2007/08/19(日) 02:36:15
っえ? MFCは大規模アプリケーションには向きませんよ
32 :
デフォルトの名無しさん :2007/08/19(日) 02:50:20
>>24 あれだろ?
MSの仕様から逸脱した仕様を希望する馬鹿な客だろ?
そういうの刎ねちゃって問題無い場合がほとんどだぜ
そいつの好感度上げてもなんもいいことねーし
やったからって次の仕事がくるかどうかも全然関係無い場合が多い
俺はタブフォーカスやショートカットの類は全部高額な金額ふっかけて刎ねてる
やりたきゃ自分のところでやれと
正直、やるだけ無駄、全く意味無し
ソフト会社入社3年目の初心者です。 MFCは今後は.NETに取って代わられるというような話を聞きました。 実際どうなんでしょ?
.NET Frameworkのことじゃね? でも.NET FrameworkってC++で使えるの?
>>33 まあ、単純で簡単な.NETに移っていくのはしょうがないんじゃね。
VSの機能も、明らかにC++よりC#に力入れてるし。
MFCがなくなることはないだろうけど、使う機会はゆっくり減っていくかと。
組み込みプログラムとそのツールの作成の仕事が多いから MFC+C++の形を保ってくれないと困る ソース流用できねーじゃん 基本理念(オブジェクト指向)が変わらないのに 新しい言語なんて無駄に作るんじゃねぇといいたくなる
C#やVB.NETは厳密にはコンポーネント指向
>>35 C++/CLI
>>37 >組み込みプログラムとそのツール
GUIとファイル処理、通信部でも作っとけば、
ちょっとした組み合わせと改造で事足りるんじゃないか?
その程度だったら、2ちゃん回ってる時間を少し割けば、速効で作れるだろ
VC、VBだろうが、OOPがどうとか目くじら立てるほどのもんかね?
組み込みでアーキテクチャやOSやらが変わったり、
実績のないボード動かしたりするほどの手間でもないだろ
40 :
デフォルトの名無しさん :2007/08/19(日) 20:01:19
.netでのアプリを出荷したことないから何とも言えないが 客先から見たら、.NETであることによるメリットってなにもないよね? しかも、.netは遅いなんてことも浸透してるから・・・
今までいろんなプログラム書いてきたが MFCほどわからんもんはない
>>40 なんだろうなあれ?
なんであんな糞動作するんだろか?
スクリプトで動作してんのかな?
Vistaといい動作の糞なアプリが多くなったな
>>42 糞動作の意味がわからん
中間言語で動いてるんだから初回起動は遅いのがあたりまえだろ
もっさりしているが 異常動作してるわけじゃない
さらにVistaをアプリと分類する頭も逝かれてるな
アンマネージドなのは好きになれないが、GUI周りの設計は嫌いじゃない。
アンマネージドじゃなくてマネージドだった
>>40 ヒント
1年目マでも使える
開発期間
ASP.NET
48 :
デフォルトの名無しさん :2007/08/20(月) 17:14:01
CWinApp* pApp = AfxGetApp(); if (pApp != NULL) return pApp->DoMessageBox(lpszText, nType, nIDHelp); else return pApp->CWinApp::DoMessageBox(lpszText, nType, nIDHelp);
>>43 やっぱ、もっさりしてるんじゃんw
これが糞動作でなくてなんなんだと聞きたい
俺等は.Netをサポートしてバージョンをわざわざアップしてやるのに
動作はもっさりすんのか?
お前等なんて一生もっさりしてればいいんだ
50 :
デフォルトの名無しさん :2007/08/20(月) 22:36:34
CDC::SaveDCとCDC::RestoreDCって、 CDC::SelectObjectの戻り値を最後に戻す方法に比べて、 なにかデメリットってありますか? こっちのほうがずっと簡潔に書けると思うのだけど。
一切合財保存するだろうから、必要なものだけ戻すよりは重いと思う。 でもまあ今時のPCならデメリットと言えるほどのものではないだろう。
一ヶ所でやる事しか考えないなら どっちでもいい
53 :
デフォルトの名無しさん :2007/08/22(水) 12:37:48
>>51 やっぱりSaveDCとRestoreDCのほうが便利ですよね。
なんでこの方法って広く浸透していないんだろう。
卑怯な方法みたいに書かれているところもあったし。
>>52 これはどういうことでしょうか?
SaveDCはスタック的に何回でもコールできるみたいですけど。
CDocumentでファイル開く処理を行った後、 CViewのOnDrawで再描画行いたいんですけど CView::GetDocumentのような GetViewみたいなの無いですか? OnDrawするような再描画コマンドでもいいです。
>>54 Viewの更新は、基本的にCDocument::UpdateAllViewsで通知する
GetFirstViewPosition/GetNextViewを使って、
関連付けられたViewの取得もできなくはないけど。
CMyView* pView = (CMyView*)AfxGetMainWnd()->GetActiveView(); pView->InvalidateRect(NULL, FALSE);
ドッキングウィンドウ難しい・・・orz 誰か詳しいページ知ってる人いませんか? コードGruruしかない?
MFCでドッキングは茨の道すぎるので C#かBCBやりなさい
VC++2005にCWebBrowser2が無いのですが、 ダイアログに貼り付けたWeb Browserコントロールで 下記のようにNavigate2したいのですが、どうすればできるでしょうか? CWebBrowser2* wb = (CWebBrowser2 *)GetDlgItem(IDC_EXPLORER1); wb->Navigate2(url,NULL,NULL,NULL,NULL・・・);
>>59 ですが、webbrowser2.hとwebbrowser2.cppを自分のプロジェクトへ追加することで解決しそうです
>58 MFCはドッキングツールバーがあるから ドッキングウインドウは簡単だけど?
64 :
デフォルトの名無しさん :2007/08/31(金) 23:11:46
ドッキングも使えないとは・・・
65 :
デフォルトの名無しさん :2007/09/01(土) 11:35:46
メモリマップドファイルについてですが hMap = CreateFileMapping( hFile, 0, PAGE_READONLY, 0, 0, NULL); // MAP名なし if( hMap <= 0 ) { return false; } pPointer = (char*)MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0); // 全サイズ ↑のようにとするとhFileの内容が数1G超とかの場合、無謀になるような気がしますが MapViewOfFileEx等で数ページ分を部分的に割り当てていくしかないでしょうか? 1Gぐらいのファイルを試してみるとpPointerがNULLでした。
ここMFCスレですよ
CControlBarから派生する独自ドッキングバー作る時はかなり苦労したもんだ( ´∀`) CDockBarとかCDockContextとかMSDNドキュメントにも載ってないしソース読むしかないもんな でも.NETだと最初からリサイズ可能ドッキングバーがあるんだよなー・・・なぜMFCも拡張せん!ヽ(`Д´)ノ
だってMFCだもん
MFCって今後は先細り? .NETマンセー時代は来るんですか?
VS2008でVista向けMFCが出るみたい
MFC嫌いなんで廃れてくんねーかな
72 :
デフォルトの名無しさん :2007/09/02(日) 00:23:31
なぜ? .NETに比べたら100倍はいいと思うが?
例外でポインタを投げてくるのだけはどうにかしてほしい
75 :
デフォルトの名無しさん :2007/09/02(日) 14:27:02
MFCに文句つける奴って単に使えないからだけだでょ? 現在、WINでGUIを作成するなら最強だと思う。 MFC無い時代はWINアプリを書くのはしんどかった。 最近C#なんてあるが、所詮インタプリタみたいなもんだからおもちゃw
お前は小学生か
.NET Frameworkに文句つける奴って単に使えないからだけだでょ? 現在、WINでGUIを作成するなら最強だと思う。 .NET無い時代はWINアプリを書くのはしんどかった。 昔MFCなんてものがあったが、所詮遺産みたいなもんだからガラクタw
MFCなんて時代遅れっしょ
79 :
デフォルトの名無しさん :2007/09/03(月) 00:48:28
次期VSでのMFCはかなりイイ ダウンしてみ。 .NETなんざ使う気しなくなるぞ
具体的に説明せよ
MFCってなにがどうなってんのかさっぱりわかんね('A`)
82 :
デフォルトの名無しさん :2007/09/03(月) 11:39:24
ダイアログ上に数十のラジオボタンを配置したいのですが、 後のメンテナンス性を考慮して、ダイアログエディタではなく プログラム内の初期化処理にて生成したいのですが、 どういう関数を使えばいいのですか? よろしくお願いします。
84 :
82 :2007/09/03(月) 13:39:19
85 :
デフォルトの名無しさん :2007/09/03(月) 20:50:30
MFCって関数ポインタテーブルを使いたい「だけ」のためにC++使ってるんだろ? C with class でしかないじゃん、C++と言うより
>>85 "C with class"であることの何が悪いのか知らんけど、クラス継承もあるし、オペレータオーバロードもある。
新しいMFCならテンプレートも使っているね。
ダイアログ上にタブコントロールを配置してます。 ダイアログの表面色を塗りつぶしてるんですけど、 タブコントロールのタブが並んでいる部分の横の余った空間や、 タブコントロールの周囲の微小な背景がグレーのままです。 ここを塗るにはどうしたらいいんでしょうか。 塗るでもいいし、背景を透過にできればいいんですけど。
88 :
デフォルトの名無しさん :2007/09/03(月) 23:53:19
CHtmlViewでURLのドロップを受け取れるようにするにはどうすればいいの? SetRegisterAsDropTarget(TRUE)をしてもダメだった
中味はIEだし、特に何もしなくてもできるだろ
ちょっと興味あったんで試したけどデフォルトじゃ無理みたい。 WM_DROPFILESのイベントハンドラ追加のみで出来ました。 ショートカットだけじゃなく、htmlファイルやtxtファイルも表示可。
ウイザードでCHtmlViewにして、あとは何もいじらない状態でできたよ
>>90 ,92
通常のCHtmlViewではドロップできませんでした
MFCのバージョンが関係あるかもしれないでしょうか?
自分はVisual Studio 2005 Standard Edition SP1を使ってます(WinXP&IE6)
>>91 OnCreateでDragAcceptFiles()してWM_DROPFILESを追加したら、
ローカルのファイルはドロップできるのですが
IEからのURLのドラッグ&ドロップはできませんでした・・・
IEからのURLのドロップをしたいのです
CDC::DrawDragRect()の説明には、座標は「論理座標」と書かれてるのに、 指定した位置にちゃんと描かれず、ネットで使用例を漁ってみたところ、 dc.LPtoDP(&rect); dc.DrawDragRect(rect, Last_draw_size, NULL, CSize(0, 0)); という記述がありました。 これに倣ってLPtoDP()してみたらちゃんと描かれたんですけど、 LPtoDP()するということはデバイス座標ですよね? MSDNの「論理座標」というのはどういう意図なんでしょうか? CDC::Rectangle()のほうにも論理座標と書かれていて、 こっちはLPtoDP()は必要無いんですけど。
>>94 MSDNの説明が間違っているな、これ。英語版でも駄目だな。
VS2005のCDC::DrawDragRectのコードだと、
矩形描画の範囲を指定するのにSelectClipRgnを使っているが、
この関数はデバイス単位での指定を仮定しているにも関わらず、
単位変換無しでそのまま渡している。
mfc(VC++ 2005)で開発をしているのですが、 ステータスバーをスレッド中から参照しようとすると、 Assertion Failedで怒られてしまいます。 ダイアログに変数で CStatusBar m_statubar を追加して OnInitDialog でCreate、ペインの初期化を行い ダイアログのコンストラクタで外部変数で定義した CStatusBar *m_sb に m_sb = &m_statusBar でアドレスを渡してスレッドで参照しているのですが どこがいけないのでしょうか?
>>95 解析情報ありがとうございます。
やっぱりCDC::DrawDragRect()ってデバイス単位で渡すのですよね。
昔からある関数なのにドキュメント修正すらされてないのか…。
たまたま指摘が無かったんじゃね? ちゃんとMSに言えば多分直してくれるよ。
>>96 メインスレッド以外からコントロールを操作してはいけないからと思われ。
101 :
100 :2007/09/06(木) 00:14:51
アンカー間違えた、ごめん。 99じゃなくて96宛です。
102 :
96 :2007/09/06(木) 00:47:54
>>99 >>100 スレッドから参照できないんですね。
ということで、タイマーで監視することにしました。
ありがとうございました。
103 :
デフォルトの名無しさん :2007/09/06(木) 01:28:16
>>102 作り方によってはタイマー監視でもいいけど、同期オブジェクト使った方がいいかも
スレッドプログラミングをタイマーで監視するプログラムは安易でいいけど嵌ることもあるから
あ、スマン96のようなステータスバー監視だったら タイマーで良いや
>スレッドプログラミングをタイマーで監視するプログラム 何を監視するんだか。
106 :
デフォルトの名無しさん :2007/09/06(木) 08:20:53
>>94 さぁ、ドキュメントのフィードバックをしよう
VC++ 2005, OSはXPProを用いているものです。 DLLを作成し、そこからAfxBeginThreadでスレッドを複数立ち上げているのですが、 メモリリークが起こってしまいます。 同様のコードをDLL経由でなく、EXEから直接動かすとリークしません。 恐らく、何らかの初期化処理が足りてないためと思っているのですが、心当たりのある方がいらっしゃいましたら、教えてください。 //--- 以下ソース #pragma once #include "TestThread.h" class CThreadManager { public: CThreadManager() { m_pThreads = NULL; } virtual ~CThreadManager() { delete [] m_pThreads; } void Run() { if (m_pThreads == NULL) {m_pThreads = new CTestThread[50];} for (int i = 0; i < 50; i ++) { if (m_pThreads[i].IsEnable()) { m_pThreads[i].SetEnable(FALSE); m_pThreads[i].Run(); return; } } } private: CTestThread* m_pThreads; };
//続き #pragma once class CTestThread { public: CTestThread() { m_pThread = NULL; m_bEnable = TRUE; } virtual ~CTestThread(void) { EndThread(); } void Run() { EndThread(); m_pThread = ::AfxBeginThread(TestProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); if (m_pThread != NULL) { m_pThread->m_bAutoDelete = FALSE; m_pThread->ResumeThread(); } }
//続き BOOL IsEnable() {return m_bEnable;} void SetEnable(BOOL bEnable) {m_bEnable = bEnable;} private: void EndThread() { if (m_pThread != NULL) { m_bEnable = -1; ::WaitForSingleObject(m_pThread->m_hThread, INFINITE); delete m_pThread; m_pThread = NULL; } } static UINT TestProc(LPVOID pParam) { for (int i = 0; (i < 50) && (((CTestThread*)pParam)->m_bEnable == FALSE); i ++) ::Sleep(5); ((CTestThread*)pParam)->m_bEnable = TRUE; return 0; } CWinThread* m_pThread; BOOL m_bEnable; };
以上です。 108,109は一つのファイルを分割しています。 それと、掲示板に登校するサイズを減らすためにヘッダファイルのみで書いてみました…… よろしくお願いします。
>>107 に追加です。
CThreadManager::Run(); 関数をタイマーで何回も呼ぶと、どんどんメモリが消費されていくという現象です。
確認は[管理ツール]→[パフォーマンス]から行い、一日ほど回し続けました。
初心者です、質問させてください。 OnFileNewなどMFCが用意してくれた関数の中身(=ソースコード)って 見る事ができないのでしょうか? もしできるのなら、その方法を教えてください。 よろしくお願いします。
113 :
デフォルトの名無しさん :2007/09/09(日) 00:55:01
初心者を自称する人がMFCのソースコードが読めるとでも?
>>107 もっと簡素化したソースで検証したほうがいいんでねえの?
あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、
メモリリークが発生しているかどうかをどのように見極めているとか、
メモリリークは、1スレッドあたりどの程度発生しているとか、記載すべきことがあるんでねえの?
>>112 どのクラスのOnFileNewだかしらねーけど、MFCのソースはインストールされてんの?
されてんなら検索すればいいだろう。 されてねーならインストールすればいいだろう。
116 :
112 :2007/09/09(日) 02:15:39
>>114 「OnFileNew」をキーワードに、下記フォルダを検索したら探せました。
ありがとうございました!!
C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc
WIN32開発、java、C#とやってきて 最近MFCを始めました。 MFCってすごく難しく感じます。 実際どうなんですか?
>>117 あなたにとって難しい。それだけのことです。
>>117 平然と並列でないものを並べられると、頭がグラグラする。
漢文、英語、中国語とやってきて、
最近2ch語を始めました。
2ch語って凄く難しく感じます。
とかそんな感じか?
とりあえず、107のソース使って、dllとexeから実行してみたけど リーク検出できなかったな 1日実行してみて、どれくらいリークしてるの?
>>117 win32の経験があるのなら、mfcはそんなに難しくないと思うが。
フレームワーク「郷に入っては郷に従え」 の考え方ができればいける。
>>114 もっと簡素化したソースについては今から作る事にします。
>あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、
何らかの初期化処理というのは、単にスレッドを起こす前に、おまじない的なものが必要なのかと思って書いただけです。
また、DLLMain関数はMFC側で作っているものを使っているので、こちらの初期化処理については不明です。
>メモリリークが発生しているかどうかをどのように見極めているとか、
管理ツールからパフォーマンスモニタを開きまして、そこでプロセスを選択して、15秒おきにワーキングセットを監視しています。
直接のメモリリークではないと思いますが、exeとの比較により、ワーキングセットの増え方があまりに異常なので問題かと……
>メモリリークは、1スレッドあたりどの程度発生しているとか
1スレッドあたりのリークは調べていませんが、15秒おきのワーキングセット増加値は平均で23kBほどです。
これは、CThreadManager::Run();をタイマーで、90msごとに動かした結果です。
一日動かしたときは、これよりも間隔をあけて1000msでやりました。割合は減りますが、同じようにリークします。
なお、1000msで一日動かしたときの、一日のリーク量は1MBほどです。
>>120 1000ms間隔で1MB程度です。
ちなみに、事情がありまして、DLLエクスポートの部分は少々特殊かなぁ……と。
そこのソースも書いてみます。
// エクスポート部分のソース。 __declspec(dllexport) void CreateThreadManager(DWORD** ppObject) { *ppObject = (DWORD*)(new CThreadManager()); } __declspec(dllexport) void RunThread(DWORD* pObject) { ((CThreadManager*)pObject)->Run(); } __declspec(dllexport) void DeleteThreadManager(DWORD* pObject) { delete (CThreadManager*)pObject; } //アプリ側の使用部分 #include "stdafx.h" #include "ThreadTest.h" #include "ThreadTestDlg.h" #include "ThreadDll.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CThreadTestDlg::CThreadTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CThreadTestDlg::IDD, pParent) { m_pManager = NULL; m_nTimerEvent = 0; } // 続く
//続き BEGIN_MESSAGE_MAP(CThreadTestDlg, CDialog) ON_WM_TIMER() ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CThreadTestDlg::OnInitDialog() { CDialog::OnInitDialog(); ::CreateThreadManager(&m_pManager); m_nTimerEvent = SetTimer(1, 89, NULL); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } void CThreadTestDlg::OnTimer(UINT_PTR nIDEvent) { if (m_pManager) { RunThread(m_pManager); } CDialog::OnTimer(nIDEvent); } void CThreadTestDlg::OnDestroy() { CDialog::OnDestroy(); if (m_nTimerEvent != 0) { KillTimer(m_nTimerEvent); } DeleteThreadManager(m_pManager); }
てな具合で、動かしています。正直な話タイマー間隔をこのぐらい短く設定すると一日は多分動きません。 もうちょっと空けてやらないと、マシンスペックの弱いPCだと落ちてしまうのではないかと……
127 :
デフォルトの名無しさん :2007/09/09(日) 13:59:38
>>122 そうですか?
BCBやVC#と比べると何をどうしていいのかまったく分からん
128 :
デフォルトの名無しさん :2007/09/09(日) 14:11:26
>>127 >何をどうしていいのかまったく分からん
たとえば、何をどうしたいのかな?
よほど難解なことをしようとしてるのか。それともごく標準的なGUIツールも作れないのか。
>>127 ぶっちゃけ、すぐ上のサンプルコードは動かせる?
>>126 とりあえず、そのもたないと思われる状態で一日動かしてみるべき
CObjectから派生させていないデータクラスでも Serializeでないファイル読み書きに CArchiveを使ってしまってよいものでしょうか? virtual void LoadData(CArchive& ar); virtual void SaveData(CArchive& ar) const; こんな感じのメンバ関数を用意しようかと思っているんですけど。 それとも、CFile*を引数にしてしまうべきですか?
>>131 シリアル化にIMPLEMENT_SERIALを使わないなら、
CObject派生の意味は殆ど無いし、良いんじゃないかな。
結局は単純なバイト列の読み書きなのだし。
>>132 ありがとうございます。
自作データクラス群は大元の親クラスが純粋仮想クラスで、
また、自分自身がCObjectから派生することに慣れていないため、
この形のままCArchiveだけ使えないかなと思いました。
このデータクラス群の一つが内部でCArrayのメンバを持っているのですが、
これを保存するためにCArray::Serializeを呼ぼうとすると、
SaveDataはconstにはできないですね…。
まぁconstを取り外してしまえば、とりあえず動きそうですが、
SaveDataの中でMFCクラスメンバのSerializeをコールというのが
かなりまずい構造なのかなぁ。
>>133 MFC - 概念 - シリアル化 - シリアル化 : オブジェクトのシリアル化
- アーカイブを通じた CObject の格納と読み込み
質問です CDialogの派生クラスを作成して、そのダイアログに CButtonやCStaticなどのコントロールを貼り付けています そのコントロールの上に色々描画したいんですが やり方が解りません。どうすればいいでしょうか? OnPaintを作ってその中で CPaintDC dc(this); dc.MoveTo(*,*); dc.LintTo(**,**); としてみましたが、コントロールの上でなく背後に描画されてしまいます
>>135 ダイアログを派生させるまで分かって、
コントロールを派生させることに思いつかなかったってことでいいの?
>>136 CStaticを派生させてそのOnPaintを処理したら
キャプションが表示されなくなりました。
やりたいことはCStaticのコントロールがあれば、そのコントロールに
縁取りして線を描いたり、コントロールの上にビットマップを表示したり
したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。
イメージとしてはダイアログを表示してそれをビットマップで保存し、
その上に落書きする、みたいな。
138 :
デフォルトの名無しさん :2007/09/14(金) 12:06:25
DLLの関数をコールした時に、よく解らない現象が起きます。 char Buff[1000]; int nRet = ((PT_FUNC)*m_fpFunc)( Buff, sizeof(Buff) ); 1行目でBuff領域を確保した後、 2行目のDLLをコールするとBuffのアドレス値が変化してしまいます。 しかもthis変数の値も変化してしまい、エリアの破壊が起きている感じです。 DLL側(自作)では無処理のreturn としています。 2行目のBuff宣言を static char Buff[1000] とすると正常に動作します。 DLL関数には 静的なバッファしか渡せないという事なんでしょうか? 教えて下さい
140 :
138 :2007/09/14(金) 12:38:29
>>139 FARPROC m_fpFunc;
です。ここが違うのでしょうか?
>>140 FARPROCやめて実体と同じ型で宣言してみ
引数と戻値が呼び出しと実体で違っててスタックを壊してるだけだと思うぞ
142 :
138 :2007/09/14(金) 13:30:42
>>141 指摘の通りでした。
ありがとうございました。
>>137 > やりたいことはCStaticのコントロールがあれば、そのコントロールに
> 縁取りして線を描いたり、コントロールの上にビットマップを表示したり
> したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。
CStaticのOnEranseBkGroundって作れるっけ? 作れるんなら、そこで処理してみたら?
作れないなら、無理っぽい。
144 :
143 :2007/09/15(土) 17:34:21
×OnEranseBkGround ○OnEraseBkgnd
>>143 結局CStaticから派生してOnPaintの中で
DrawTextとかFrameRectとかを使用するようにしました
今OnEraseBkgndでFrameRectを使ってみましたが、
これでも出来そうな気がします
しかし、テキストの描画時にFrameRectで描いた枠が消されて
しまうようで他にも幾つかいじらなければいけないっぽいですね
一応解決です、皆さんアリガト
CHtmlView::Navigate2のエラー検知を行いたいのですが、 どうすれば良いのでしょうか? どなたか教えてください。
147 :
デフォルトの名無しさん :2007/09/16(日) 14:49:26
自作DLLでダイアログを表示しようとしています。 m_pcDebugDlg->Create(IDD_TEST); を実行すると、 ERROR: Cannot find dialog template with IDD 0x36B1. というエラーが発生します。 何かの設定が足りないのでしょうか? よろしくお願いします。
そこに書いてある通りじゃないの?
149 :
147 :2007/09/16(日) 17:25:10
>>148 IDD_TEST は resource.h に定義されていました。
プロジェクト/プロパティ/MFCの使用を「共有DLLでMFCを使用する」から
「スタティックライブラリでMFCを使用」に変更したら、ダイアログが表示される様になりました。
ただし、客先からは「共有MFC」でと指示があります。
何が悪いのでしょうか?
リソースをビルドしなおしても同じ?
>IDD_TEST は resource.h に定義されていました。
.rc ではどうなってますか
まあ
>>150 でおkだと思うけど
152 :
147 :2007/09/16(日) 18:02:30
..rc には IDD_TEST DIALOGEX 0, 0, 250, 170 という記述がありました。 リソースをビルドという方法がよくわからなかったのですが、 ソリューションのリビルド . rcファイルのコンパイル の両方とも、現象は変わりませんでした。 リソースのビルドって、他のやり方でしょうか?
つ AFX_MANAGE_STATE
154 :
147 :2007/09/16(日) 18:43:56
>>153 DLL関数の先頭に
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
を追加したらうまくいきました。
どうもありがとうございました。
155 :
デフォルトの名無しさん :2007/09/19(水) 17:46:56
ダイアログの上でエンターキーを押すと、 プログラムが正常終了してしまいます。 プログラムを終了させたくないのですが、どうすればいいのか教えて下さい。 よろしくお願いします
いや俺は PreTranslateMessageで処理するほうが好きだ
158 :
155 :2007/09/19(水) 20:06:07
>>156 ,157
ありがとうございました
OnOK()で対応しました
OnOK()で対応するというのは間違っていると思う。 OnOK()の意味をちゃんと考えるべき。 そして「Enterキーを押したときにダイアログを終了させない」という仕様の意味をちゃんと考えるべき。 するとどうやって実現するのが正しい形かわかるでしょ。 面倒でも、何事も正しい形ってものを常に意識して作っておかないと後悔するよ。大袈裟だがw
MFCが勝手に定義してる機能を殺すだけだろ 元のダイアログにはそんな機能ない
リターンキーが押される→OnOK()が呼び出される→OnOK()の処理をキャンセルする よりは リターンキーが押される→OnOK()を呼ばないようにする の方がスマート。 よってPreTranslateMessageを推奨するよ。 他の用途にも使えるし覚えといて損はない。
そこまで気にするんなら メッセージ発生するごとにPreTranslateMessage呼ばれるのも気にした方がいいよ OnOKよりはるかにオーバヘッドになってるはず
Okボタンが在る場合、 Okボタンがデフォルトボタン形状なのはUI的にまずい。
164 :
デフォルトの名無しさん :2007/09/20(木) 17:56:11
フォトショップ等、メインウィンドウの他に、 レイヤー情報などを表示するウィンドウがあるんですが、 それをCDialogで作ろうと思っているんです m_dlg.Create( CTestDialog::IDD , this ); m_dlg.ShowWindow( SW_SHOW ); で、一応表示されるんですが、 ダイアログにフォーカスが写ると、 メインウィンドウのタイトルバーが灰色になるのです。 正しい、子ウィンドウの作り方ってありますか?
正しいかどうか知らんけどツールウィンドウ
Enterキーは、OKボタンを押すのではなく、デフォルトボタンを押す操作です。 PreTranslateMessageでEnterキーを弾いてしまうと、 OKボタン以外のボタン上でEnterキーを押したときにも無視されてしまいます (そのときにはそのボタンが押されるべき)。 もちろん、PreTranslateMessageでフォーカス位置を調べてもいいけど、 そこまで面倒なことをするのなら、 OKボタンをDisable・非表示にしたほうが早いです。 OKボタン自体は残しておきたいのであれば、 なにもしない非表示ボタンをデフォルトにすればよいです。 PreTranslateMessageの方法だと、デフォルトボタン枠が出ているのに Enterキーが効かないというGUI上の矛盾もあります。
167 :
392 :2007/09/21(金) 21:55:41
> OKボタン自体は残しておきたいのであれば、 > なにもしない非表示ボタンをデフォルトにすればよいです。 デフォルトボタンは何ですか、と問われたときに、ありませんと答える方が良いかと。
今、以下の方法で自作ボタンを作ろうとしています。 ・CStaticを派生させる。SS_BITMAPとSS_NOTIFYを設定する。 ・OnMouseMoveでカーソルが乗ったらSetCaptureなどして降りるまでハイライト用のビットマップをSetBitmapする。 ・カーソルが降りたらReleaseCaptuerして通常のボタン用ビットマップをSetBitmapする。 ・OnLButtonUpで親ウインド(CDialog)にWM_COMMAND,BN_CLICKEDをPostMessageする。下記ソース参照。あと押された時のビットマップをセットする。 CMyButton::OnLButtonUp { WPARAM w = MAKEWPARAM(id,BN_CLICKED); ::PostMessage(hParent,WM_COMMAND,w,0); ごにょごにょ } すると確かにLボタンを押下すると親のダイアログに通知されます。 しかしながら親ダイアログではON_BN_CLICKEDマクロで登録したハンドラが2回呼ばれます。 一回目は不明。2回目は私の作ったCMyButton::OnLButtonUpから。 誰が一回目のBN_CLICKEDを送るの?CStaticの規定クラス??
169 :
392 :2007/09/22(土) 22:02:59
winuser.h #define STN_CLICKED 0 #define BN_CLICKED 0
171 :
デフォルトの名無しさん :2007/09/22(土) 23:31:42
本当にMFCが全くわかりません。 とにかく、GUIを作るのが難しすぎに感じます。 VC#なんて超簡単にGUI作れるのに・・・ まだまだ、VC+++MFCはデファクトスタンダードなんですかね?
>>171 MFCは欠陥製品だと思う
対抗するボーランドがコケちゃったんでMSの一人天下になっていますが
これに付き合わされる開発者はたまらない
C#を使いましょう
173 :
デフォルトの名無しさん :2007/09/23(日) 00:42:51
慣れの問題ですよ VC#が簡単に、作れるって言っても例えばテキストエディタを作る場合 商用を考えたら標準のTextBoxなんて使い物になりません。 一から書くことになります。 だったら、WIN32APIを手間なく呼べるVC++に利がある。 VC#だと使う、WIN32APIをいちいち宣言しなくてはいけない。
MFC使わねばならん環境なら、頑張って使えるようになればいいだけだし、 使わなくて言い環境なら、C#でやればいいだろう。 何故このスレで愚痴るのか理解できない。
>>174 MFCの習得に挫折した人がMFC叩きしてるだけ。
穏やかになだめてあげてください。
176 :
デフォルトの名無しさん :2007/09/24(月) 00:10:51
確かに他のライブラリと比較すると挫折率はダントツに高いかもしれん よく、Cはポインタで躓いたなんて人いるけど似たようなもん
ていうかあまりの複雑さと面倒臭さに死にたくなるときあるな なんでもかんでもメッセージって逆に面倒臭いだけだったんじゃないだろうか・・・
178 :
デフォルトの名無しさん :2007/09/24(月) 02:17:59
けど、大抵の商用ソフトはMFCが使われている。 .NETなんて皆無では???
Vistaならネイティブとほとんど変わらんが?
>>180 それって普通に作ってた奴の方が遅くなったんでしょ?w
182 :
デフォルトの名無しさん :2007/09/24(月) 05:07:52
MFCは隠蔽化というより隠蔽工作だというようなことがかかれた本があった。 本来仕組みなど知らなくても簡単に使用できるのが隠蔽化だが MFCには仕組みを知らなければバグの原因がまったく理解できない不可解な現象も多い。 それらを苦労して乗り越えて来た人間は威張り腐りって、 「MFCが糞なんじゃなくて理解できないやつが糞」と言いたいのだろう。気持ちはわかる。 だが世間一般ではそういう場合ライブラリが糞だという。 自分の腕前を自慢したいからって言葉を捻じ曲げてはいけない。
183 :
デフォルトの名無しさん :2007/09/24(月) 05:31:44
あの当時に書かれたライブラリで今まで通用したものってほかに何かあるかな? OLEを隠蔽するフレームワークとして十分納得いくし、フル機能のウインドウズ ソフトウエアを書くのにほかにいいライブラリが無かったのも事実だと思う。
>>それらを苦労して乗り越えて来た人間は威張り腐りって、 被害者意識が強い傾向が見られます。 何かトラウマになるような事でもあったのでしょうか(w
MFCがなければWIN32のバグが分からない 永遠に更新を続けるべき
186 :
デフォルトの名無しさん :2007/09/24(月) 07:39:58
>>182 あー、でも俺、そういうラッパー系のクラスで
下層の構造知らずにうまく包んであるもんってみたことないわ
無理なんじゃねぇの?って思ってる
可変長ですよといいつつ
なんも意識せずに1文字ずつ追加すると毎回全バッファを再確保する
最近の次世代(?)言語の文字列クラスのようにw
文字列定数 -> System.String CString -> System.Text.StringBuilder と考えれば、それはそんなもんかって気もする。 Stringの連結はおまけ機能ってことで。
MFCのいいところはVisualStudioで使う場合にドキュメントモデルを提供してくれることとダイアログエディタがあることか。 ちょっと凝ったことをしようと思うと折角クラスで隠蔽化しているように見えても実際にはAPIと同じ名前のメソッドだからAPIと手間は変わらないし、 全てを網羅しているわけではないから結局APIを直截呼ばないといけないケースもある。 あれはだからAPIラッパクラス集と思えばいいのであって、それ以上のフレームワークと思ってはいけないのだろう
>>187 >Stringの連結はおまけ機能ってことで。
そんなことになってるぐらいならラップなんてしないほうがいいじゃないって思う
190 :
デフォルトの名無しさん :2007/09/26(水) 11:01:12
CDC型のメンバからその描画領域のサイズを取る方法はありますでしょうか。 CBitmap* pBitmap = pDC->GetCurrentBitmap(); BITMAP bmp; pBitmap->GetBitmap(&bmp); とやってbmp.bmWidthやbmp.bmHeightを参照しようと思ったのですが、 ビューのOnDrawなどで渡される画面DCに対しては GetBitmapがエラーになるようなのです。 メモリDCに対しては成功します。 もちろん、OnDraw時はGetClientRectを使えばサイズを取れるのですが、 関係無い場所でpDCだけを見て調べられないかなと思っています。
つ ::WindowFromDC
192 :
デフォルトの名無しさん :2007/09/26(水) 11:53:25
>>191 ありがとうございます。
::WindowFromDCというのは、CDC::GetWindowと対応しているようなので、
CRect rect;
BITMAP bmp;
if (pDC->GetCurrentBitmap()->GetBitmap(&bmp)) {
/* メモリDC */
rect = CRect(0, 0, bmp.bmWidth, bmp.bmHeight);
}
else {
/* 画面DC */
pDC->GetWindow()->GetClientRect(rect);
}
とやってみたところ、どちらの場合でもサイズを取ることができました。
判定方法はこれで大丈夫ですよね?
.NETのMenuStrip簡単にできていいなぁ MFCでもサポートしてくれ
簡単に作れる代わりに使い物にならんほど遅いプログラムとなってしまった .NET非常に残念だったな
MFC not dead - "massive update" planned まさか .NETは無しね!MFC大幅機能強化するから! なんてことになるん(r
196 :
デフォルトの名無しさん :2007/09/30(日) 06:51:40
MFC と NET って、どの程度の処理速度がちがうんですか? まじレス希望
>>196 MFC全盛期のPCでMFCを動かすと、今のハイエンドなPCで.netを動かすのとは較べ物にならないほどもっさりしています。
MFCって.NETのコントロールと比べると鼻くそみたいにショボイのに2008にもまだ残ってる理由ってなんですか? 必要かな?
鼻くそみたいにショボイと思ってるのに このスレへやってくる理由ってなんですか? 必要かな?
.NETのコントロールなんて飾りです。偉い人には(ry 冗談抜きで。
EEダウンロードできんじゃん
204 :
デフォルトの名無しさん :2007/10/01(月) 11:36:20
VS2005とMFCで拡張DLLを作成しているのですが、 この拡張DLLを呼び出した側のインスタンスハンドルって どうやって参照すればよいのでしょうか。 AfxRegisterClassで必要なのですが、 AfxGetInstanceHandleだと、大元のEXEのハンドルが返ってきてしまいます。 EXEから呼び出された別の拡張DLLがこの拡張DLLを使う可能性もあるため、 大元のEXEではなく、呼び出し元を参照できるようにしたいのです。
Code Projectにたくさんのコントロールがあげられているが コントロールってダイアログベースにするかViewをFormViewに選択するしか 使えないんでしょうか?
VC6です。 プログレスバーについての質問。 時間がどのくらい掛かるか不明な処理でプログレスを表示したい。 Webなんかで有るような、2−3このコマが左から右へくるくる回ってるの が良いんだけど、CProgressCtrlじゃできないっぽい? なんか良い案あったらおしえて。 時間がどのくらい掛かるか不明なのは、開始ボタン押すとハードと通信して ハードが処理終了するのを待つから。 ハードは詳細な進捗なんて返してくれない。 ハードの状態や処理対象によっても時間が大きく変わるので平均でこのくらい ってどんぶりで表示するのも厳しい状況。 したがって、ループするようなヤツが欲しいといった理由。
砂時計
208 :
206 :2007/10/02(火) 19:29:58
>>207 レスサンクス。
砂時計は却下されてしまいました。
と言うか、すでに砂時計は出してるけど、曰く
「ホントに、動いてるのか解らない」だそーで。
プラスでプログレスが欲しいんだと。
えらい人の考えは良くわかりません。
>>206 まあ、砂時計出したままフリーズするアプリもあるから、動いているか
どうかを確認したいというのもわからなくはない。
どうしてもプログレスコントロールにこだわるなら、何回も繰り返して
描画してやればいいんじゃない?
>>205 ん? Code Projectにあがっているコントロール”だけ”使えてないの?
そうなら、そのコントロールを挙げてくれ。
そうでなく普通のEditやComboも同じように使えてないなら、動的生成すればいい。
”Edit 動的生成”とかでググレば、サンプルとかあるんじゃねーかな。
>>206 IEのようなウィンドウ右上のアニメーションで済むならCAnimateCtrlでが楽。
プログレスバーの現在位置が左から右へ動き続けるような奴だと
中断ボタンも必要だろうし、別スレッドでプログレスバー制御と中断の
入力待ちをすることになるんじゃないかな。
砂時計を却下する上司って良いなーと思った。
動いてるのか解らないという理由で砂時計がダメなら IEのようなアニメーションもダメだろう
エディットコントロールの質問です。 コントロール内部に画像を表示させて、文字編集を行うものを作ろうと思ってるのですが なかなかうまくいきません。 OnCtlColorでCreatePatternBrushで作ったものを返すようにして 何とか文字未入力領域に画像を表示させたのですが、 文字入力エリア部分に画像を表示できなくて困っています。 何かいい解決方法はないんでしょうか?
>>214 SetBkModeで透過にするのを忘れている予感
マルチラインは、この方法だと不都合があるみたいなので注意
>>215 あ、説明たりなくて申し訳ない。
複数行エディットコントロールについての話でした。
質問です。 CViewの派生クラス を A 、 CWndの派生クラス を B とします。 Aのメンバ変数にBを持ち、A の OnCreate にて B を Create し、A全体に貼り付けました。 正常に生成され、貼り付けもうまくいっているのですが、B にてマウスホイールが 取得出来ないことに気づきました。(クリック等は正常動作します) どうもフォーカスがいっていないようなので、A の OnSetFocus にて、B に対して SetFocus をすると、期待通りの動作をしてくれ、B にてホイールを取得出来る ようになりました。 A全体にBが貼り付けてあり、これをクリックしたら当然Bにフォーカスが行くものだと 思っていたのですが、なぜ行かないのでしょうか? XP Pro SP2 VC++8 sp1
>>217 例えば、ラベルをクリックしてもフォーカス受け取らないじゃん?
そしてどーやるんだったか忘れた。 ごめん。
SPYでフォーカス受け取るコントロールと
受け取らないコントロールのメッセージの違いを調べる…とか。 激しく疲れるな。。
ラベルというかスタティックはidの設定だから全然別の話
>>219 idの設定て、IDC_STATIC? まさか、そんなはずは。 もうちょっと分かるように説明してくれ。
シングルダイアログのプログラムです、最小化ボタンと最大化ボタンを付けるのを忘れてしもうたww 今から付加したいのだが、どのクラスのどのプロパティーをいじったらええの? VS20005 MFC
>>221 ダイアログエディタかテキストエディタで<project>.rcを編集し給え。
>>222 221です
rcファイルいじって悲惨な目(編集不能)に何回かあったのだが大丈夫なのか?
ダイアログのプロパティでMinimize/MaximizeBoxをTrueにすればいいだけの話だろ。 何を悩んでるんだ?
>>223 ダイアログエディタでプロパティを変更する行為だけで編集不能にできるならたいしたもんだ。
227 :
デフォルトの名無しさん :2007/10/06(土) 15:19:49
CToolBarのボタンを大きくすることは出来ますか?ロードするビットマップのサイズが大きければ大きくなるのでしょうか?
228 :
デフォルトの名無しさん :2007/10/06(土) 18:17:23
MFCのSDIアプリケーションを作成しています。 日本語以外のOSでも正しく動作させたいのですが、 最小化ボタンの上にカーソルを合わせたときに表示されるツールチップの「最小化」 などは自動的に現地の言葉で表示されるのでしょうか?
229 :
デフォルトの名無しさん :2007/10/06(土) 19:09:31
コード調べたらわかるでしょ
日本語化されてない英語アプリ動かしてみりゃわかるだろ
apiのソースは非公開 漏れたのもあるけど
CStringのTrimの中でアサートするんですが・・・ CString str = "33 " str.Trim(); ・・・ Truncate ATLASSERT( nNewLength <= GetLength() ); Unicodeライブラリ使ってますがこれがまずい?
"33 "
VC2005で試したところ、
>>232 のコードはコンパイルを通らなかったのだが、
それはそれとして、不思議な現象が。
1. CString str = "33"; // NG
2. CString str("33"); // OK
3. CString str; str = "33"; // OK
いまいち納得がいかない。
すみません str = _T(" 33 ")なら通りますね
>>234 コンストラクタと=の動作が違うんかな?とかわからずに言ってみるテスト
>>234 初期化と代入の違いわかってるか?
あと_T()マクロがどう展開されるか
238 :
234 :2007/10/08(月) 08:29:48
WCHARベースのCStringでも CString(LPCSTR) operator=(LPCSTR) の両方とも定義されているので、2.と3.が通るのは分かるが、 なら、何故1.が通らないのかがよく分からない。 1.は3.の省略系みたいなものだとの解釈は間違い?
コンパイラはヘッダみてるだけだから コンパイラの立場でヘッダ見てみればいい
240 :
デフォルトの名無しさん :2007/10/08(月) 16:48:36
MDIでApp作ってます。 CMDIChildFrameA :: OnCreate() { dlg.Create(IDD_DIALOG, this); } としておいて Dialog 内 OnOKで if ( GetParent()->IsKindOf(RUNTIME_CLASS( CMDIChildFrameA )) ) とすると何故か失敗するのですが・・・ GetParent()で取れるCWnd* がCMainFrameになっているみたいです。 誰かボスケテ
241 :
234 :2007/10/08(月) 16:52:45
(・∀・)ワカッタ!! 1. CString str="33"; は、暗黙的に CString str("33") に変換される 2. が、WCHARベースのCStringでは #define CSTRING_EXPLICIT explicit CSTRING_EXPLICIT CString::CString (LPCSTR str); と宣言されることになる 3. explicit宣言されていると、1.のような暗黙的なコンストラクタへの変換は禁止される。 よってコンパイルエラー発生。 explicit使った事無かったから、全然思いもつかなかった。
>>240 Windowsの仕様で、自動的にフレームウィンドウを親にされてしまうみたいだな。
Get/SetOwnerで関連付けてしまうのも一つの方法か。
>>242 さん ありがとうございます
色々試してみてたんだけど
GetWindow(GW_OWNER) ← 駄目
GetParent() ← 駄目
SetOwner() GetOwner()すればRUNTIME_CLASSうまくいきました
>>228 MFC使わないコードで
Tooltip(?)の処理しなくても出てくるから
OSが処理してる。
だからOS依存で英語版なら英語で表示されるでしょ。
MFC内で独自処理してたらしらない
英語版のVCでコンパイルすれば解決ということだな
そうだっけ? なんかリソースファイルの中くまなくさがしてみるとか・・・
247 :
デフォルトの名無しさん :2007/10/09(火) 00:25:46
SDIアプリでCreateWindowでCFrameWindowの子供ウインドを作成し、Viewの上に沢山並べてみた。 で、そいつらをクリックしたら、アクティブになってフォーカスがあたってフォアグラウンドになる予定だった。 でも実際はWM_MOUSEMOVEすらそいつらには飛んでこない。くるのはWM_CREATE,WM_MOVE,SIZE,PAINTくらいだ。 この子供ウインドをWS_POPUPとかにすれば飛んでくるけど。。あーわかんないよぉ。 子供ウインドの一つを選択したら、他のウインドがフォーカスを失って、選択されたウインドがフォーカスされて しかもメッセージを受け取って欲しいんだよぉ。なんでだめなの?????
>>247 何が作りたいのか俺にはわからんが
他のアプリで似たような動きしてるもんあったら教えてみぃ
MFCのライブラリをスタティックリンクすると挙動が変になり悩んでます。
[現象]
・スタティックリンクすると、
メニュー → ファイルを開く → コモンダイアログのフィルタに「すべてのファイル(*.*)」がなくなる。
・共有DLLでビルドすると普通に出来る。
--
新規プロジェクトでスタティックリンク試してみると
普通に出来るので俺が悪いのは確かだろうが・・・
ちなみにデバッグビルド(&スタティックリンク)すると
[docmgr.cpp]
DoPromptFileName()
VERIFY(title.LoadString(nIDSTitle));
でエラーになる。
この先を追っかけているが(atlcore.hとか)だんだん鬱になってきた。
似たような現象になった人いませんか?
>>247 割り込んでごめんなさい
フォーカスないウインドウにもマウスのメッセージは飛んでくるし WM_MOUSEMOVEすらそいつらには飛んでこないというのは変
251 :
デフォルトの名無しさん :2007/10/09(火) 14:34:01
>>248 そうですね。。たとえて言えばエクセルのオートシェープをウインドで表現し、
シートに沢山並べた状態みたいなものでしょうか。
トラッカークラス使えよ
VC6です。CListCtrlをレポート形式で使ってます。 SetExtendedStyle()でLVS_EX_GRIDLINESを設定するとグリッド線が表示されていたのですが、 Windows2000からWindowsXPに変えて、画面をXPスタイルで表示するとグリッドが消えてしまします。 設定の仕方を間違えているのでしょうか。
>>253 スクロールさせると消える挙動はバグ。修正予定はたぶん無い。
どうしても直したいなら、自前描画するしかないと思われ。
255 :
253 :2007/10/10(水) 12:35:12
>>254 まだスクロールもさせていない段階なのですが・・・。
カスタムコントロールにCPenで書いた線を消そうと void CLineChartCtrl::DeInvalidateCtrl() { CClientDC dc(this); CRect rcClient; GetClientRect(rcClient); InvalidateRect(rcClient , TRUE); } として再描画しても消えないのはお子ちゃまだからデツカ? ハンドルもしっかり取れてるのにな??
おぼっちゃまがやっていることは ただ画面を更新してるだけ
再描画でまた書いてるだけなんじゃ…… ちなみに、その処理ならCWnd::Invalidate()一発で済む。
>>257 のおじさま、ありがd
うぅぅぅ〜〜〜、嫌な悪寒デツ
どうしたら簡単に線が消せマツカ?
やっぱり書いた線をxorで描くとかマンドクサイことやんなきゃムリッポなのかなぁ。。。。。。うぅぅぅ〜〜〜
>>258 さんもありがd
やってミマスタガ線が消えません、MFCってCPenクラスがあるならCEraserクラスも
作ってホスイ片手落ちって言うんだよねこれ豆知識
線が消したいというか初期画面に戻したいんデツガ、コンストラクタをも一回読んでみたら
どうなるのかな、実験シマツ
おまいは何か根本的に勘違いをしている。 ウィンドウに描画した内容は、基本的に保持されていない。 描画内容を変更したい時は、一旦クライアント全体を無効にして、 次の再描画からその変更した内容で描くようにする。 自前でフレームバッファを用意してそこに描画してる、とかは無しな。
>>260 おまえ、あたまん中をいっぺん消した方がいいぞ
最小化して戻したら消えてないか?
まぁマイクロソフトのウインドシステムは確かにわかりにくい仕様がおおいけどな。
266 :
デフォルトの名無しさん :2007/10/15(月) 10:11:46
VS2005です。 SDIのプロジェクトからダイアログを追加し(CDialog1)、 そのコンストラクタにビューのポインタを渡してみたのですが、 ダイアログはフレームウィンドウの中央に出てきてしまいます。 void CTestView::OnLButtonDown(UINT nFlags, CPoint point) { CDialog1 dlg(this); dlg.DoModal(); } ダイアログのコンストラクタで親ウィンドウを指定しているのに、 なぜその中央に表示されないのでしょうか? 中央に表示させたい場合は、ダイアログに何を渡せばよいのでしょうか?
.........@ノ” かたつむりなのです。 わかってほしいのです。 触られると触角がひっこんじゃうの。 動けなくなっちゃうの。 よくわかんない、でもそうなっちゃうのだ。 雨の日とかにぺたぺた這うのが好きなのです。 なんでかしら。 自分でもよくわからないのだ。 あんまり指ではがさないでください。 ごはんたべてうんこしようっと。
塩撒くか
>>266 >>240 とたぶん同じ原因なので、同じ解決法で。
SetOwnerしておいて、OnInitDialogでCWnd::CenterWindow(GetOwner())。
別にオーナーに拘らずとも、中央配置の元になるウィンドウを渡せればいいんだけどね。
270 :
デフォルトの名無しさん :2007/10/16(火) 09:30:39
>>269 ダイアログのOnInitDialog()でGetParent()とm_pParentWndを調べてみたら、
m_pParentWndにはコンストラクタで渡したビュークラスが入っているのに、
GetParent()ではメインフレームが返ってきました。
OnInitDialog()でm_pParentWndを直接CenterWindow()に渡してみたところ、
ビュークラスの中央に表示させることができました。
m_pParentWndっていうのは隠れメンバっぽいけど、
これならダイアログを呼ぶ側でオーナーを別途指定する必要は無いですよね。
ダイアログのコンストラクタって、なんの意味があるんだ…?
>>270 それはダイアログ(そのもの)ではなくてダイアログクラスだ。
OnInitDialog()以前に一回だけ必要な処理を行なっておくなどの使い道がある。
272 :
デフォルトの名無しさん :2007/10/16(火) 11:49:03
>>271 > OnInitDialog()以前に一回だけ必要な処理を行なっておくなどの使い道がある。
もちろんコンストラクタの使いかた自体は理解しているつもりですが、
ダイアログクラスのコンストラクタで親ウィンドウを指定しても
それが実際の親にならないのなら、
コンストラクタで親ウィンドウなんて指定させるなよっていうことでした。
まぁ今回の件では、隠れメンバに保管されていることがわかったので、
コンストラクタに渡す作業は無駄ではなかったようですが。
>それが実際の親にならないのなら、 親になってるからCenterWindowが正しく動作しているのでは? CWnd::GetParent()が親じゃなくオーナーを返すのは、内部で 呼び出しているAPI(GetParent())の仕様。 トップレベルウィンドウがGetParentするとオーナーを返すみたいね。
274 :
273 :2007/10/16(火) 18:04:38
あ、CenterWindow(NULL)じゃ駄目なのか。しょっく
MFCアプリケーション(ダイアログ)の終了時、アプリケーションのの戻り値(%ERRORLEVEL%)を 使用したいんですが何か方法ありますか? ・コンソールアプリケーションだと一瞬コンソールが表示されるのが問題 ・引数なしの起動でダイアログでて起動をさせたいができればMFCダイアログテンプレートで作りたい。 という理由です。 WinMainのでやれば恐らく可能とは思いますが・・誰か知ってたら教えてください。
>>275 CWinApp::ExitInstanceをオーバーライド
>>276 今その方法でやったらできました。
一応方法を書いておくと、ExitInstance で戻り値を返すだけではだめで
start /wait aaa.exe
とかしてアプリケーションの終了を待機しないとだめなんですね・・
当然といえば当然なのかも。
なにはともあれ、ありがとうございました。
278 :
デフォルトの名無しさん :2007/10/16(火) 23:44:10
ダイアログアプリケーションでCDialog派生クラスのデストラクタがないのですが、 デストラクタの処理はどこでするのでしょうか?
定型文のボタンを押したら、 CEditコントロールのカーソル位置に文字を自動で入力したいのですが、 どうやればいいですか?
現在のCEditの文字取得して定型文追加して再設定 カーソル位置は GetSel() で取得
★番組で紹介された亀田史郎が息子・興毅に書いた手紙 興毅 ほんとうに おめでとう お前は もう 親父だけの者ではない 今や世界の亀田興毅になったんじゃ それも山あり谷ありの厳しい勝負の道を ひたすら歩み続けたからこそ今日の栄光が会った しかしボクシングの道は終った分けではない これから厳しいボクシング道が待ってる 興毅よ万文の山はいくつはばまおうとも 戦陣の谷に何度も落ちようとも前え 進め 最後に 本当におめでとう 親父 ★ アニメ「侍ジャイアンツ」最終回 川上監督が番場蛮に贈った言葉 番場よ、本当におめでとう。 おまえはもうジャイアンツだけのサムライではない。 今や世界のサムライになったんじゃ。 それも山あり谷ありの厳しい勝負の道を ひたすら歩み続けたからこそ、今日の栄光があった! しかし、野球の道はこれで終わったわけではない。 これから厳しい野球道が待っている。 サムライよ、万丈の山がいくつ阻もうと、 千尋の谷に何度落ちようと、前へ進め! その前途を祝って、もう一度言わせて貰おう。 番場蛮、本当に、おめでとう! 巨人軍監督 川上哲治
284 :
デフォルトの名無しさん :2007/10/17(水) 21:16:32
visual c++ 2005 SP1でSDIアプリを作っています。 MFCをスタティックリンクでビルドすると、Cランタイム(_recalloc)で メモリリークが発生します。共有DLLでビルドするとリークは発生しません。 リークのチェックにはBoundsChecker8.2を使用しました。 スケルトン(ソースは変更しない)でも同じでした。 どなたかご存知ないでしょうか?
スタティックリンクは使うなってことよ
287 :
デフォルトの名無しさん :2007/10/19(金) 13:00:37
CInternetsessionでのFTPのcloseは、FTPサーバーにログが残らないものなのでしょうか。
288 :
デフォルトの名無しさん :2007/10/19(金) 15:04:58
CCriticalSectionについて質問があります。 今Visual C++ 2005でアプリを作成しているます。 TestA.cppに通信処理があって2箇所からココを呼び出してます 1つはTestA.cppのOnTimerからコール 1つはTestB.cppのワーカースレッドからコール 通信処理は、入った時点で CCriticalSectionのLock()、抜けるときにUnLock()してます で、問題なのはTestB.cppのワーカースレッドから通信処理をコールし、Lock状態のときに TestA.cppのOnTimerから通信処理をコールするとデッドロックしてしまいます なぜそうなってしまうのか、原因が全く分からず困ってます・・・ 何か分かる方、いらっしゃいましたらご教授お願いします
通信処理が怪しい。 OnTimerの呼ばれるスレッド側に依存する処理が混じっていないか? メッセージキューが回っている必要がある、とか。
>>289 ご返答ありがとうございます
通信処理の本体はTestC.cppに用意してあり、そこで完結してます
それをTestA.cppからコールしているだけなのです
なので依存する処理とかはないと思います
簡単に書くとTestA.cppの通信部分はこんな感じです
void CTestA::SendProc()
{
m_CriticalSection.Lock();
TestC->SendData();
m_CriticalSection.Unlock();
}
もしかして、OnTimerとCCriticalSectionのLock、UnLockは
同じ場所(TestA.cpp)にあってはいけないとか
そんなことはない・・・ですよね?
当たり前だろ Lock状態というのは、他から同時に同じ部分をアクセスさせないように するのが仕様だよ 要はバッティングしないようにしてるわけだから、用がすんだら 解放される
292 :
291 :2007/10/19(金) 17:27:56
>>292 Lock状態のときに、その処理に入ったら待機状態になりますよね?
先にLockを掛けた処理が動いてUnlockしてくれればなんの問題もないのですが、
何故か動いてくれないんですよ・・・
なので困っております・・・
説明不足ですみません
ワーカースレッドからSendProcを呼び出した際にm_CriticalSection.Unlock(); までたどり着いてないってこと?
UI更新しようとSendMessageしてロック、とかは初心者にありがちなんだけどな。 TestC->SendData()の処理内容が判らないことにはなんとも。 あと、Lock/Unlockを直接書くより、CSingleLockを使っておいた方がいい。
>>294 はい、おっしゃる通りです
Lockした状態でOnTimerから通信処理に入って
m_CriticalSection.Lock(); の中へステップで進んで行くと
:EnterCriticalSection(&m_sect); で実行中になったまま処理が戻らず、
仕方なくデバッグ中断すると
「プロセスはデッドロックされているか、ユーザーモードコードがどれも実行されません。すべてのスレッドが中止されました。」
となります
>>295 TestC->SendData()の処理内容はUSBドライバに対して
プロトコルに沿ったデータの送信・受信をしています
CSingleLock、ちょっと勉強してみます
297 :
294 :2007/10/19(金) 18:51:18
ならAPIのTryEnterCriticalSectionを使うか
>>295 の方法。
ワーカスレッドから呼ばれたTestC->SendData()がフリーズしてる可能性もある。
>>297 TryEnterCriticalSectionを試してみたところ、それっぽい動きになりました
ありがとうございます!
ところで、MSDNライブラリに書いてある解説に
「TryEnterCriticalSection 関数は、クリティカルセクションの所有権を
取得できたかどうかにかかわらず、すぐに制御を戻します。」
とありますが、これは処理が終わる前に次の処理が動いてしまう
と解釈してよろしいのでしょうか・・・
戻り値で、他のスレッドがCriticalSectionを所有している事が判るわけだから 後で再送するとか、諦めてエラーにするとか好きにすれば良い。
>>299 了解しました
戻り値で判断して何とか回避してみます
皆様、色々ご指導ありがとうございました
とてもとても助かりました
素敵な週末を過ごしてください
今後Winアプリって.NETがデファクトスタンダードとなるんですかね? MFCは開発止まってるのですか?
デファクトスタンダード(笑) まあ、そうだろうね。 XPが標準になってることで、.NETFrameworkデフォルトで入ってるだろうし 最近のすごいアプリ 3ds maxとか、C++/CLI(.NET使えるように拡張したC++)で 作られてるみたいだし
Win32で十分だろ。なぜ.Netなんかで開発するの? いまはじめてWindowsFormアプリケーションってのを生成してみたが さっぱりわからない。ショック。
しょぼいツール作るならWin32でいいけど、 こったもの作るなら、.Net最高
自分がMFCを勉強し始めた時と比べると、C++/CLIの学習は 随分楽だなーと思った。 でもC++/CLIの描画がGDI+を使わなくなるか、GDI+の性能が 大幅アップするまではMFCを使い続ける気がする。
結局.NETってライブラリとして充実しているんだろ? Win32だって充実させてくれたらいいじゃん。 なんで言語まで変えるの。。
>>303 Win32、MFCが理解できて
.NET Frameworkが理解できないヤツはいねえだろ
MTは運転できるがATは運転できない というヤツがいないように
>>304 逆だろ?
こったものを.NETで作るのは無理
メモ帳程度のテキストエディタなら.NETでも十分つくれるが
メジャーなテキストエディタに勝とうとしたら.NETでは絶対無理
ちょっとさみしい気もするが手軽にきれいなのできるからいいよ クラスの構造もMFCと比べるときれいだし、仕事の関係上使えないのが残念なくらいだ C#とかで作ってるとVBって(使ったことないけど)こういうもんなのかなーって思うくらい簡単
ていうか基本的に糞重いアプリができる
296じゃありませんが ちょっと前(>295)で CCriticalSectionを直接Lock/Unlockするのではなく CSingleLockを使った方がいいとありますが その理由はなぜでしょうか? CCriticalSectionだと待ち合わせ時間が設定できないって事くらいですか?
312 :
デフォルトの名無しさん :2007/10/22(月) 22:31:04
MFC71.DLLは何処からダウンロードできるのですか?
>>311 別に深い理由ではなく、単に解放し忘れが無くなるだけ。
途中returnや例外でロックしっぱなしとかなると危険だし。
C#でのDataGridViewみたいな便利なものはないんですか?
315 :
sage :2007/10/23(火) 02:40:33 BE:233717663-2BP(0)
質問です。 あるGUI有りのアプリから、別のDLLの関数を呼び、そのDLLが 生成したウィンドウを表示したところ、Tab キーや、OK, Esc キーなどが 期待通りに動作しない現象が起こりました。 具体的には、CMainFrame から DLLのある関数を呼び出し、その関数に HWND を引数に与えて、そのHWNDを親ウィンドウとした、別ウィンドウを 表示しています。モーダルではありませんが、モーダルでも同じ挙動です。 原因が分かる方、教えてください。 VC++ 8.0 SP1 WinXP SP2
CEditコントロールで質問ス カレット位置を取得するためにGetSel()を使うというのは理解できるんですが、 範囲選択状態となっている場合、カレット位置がどこにあるかという判断はどーすればいいっスか?
>>316 CWnd::GetCaretPos()で取れると思う。尤も、クライアント座標だから適当に変換する必要があるけど。
>>317 ありがとうっス!
ちょっと試してみるっス
319 :
315 :2007/10/23(火) 16:44:59
VS2005、ダイアログベースで、マウスオーバーイベントを ボタンコントロールが取得するにはどうしたらいいでしょうか? ↓やったこと ボタンを画像にするのに、オーナードローでやってみて それ自体は問題なかったのですが マウスオーバーしたときにも画像を変えようと思ったら マウスオーバーのイベントが来てませんでした。 MSDNみてCBitmapButtonなるものを使って見たのですが AutoLoadでアサートが出てしまって動きませんでした。
>>320 前似たようなもの作った時は CButtonのサブクラスの中のOnMouseMoveで
マウスが入ってきたことを検知し、TrackMouseEventを呼び出してWM_MOUSELEAVE
を発生させるようにし表示画像を変えてた。一般的なやりかたかどうかは知らない。
WM_MOUSEHOVERも同様にTrackMouseEventで発生させることができる。
マウスオーバーってホバーのことだよね?
>>321 そうです。
ありがとうございまいた。
ちょっくらやってみます。
323 :
デフォルトの名無しさん :2007/10/24(水) 17:42:18
Win32APIスレから誘導されてきました。 MSGraph.Chart(Officeについてくるグラフコンポーネント)をウィンドウに張り付けたいんですが、どうすればいいですか? MFCのCWnd::CreateContorlをいじってみましたが、うまくいかないです(´・ω・`) ゚・(ノД`)教えて下さい。 CWnd* wnd = new CWnd(); BOOL ret = wnd->CreateControl("MSGraph.Chart", "", WS_VISIBLE, rc, this, 2000); で、retがFALSEになります。 CreateControlの第1引数を"mscal.calendar.7"にすると、ちゃんとカレンダーが表示されます。
ActiveXコントロールとして貼り付けたら?
325 :
323 :2007/10/24(水) 19:25:39
>>324 (Officeフォルダ)\Graph9.olbをリソースエディタのツールボックスに登録しようとしたら、
「有効なCOMサーバーではありません」と言われました(´・ω・`)
そもそも根本的に無理なのでしょうか?
ググってみて思ったのだが、 もしかすると、MSGraph.ChartはActiveXドキュメントかもしれない。 自分の所にはOffice無いからそれ以上は分からないけど。
327 :
323 :2007/10/24(水) 22:38:16
>>326 情報ありがとうございます(・∀・)
ActiveXドキュメントでググリましたが、要領を得ません(;´Д`)スミマセン
ActiveXドキュメントというのは、それ単体では表示できず、
ExcelのWorksheetや、RichEdit等にしか貼り付け出来ないということでしょうか?
質問です。 class CHogeA; class CHogeB; class CHogeA : public CView { ... private: CHogeB m_hogeB; }; class CHogeB : public CWnd { }; CHogeA 上に CHogeB を貼り付けて使っていたのですが、そうすると、 CHogeA にて例えばマウス操作などのイベントを拾うことが出来ません。 そこで、 1. CHogeA でも各種イベントを拾う、一般的な方法がありますか? 2. CHogeA と CHogeB で、ウィンドウを2枚作らず、1枚を共有するような手法がありますか? よろしくお願いします。 WinXP SP2 VC++ 8.0 SP1
>217
>>328 >1. CHogeA でも各種イベントを拾う、一般的な方法がありますか?
あなたの書いたとおりの構成でサンプルを作ってみたらマウスイベントは
全てCHogeAに流れました。逆にCHogeBでマウスイベントを拾うためには
細工が必要でした。
>2. CHogeA と CHogeB で、ウィンドウを2枚作らず、1枚を共有するような手法がありますか?
おそらくあります。
要するに情報不足杉です。
SDIでCView CViewでCWndをCreate あとはどこもいじらないでCWndにMouseMoveイベント来たよ
332 :
デフォルトの名無しさん :2007/10/27(土) 10:30:33
スレ間違いで再投稿です。 マルチすいません・・・ Visual studio6.0です。 ラジオボタン2個、ボタン1個のwindow作ってます。 MFCでラジオボタンにintの変数を追加しようと してもbuttonにしか変数が追加できません。 どうすれば、受付けてくれるのでしょうか? VS.NET仕様のテキストを見ながらやってて違いに困ってます・・・
ラジオボタンはボタンなの
>>332 ラジオボタンのグループ分け(WS_GROUPのオン・オフ)がきちんとできているか?
面倒ならDDX_Radio()を直書きしてもいい。案外簡単だから。
335 :
デフォルトの名無しさん :2007/10/27(土) 11:07:00
>>333 言われて見れば・・・「チェックしたか、してないか」しかないのに
変数の設定っていうのも変な気がします・・・。
>>334 グループ分けは出来てると思うので
ラジオボタンがどんな値を返すのか勉強してきます。
VC6.0準拠の本かサイトも探してきます・・・
VC2005でもそこら辺の仕様は変更されていなかったはず。 MFCのヘッダをDDX_Radioで検索して、実際に中身を見た方がたぶん早い。
グループをチェックすれば出てくるな
Win2k 上で vc6 sp6 使ってMFC勉強中の者です。 ウィザードで CFormView 指定してつくったもので、 その画面のボタンから CDialogの Modal で表示してる部分があるんですけど、 垂直方向に一画面に入りきらなくなってスクロールさせようと思い、ハマッテマス。 リソースで垂直のチェック入れて、OnVScrollとってきてScrollWindowExつかって みたんですけど再描画で位置がリセットされちゃうんで OnDrawで覚えた値を使って ScrollWindowExで戻してます。みなさんもこんなやり方で実装します? アドバイスお願いしますm(__)m やり方、なんか間違ってる気がするんですよね……。 CFormViewでdoModal できれば楽なのになぁ〜。
リセットされるところをみるに、SetScrollPosしていない予感。 WM_VSCROLLはスクロールさせたいという意図を伝えてくるだけで、 実際にスクロールバーの位置を確定させるのはプログラム側の仕事。
スクロールバーが付いたダイアログって見たことない。 止めるつもりは無いけど、自分ならプロパティシート使う。
もう1個別のCFormViewのウインドウ出すのは可能だし CDialogの上にCFormViewを貼り付けることも可能 でも問題はそういうことではなさそうだな
レスありがとうございます
>>339 ウィンドウについてるって事で OnVScroll内に引数でもってきてる pScrollBarは null なので
pos = ::GetScrollPos( m_hWnd, SB_VERT );しています。
あとは nSBCodeみて 移動量決め SetScrollPos( m_hWnd, SB_VERT, pos, TRUE );して
ScrollWindowEx( 0, 垂直移動量, NULL, NULL, NULL, NULL, 0 ) してます
で…再描画でリセットされてしまうので OnPaint()用意して ScrollWindowEx( 0, 総移動量, …
って感じになっちゃっております。
>>340 なるほど。プロパティシートですか。
いやぁこまった、変えられない仕様みたいでして。
>>341 CDialog上にCFormViewの貼り付けですか。 CDialog持ってるクラスのメンバーに
CFormView持ってるクラスをメンバーのインスタンスもたせるのかなって想って
ちょっと今やってみましたがProtectあたりでひっかかってコンパイルもとおりませんね。
難しい……。
子ウィンドウを全然動かしていない件について。 そりゃ、再描画でリセットされるように見えるわ。 子ウィンドウを一つ一つ動かすより、 フレーム-CDialog派生の子ウィンドウ(=フォーム) という風に乗せて、 フォームの位置を動かす感じで作ればいいんじゃないかな。
344 :
デフォルトの名無しさん :2007/10/28(日) 01:43:07
CSliderCtrlを使用して、マウスでクリックした位置に一発で移動する動作をさせたいです。 (通常はページスクロールをしますが、この動作をさせずに、クリックした位置に移動させたいです。) ためしにGetChannelRectでスライダーの稼動範囲(厳密には稼動範囲より広いエリアになってしまうけど。。)とマウス位置から Posを求め、SetPosしています。これだと問題が二個あります。 1)ユーザーが一回クリックすると、見た目上二回動く 2)そもそもGetChannelRectはスライダーの稼動範囲を取るわけではないので、微妙に位置の計算が狂う。 なにか良いアイディアは無いものでしょうか?
ぶち殺すぞ糞が
↑しゃぶれよ
347 :
デフォルトの名無しさん :2007/10/30(火) 11:52:37
とりあえず保守させておいてくれ また質問したい時がくるかも知れんから
348 :
デフォルトの名無しさん :2007/10/31(水) 09:32:39
349 :
291 :2007/10/31(水) 10:37:25
そのページを見てわからんのなら 君にはむりだ
>>348 謎は解けた!
マスク描画のROPを、SRCPAINTからMERGEPAINTに変えれば正しく描画される。
普通はキャラ画像の背景は黒にして、
SRCANDで抜いてSRCORで重ねるってのが定番だと思うのだけどな。
CImageListならカラーキーを使った描画ができるから、
こっちを使った方が手っ取り早いかも。
>>350 さん
ありがとうございました。
感謝感謝です。
352 :
デフォルトの名無しさん :2007/11/01(木) 07:21:07
どうも、他スレから流されてきました。 Win32環境+VS2005で開発を行っています。 ダブルクリックでファイルを開く処理に対応させようと頑張っていた所 Debugビルドでは成功したのですが、Releaseビルドにするとファイルを開かなくなりました。 (でもショートカットに開きたいファイル名を指定するとReleaseビルドでもきちんと開く) そこで処理を追っていくと、どうもInitInstanceメソッドが呼び出されていないようなのですが、似たような経験をされた方はいらっしゃらないでしょうか?
そこまで分かってんなら呼び出せばいいじゃん
CTreeCtrlを使ってエクスプローラライクなダイアログを作っています。 メーラーの未読数表示のように、フォルダ内のファイル数を表示する 方法はあるのでしょうか? ラベル編集も可能にしたいので、"フォルダ名(n)"のように直書きでは 問題が出てしまいます。 やっぱり無理矢理作るしかないのでしょうか?
>>354 楽な方法は無いな。
NM_CUSTOMDRAWを始め、
いくつかの通知メッセージを処理しないと実現できないと思う。
356 :
352 :2007/11/01(木) 15:25:21
>>353 すいません、関連付け関係のレジストリをすべて掃除したら直りました。
プログラムのミスではなかったようです。orz
ダブルクリックってそういう意味か 仕様を満足に説明できないやつは1人でやってればいいと思う
MFCを使った有名なソフトはどんなものがあるんですか?
秀丸
ペイント
Internet Explorer
得体の知れないリンクは踏まないようにしてる
365 :
デフォルトの名無しさん :2007/11/05(月) 22:00:13
>365 教えてやったのに無視してこっちに引越しか? とんでもないやつだな
VC++2005スタンダードを使ってMFCを勉強しているのですが、 onNewDocumentやonOpenDocument、Serializeなどファイル操作や イベント処理などがどういう流れで行われているのかがいまいち把握できないので、 詳しく解説してある良い書籍とかないでしょうか? ちなみに今頃MFCかよとかなしでおねがいします。
いや、本当にいまさらMFC勉強しても意味がない
>>367 みたいな質問してるようだと、人に見せれるようなアプリがかけるまで、2年以上はかかる
2年後にはMFCはVSからなくなってるぞ
なくなるわけねーだろ お前みたいな、おこちゃまアプリしか作らんやつには MFC は必要ないだけだ
2年後が楽しみになってきました
2年後にMFCが無くなってたら怖いな。 M$がwin32apiを無理矢理クラス化し、永続させてきたMFCを ばっさり切るなんて、今までの努力を捨てちまうようなもんだもんな。 それにVBを.net化したりしてるのを見れば「まだまだ、へこたれへんでー」 ってな感じに受け止めれる。 まぁ、主流はVC#VB.netの方針で発展していくんだろうね。
Picture ControlのBorderをプログラム実行中に変更する方法を教えてください
変らない?
375 :
373 :2007/11/06(火) 16:17:49
パスがファイルかフォルダかを判定する方法があれば教えていただけないでしょうか? そのパスは存在することが前程でよいのですが。。。 よろしくお願いいたします。
ファイルの属性を見る MFCにそういうのを扱うクラスはなかったと思う
>>377 CFileにGetStatus()があるのだが。static版の方は引き数にフルパスを取るから一応使えると思う。
CFileでディレクトリも扱えるの?
>>379 CFile::GetStatus()のstatic版は、実体を必要としないので普通の関数のように使える。
つまり、その対象を予め開いておく必要はない。詳しくは、MSDNでも読め。
381 :
367 :2007/11/07(水) 18:08:26
>>368 何を根拠に2年なのかkwsk、というかカチンときた。
まぁ、ATLとか.NETとか出てる中、いまどきMFCやるのもあれかもしらんが・・・
で、MSDN以外に参考になるものはないってことかい?
カチンと来るのは勝手だけれど、MFCが斜陽なのは事実。 一頃本はたくさんあったようだしWebSiteもそれなりにあると思う。 それを探せないようでは先が思いやられるのも同感。
ATLとMFCって同じレベルのものなの? 全然知らなくてすまそ
無駄に複雑で使えないっていう点では同じレベル
簡単なツールならVB感覚でさくっと作れるじゃない。MFCは。
やっぱり.NET
View画面でのサイズ指定で SDIのCMainFrameウィンドウサイズを変更する関数ってありますか? やっぱり、指定のサイズ+枠のサイズとかメニューのサイズとかを計算しないとだめですか?
388 :
デフォルトの名無しさん :2007/11/09(金) 16:37:49
CHTMLViewクラスを使って表示したHTML文書のテキストの 色などをプログラム中から変更することはできるでしょうか? PutPorpertyというメソッドを使えばできそうな気がするの ですが使い方がよく分かりません。 <P class='test'>Hello, World</P> というテキストの色を赤にする方法を教えてください。
>>388 CHTMLViewのGet/SetPropertyは、単にIWebBrowser2の同メソッドが呼ばれるだけ。
GetHtmlDocument()から始めるしかないと思う。という訳で、試しに書いてみた。
ちなみに、MFCでなくてATLだが全く問題無い。
// 1. CSSを追加してみる方法
CComPtr<IDispatch> spIDisp;
spIDisp.Attach(GetHtmlDocument());
CComQIPtr<IHTMLDocument2> spIDom(spIDisp);
CComPtr<IHTMLStyleSheet> spCSS;
spIDom->createStyleSheet(NULL, -1, &spCSS);
long idx;
spCSS->addRule(CComBSTR(_T("P.test")), CComBSTR(_T("color:red")), -1, &idx);
// 2. エレメントに直接スタイルを追加してみる方法 CComPtr<IDispatch> spIDisp; spIDisp.Attach(GetHtmlDocument()); CComQIPtr<IHTMLDocument2> spIDom(spIDisp); CComPtr<IHTMLElementCollection> spElemCol; spIDom->get_all(&spElemCol); spIDisp.Release(); spElemCol->tags(CComVariant(_T("P")), &spIDisp); CComQIPtr<IHTMLElementCollection> spElemCol2(spIDisp); for ( int idx = 0 ; ; idx++ ) { spIDisp.Release(); spElemCol2->item(CComVariant(idx), CComVariant(), &spIDisp); if ( !spIDisp ) break; CComQIPtr<IHTMLElement> spElem(spIDisp); CComBSTR clsname; BSTR bstr; spElem->get_className(&bstr); clsname.Attach(bstr); if ( clsname != _T("test") ) continue; CComPtr<IHTMLStyle> spStyle; spElem->get_style(&spStyle); spStyle->put_color(CComVariant(_T("red"))); }
391 :
388 :2007/11/09(金) 22:57:03
>>389 >>390 ありがとうございます。ATLは全く知らないのでコードは謎ですが、
必要なヘッダを調べてインクルードして何とか両方とも動かすこと
ができました。
if ( clsname != _T("test") ) continue; のところで
エラーが出たので調べてみると CComBSTR::operator==は
定義されていましたが CComBSTR::operator!=は定義されて
いませんでした。if ( clsname == _T("test") ) { /*../*/ }
と直すとコンパイル通りました。これはVisual C++6.0の
不具合かもしれません。
師匠になってほしいです。
393 :
デフォルトの名無しさん :2007/11/14(水) 11:34:45
CReBarでレバーコントロールを利用しているのですが、 複数のコントロールを1つのバンドに含めるにはどうすればいいでしょうか。 CReBar cRebar; … cRebar.AddBar(コンボボックス) cRebar.AddBar(ボタン) とすると、コンボボックスとボタンが別々のバンドに配置されますが、 目的としては、コンボボックスとボタンを同一バンドに配置したいです。
各バンドには 1 つしか子ウィンドウ (コントロール) を含むことができません。 各バンドに複数の子ウィンドウを含めたい場合は、この点が制約になります。
395 :
393 :2007/11/14(水) 17:10:33
なるほど、ありがとうございます。 ちょっと微妙ですけど、コンボボックスとボタンをスタティックコントロールの子にして、 そのスタティックコントロールをAddBarすることにしました。
MFCでExcelのセルみたいなぐりっどコントロールってないんですか?
ありません。ListCtrlを自前で拡張するか、CodeGuruでそうしたものを探すか、市販のライブラリを使うか、 ExcelをDDEで使うことになるかと。
拡張DLLでダイアログクラスをエクスポートしようとしているのですが、 ヘッダのクラス宣言の中に enum { IDD = IDD_… }; という記述があります。 このリソースIDは拡張DLL側のResource.hに書かれているものです。 拡張DLLを使う側がこのヘッダをインクルードすると、 リソースIDが見つからないと言われると思うのですが、 拡張DLLでダイアログクラスをエクスポートする場合 この部分はどのように対応すればよいものなのでしょうか。
399 :
デフォルトの名無しさん :2007/11/16(金) 16:17:31
保守!
>>398 そのリソースIDが記述されてるヘッダをインクルードしなきゃいんじゃね?
使う側は、拡張DLL側のリソースIDなんて余計なだけじゃね?
401 :
デフォルトの名無しさん :2007/11/17(土) 18:06:11
MFC VC でセマフォや共有メモリみたいなのって無いの?
>401 自分で調べようとも思わないのか?
ぐぐってみようとも思わなかったんだろうな
VS2005付属MSDNのキーワードに「セマフォ」って入れるだけで
あっさり対応するクラスが見つかった件について。
おまえやる気無いだろ。氏ね。
>>401
405 :
デフォルトの名無しさん :2007/11/17(土) 22:35:15
>>404 そんな高価なツールもってねえよばーーか
VS2005のどこが高価なんだよw 今までのこと考えたらクソ安いつーの つーかMSDNのちょっと遅れのイメージなんか完全フリーじゃねえか
MSのサイトでみれるMSDNはVS2005のとは別ものなの? 同じなら、オンラインで検索すれば。
基本的には同じはずだが…
VS2005 MFCです 折れ線グラフを描画する、ツールを作りたいんだけど MFCのツールボックスには、ピクチャーコントロールというツールと カスタムコントロールというのがあるけれど、どう違うのでしょうか? また、グラフを描画させるにはどちらのコントロールを選んだ方がいいのでしょうか?
>>410 >>409 です
True WinChart for .NETですよね、標準価格:102,900円
そんな予算でないです
自分で描画するだけだからコントロールは必要ない
413 :
409 :2007/11/18(日) 19:11:21
>>412 ダイアログに直接描画するのではなく、ピクチャーコントロールかカスタムコントロールに
描いて、それをサブクラス化したいんだけど、違いがよく分からないんだよね
違いは標準かカスタムか
415 :
409 :2007/11/18(日) 19:34:14
ということは、カスタムコントロールのほうが、拡張性(自由度)が 高いってことだね?
描画するだけなら、単純にウインドであれば良いだけじゃないの? ゴテゴテ機能が付いている方がいろいろな横槍がはいって返って上手くいかないかもしれん。
417 :
409 :2007/11/18(日) 20:34:14
>>416 言われてみればそうかも知れないな、
コントーロールを貼り付けて、描画専用クラスを別に書き、シリアル化したデータを
流し込んで、グラフを描画させようと思ったけど
よく考えたら、描画専用クラスは、ダイアログに描こうがコントロールに描こうが必要なわけで
対象となるオブジェクトがどっちになろうが、使えるクラスを設計する方が賢いかもしれないね
.flvから0.5秒おきのBMPを作りたいんですが 何かヒントだけでもいただけたら
ヒント MFCと関係ない
>>419 とは思ったのですがやはりプログラミングのプロ集団は
MFCスレかと思いまして。
B's Recorderみたいな画面作りたい><
ShowWindowでウィンドウを描画するときに一瞬描画にもたつきます。 描画してからShowWindowするには、 WM_PAINTを送ってからShowWindowすれば良いでしょうか。
WM_PAINTってShowWindow、Invalidate、UpdateWindowなどの呼び出し または他アプリに無効化された際に、発生するものであって、自分で 送るものじゃないと思う。 描画のもたつきについては、CompatibleBitmapへ予め描いておき OnDrawなりOnPaintなりで、それを実画面に転送(BitBlt)する手法が一般的。 ダブルバッファとかダブルバッファリングで検索すると具体例が見つかるよ。
426 :
423 :2007/11/20(火) 01:06:54
>425 ありがとう。 やってみるよ。ほんとに親切にありがとう。
VS6 MFCです。 複数のスレッドで色んな処理をしていて、 各スレッドの処理ログを一つの CListView に書き込んでいくというプログラムを作っています こんなとき、どのように組むのが一般的というか技法的に正しいのでしょうか? 最初は動的に確保した領域にログを書いてそのアドレスをLPARAMに渡して 各スレッドからメインスレッドにメッセージを投げていたのですが 取りこぼしがあるとメモリリークしてしまったため、 今はmailslotを使ってやっています。 クリティカルセクションを置いたログ書き込みメソッドを持つ CListViewの派生クラスを作り、 そのインスタンスを各スレッドに渡すような感じがいいんでしょうか?
429 :
デフォルトの名無しさん :2007/11/22(木) 11:15:31
>>428 MSDNのサンプルに複数スレッドで実行した内容を1つのビューに反映させる
サンプルがあったはず。それが参考になるかも。
>>各スレッドからメインスレッドにメッセージを投げていたのですが PostMessageまたはSendMessageのどっちよ? これで解答のしかたは大きく変わるし、質問者さん情報少なすぎ mailslotか、そんなのあったのか、知らなかったよ 普通にクリティカルセッションで排他制御して SendMessageでデータ投げて、無問題だったが? 後はシングルトーンによる、インスタンスの一意化? とかそんな感じジャマイカ
ダイアログのモーダレスのプログラムです。
http://www.athomejp.com/goldfish/mfc/dialog/modeless.asp のサイトのプログラムを作成しているのですが、動きません・・・
誰か助言をお願いします。(Win2000・vc6.0)
リビルドすると、次のエラーが出ます。
c:\documents and settings\あ\デスクトップ\modeless\modelessdlg.h(19) : error C2143: 構文エラー : ';' が '*' の前に必要です。
c:\documents and settings\あ\デスクトップ\modeless\modelessdlg.h(19) : error C2501: 'CTestDlg' : 識別名を宣言するのに、型が指定されていません。
c:\documents and settings\あ\デスクトップ\modeless\modelessdlg.h(19) : error C2501: 'm_pTest' : 識別名を宣言するのに、型が指定されていません。
ModelessDlg.cpp
c:\documents and settings\あ\デスクトップ\modeless\modelessdlg.h(19) : error C2143: 構文エラー : ';' が '*' の前に必要です。
c:\documents and settings\あ\デスクトップ\modeless\modelessdlg.h(19) : error C2501: 'CTestDlg' : 識別名を宣言するのに、型が指定されていません。
c:\documents and settings\あ\デスクトップ\modeless\modelessdlg.h(19) : error C2501: 'm_pTest' : 識別名を宣言するのに、型が指定されていません。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(99) : error C2065: 'm_pTest' : 定義されていない識別子です。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(189) : error C2440: '=' : 'class CTestDlg *' から 'int' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(190) : error C2227: '->Create' : 左側がクラス、構造体、共用体へのポインタではありません。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(194) : error C2227: '->BringWindowToTop' : 左側がクラス、構造体、共用体へのポインタではありません。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(204) : error C2440: '=' : 'class CTestDlg *' から 'int' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(205) : error C2227: '->DoModal' : 左側がクラス、構造体、共用体へのポインタではありません。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(206) : error C2541: delete : 'delete' 演算子が、ポインタでないオブジェクトに用いられています。
C:\Documents and Settings\あ\デスクトップ\Modeless\ModelessDlg.cpp(211) : error C2227: '->BringWindowToTop' : 左側がクラス、構造体、共用体へのポインタではありません。
TestDlg.cpp
ソースファイルは、
http://www11.axfc.net/uploader/20/so/He_49138.zip.html dlPASS=1
一応つけました。宜しくお願いします。
>>431 エラーは抜粋してくれ、、、それができるなら質問しないでもわかるか。
modelessdlg.h 内で CTestDlgクラスを参照してるから。
#include "TestDlg.h" を適切な位置におけばよろしい。
面倒ならmodelessdlg.hの先頭に入れてもいいかもな。
>>433 modelessdlg.hではポインタでメンバ定義してるみたいだから
modelessdlg.hの先頭で class CTestDlg; 入れて
modelessdlg.cppに #include "TestDlg.h" を入れるスタイルもあるな
自分でもわからんがヘッダに#include入れるのを無意識に避けるオレ
435 :
431 :2007/11/27(火) 09:29:10
>>433 様
>>434 様
有難う御座います。
おかげ様で、動きました。
ヽ(゚∀^○)ノ★'*:・.@+【感謝】+@.・:*'★(●゚ω^)ノ
またMFCを勉強すると同時に、クラス・メンバのC++をかじる必要があると感じた。
MFCから入るとへんな誤解をしたまま気が付かない大人になるよ
MFCつかわない人でもMFCのソース見れば apiの使い方の参考になるよ
それは認める。つまりMFCはAPIのリファレンスなんだよ。あるいはサンプル。
439 :
デフォルトの名無しさん :2007/12/03(月) 09:02:58
保守!!!
\あ\ なんか受けたww
441 :
デフォルトの名無しさん :2007/12/03(月) 19:36:45
今 青龍マスター なのですが何に進化しますか?
朝青龍に
そして昼青龍へ
その後、夕青龍へ進化した後に?
夜青龍
丑三つ時青龍を経て
最後は昇竜拳!
よって
>>441 はケンorリュウ使い
448 :
デフォルトの名無しさん :2007/12/05(水) 17:28:26
>>411 ですけど
黄龍っしょ あとで わかりました
けど おもしろかったです。 どうもありがとうございます。
→↓↘+P
ちょwなんだよこの流れはwww 何故かプログラマーやってて良かったと思っちまったじゃねーかw (この業界若しくは趣味でプログラミンでもやらなきゃこんなスレ見ないって意味でw) おまいら最高www
海自の新しい潜水艦の名前は蒼龍らしいな
アスカ?
453 :
デフォルトの名無しさん :2007/12/06(木) 10:36:01
日本の豪華客船でしょ!飛鳥
454 :
デフォルトの名無しさん :2007/12/10(月) 10:56:32
保守+.(´・∀・)ノ゚+.ダー
今、本に書いてある、ダイアログボックスにある二つのエディットコントロールに 入力した数値を加算して、それを表示するということをやろうとしているのですが、 「wprintf' : 1 番目の引数を 'char [80]' から 'const wchar_t *' に 変換できません」というエラーがでます。 その本はVC++.net用の本で私はVS2005を使用しています。 VS2005のほうでも通用するとあったのですが上手くいかず悩んでいます。 コードは以下のとおりです。 char str[80]; wprintf(str,"%d + %d = %d", dlg.m_X,dlg.m_Y,dlg.m_X+dlg.m_Y); //エディットコントロールのメンバー変数。 dc.TextOutA(0,0,str); 全くの初心者ですが、何卒ご教授願えないでしょうか?
wprintf -> printf
まちがえた sprintf
おぉぉ!
>>456 さんのいうとおりwprintfをprintfにしたら、
ビルドが成功しました! ありがとうございます。
しかし、二つの数値を入力してOKボタンを押したら、
ウィンドウに「フフフフフフxX」などという文字がずらーっと表示され、
加算した結果が表示されません。
これはなぜでしょうか?printfでエディットコントロールのメンバ変数
m_Xとm_Yを%dで表示しているし、char型で文字も整数も表示できるはずですし…
おぉっと書き直してくださっていたんですね。
sprintfにしたら、バッチリ表示されました!
>>457 さん、本当にありがとうございます。
MFCらしくないコードだな まともな本とは思えない
MFCなのにchar[]使うのか・・・
MFCらしくないですか?一応ほんの名前を出しておきますね。 「ゼロから学ぶVisualC++」という本です。
A系とW系がごちゃまぜだし、元の本のコードと違うんじゃないの?
>>463 さん、Cstringですか?
つまりchar[80]という文字配列ではなく、文字列型にデータを格納して
扱うということでしょうか?ちょっと試してみます。
ご助力ありがとうございます。
>>464 さん、A系、W系ですか?
すみません、まだまだ初歩の者で、わかりません。
でも確かにそそっかしいので…。確認をしてみます。
CStringクラスを使うなら CString str; str.Format("%d + %d = %d", dlg.m_X,dlg.m_Y,dlg.m_X+dlg.m_Y); //エディットコントロールのメンバー変数。 dc.TextOutA(0,0,str); とかかな?
467 :
431 :2007/12/12(水) 15:28:58
468 :
431 :2007/12/12(水) 15:34:33
スレ汚しすいません。追加したプログラムの部分です。 新規にダイアログを追加して、クラス名をCTestDlg2にしました。 CModelessDlgクラスにCTestDlg2のデータメンバを追加します。 BOOL CModelessDlg::OnInitDialog() { ・・・・・ m_pTest = NULL; m_pTest2 = NULL; } void CModelessDlg::EndTestDlg2() { m_pTest2 = NULL; } を追加 void CModelessDlg::OnButton2() { // TODO: この位置に・・・ if( m_pTest2 == NULL) { m_pTest2 = new CTestDlg2; m_pTest2->Create(this); } else { m_pTest2->BringWindowToTop(); } }
469 :
431 :2007/12/12(水) 15:35:23
その2 CTestDlgにウィンドウのデータメンバを追加します。 CTestDlgにCreate()メソッドを追加します。 CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/) : CDialog(CTestDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTestDlg) // メモ - ClassWizard ・・・ //}}AFX_DATA_INIT m_pParent2 = NULL; } BOOL CTestDlg2::Create(CWnd *pWnd) { m_pParent2 = pWnd; BOOL bret = CDialog::Create( CTestDlg2::IDD, m_pParent2); if( bret == TRUE) { this->ShowWindow( SW_SHOW); } return bret; }
470 :
431 :2007/12/12(水) 15:36:16
その3 クラスウィザード(Ctrl+W)でPostNcDestroyメソッドをオーバーライドします。 クラスウィザード(Ctrl+W)でPostNcDestroyメソッドをオーバーライドします。 void CTestDlg2::PostNcDestroy() { // TODO: この位置に固有の処理・・・ if( m_pParent2 != NULL) { ((CModelessDlg2 *)m_pParent2)->EndTestDlg2(); delete this; } CDialog::PostNcDestroy(); } void CTestDlg2::OnClose() { // TODO: この位置に・・・ if( m_pParent2 != NULL) { DestroyWindow(); } else { CDialog::OnClose(); } }
>現在モーダレス・ダイアグラムでプログラムを作っています。 「モーダレス」も「ダイアグラム」も間違い。
473 :
431 :2007/12/12(水) 17:29:04
>>472 アリガト━━━ヾ(・∀・。`)(´。・∀・)ノ━━━!!!
動きました。
3日間真剣に悩んでいましたw
BOOL CModelessDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// "バージョン情報..." メニュー項目をシステム メニューへ追加します。
m_pTest = NULL;
m_pTest2 = NULL;
初期化したつもりで、見落としていました。
有難うです
☆⌒(*^▽゜)vありがd
それより、 >助言と教授をお願いします。 に笑ってしまったw
475 :
465 :2007/12/12(水) 23:33:36
465です。
>>466 さん、わざわざCStringの使い方を
教えていただきありがとうございます。
大変助かります。
>「ゼロから学ぶVisualC++」 amazonでのレビューの評価が概ね高いな。 上に貼ってあるコード見てるとちょっと微妙な気がするけど 評価高いってことは良書なんだろうね。 おれはC入門しながら、林ハルヒコ本で並行してMFCの 勉強してつまづいた経験があるから、どうもMFCのとっかかりは 難しいというイメージがある。 C++の理解が足りてないということに気付くまで、時間がかかりすぎた。
VS2005 MFCです
ダイアログにCustom Controlを追加し、コンパイルに成功後、実行しますと
Custom Controlどころか、ダイアログ自体も表示されません
検索しましたら、MSDNに
http://msdn2.microsoft.com/ja-jp/library/dsezt3x7 (VS.80).aspx
「Visual Studio コントロールを追加してもダイアログ ボックスに表示されない」
というタイトルでSDKの場合の対処法が出ていましたが、MFCの記載がありません
どなたかご存知ないでしょうか?
あまりに丁寧語を使いすぎると 逆にうざく感じるのは 2chだからなんだろうなあ おまいらおしえれ くらいのノリが普通な気がする俺は異常
そこのMSDNの説明はコモンコントロールの場合の解決法と リッチエディットコントロールの場合の解決法だけだな その2つはMFCは特に何もしなくても使えるだろ
481 :
478 :2007/12/16(日) 10:55:36
>>480 サンクス
>コモンコントロールの場合の解決法と
>リッチエディットコントロールの場合の解決法だけだな
読解力が無くてスマソ、カスタムコントロールのことは書いて無かったんですね(^^;
478でも書きましたが、ダイアログにカスタムコントロールを貼り付けて
正常にコンパイル成功して、実行した場合、ダイアログらしきものが一瞬チラッと見えるのですが
直に、消えてしまうんですよ、どうしたらイイ?
>>479 こんな感じでOKww
>>481 俺も初心者に毛が生えた位なんで間違ってるかもしれんが
リソースエディタのカスタムコントロールのclassのところが
空になってないか?
そこに自分の作ったコントロールのクラス名を入れないと駄目っぽい
カスタムコントロール MFCでぐぐるとサンプルも幾つかあったよ
>>482 ありがとう、もう、あきらめて、他の掲示板で尋ねようか迷ってたところでした
class名を登録したら、上手くできました。
484 :
デフォルトの名無しさん :2007/12/18(火) 13:04:39
保守!
EditBoxのメンバ変数に、std::string型の変数を定義したのですが、無理ですか?
>>486 >>485 です、補足します
MFCで、メンバ変数の追加ウィザードを用いて、変数を追加する際
「変数の種類(V)」という項目があり、そこで、追加する変数の、種類を決めるのですが
その中に、std::string型がありません、強引にstd::stringと入力してやると、
エラーになります、やはり無理なのでしょうか?
std::string用のDDX_Text があるか探して なかったら自分で作る
DDX_Textでgrepかけてみたけど、見当たんないだよね(´∀`)タハー
自分で作れ。 つーかMFCなんだからCStringでいいじゃん。
コアな部分でSTLをがんがん使ったクラスがあるんで、はなからstd::string型にしたいんですよ どうやってツクルンデツカ? 作り方教えてホスイ
MFCのソース参考するとか。 DDX_Textをラップするだけでもいいな。 つーかDoDataExchangeの最後あたりで、CStringに取った値をstd::stringに入れ直すだけでいいんじゃね? 頻度によっては毎回CStringからstd::stringに変換するのもアリ。
テキストデータだとDDXの利点がほとんどない 自分で読み書きしても同じぐらいの手間だと思う
CString()とstd::stringをオーバーロードしたりして、冗談ですww (実際やったらどうなるのか、興味はありますが) 今回の場合は、EditBoxに入れる変数がコード番号だったんで、 EditBoxの値型をint型→_itoa_sでchar[]型に変換→std::stringとリレー変換でお茶を濁します (*^‐^)_且〜〜
CStringには operator LPCTSTRが実装されてるから、 std::string = (LPCTSTR)CString のほうがちょっとマシなきがする。 ほんのちょっとね。
std::string& operator=(std::string& lhs, const CString& rhs) { return lhs = (LPCSTR)rhs; } をグローバルで定義しちゃえば?
暗黙的な型変換かstatic_castつかえよばyれgbぐ
1.VS2008でMFCアプリのプロジェクトを選択 2.シングルドキュメントを選ぶ←これは無関係かも。 3.ビルドして実行する。 4.ウィンドウの右端を引っ張って縮める。 5.ウィンドウの右端を引っ張ってゆっくりとゆっくりと右に広げる。 これだけで、ボタンのない部分のツールバーの描画に白い縦線のゴミが 残るんだけど、これってほかになる人いる? OSはVista Ultimate(x86) VideoはGeforce8600GTS
2008のスレなかったかな?
501 :
デフォルトの名無しさん :2007/12/20(木) 21:42:57
MFCを学ぼうと思っているのですが、.NETに対する利点はあるのでしょうか。 それともMFCは時代遅れなのでしょうか。
作る側は.netのが楽かもしれないけど、使う側は.net嫌う
503 :
501 :2007/12/20(木) 22:34:35
>>502 それってJAVAみたいに遅いってことですかね?
MFCのほうがなんとなくプロっぽい
MFCを手足のように使いこなせれば、.NETなんて1日あれば十分に習得できる 逆に.NETに慣れきったやつはMFCのUIでまずつまずく
506 :
501 :2007/12/22(土) 23:34:53
>>504 でもできることは似たようなものですよね?
>>505 MFCの方がいいのかなぁ
でもMFCって難しい・・・
>>505 まず C++ でギブアップする奴が多い気もする。
STLやboost使いまくってるソース見たら、 拒絶反応起こしてもしようがない。 MFCのC++なんて、たいした機能使ってないのにな。
509 :
デフォルトの名無しさん :2007/12/26(水) 11:59:35
VS2005でCWnd派生のカスタムコントロールを作成し、 それをダイアログなどに貼り付けています。 WS_BORDERが指定されている際には自動で外枠が描画されますが、 この枠がXPでも立体的に描かれてしまいます。 リストビューやリストボックスのように平面的な枠にしたいのですが、 これはどこで設定するものなのでしょうか?
EXSTYLE指定してる?
511 :
509 :2007/12/26(水) 12:35:00
>>510 「Extended Style」のプロパティはデフォルトのままで、値は0x0になっています。
「Style」は0x50830000で、これはデフォルトの値(0x50010000)から
WS_BORDERとWS_GROUPを追加したものです。
指定してなきゃ誰も描かないと思うんだがな、、 spy++でスタイル見るとか、、、派生元クラスによるのかなあ NCPAINTで自分で描く手もあるが、、、
513 :
デフォルトの名無しさん :2007/12/28(金) 11:18:15
仕事収め保守
VS2005MFCです カスタムコントロールのサイズを取得する、関数って準備されてない?
>>514 CSize size = CClientDC().GetTextExtent(_T("カスタムコントロール"));
>>515 サンクス
CSize size = dc.GetTextExtent(_T("カスタムコントロール"));
カスタムコントロールの部分はキャプション名でいいよね?
long x = size.cx;
long y = size.cy;
CSize構造体からの、値の取出しはこれで出来た
∧_∧ (<_` ) > ⌒ヽ / へ \ / / / ) / ノ/ / / /(_/~ / /| / / | 〈 < 、 \ ∧_∧ ダッ 515死ね \ \ |⌒l (;`−) −=≡Ξ−=≡Ξ∧ ∧ \ ヽ | ミ ( :つ−=≡Ξ〜′ ̄ ̄(;″゚Д) / 丿_) U ̄U −=≡Ξ(/(/ ̄ ̄ヽ)ヽ) (_丿 ミ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ (<_` ) γ ⌒ヽ | | \ | | \ \ | | ) ) | |/ / ∧ ∧ i⌒i______ノ |_ノ (" ゚Д) ヽ | ノ / / つ ― ̄ ̄ ̄ ̄ ̄ ̄ | | / / / ミ | | / / ∪/ ミ | | ∧_∧ / ∪ / ミ | | (;`−) / / / | | ( :つ ザッ | | U ̄U (__丿  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
519 :
デフォルトの名無しさん :2007/12/31(月) 12:44:59
大晦日におじゃまします (誰もみてないかなぁ。。) エディットコントロールボックス(複数行・縦方向スクロールバー付き)に対して、 以下の様な処理でログを表示しています。 // ログの追記表示 strMsgKeep = strMsgKeep + "\r\n" + strMsg; m_edtMsg.SetWindowTextA( strMsgKeep ); ← @ // スクロールバーを最下限に m_edtMsg.LineScroll( m_edtMsg.GetScrollLimit( SB_VERT ) ); ←A しかし上記方法で行うと、 @の処理でスクロールバーがログの先頭にいき、Aの処理でスクロールバーが最後に行くため、 大量なログを連続で表示すると、画面のちらつきが目立ちます。 画面のちらつきを目立たない様に表示を行うにはどうしたらいいのか教えて下さい
つ GetWindowTextLength/SetCurSel/ReplaceSel あとは自分で試せ
521 :
519 :2007/12/31(月) 15:17:11
>>520 ありがとうございます。
無事きれいなスクロールになりました
522 :
デフォルトの名無しさん :2008/01/07(月) 15:45:59
保守!!!!!!!
523 :
デフォルトの名無しさん :2008/01/09(水) 19:25:13
定期age
524 :
デフォルトの名無しさん :2008/01/12(土) 04:27:42
最近MFC覚えたんだけどC++/CLIより使い易いな!!!!!
そりゃぁ、C++/CLIが使いにくいだけだろ。
526 :
デフォルトの名無しさん :2008/01/13(日) 20:05:42
教えて下さい。 VS2005 エディットコントロールボックスに対して、 関数で文字列データを改行しながら追加表示しています。 AddMsg(CString strMsg) { strMsg += "\r\n"; m_edtMsg.LineScroll( m_edtMsg.GetScrollLimit( SB_VERT ) ); int nEnd = m_edtMsg.GetWindowTextLengthA(); m_edtMsg.SetSel( nEnd, nEnd+1, TRUE ); m_edtMsg.ReplaceSel( strMsg ) ; } nEnd の値が30000未満は順調にデータ表示されますが、 30000になると、そこでデータが追加されなくなってしまいます。 どこが悪いのですか? それとも、何かの制約があるのでしょうか? よろしくお願いします。
デフォルトでは 32767 文字 SetLimitText で広げる
528 :
526 :2008/01/13(日) 20:36:06
>>527 素早い回答、感謝です。
ありがとうございます。
そういや、俺も前に
>>526 と同じ症状になったことあったな。
SetLimitTextか…いいもん教えて貰ったぜ!!!!!
ちなみにSetLimitTextで設定できる最大値っていくつ?
0
mjd?
>>530 脊髄反射せず、MSDNのヘルプ見ろや。
ttp://msdn2.microsoft.com/ja-jp/library/bb761607 (en-us,VS.85).aspx
ちなみにデフォルトが32767なのは、16bit時代からのAPIを引きずって
いる名残だろう。Windows 95のメモ帳も、32KB超えるテキストを編集
できなかった。
MFCはWin32 APIをラップしているに過ぎないからな。
プログレスバー(CProgressCtrl)の範囲(Min/Max)やポジション指定が
16bitで表現可能な範囲の値なのも、同様の理由から。但しこっちは、
SetRange32(),SetPos32()がある。
NTのメモ帳は昔から大きいのもOKだったけどな。
CImageListのオブジェクトを受け取った関数内で そのオブジェクトの1画像あたりのサイズを知りたい場合、 どのように参照するものなのでしょうか。 CTreeCtrl::SetImageList()やCHeaderCtrl::SetImageList()には サイズ情報は渡していないのに、 描画の際にはちゃんとサイズを元にテキストなどを位置合わせしています。 これと同じような処理を行いたいのです。 GetImageInfo()というメンバ関数はあるようですが、 これは画像インデックスまで渡さないといけません。 1画像あたりのサイズは、画像インデックスは関係無いはずですが、 このような遠巻きな方法しか用意されていないのでしょうか。
>>535 ::ImageList_GetIconSizeを直接呼ぶしかないな。
537 :
デフォルトの名無しさん :2008/01/15(火) 22:10:01
VS2005です。スナップショットを生成します。 hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); [debug]で実行した時は、hSnap の値がそれらしい値になりますが、 [Release]で実行すると、hSnapの値が0になってしまいます。 どこが悪いのかさっぱりわかりません どうか、よろしくお願いします。
>>537 If the function fails, it returns INVALID_HANDLE_VALUE.
0というだけでは、無効なハンドルとはいえない。
539 :
537 :2008/01/15(火) 22:59:51
>>538 ありがとうございます。認識が間違っていました。
540 :
デフォルトの名無しさん :2008/01/15(火) 23:48:12
MFCはあと何年の寿命でしょうか?
ちょwwwww
VS2005でMFCのアプリを作成してます。 質問なのですが、例えば2つのアプリケーションを作成し Test1アプリで編集したデータを Test2アプリで取得して表示に反映させる (その逆も同様に) どんな方法が一番簡単にできるでしょうか? ご存知の方、どうか宜しくお願いします。
プロセス間通信の話? ファイルでもメモリマップドファイル(のメモリ)でもパイプでもメールスロットでも クリップボードでもWM_COPYDATAでもすきなの使えばいい。 具体的に何をどうするかわからんと何が適切なのかはわからない。
544 :
535 :2008/01/16(水) 12:47:10
>>536 ズバリな関数です。
CImageListには備わってないんですかね。中途半端だな。
ありがとうございます。
>>543 ありがとうございました。
素人なもので、どんな手段があるのか分からなかったのです^^;
メモリマップドファイルで調べてみます。
546 :
デフォルトの名無しさん :2008/01/17(木) 11:38:23
教えてください。 コンボボックス内の項目を作りたいのですが、 CComboBox *pCombo; pCombo = (CComboBox *)GetDlgItem(IDC_COMBO1); pCombo->AddString(""); のところで、 error C2664: 'CComboBox::AddString' : 1 番目の引数を 'const char [17]' から 'LPCTSTR' に変換できません。 というエラーが出てしまいます。 どうやったら消せるか教えてください。 お願いします。
548 :
デフォルトの名無しさん :2008/01/17(木) 12:16:00
解決しました^^ ありがとうございました。
ダイアログの大きさを変えると、グラフの大きさが異なる様なプログラムを作っています。 ダイアログの大きさを変えた時の画面の大きさを検出する。 GetClientRect構造体で画面を検出しているのですが、それが画面を大きくすると検出するのですが、 小さくすると検出しません・・・ 検出している所は、 void CMyDlg::OnPaint() で検出しています。 ヒントを下さい。
小さくしても InvalidateRect は送られないから Paint もよばれない
OnSize
CS_VREDRAW|CS_HREDRAWを::SetClassLongで追加。 ただし、それだけだとボタン等も容赦なく再描画対象になるので、 WS_CLIPCHILDRENを付けておくといい。
いや、、、大きさが変わったことを通知してくれるメッセージがあるのに
OnPaint使うのがおかしいだろう
ということで、
>>551
>>550-552 有り難うございます。
早速検索を行い見てみたのですが、あまり良く分かりませんでした。
::SetClassLong
で追加と言う事の様ですが、
もう少しヒントを頂けないでしょうか?
Class Wizardを見てもそれらしき物は出て来ませんでした。
今、更に検索しています。
知識を得て出直して、また来ます。
>>554 >552なんて無視していいから>551。
漏れも、
>>551 >>553 >>555 とまったく同意見だな。
CodeGuruで「CResizeDialog」を見つけられれば幸せになれるだろう。
Resource.hに下記みたいな意味のない(使われていない)IDがたくさんできていて驚いた のですが、これって消して番号をつめたほうがいいですか? IDの番号が枯渇しそうな気がするんですが・・・ #define ID_32794 32794 #define ID_32795 32795 #define ID_32796 32796 #define ID_32797 32797 #define ID_32822 32822 #define ID_32823 32823 #define ID_32824 32824 #define ID_32825 32825
IDEのシンボルブラウザから消せる気がした
ダイアログ ベースで作成したものを、シングル ドキュメントに変更したいんだけど 途中から出来る?、新たに作り直す方が早いのかなぁ、どっち?
>>559 ドキュメントの中にダイアログをはっつけちゃえば簡単かと。
>>559 CFormView派生クラスを使うSDIを新規作成して、MyxxxView.cppと、
MyxxxView.hを、途中まで作成していた、MyxxxxDlg.cpp,MyxxxxDlg.h
をファイル名を替えて差し替えた後、エディタの置換機能で、派生
クラス名と基底クラス名をそれぞれ、CMyxxxxDlg→CMyxxxView、
CDialog→CFormViewへ置き換える。
ダイアログリソースもDrag&Dropか.rcを編集して持ってる。Resource.hを
手作業でリソースIDをマージする。
これくらいで、大筋取り込みは可能かと。 あとの作業は、元のソース
内容や記述による。
MFCのピクチャーボックスに描画したものをメニュー処理(名前をつけて保存)からBMPで保存したいんだけど ピクチャーボックスにファイル選択ダイアログがかぶってるとダイアログが写った状態で保存されてしまう これって方法が悪いんだろうか? なんか参考になるとこありませんか?
そりゃウィンドウのDC使ってたらそうなるわな。
>>564 Windowsはよく知らんけど、どうしてもウィンドウに描画されたものを使いたいなら、一度再描画したら?
# 普通はメモリDCに対して再描画して、それを保存するような気がするのだが。
MFCでピクチャーボックスって、CStatic使ってんの? もしそうなら、GetBitmap でハンドル持ってきてそれ使ってBMPにしては。
>>567 よくわからないけどGetDlgItemでリソースエディタのコントロールを関連付けてる
どうにかなる?
static_cast<CStatic*>(GetDlgItem(コントロールID))->GetBitmapでイケルと思った
実行中にコントロールの上に別のウィンドウをかぶせたりするとコントロールが消えてしまう 一応クリックしたりすると再描画されるんだけど不便だしstatictextなんかは消えっぱなしなのでなんとかしたいのですが どうすればいいでしょうか?
描画をどの関数でやっているのだろう? 描画系の関数はOnPaintでやらないと消えるぞ
Onscrollでやってる statictextはリソースエディタで作ってわざわざ記述してないんだけど消えないようにするにはなにか記述しなければいけないの?
Zオーダー的には他の兄弟コントロールの下になっていても、 たまたまフォーカスを受けた時は、処理の関係上表示されてしまう。 ってのが良くあるパターン。
WS_CLIPCHILDREN の話なのか、独自描画の問題なのかわかりづらいな
廚な質問なのですが、(本人は結構真剣) ダイアログを2つ作りました。 2つ重なった場合、下の方を選択しても上になりません。 どうしたら良いですか?
それは仕様
モードレスダイアログにすればいいんじゃね?
具体的にどうやって作ったのかわからんから説明のしようがないな
メインダイアログからDoModal()でもう一個のダイアログを作ってるっぽくね? それなら仕様としか言い様がない
いまVS2005で勉強中なのですが、CListViewの描画まわりって、 OnInitialUpdate()でリストコントロールのスタイル設定、 OnUpdate()の中でリストコントロールの中身を更新、 OnDraw()の中でInvalidateRect()→UpdateWindow() だけでいいんでしょうか? MDIの子ウィンドウを2つのビューに分割し、そのうち1つを 画像表示に使い、もう1つをリストビューにしてるんですが、 子ウィンドウ生成直後や最小化復帰直後にリストビューの 領域だけが描画されないことがあるので、もしかすると リストビューの作法から外れたことやってるのかも、と 思ったもので。
Windows の作法から外れたことをやっとる
583 :
576 :2008/01/24(木) 10:07:53
>>577-580 有り難うございます。
>メインダイアログからDoModal()でもう一個のダイアログを作ってるっぽくね?
その通りです。メインからダイアログを作りそして、
2つ目のダイアログを作成したところ、
始めのダイアログが上にいかない Orz
仕様ですか・・・
どうしたら良いですか?
DoModal だと無理。普通にモードレスでやればいい
585 :
576 :2008/01/24(木) 10:30:23
>>584 メインがモーダレスって出来るのですか?
出来れば、やり方を教えて下さい。
メインを見えないウィンドウにしてモードレスで2枚作るとか
>>585 試していないが
ダイアログベースアプリで、CxxApp::InitInstance()内で、ローカル変数
としてオブジェクトを作成し、dlg.DoModal()を呼び出している部分を ...
(1) メインダイアログ(CxxxDialog)を、CxxxxAppクラスのメンバ変数
にする。
(2) DoModal()を、CxxxDialog::Create(nID=CxxxDialog::IDD,...)と、
CxxxDialog::ShowWindow()に書き換える。
(3) CxxApp::InitInstance()をTRUEで終了して、InitInstance()終了後
メッセージポンプを開始する。
で可能なんでわ?
589 :
デフォルトの名無しさん :2008/01/25(金) 13:52:57
片方、DoModalで dlg.Create(CXXX::IDD); dlg.ShowWindow( でいいんじゃね? かスレッド
>>585 >>588 に付け足しで
モードレス化するダイアログにPostNcDestroyをオーバーライドして
delete this;を追加する
これをすると、ウインドウの破棄後に自己削除が行われて
アプリ終了時にメモリリークしないモードレスダイアログアプリができる
591 :
588 :2008/01/26(土) 10:13:38
>>589 普通はそれでいいと思うが、メインをモーダレスにできないという
やりとりがあったので。
>>590 おそらくマイクロソフトのサンプルコードから得た知識だろうが、delete
してよいのは、new で作成したオブジェクトの場合のみ。 malloc()して
いないポインタをfree()してはいけないのと同じ。
ダイアログをアプリケーションクラスの変数とすることで、アプリケー
ションクラスCxxxAppのオブジェクトが消滅する時、メンバ変数(CxxxDialog)
のデストラクタが自動的に呼び出されるので問題ない。
もちろん、ダイアログオブジェクトへのポインタを、アプリケーション
クラスのメンバ変数として、コンストラクタ/デストラクタで、
CxxxApp::CxxxApp()
{
m_pCxxxDialog=(CxxxDialog *)new CxxxDialog;
}
CxxxApp::~CxxxApp()
{
delete m_pCxxxDialog;
}
としても可だが、ダイアログ消滅時(PostNcDestroy)にdeleteして、アプリ
ケーションの消滅時にもdeleteすると、都合2回deleteが呼ばれるのでこれ
またマズー。
>>591 >普通はそれでいいと思うが、メインをモーダレスにできないという
 ̄ ̄ ̄ ̄ ̄
そんなものない。
初歩的な質問かもしれませんが宜しくお願いします。 MFCアプリケーションのメインダイアログ(ウィザードが作ってくれたもの)に追加したリストコントロールで Viewプロパティをレポートにしたときの話です。 幾つかのカラムを作成した後にアイテムを設定し実行したところ思ったように出力されたのですが、リソソ ースエディタからリストコントロールのSortプロパティを昇順にしてみたところ追加したアイテムの一部が消 えてしまいました。 消えるアイテムは実際に追加するデータによりまちまちですが、最下部に配置された行のものと各行の先 頭のアイテムだけは残ります。しかし、出力された行のデータの並びがSetItemで追加したときとは異なっ てしまっています。 ご存知の方がいらっしゃればご教授願えませんでしょうか。
たぶんこれと同じ ---------------------------------------------------------- CListCtrlコントロールを、プロパティ-スタイル-ソート昇順と設定し その後は、コード上で、ソートに関しては何も考えずに SetItemTextとInsertItemを用いて、データを追加するロジックを 書いておりました。 データを昇順で追加すると、正常にリスト表示されますが データを降順で追加すると(コントロールのソート機能が反応?すると) なぜか一番最後の行しか、まともにデータが設定されておりません。 追加している間にソート機能が働いて、インデックスが訳わからない事に なっているのでしょうか。
>>591 いや、そんなの言われなくてもわかってるからw
>>576 のやりたい事って、
dlg.DoModal() の代わりに dlg.Create(IDD_DLG, GetDesktopWindow()) と dlg.ShowWindow(SW_SHOW) を使うだけだと思っているのは俺だけ?
>>576 が
>>585 で言っている「メインがモードレス」ってのは、何かを勘違いしていると思うのだが。
「モードレスとして出現するダイアログ」 を呼び出す側のことを 「モードレスダイアログ」 だと勘違いしているのでは?
そもそもメインダイアログがモードレスってのが意味分からん。
メインダイアログは、実質モードレスみたいなもんだと思うが。
デスクトップに対してモーダルではあるかも知れないが。
>>594 それと同じですね。
その解決策をご存知でしたら教えて頂けないでしょうか。
599 :
デフォルトの名無しさん :2008/01/29(火) 01:22:30
MFC難し過ぎ お前等なんでこんなもの分かるの?
MFC とは関係ないかもしれませんが、 かなり昔から、VC6をしばらく使っていると、 ツールバーの端をクリックすると、 パソコンがフリーズするようになるんですが、 これってなおし方ありませんか??
>>600 他のPCでも起きるかどうか調べてみたら?
おそらくPCを買い換えるのが吉。
いや、もう8年くらい前から、 いろいろなPCでVC6をやってて起きてます。 知り合いソフト屋も、この現象の事は知っていて、 VC6では、ツールバーの端は触っては行けないのだ! ・・・と言っていますが、まさか、世界のVC6ユーザーが 全てそれで対応してるとも思えませんし・・・。
そんなにひんぱんに起きる現象なら検索したら情報ぐらいあるだろ お前の説明だと原因不明で対処しようがない もうちょっとちゃんと説明してあるサイト探して来い。
>>603 そうそう、検索するのすっかり忘れてました。
どうやら、MFCの例の無限ループのバグが、
VC6自体にもあるようですね。
・・・多分、そんくらいしかわからん。
>>599 SDKの難しさと比べると断然に簡単だと思われ。
俺はSDKの方が簡単だと思うけどな。 MFC使っても素のウィンドウやメッセージの振る舞い知らんといかん事もあるし その上MFCの仕組みも覚えにゃならんし。
元々SDKを楽に使う為に作られたのだから、ある意味当然だな。 SDKが簡単かどうかも微妙だけど。どこまでを範囲とすべきがサッパリわからんし。
MFCは、VC++4.0の頃から使っているけど、これまで『MFCの例の無限 ループのバグ』って、一度も聞いたことないんだが? VC6より、VC2002の方がずっと不安定だった思う。VC6は操作中に突然終了 したなんてことはめったにないが、VC2002は何かの拍子にIDEが終了して しまう。 例えば、「VC内蔵エディタで開いているプロジェクトの対象ソースを、 プロジェクトのツリーから削除(プロジェクトから外す)して、その後 エディタを閉じる」といった操作で、いとも簡単に落ちた気がする。
609 :
585 :2008/01/31(木) 03:30:20
>>586-590 様
>>595-596 様
プロバイダの規制が有り、亀レス申し訳ないです。
大変参考になりました、有り難う御座います。
とりあえず、以下を実行いたしました。
//int nResponse = dlg.DoModal();
dlg.Create(IDD_TEST_DIALOG,GetDesktopWindow());
dlg.ShowWindow(SW_SHOW);
にしました。けれど次のエラーが出ています。
C:\Documents and Settings\○○\デスクトップ\サンプル\sample1\Debug\samp\Debug\Test\Test.cpp(62) : error C2664: 'int __thiscall CDialog::Create(const char *,class CWnd *)' : 1 番目の引数を 'const int' から 'const char *' に変換できません。
(新しい機能 ; ヘルプを参照)
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
エラーが出ています。
610 :
585 :2008/01/31(木) 03:31:01
>>588 様の所で止まっています。
>(1) メインダイアログ(CxxxDialog)を、CxxxxAppクラスのメンバ変数
にする。
(2) DoModal()を、CxxxDialog::Create(nID=CxxxDialog::IDD,...)と、
CxxxDialog::ShowWindow()に書き換える。
を具体的な記述が分からなく難航しています。
(CxxxDialog)を、CxxxxAppクラスのメンバ変数 にすると有りますが、
変数の型は、何でしょうか?
どなたか、お教え下さい。
初めのダイアログのIDを
IDD_TEST_DIALOG
クラスをCTestDialog
としています。
モーダルもモードレスも同じ型だろ
>>609-610 横レス失礼。
受け答えを見た限り
>>588 以降が書いてくれていることが理解できるレベルじゃないようだし
このまま続けても泥沼に嵌るだけだと思うよ。
いったん立ち返って、
>>584 が「モードレスでやればいい」と答えたのに対して
>>585 で「メインがモーダレスって出来るのですか?」と切り返したのはなぜ?
何かメインをモードレスにしなければならない理由があるのか、それとも単なる勘違いなのか?
>>584 はもう一方のダイアログをモードレスにすればよいと提案してるんだと思うが。
とりあえずメインの方は弄くらずに、
>>596 の言う通りに
2つ目のダイアログをDoModal()しているところを
Create()とShowWindow()にしてごらん。
>>608 ttp://www.tkb-soft.hmcbest.com/diary_2005_03.htm にそれらしき事が書いています。
又、マイクロソフト自身が確か、ツールバーに何やら無限ループの
バグがあると情報公開していました。
でも、VC6のフリーズのなおし方の情報は見当たりません。
VC6はやめてVC2005にでも移行したいのですが、
私はFAの制御関係の仕事でソフトを作っていて、
ただでさえリアルタイム処理に向いていないウィンドウズで
managedのC++はかなり不安です。(一応何本か作りましたが)
FAの業界ではVC6はまだまだ現役なんだけどなぁ。
徹夜で頭くらくらでも、ツールバーのアイコンは慎重に、
真ん中目がけて「えいっ」て押すしかないのかなぁ。
614 :
デフォルトの名無しさん :2008/02/01(金) 16:13:30
____ / \ / ─ ─\ FA? / (●) (●) \ | (__人__) | ファイナルアンサー? / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | . \ /___ /
ふぁくとりぃおおとめぇしょん
>>613 > VC6はやめてVC2005にでも移行したいのですが、
> 私はFAの制御関係の仕事でソフトを作っていて、
> ただでさえリアルタイム処理に向いていないウィンドウズで
> managedのC++はかなり不安です。(一応何本か作りましたが)
VC2005や2008に移行して普通にC/C++として使えばいいのに。
>>609-610 目的に合うかどうかは別として、そのコードでそのエラーメッセージが出るとは奇怪な。
IDD_TEST_DIALOGってのはデファイン定数だよな?
むーん、我が家にはMFCの開発環境も無いから実験も出来ない。
まずは、モーダルとモードレスの大きな違いは説明できる?
618 :
599 :2008/02/02(土) 21:07:16
>>605 >
>>599 >SDKの難しさと比べると断然に簡単だと思われ。
そうなんだろうけど、入門書を読んでいてもいまいちライブラリの体系のようなものがみえてこないというか・・・
Boarland C++ Builderみたいに完全に抽象化してほしいなり
抽象化はMFCの目的ではないから駄目。 むしろ、そのおかげでWin32API呼び出しもガシガシ突っ込める所が魅力。
MFCだとある程度まで理解するのは早いが、完全に理解するのは遅い(出来ない?)って奴かねぇ
CWinAppとCWndが理解できたら全部わかったようなもの Doc-Viewは使わなくてもいいし 他はapi使うのと変らない
VBだと簡単にできる(らしい?)エクセルとか呼び出す機能を使えるようにしてくれって言われたけど VCだとわけわからんかった・・・ VCのアプリからVBのアプリ呼び出すようにしたほうがよかったかな?
>>622 IDEの機能でタイプライブラリのインポートをすると、
COleDispatchDriver派生のソースが生成されるから、それ経由でアクセスする。
Excelのタイプライブラリは*.olbか実行ファイルに含まれているか何れか。
624 :
デフォルトの名無しさん :2008/02/04(月) 00:45:20
MDIでアプリケーションを作っています。 保存するファイルにメニューの選択項目の状態を 記録しておいて、ファイルを開いたときに、保存した時 の状態にメニューの選択項目をの状態を再現させたい と思っています。状態の保存は出来たのですが、 読み込み時に子ウィンドウ用のメニューにチェックを 入れたりする方法が分かりません。どうすれば いいのでしょうか?
625 :
デフォルトの名無しさん :2008/02/04(月) 01:58:48
おめでとう!
まぁ、良いか悪いかは別として、 抽象化されてないMFCのコードは普通に組んでもうんこになる。
628 :
デフォルトの名無しさん :2008/02/07(木) 04:37:33
激しくスレ違いかもしれませんが、質問です。 PCゲームを多重起動しようと試みたのですがダメでした。 大抵のゲームはWindowsのアカウントを2つ作成し、別々のアカウントで起動すれば問題ありません。 現在、Vistaを使っているのでXPではどうなるかはわかりませんが(XPは右クリックから別ユーザーで起動が可能)、 Vistaでその手法をとる場合、runasコマンドを使用することになります。 しかしこのコマンドで別々に起動しても、後から起動したほうが無効になってしまいました。 で、ここからがわけわかめなのですが、同一のデスクトップからの起動はダメでも、 Windowメニュー→ユーザー切り替えをし、別々に起動すればうまくいきました。 この違いはいったいなんなのでしょうか?
激しくスレ違い(・∀・)カエレ!!
数ある質問スレの中から何故MFCスレを選んだのだろうか?
631 :
デフォルトの名無しさん :2008/02/07(木) 14:38:15
/ ̄\
| |
\_/
|
/  ̄  ̄ \
/ \ / \
/ ⌒ ⌒ \
>>628 よく質問してくれた
| (__人__) | 褒美としてオプーナを買う権利をやる
\ ` ⌒´ / ☆
/ヽ、--ー、__,-‐´ \─/
/ > ヽ▼●▼<\ ||ー、.
/ ヽ、 \ i |。| |/ ヽ (ニ、`ヽ.
.l ヽ l |。| | r-、y `ニ ノ \
l | |ー─ |  ̄ l `~ヽ_ノ____
/ ̄ ̄ ̄ ̄ヽ-'ヽ--' / オプーナ /|
.| ̄ ̄ ̄ ̄ ̄ ̄|/| | ̄ ̄ ̄ ̄ ̄ ̄|/| ______
/ ̄オプーナ/|  ̄|__」/_オプーナ /| ̄|__,」___ /|
| ̄ ̄ ̄ ̄ ̄|/オプーナ ̄/ ̄ ̄ ̄ ̄|/ オプーナ /| / .|
| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄|/l ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄|/| /
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
632 :
デフォルトの名無しさん :2008/02/07(木) 17:49:29
ダイアログのタイトルバーの左上の[x]を 表示しない、もしくは灰色表示ってどうやって出来ますか?
あのボタンは、システムメニューの「閉じる」(SC_CLOSE)と連動してる。 GetSystemMenu()でメニューもってきてどうにかすればよい
左上?
635 :
ゆい :2008/02/08(金) 01:28:55
質問です! マウスクリックした場所を丸く円を描くように BITMAPキャラクターが動くといったものを 作りたいのですが、OnLButtonUp(UINT nFlags, CPoint point) とOnTimer(UINT nIDEvent) にどのような記述を入れたら良いでしょうか?
マルチ
637 :
624 :2008/02/09(土) 10:14:04
ファイルを開いた時のメニュー状態の復元はフラグセットしておけば、 後はフレームワークがうまくやってくれたのですが、 開いた後にタイトルバーのファイル名の後にファイルの中身を 元に計算した結果で作成した文字列を追加して表示したいのですが、 タイミングが分かりません。どこでやればいいのでしょうか? ChildFrm のOnCreateClient CXXXXDoc::OnOpenDocument とか、 だと早すぎて後でファイル名で上書きされてしまいました。
ダイアログベースのプログラムに、メニューバーが欲しくなった "MFC ダイアログベース メニューバー"でググると VC6時代の掲示板やMFCのサンプルが出てきたが、マンドクサくて( ゚д゚)ポカーン 最期のHP開いたら、VS2003のサンプルが載っていて 一分で完了シマスタ
>>624 計算後にCDocument::SetTitle( ResultString ) ;
色んな箇所でタイトル弄る場合は、一々呼ぶのが面倒なので
CDocument::SetModifiedFlagをオーバーライドして、そこで書き換えてる。
あごめん。Open時に計算してるのか... だったらCYourView::OnInitialUpdate辺りで CXXXXXDocのメンバー関数(自作)呼ぶようにして、そこで代える。 たぶんOpen時以外にも呼ぶだろうし。
>>637 ChildFrame側だとOnUpdateFrameTitleでいけたけど、
>>639 のがよさげ。
642 :
624 :2008/02/10(日) 00:55:48
>>641 上手くいきました!ありがとうございます。
>>640 実はOnInitialUpdateは試してみたのですが、この関数を抜けた
後で見事に上書きされてしまい、今回の書き込みをさせて頂い
たのです。
起動時以外での書き込みは問題なく出来ていたので問題は
解決しました。皆さん本当にどうもありがとうございました。m(_o_)m
CString banana = ""; banana.IsEmpty(); の答えはどっちになりますか?
試せorソース読め
ソンナノ ワタシ シラナイ
647 :
デフォルトの名無しさん :2008/02/13(水) 22:51:15
どなたか知っている方がいらっしゃいましたら教えてください。 現在CListCtrlのスクロールバーの色を変えるというのをやっています。 簡単だと思っていたのですが、実はめちゃくちゃ難しくて悩んでいます。 CListCtrlを普通のウィンドウに貼り付ける形でつかっています(ダイアログではない) 当初、OnCtlColorやカスタムドローを用いればできると考えていましたが、これらを用いてもできないようで リストコントロールのようなウィンドウスタイルレベルで指定されている 「ネイティブスクロールバー」にはWM_CTLCOLORXXX系がこないという点からOnCtlColorでは無理 カスタムドローにスクロールバーの色を変える機能がないという点でこちらも無理 オーナードローもアイテムごとの描画でありスクロールバーを描画する部分がないため限りなく困難 ということがわかりました。 そこで、そもそもネイティブスクロールバーを非表示にしてCScrollBarを貼り付けて動作をエミュレートする形で作ろうとしましたが ShowScrollBarやShowScrollBarCtrl等々のスクロールバーを非表示にする関数を一度呼び出しても InsertItem毎に勝手にスクロールバーが復活するのでWM_NCCALCSIZEにてこれらの関数を呼ぶようにしました。 しかし、ここでこれらの関数を呼ぶと2点問題が浮上しまして、 1点目は、親ウィンドウにたいしてWM_ERASEBKGRNDが送信されてしまう 2点目は、単純に何度もShowScrollBarを呼び出すとかなり遅い といった感じになりました 1点目については、CListCtrlにWS_CLIPSIBLINGSを指定することで解決できましたが(これもかなり謎な動作ですが) 2点目については解決するほうほうが思いつきません。 codeguruなどをあさっていると FlatSB系のイニシャライズとEnableScrollBar関係の関数を使うと隠せるっぽいものを見つけましたが 自分のコードのOnCreateで呼び出しても無効で、OnSizeなどで呼んでも単なるEnableScrollBarとの違いはありませんでした。 もう手詰まり状態で、最終手段としてスクロールバーの部分をリージョンでくりぬいてその上にスクロールバーコントロールを貼り付けようかと考えているのですが それ以外に何か解決方法があったら、ぜひご教授願えませんでしょうか?
回答じゃないです それだけ色々試すスキルがある人ならCListCtrlなんか捨てて 自前のコントロールなりクラス作れば良いんでない?
なんでム板って突然小学生みたいなこと言いだす奴多いんだろう ガチでそういう子供が紛れてたりするのかと疑いたくなる
スクロールやってるのはコントロールの中の人だからMFC関係ない
今からMFC始めるのって遅いでしょうか?
652 :
デフォルトの名無しさん :2008/02/15(金) 08:58:39
EUCなどの文字コードを変更するAPIはないでしょうか?
ここAPIスレ?
>>651 遅いと思うけれど、必要があるなら必ずしも無駄ではないと思う。
>>652 MFCには該当の関数はありません。
>>651 悪いこと言わないからC#なんかやめとけ
じゃあ何がいいんだろう、WinAPIは論外となるからなぁ
プロは MFC を使う アマは VB,C# を使う
>プロはMFCを使う これ本気で言ってる?どんな業界の人?
今全体を見渡せばC++ひいてはMFCで開発してるとこは少なくなってるからねぇ そのせいかMFC使いは変なプライドある奴が多いから鵜呑みにしないこと そこを見極める程度の力はあってほしい
ひとえにプログラミングを行う業界と言っても向いてる方向は思っている以上にばらばらだからね プログラミング好きで色々自分でやってみたりマな人のコミュニティを回ってる人とかじゃないと 井の中の蛙になりやすい 一行目で言ったような予想以上にプログラミングといっても様々にあることを理解できない C++使って開発っていうのは結構カバーする範囲が広いというか多いから尚更(ここではMFC使いの人は)勘違いしやすい
おめーらみんな MFC で挫折したやつらだろ 低レベルなやつは VB で満足してろよ
.netのアプリはあんまり見かけないと思うけど 意外にみんな使ってるのかな?
MFCは無償の開発環境がないから他と比べると利用者は少ないかも 無償の場合は利用者は多くても入門者ばっかりなのかもしれない
Windowsのアプリを作る場合、 C & SDK(WinAPI) は原理的に何でもできる ただし、コーディング量は膨大(現代ではアセンブラみたいなもの) そこで上記の長所を維持しつつ、コーディング量を減らしてくれるのがC++&MFCだ つまり、きめ細かいこと(付属のライブラリにないこと)をやろうとすれば、 WinAPIを直接叩く必要がある C++は(Cも)そのときの親和性が高い 他の言語ツールは、そういうときに非常にやっかいになる したがって、おのずとプロはC++ & MFC に行き着く
MFCはまだ更新されてるからやって損はないよ コードは反面教師として勉強になる 笑い話じゃなくて
シロート騙して手っ取り早く儲けるには、バイトにVBで作らせた方がいい。 そのバイトが自分がプロのエンジニアだと勘違いしてるから鬱陶しい。
MFCの方向性は合ってると思う。 ただ、煩雑というか整理されきれてないというか、惜しい。 だから、MFCに替わる新しいAPIラッパー作ってよ、M$。 .NETは好かん
・作業効率なら.NET。ただし、難読化しないとソースが漏れる。 ・MFCは難解な仕様とFAQを奔走することになる。ただし、MSクオリティ ・クロスプラットフォーム用のライブラリ=最大公約数になる。質はMSには劣る。
.NET Frameworkのネイティブ版みたいなのがあればなあ
GCJ+CNI→Java API for C++
>>669 >ただし、MSクオリティ
褒めてるの?貶してるの?w
難読化とか言ってる人はjavaのアプリはどう考えてるの?
っATL
俺のコードは難読なんだからね!
なんで俺の職場ではみんなMFC使ってるんでしょうか?
訊けよ。
678 :
676 :2008/02/16(土) 12:44:40
いや、多分昔の資産が使えるからじゃないかと思います。
判ってるなら、ここで訊くな。
遊びで2chのブラウザ的なもの作ってみたいんだけどMFCで作れますか? 言語は、C/C++使えますが、MFCは未知の領域なので・・・。 C/C++の知識でもっと簡単に作れるツールとかあれば教えてください。
人によって簡単のレベルが違うからな
遊びでWindowsのOS的なもの作ってみたいんだけどMFCで作れますか? 言語は、C/C++使えますが、MFCは未知の領域なので・・・。 C/C++の知識でもっと簡単に作れるツールとかあれば教えてください。
>>684 「OS的なもの」の定義にも拠りますが、単に「オペレーティングシステム」を作ってみるのなら
MFCは必要ありませんしMFCがあればできるというものでもありません。
質問を重ねるのなら、スレ違いになるので適当なスレへどうぞ。
遊びで〜的なものを作ってみたいんだけどMFCで作れますか?のガイドライン
MFCとATLとWTL、3つの中で始めるならどれが良いですか?
MFCスレだけどMFCはお勧めしない
MFCすれだからWTLはお勧めしない
MFCスレだからATLもお勧めしない
どれも今更感があるよなぁ
WindowsAPIから始めるべき
693 :
Gori :2008/02/17(日) 12:51:18
コントロ-ルIDについて教えて頂けませんか? マニアルでは IDC_MSG と成っていますが 僕のコントロールIDは IDC_EDIT1 と成ってます。 これを IDC_MSG に変更設定するには、どの様に すれば良いのでしょうか?
IDC_EDIT1をIDC_MSGという名前に付け直す
695 :
Gori :2008/02/17(日) 13:37:31
VC6.0まではIDEにMFC専用のUIが用意されていたけど、 2002以降はプロパティページとかに汎用化されてしまっているから、 今から始めると分かりにくいのかもしれないなあ。
.NETf/wとかC#ってMFCのwrapperだと思っていいですか?
いいえ。MFCとは殆ど互換性がありません。
IDC_EDIT1のIDCってIDカスタム(ID Custum)の略なのでしょうか?
どうみてもコントロール
701 :
699 :2008/02/17(日) 23:46:46
なるほど!ありがとうございます。今までずっと分からないでいました。
702 :
Gori :2008/02/18(月) 04:44:38
(記述) // プログラム名をローカル変数に渡す strPgmName = m_strProgToRun; *************************************************************************************** (結果) C:\Day2\Day2Dlg.cpp(327) : error C2065: 'm_strProgToRun' : 定義されていない識別子です。 cl.exe の実行エラー Day2.exe - エラー 1、警告 0 ------------------------------------------------ いろいろやってみましたが。。。なぜエラーに成るのか解りません。 宜しくお願いします。。。m(__)m
703 :
Gori :2008/02/18(月) 04:49:18
(記述) // プログラム名をローカル変数に渡す // strPgmName = m_strProgToRun; *************************************************************************************** (結果) Day2.exe - エラー 0 警告 0 に成ります。。。はあ〜〜 (-_-;)
704 :
Gori :2008/02/18(月) 04:50:25
宜しくお願いします。。。m(__)m
Day2Dlg.hの中に m_strProgToRun
VC++2005で作成した自作アプリ (プリンタDCに対する描画による印刷処理は実装済み)に PDF出力機能を追加したいと思っています。 Acrobatが入っているPCだと、印刷時にAcrobatを選択することによって、 既存の描画処理のままPDFを作成することができますが、 ユーザにプリンタを選択させることなく、 「PDF作成」のような直接のボタンを用意し、 その中で同じようにプリンタDCに描画していきたいのです。 Acrobatのように既存の印刷用描画処理を流用でき、 ユーザに操作を意識させないようにするためには、 どのような実装方法が考えられますでしょうか。
MFCにAcrobatはついてない
Adobe(R) PDF Library を使う
>>708 このPDF Libraryって、
自作アプリへのPDF出力機能の組み込みにも使えるということなのですね。
Acrobat用プラグイン開発のためのものだと思っていました。
もう一度メーカーのサイトを読んでみます。
ありがとうございます。
710 :
デフォルトの名無しさん :2008/02/19(火) 01:06:07
|┃三 / ̄\ |┃ | | |┃ \_/ ガラッ. |┃ | |┃ ノ// ./ ̄ ̄ ̄ \ |┃三 / ::\:::/:::: \ |┃ / <●>::::::<●> \ |┃ | (__人__) | |┃三 \ ` ⌒´ / |┃三 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
711 :
デフォルトの名無しさん :2008/02/19(火) 01:06:31
|┃三 / ̄\ |┃ | | |┃ \_/ ガラッ. |┃ | |┃ ノ// ./ ̄ ̄ ̄ \ |┃三 / ::\:::/:::: \ |┃ / <●>::::::<●> \ |┃ | (__人__) | |┃三 \ ` ⌒´ / |┃三 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
712 :
デフォルトの名無しさん :2008/02/19(火) 01:07:55
|┃三 / ̄\ |┃ | | |┃ \_/ ガラッ. |┃ | |┃ ノ// ./ ̄ ̄ ̄ \ |┃三 / ::\:::/:::: \ |┃ / <●>::::::<●> \ |┃ | (__人__) | |┃三 \ ` ⌒´ / |┃三 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
CHtmlViewの質問なんですが、メモリ内にあるタグソースを表示させるにはどうすればいいのでしょうか? メンバ関数調べましたがそのような機能の関数はありませんでした。 一度ファイルに保存してNavigate2()等で表示するしかないのでしょうか? 宜しくお願いします。
714 :
713 :2008/02/19(火) 15:26:33
すいません自己解決しました
715 :
713 :2008/02/19(火) 16:01:12
about:付けたら行けたのですが文字数が多くなると駄目でした。 なので、他の方法お願いします。
IHTMLDocument2::write()
717 :
713 :2008/02/19(火) 18:43:14
>>716 ありがとうございます。
どうやってやるか分からなかったんで調べて
ttp://www.nitoyon.com/vc/tips/ie_component.htmの about:blank のページに動的にページを入れ込みたい
と言う項目を参考にしてやったらとりあえず表示は出来たのですが、
この処理を2回以上行うと、2回目から何も表示されなくなります。
〜->Navigate2("about:blank")のコールを毎回行わずに最初だけにすると前のデータが残っていて、
どんどん追加されていってしまいます。
どうすればいいのかお願いします。
719 :
713 :2008/02/19(火) 20:59:33
>>718 レスありがとうございます。
仕様だったんですか。なら仕方ないですね・・。
諦めて一時ファイル作るなりします。
サイトの方もありがとうございます。参考にさせて頂きます。
720 :
デフォルトの名無しさん :2008/02/20(水) 10:25:37
タブオーダーについて 質問させて戴けないでしょうか? 親ウィンドウに、 タブコントロールとOKボタンを置きます。 タブコントロールの中にもOK2ボタンを置きます。 書式⇒タブオーダーで、 OK2ボタン⇒OKボタンと指定したいのですが どのようにすれば宜しいでしょうか?
OK2ボタンがFocusを失ったタイミングでOKボタンにSetFocusする
722 :
720 :2008/02/20(水) 15:57:37
723 :
デフォルトの名無しさん :2008/02/20(水) 23:10:05
ピクチャボックスでオブジェクトを動かしいて、領域外に描画した際に その描画した線を消せずに困っています。 解決策としてInvalidate()を試しましたが、ピクチャボックスの領域も再描画されてしまい 意味がありませんでした。 それともピクチャボックス上で領域外にも描画するような処理を行うのはイレギュラーな使い方なんでしょうか?
InvalidateRect()なら、再描画の領域指定出来るが・・・ 領域外にはみ出してしまった描画を消すのではなく、 はみ出しても描画させない つ【CreateRectRgn】【SelectClipRgn】
分割ビューの切り替えについて質問があります。 CSplitterWndで左右に分割したとし、押したボタンによって、 右側のビューをツリービューとリストビューに切り替えたいです。 その際、現在のビューを削除するのではなく予め作っておいたツリービューかリストビューを セットしたいのですがどうすればいいのか分かりません。 そもそもそういう事は可能なのでしょうか? わかりにくい説明だとは思いますが宜しくお願いします。
CSplitterWndにはそういう機能はないけど自分で入れ替えれば可能
727 :
725 :2008/02/23(土) 15:39:04
>>726 具体的にどのような手順で行うのか教えて頂けないでしょうか?
728 :
725 :2008/02/23(土) 16:10:00
やっぱりなんか出来る気がしてきたので自分でやってみます。
よし頑張れ!
タブでウインドウ切り替えができれば ボタンで切り替えも同じようなもの
731 :
725 :2008/02/23(土) 18:37:13
えーっと、やっぱり良く分からない・・・アドバイスお願いします。
>>731 タブのサンプルを探して読め。理解するまで実験しろ。
そこまで理解できていれば、ボタンでもすぐ書ける。
733 :
725 :2008/02/23(土) 19:26:29
はいサンプル探してみます。でも、また出来そうな気がしてきました。
735 :
725 :2008/02/25(月) 18:27:43
>>734 いきなり英語のサイトを晒されてもわかるかヴォケ
おとなしく聞いているからって調子にのるな
いいかわかたっか!
>いいかわかたっか! 餅搗け。この程度の英語も読めないようじゃ、餅搗いてもいられないかも知れんが。
若貴のことだろう
ちょいと相談。 あるActiveXをダイアログに置いているのだが、こいつがどうもフォーカス移動でおかしな動作をするようだ。 そこで、マウスクリックしてもフォーカスを移さないようにしたいのだけれど何かいい方法はないかな。 Spy++で見る限りSETFOCUSは飛んでいるけどpreTranslateMessageではトラップできないみたいなんだ。 試しに、EnableWindow(FALSE)して親からメッセージを送りつける方法は、そのコントロールがスクロールバーを 持っているのでスクロールバーの操作が親からではできないと言う点で失敗だった。
MFCに未来はあるの?
740 :
734 :2008/02/25(月) 23:41:23
>739
http://blogs.msdn.com/vcblog/archive/2008/01/07/mfc-beta-now-available.aspx MFC Beta Now Available
A beta version of a major MFC/TR1 feature pack is now available for download.
Please note that this feature pack is only supported on systems which have the English language (ENU) version of
Visual Studio Team System 2008 Team Suite or Visual Studio 2008 Professional Edition installed.
These components allow developers to create applications with the “look and feel” of the most popular Microsoft products - including Office,
Internet Explorer, and Visual Studio. With this update, you’ll be able to build applications that utilize:
・Office Ribbon style interface
・Office 2007, Office 2003 and Office XP look and feel
・Modern Visual Studio-style docking toolbars and panes
・Fully customizable toolbars and menus
・A rich set of advanced GUI controls
・Advanced MDI tabs and groups
・And much more!
ないっしょ。
>>739 MFC の将来は Windows と同じ
Windows が続く限りMFC も続く
なぜなら、MS が提供するほとんどのソフト(ツール)が
MFC を使っているからだよ
マイクロソフト自身はMFC使ってないだろ
昔はサンプルもmakefileでcl使う方式だった VC++で書けよ!と思ったw
つーかころころDLLのバージョン変えるの勘弁してほしい
C++/CLIに将来はあるの?
VisualStudio2008のMFCの新機能はどんな感じかな? 誰かレポートきぼんぬ
750 :
デフォルトの名無しさん :2008/02/27(水) 00:49:49
http://rararahp.cool.ne.jp/vc/vctips/bar.htm VC6.0MFCを使っています。
ウィザードでCFrameViewから作成したSDIをつくり、
デフォルトのメニューバーに加え、IDD_DIALOGABARを
プラスしました。
最初に起動したときにファイル読み込みを行ったときには、ファイル読み込みのダイアログが出て、CxxxDocの Serialize関数を読み込みます。
が、なぜか2回目を起動したときにファイル読み込みのダイアログは出るのですが、
Serialize関数まで行きません。それはブレークポイントで調べました。
こういうときに陥りやすい罠とかあったら教えてください。
DocTemplate って new してるのに delete が要らないのはどうしてですか? MFCが自動的にメモリを解放してくれているんだろうと 信じて使ってはいるのですが、気になってます。
752 :
デフォルトの名無しさん :2008/02/27(水) 00:56:55
>750 自己レスです、また別のファイルを読んだときはSerializeまで行くみたいです。 ところが同じファイルを読み込んだときは、全く反応がありません。 普通のデフォルトのフォームビューではそんなことはありませんでした。
ところでMFCって Dialog以外でも ポトペタできるようになったの?
>750 そこのサイトに掲示板がある
755 :
デフォルトの名無しさん :2008/02/27(水) 10:12:07
>754 ありがとう。そっちに行きます。
756 :
デフォルトの名無しさん :2008/02/27(水) 11:15:06
>>754 ?変わった方ですね… dialogは無し、書き換えてreloadで其の儘とは…
r
CEditで右寄せのスタイル時に キャレットが邪魔で文字が見にくいのですが キャレットと一番右の文字の間に余白を設定することってできますか? SetMarginsを使ってもキャレットの邪魔っぷりはどうにもなりませんでした。。 自前でエディット作るしかないのかな。
758 :
デフォルトの名無しさん :2008/02/27(水) 11:56:46
>756 どういうことですか? 意味が分かりません。
余白にキャレットが移動するとは思えない スペース入れてやれば? それかフォントかキャレットをいじる
760 :
デフォルトの名無しさん :2008/02/27(水) 17:06:03
761 :
デフォルトの名無しさん :2008/02/27(水) 17:22:04
CPrintDialog dlg(FALSE); dlg.GetDefaults(); HDC hDC = dlg.GetPrinterDC(); LPDEVMODE pDevMode = dlg.GetDevMode(); // //印刷処理 // というルーチンで印刷処理を用意してします。 MSDNのCPrintDialog::GetDevModeの説明には 「この構造体に割り当てられているメモリは、 Windows の GlobalUnlock 関数でロック解除する必要があります」 と書いてあるんですけど、GlobalUnlockに渡すハンドルって、 GlobalLockに渡すものと同じものですよね? このハンドルって、CPrintDialog::GetDevModeの戻り値から わかるものなのでしょうか?
>>751 CDocManagerのデストラクタで
VS2005でMFCの開発をしています。
画像を見て頂きたいのですが、
移動させられる点がいっぱい付いているつまみの背景色の色@と、
メニューバー、ツールバー、ダイアログバーの背景色Aが異なっておかしい事になっています。
個人的には、@の背景色に合わせたいのですがどうすればいいのでしょうか?
宜しくお願いします。
ttp://kjm.kir.jp/pc/?p=53616.jpg
画像見てないけど 全部変えたかったらスキン使え
766 :
デフォルトの名無しさん :2008/02/29(金) 14:15:57
http://k0me-lab.hp.infoseek.co.jp/Tuto/MFC_Tips.html ダイアログバーにカラーボタンを作ろうと思ってボタンの色を
換えるのが最終目的ですが、
このホームページの2番が分かりません。
リンク先の英語が分からないのも問題ですが、
2.紹介されているバグがありますので、これにしたがって、CInitDialogBar::Createを
.・・・・・・・・・・・・・
CInitDialogBarの中で呼んでいるCreateを、ベースクラスのもの(CDialogBar::Create)に書き換えるだけです。(引数同じ)
InitDialogBar.cppのCreateを見てもCDialogBar::Createになっています。
どこが間違っているのでしょうか?
それとも既に修正された?
何それ?質問?愚痴?
768 :
デフォルトの名無しさん :2008/02/29(金) 14:48:43
>766 自己レスです。 //if(!Create(pParentWnd, MAKEINTRESOURCE(nIDTemplate), nStyle, nID)) if(!CInitDialogBar::Create(pParentWnd, MAKEINTRESOURCE(nIDTemplate), nStyle, nID)) もしかしてこういうこと。 ただ単にCreateだと自分のところ(CInitDialogBar)のCreateになるからってことかな?
769 :
デフォルトの名無しさん :2008/02/29(金) 14:51:38
>768 まちがい if(!CDialogBar::Create(pParentWnd, MAKEINTRESOURCE(nIDTemplate), nStyle, nID)) でした
ぼやき、ひとりごと
自分で見てわからないものは使わない
772 :
デフォルトの名無しさん :2008/02/29(金) 15:53:38
>770 レスが付いているとは思いませんでした。質問の仕方が悪かったですね。 改めて質問します。 というのは新しい派生クラスはを親をCDialogとしなさいと書いてあるけど、 そうするとprotectedされている関数にアクセスできないから、 CInitDialogBarに変えています。(これも確証は持てないのですが正しいのでしょうか?) また、上記のホームページのようにCDialogをCInitDialogに変えると void CHogeDialogBar::Createの中の //return CDialog::Create(IDD, pParentWnd); ←デフォルト の引数は同じにしないといけないことになります? BOOL CHogeDialogBag::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { //return CDialog::Create(IDD, pParentWnd); ←デフォルト return CInitDialogBar::Create(pParentWnd, lpszClassName, dwStyle, nID); //ここの引数も自信がない。 } これで正しいのでしょうか?
773 :
デフォルトの名無しさん :2008/02/29(金) 15:54:38
>771 自分で考えるともっと分からないかも?
774 :
764 :2008/02/29(金) 16:02:36
>>765 レスありがとうございます。スキンですか。調べてみます。
ウィザードから作成したのですがスキンで変更するしかないのでしょうか?
775 :
デフォルトの名無しさん :2008/02/29(金) 16:15:19
>772 また自己レスです。愚痴と言われても仕方ないですね。 BOOL NewDlg::Create(CWnd * pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID) { // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください return CInitDialogBar::Create(pParentWnd, nIDTemplate, nStyle, nID); } こうしないといけませんね。たぶん・・・。 何で気づかなかったんだろう。
776 :
デフォルトの名無しさん :2008/02/29(金) 19:04:24
VC6.0のMFCです。 ダイアログバーのCButton上でカラーボダンを作りたいのですが、 うまくいきません。 いろいろと調べたのですがどうもサブクラスかがうまくいっていません。 Assetion Errorが出 てwincore.cpp Line311でエラーが出ます。 MainFrame.h publicにCDialogBarを継承した派生クラスを public: CNewDlg m_wndDialogBar とし、サブクラス化の部分はこんな感じです。 MainFrame.cpp CColorButton* pColor1 =(CColorButton*)m_wndDialogBar.GetDlgItem(IDC_BUTTON1); if(!pColor1->SubclassDlgItem(IDC_BUTTON1, &m_wndDialogBar)) return(FALSE); この段階でエラーが出るようです。 CColorButtonはCButtonの派生クラスです。
777 :
デフォルトの名無しさん :2008/02/29(金) 19:05:10
ダイアログバーを派生クラスにせずに直接CDialogBarにしても 状況は変わりません。 なにとぞご教授お願いします。
ダイアログバーが使いものにならないと気がつくといいね。
779 :
デフォルトの名無しさん :2008/02/29(金) 20:43:01
>778 .NETに移行しなさいっとことかしら。
780 :
デフォルトの名無しさん :2008/02/29(金) 21:09:06
>778 オーナードローあきらめてOnPaintにしたよ・・・orz
>>776-777 > CColorButton* pColor1 =(CColorButton*)m_wndDialogBar.GetDlgItem(IDC_BUTTON1);
> if(!pColor1->SubclassDlgItem(IDC_BUTTON1, &m_wndDialogBar))
> return(FALSE);
SubclassDlgItem()の意味わかってる?
ダイアログバーの派生クラスを作ってるんなら
その派生クラス(CNewDlg)の変数としてCColorButton m_button;を追加して
m_button.SubclassDlgItem(IDC_BUTTON1, this);とするか、
ClassWizardでCColorButton型の変数m_buttonを追加する。
ダイアログバーの派生クラスを作らないのなら
CMainFrameの変数としてCColorButton m_button;とでもして
m_button.SubclassDlgItem(IDC_BUTTON1, &m_wndDialogBar);
782 :
デフォルトの名無しさん :2008/03/01(土) 01:21:59
>781 ありがとう、使い方を間違えていましたね。 よくサンプルテキストを見るべきでした。
CDocument や CView や CWinApp から CMainFrame の m_wndStatusBar.SetPaneText にアクセスして、 ステータスバーにいろいろ情報を表示したいのですが、 どのようにすればよいのでしょうか? 今はグローバル変数で m_wndStstusBar をポイントする変数をとり、 CStatusBar* stsbar; int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ................................................................. stsbar = &( this->m_wndStatusBar ); ................................................................. } void CaaaView::OnMouseMove(UINT nFlags, CPoint point) { CString str; str.Format( _T( "(%d,%d)" ), point.x, point.y ); stsbar->SetPaneText( 0, str, TRUE ); CScrollView::OnMouseMove(nFlags, point); } としているのですが、もうすこし MFC のクラス構造から、 CMainFrame のメンバにアクセスできないのかな?と考えております。
普通はグローバル変数使わずにCDocument や CView や CWinApp から CMainFrame にアクセスすると思う。
CMainFrameさんが書いてあげるといい
786 :
783 :2008/03/02(日) 11:12:29
CView から CDocument だと CView::GetDocument() というのがありますね。
いろんなところから CWinApp だと ::AfxGetApp() というのがありますね。
CDocument から CView というのは、いまのところ再描画ぐらいしか必要がないので
CDocument::UpdateAllViews でまにあっております。
つまづいているのは、まさに
>>784 さんにつっこまれているところでございまして、
それの具体的な方法がわかりません。CMainFrame にアクセスする
なんらかの関数などが用意されているのでしょうか?
例えていいますと ::AfxGetApp()->GetMainFrame()->m_wndStatusBar みたいな感じで
>>785 さんのレスは、たしかにそうなのですが、マウスの座標みたいなものは、
やはり CView で取りたいな、と思っております。
こういう場合は CMainFrame でマウス座標を拾って表示するというのが王道なのでしょうか?
MFC の初心者のため、雰囲気がわかっておりません。
(いまさらMFCやってるのかぁ?という突っ込みはかんべんしてください)
>>783 786
CView::OnMouseMove()やCDocumentなどから直接更新するなら
GetParentFrame()またはAfxGetMainWnd() と CFrameWnd::GetMessageBar()で
CStatusBarのポインタ取得してSetPaneText()でできるよ。
MFCにはON_UPDATE_COMMAND_UIを使って
メインのステータスバーを更新する仕組みが備わってるけど、
それを使うとこの場合は冗長だろうね。
MFC ライブラリ リファレンス
ステータス バー ペインのテキストの更新
http://msdn2.microsoft.com/ja-jp/library/a9ys3wsb (VS.80).aspx
> MFC の初心者のため、雰囲気がわかっておりません。
> (いまさらMFCやってるのかぁ?という突っ込みはかんべんしてください)
ここはMFCスレなんだし、そんな遠慮は不要。
788 :
デフォルトの名無しさん :2008/03/02(日) 12:35:41
MFCの質問としてはあれなんですが、SDIでアプリを作ってます。 while()の中で条件を満たす限りある処理を行っているのですが、 その途中に途中経過としてウィンドウに文字を表示させたいのですが、 処理中はウィンドウが応答無し状態になり処理が終了と同時に全ての文字が表示されてしまいます。 処理はきちんと行われ、文字表示はCEditViewクラスで行ってます。 文字表示以外の時は応答無しでも良いので文字表示を正しく行いたいのですがどうすればいいのでしょうか? お願いします。
789 :
788 :2008/03/02(日) 12:55:05
自己レスですが、UpdateWindow()でいけました。 が、処理中にクリックすると応答無し状態になりこの状態では文字が表示されなくなります。 ウィンドウは分割して使ってます。
>786 C++の基本を勉強しよう クラスの外からは直接メンバ変数にアクセスしないように設計する。
792 :
788 :2008/03/02(日) 13:33:14
>>790 ありがとうございます。
教えて頂いたサイトのソース追加したら確かにいけました。
でも、マルチスレッドって言うのも興味があるので勉強してみようと思います。
AfxGetMainWnd()って別スレッドで使うと AppのMainFrameが取得できない?ので AfxGetApp()->m_pMainWndを使うようにしてる
>>793 別スレッドのMFCオブジェクトを操作するのはダメ
>>794 例えばメインフレームからワーカースレッド起動して
ワーカーから
AfxGetApp()->m_pMainWnd->***()はダメ?
::PostMessage(AfxGetApp()->m_pMainWnd->m_hWnd, ...)なら良い?
正直mfcに向いてない思う
まじかorz もう使って3年になるんだが辞表だしてくる\(^o^)/
辞表うp
799 :
793 :2008/03/02(日) 14:47:09
>>798 実際辞める時は上司に意思表明だけでいいのよ
>>800 In other words, if you want to access any MFC object from a secondary thread,
you must create that thread with one of the methods described in
Multithreading: Creating User-Interface Threads or
Multithreading: Creating Worker Threads.
って書いてあるけど、AfxBeginThreadで作成したスレッドからなら
アクセスしていいってことかな?
>>801 No
スレッド中でMFCのクラス使うならMFCでスレッド作れ、ということ。
ハンドルとMFCオブジェクトとの対応マップとかスレッド固有の情報を初期化する必要があるため。
マルチドキュメントのCChildFrameにツールバーを持たせたのですが、 ツールバーの全ての項目が灰色になっていてボタンを押すことができません。 何故でしょう? CChildFrame::OnCreateソースです。 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_CHILDFRAME) ) { TRACE0("ツール バーの作成に失敗しました。\n"); } // TODO : ここに特定な作成コードを追加してください。 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);
Visual C++ 2008 Feature PackでMFCに機能追加ができるようだけど、使ってる人いる?
>803 無効な場合は押せない仕様
>> 802 よく分からんのだけど、PostThreadMessageを使えってこと? でもあれ取りこぼしあるでしょ?PostMessageでおkと思ってたんだけど…
話がかみ合ってない気がする。 CWndのようなMFCオブジェクトの受け渡しは駄目。 回避するにはHWND(ハンドルそのもの)を受け渡す or PostMessageを使えとMSDNには書いてある。
>>806 PostMessageはいいけど、ハンドル取り出すためにMFCオブジェクトにアクセスするのが問題だと思われ。
809 :
806 :2008/03/02(日) 23:40:03
ラジャー
810 :
803 :2008/03/03(月) 05:02:04
>>805 解決しました
リソースエディタでアクセラレータを設定して、
さらにChildFrameでON_COMMAND_UI_UPDATEイベントを追加してEnableしないと有効にならないんですね。
世の中、MFCを使ったプログラムはC++が主流なのでしょうか? 最近習得が出来るよう学習を始めたのですが、教科書代わりに見ている 「猫でも分かるプログラム」のサンプルプログラムがCです。 このまま進んでも大丈夫かちょっと心配になってきまして・・・。
Cじゃ無理だろ
APIとMFCの違いはわかってるのかな?
MFCを使ったプログラムはC++しかありません
816 :
783 :2008/03/03(月) 22:19:51
StatusBar の件うまくいきました、皆様ありがとうございました。
写経するだけなら中味は何でも同じだから 気にせずどんどん打ち込めばいい。
818 :
デフォルトの名無しさん :2008/03/03(月) 22:22:47
>>810 コマンドハンドラを作るだけで有効になった気がするが。
メニューもそうだけどコマンドハンドラが無い項目は灰色になる仕様だった希ガス。
820 :
デフォルトの名無しさん :2008/03/04(火) 11:06:35
毎局長考、つるんでる馬鹿晒し 【TAITO INN 大宮】 ゾウのげり (埼玉) 【ロングラン萬代】 *APE* (新潟)
821 :
デフォルトの名無しさん :2008/03/04(火) 12:58:15
MFCのCFormViewでダイアログバーをつけて, CxxxViewのほうにピクチャーボックスをつけています。 グラフを作りたいのですが、MM_ANISOTROPICで 論理座標で指定すると、CPenで作った線までも拡大されてしまいます。 絶対座標のピクセルのX軸が640だとして、 論理座標のX軸を10振り分けたとすると、 640/10倍の太さににってしまうのです。 CPenの太さを0にすればピクセルになると書いてあるので 取りあえずそれで凌いでいますが、ちょっと不便です。 みなさんは、どのようにしてますか?
そのCPenどうやって作ってる?
823 :
デフォルトの名無しさん :2008/03/04(火) 16:58:22
CPen NewPen; NewPen.CreatePen(PS_SOLID, 0, RGB(0,0,0)); こんな感じです。 NewPen.CreatePen(PS_SOLID, 1, RGB(0,0,0)); NewPen.CreatePen(PS_SOLID, 3, RGB(0,0,0)); とかしたいんだけど先ほど言ったように変に拡大されて だめです。
んー、 CDC::SetView〜とかCDC::SetWindow〜を組み合わせてはどうか
825 :
デフォルトの名無しさん :2008/03/04(火) 18:05:04
>824 pDC->SetWindowExtとかいうことですか? 今これらを使っているためにおかしくなっています。
826 :
デフォルトの名無しさん :2008/03/04(火) 19:03:46
ちょっと誤解を招いているかも知れません。 マップモードで座標をを論理的にしたいのですが、 ペンの太さまではそれの影響を受けたくないのです。
それはどういうこと? ペンだけを除外できると思う根拠は何?
自分で論理単位でペン幅指定してるのに影響されないようにするとは?
829 :
デフォルトの名無しさん :2008/03/04(火) 20:44:03
>828 例えば 絶対座標Xが200相対座標Xが50、 絶対座標Yが100相対座標Yが20としたら ペン幅を1としても 200/50で横4倍縦5倍の線ができる。 ペンの幅だけは何とか縦横同じにしたい。 CPenでは縦横両方のペン幅を指定できないので 困っているというわけ。 論理座標を便利に使いながらペンを自由に 使えないかと模索中。
模索するのは勝手だけど馬鹿だと思われるから書かない方がいいよ
831 :
デフォルトの名無しさん :2008/03/04(火) 21:25:36
>830 これだと論理マップ使わないほうがいい。
CToolBarのUPDATE_COMMAND_UIで下のようなコードを書いたところ、 ツールバーがひっきりなしにちらつきます。 pCmdUI->SetRadio(1); if( hoge == 0 ) { pCmdUI->SetCheck(1); } else { pCmdUI->SetCheck(0); } このソースからSetCheck()を削除するとちらつきが無くなりましたので、 SetCheckによる再描画がちらつきの原因だと思うのですが、 ちらつくこと無くSetCheckを使うためにはどうすれば良いのでしょう?
833 :
832 :2008/03/05(水) 08:57:50
CToolBarから派生させてERASEBACKGNDをオーバーライドして解決しました(^^) このバグは早く直してほしいですね
FlashやPhotshopにあるようなタイムラインを作りたいのですがMFCでは無理なのでしょうか。 雰囲気がリストビューに似ているのでリストコントロールを色々触っていたのですがどうも上手くいきませんでした。 ・セル(行と列)単位の選択が不可能 ・カラムがフレームの増増加と共に膨大な量になる ・セルに「○」など全角文字を1文字表示させるためには若干の広さが必要 ・特定のセルだけに色が付けられない など、近づくことさえ出来ず詰んでしまいました。 FlashとPhotshopのタイムラインは似たようなインターフェイスですが特殊なライブラリを使っているとか・・・?
MFCは基本的な機能を提供するだけ それ以外は自分でやる
VS2008起動してニュースみてたらMFCがなんか始まりそうな予感
マクドナルド・フライドチキン
>>833 GetCheckで状態調べて、セットしたい状態と異なっている場合のみSetCheckすれば
解決したんじゃないの?
あと、バグっていってるのは、何を指してる?
可哀想な子に触っちゃだめ!
そうか、ダメだったか。 ああ、俺もこれで可哀想な子の仲間入りかな。 パトラッシュ、僕はもう疲れたよ。。
>>839 アーッ
UPDATE_COMMAND_UI()以外のメソッド内で設定したスタイルはすべてクリアされると書いてあったので
pCmdUIのメソッドを使うことしか考えていませんでした。
よく調べてみたら、ツールバーにGetCheckedRadioButtonというのがあったんですね。
ありがとうございました(^^)
おまえは自分のバグをすべて人のせいにするだろ ソフト向いてないよ、やめれ
お前にお前呼ばわりされる筋合いはありません。
わかってないな ソフト屋ってのは、不具合があったらまずは自分を 疑うところから始めるんだよ その辺が甘いやつは向いてないよ
俺が間違ってるわけがない!
まあ現場じゃ何でも人のせいにするあほうに振り回されるからな
僕はあなたの同僚ではないのでどうでもいいですが(^^) 現場で使えない人に直接言えないからって、無関係な僕に言うのはお門違いですよね(^^)
さらに言えば、そんな使えない人間が居る会社に入ったのも自分の能力の程度の低さのせいですよね(^^) それをちょっと能力が劣るという理由だけで全部他人のせいにして逃げるなんて、人間としてどうですか(^^)/ヽ(^^)
俺の能力がそんなに低いわけがない!
大きな会社ほど使えないやつも多いということがわかってないな
ってか他でやれと
どうでもいいよ
WBS恥また
857 :
856 :2008/03/07(金) 23:00:58
誤爆しました、すみません
なんかドロドロしてるねぇ 嫌だねぇ ここで誰かMFC豆知識でも披露してふいんき変えてよ↓
859 :
Gori :2008/03/08(土) 03:31:19
ActiveX 編に入ったのですが DOSプロンプトを開いてWindowsへ登録しなければ成らない様なのですが 参考書通り やって見るとError と出てしまいます 参考書では C:\WINDOWS> cd system C:\WINDOWS\SYSTEM> regsvr32 MYCTL.OCX これでリターンしたのですが。。。? もしかしたら。。。リターンじゃ無いのでしょうか。。? 。。。。どうすると。。。良い物でしょうか?。。。。m(__)m
VS2005のC++/MFCで CDBVariant* pVal = new CDBVariant[3]; これdeleteしただけでエラー吐くw
>>859 コマンドプロンプト開いて
regsvr32
と打つ(後ろの半角スペースも)、その後VisualStudioでビルドしてできた
ReleaseフォルダのしたのMYCTL.OCXをregsvr32 の後ろにドラッグアンドドロップ
してコマンドプロンプトにフォーカスを当ててからリターンでどうでしょう
>>860 CDBVariant* pVal = new CDBVariant[3];
pVal[0] = new CDBVariant;
pVal[1] = new CDBVariant;
pVal[2] = new CDBVariant;
regsvr32 ActiveX でぐぐったらいっぱい情報あるじゃないか
864 :
Gori :2008/03/08(土) 13:35:52
>>861 >>863 さん 有難う御座います。
アチコチ検索して見て見ると、
僕の方で概念を理解出来ていない様です。
何が、どう解らないのかも、解らない状態のようです。。。。^^;
もう少しアチコチ読み歩いて見ます。。。。m(__)m
MFC終わる終わる騒いでた奴らって何?
>>862 それはないだろ...Javaじゃあるまいし...
867 :
デフォルトの名無しさん :2008/03/08(土) 22:24:28
モードレスダイアログのクラスを用意し、 ・親ウィンドウがnewで作成 ・ダイアログクラスのPostNcDestroy()でdelete thisで自殺 というようにやっているのですが、ダイアログが残っているかどうかは 親ウィンドウはどうやって知ればよいのでしょうか。 親ウィンドウがnewで確保したダイアログのポインタを使う方法は、 自殺でdeleteされていたら不正アクセスになってしまいます。
死ぬ前に親に言う
そういや俺も親のメソッド呼んだり、ユーザー定義のメッセージポストしたりして 子の死亡を通知してるが、子がなにかしなくても親が知る方法ってあんのかな
IsWindow
一度作ったら、ダイアログ側で閉じても非表示にしかならない、という方法もある。
872 :
867 :2008/03/08(土) 23:40:02
> 死ぬ前に親に言う やっぱりこういう構造になってしまうのですかね。 せっかく自殺するのに、その前に親に教えるとなると、 親に殺してもらうのと同じになってしまいますよね。 > IsWindow このIsWindow()を使う方法って、 new後にCreate()したダイアログのm_hWndも別に憶えておくということですか? この場合、自殺した後に作られた全く他人のウィンドウが たまたま同じウィンドウハンドル値になって、親がIsWindow()に使ったときに TRUEが返ってきてしまうことはあり得ないのでしょうか? > 一度作ったら、ダイアログ側で閉じても非表示にしかならない、という方法もある。 たしかにこの方法もあるのでしょうけど、 ちょっと今の内部ルーチン的には無理があるので、 今回は作成&自殺を繰り返したいと思います。
遺書を残して自殺しなよ
MFCのモードレスダイアログのサンプルでは自殺直前に親に通知してるけど 通知された親がやるのはダイアログのポインタにNULL入れるだけ。 > 親に殺してもらうのと同じになってしまいますよね。 同じだと何か問題あるの?
876 :
875 :2008/03/09(日) 00:29:29
× MFC ○ MSDN
>>862 その方法とかいろいろ新クラス作るってテもあるけど
そもそも、なんで生成破棄だけでメモリ空間エラー吐くのかが不明だなぁ
スタックさんの勝手処理だと吐かないのに ふしぎ!
産まれた後も臍の緒を繫いでおく
879 :
867 :2008/03/10(月) 09:35:31
> 同じだと何か問題あるの? いや、結局親に伝えるのであれば、 わざわざ自殺するようなクラスにしなくてもよいはずなのに、 なぜこのような方法が推奨されているのかなと疑問に感じまして。 ちなみに、前回の 「親がダイアログのm_hWndを憶えておいてIsWindow()で自殺を断定する」 という方法は、やはり危険ということになりますでしょうか? > GetSafeHwnd() GetSafeHwnd()って、親が持っているポインタ先がすでにdeleteで自殺していて そのポインタがNULLになっていないケースでは、余計危険ではありませんか?
やり方はいろいろあるから状況で使い分ければいい。 いろいろ使ってるうちに自殺方式の良さがわかると思う。
・子が自発的に死ぬ場合 子、自殺準備する 子「死にます」 子、自殺する 親、死に水を取る ・親が子に死んで欲しい場合 親「死になさい」 子「判りました」 子、自殺準備する 子「死にます」 子、自殺する 親、死に水を取る ・子が死ねない場合(1) 親「死になさい」 子「……」 親、暫く待つ 親、子を殺す ・子が死ねない場合(2) 親「死になさい」 子「判りました」 親、暫く待つ 親、子を殺す
せちがらいな
delete this嫌う人もいるけど、MFCの中でdelete this使ってるから抵抗するだけ無駄 // self destruction void CView::PostNcDestroy() { // default for views is to allocate them on the heap // the default post-cleanup is to 'delete this'. // never explicitly call 'delete' on a view delete this; }
> 879 MSDNには両方のケースの説明のってるし、別に推奨してないと思う。 産んだ後、面倒見なくて済むからやってるんじゃないかな? ダイアログ自体がメインウィンドウの場合もあるだろうし。 m_hWndは断定はできないけど危険な気がする。自分なら使わない。 GetSafeHwndは論外。
レポート形式のスクロールバーを保持しないリストコントロールにて、スクロールさせたときの状態(位置)を取得することは可能でしょうか。 スクロールバーが無いのでScrollWindowでスクロールさせたのはいいものの アイテム0番目・カラム0番目の左上の座標が取得できないため 現在どれだけスクロールしているのか、どの列をクリックしたかが分かりません。 スクロールさせた量を自分で管理するしかないのでしょうか。
クリックしたアイテムの位置くらいなら、 LVM_HITTESTあたりで何とかならないか?
887 :
867 :2008/03/10(月) 21:06:47
> 産んだ後、面倒見なくて済むからやってるんじゃないかな? 今回のようなモードレスダイアログのケースでは 面倒見ないままというわけにもいかないので、 自殺の方法も自殺以外の方法も手間的にはあまり変わらなくなってしまうのですね。 881のような書きかただと、子ダイアログのPostNcDestroy()で 子「私を殺して」 親「わかりました」 親、子を殺して死に水を取る という方法もありますよね。 > m_hWndは断定はできないけど危険な気がする。自分なら使わない。 > GetSafeHwndは論外。 m_hWndをIsWindow()に渡して自殺を判定する方法が安全なのであれば、 わざわざ親に伝えなくても子が勝手に自殺できるのでしょうけど、 本当に安全なのか確信できる情報が出てこないので、 今回はMSDNのサンプルに従って、 親に報告してからdelete thisを使う方法でやってみたいと思います。
>>886 行は取得できるけど列は無理じゃない?時代が変わったのかな。
実行結果がなくなってるし なんかGetBufferが気持ち悪い CStringの方が使いやすそう
CSimpleStringT自体のインスタンスは作った覚えがないな ま、メンバ関数の世話にはなるし、基本と凝ってるのをクラスで分けてるぐらいの認識
892 :
デフォルトの名無しさん :2008/03/16(日) 19:15:20
AdjustWindowRectEx を使って、 クライアント領域が512×512ピクセルぴったりにあわせたウインドウを作りたいのですが、 うまくいきません、どこがよくないのでしょうか? InitInstance()部に下記のウインドウサイズを変更するコードを追加記述しています。 OSは WindowsXP で、スタイルは XP 標準のやつです。(クラシックではありません)
893 :
892 :2008/03/16(日) 19:15:53
>>892 です. 具体的にはこういうコードです
BOOL ChogeApp::InitInstance()
{
....................
....................
....................
HWND hwnd = this->m_pMainWnd->GetSafeHwnd();
long style = ::GetWindowLong( hwnd, GWL_STYLE );
long style_ex = ::GetWindowLong( hwnd, GWL_EXSTYLE );
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = 512;
rect.bottom = 512;
::AdjustWindowRectEx( &rect, style, TRUE, style_ex );
int scrlbar_w = GetSystemMetrics( SM_CXVSCROLL );
int scrlbar_h = GetSystemMetrics( SM_CYHSCROLL );
int window_w = ( rect.right - rect.left ) + scrlbar_w;
int window_h = ( rect.bottom - rect.top ) + scrlbar_h;
::SetWindowPos( hwnd, NULL, 0, 0, window_w, window_h, SWP_NOMOVE );
// メイン ウィンドウが初期化されたので、表示と更新を行います。
m_pMainWnd->ShowWindow(SW_SHOW); // defalut.
m_pMainWnd->UpdateWindow(); // defalut.
return TRUE;
}
誤爆? ここMFCスレですよ
>>892 具体的にどううまくいかないかも書いた方がいいのでは無いでしょうか。
自分には良くわからないのですが
SetWindowPosをコメントアウトしてみての動作
window_w,window_hを100,100とか適当な値での動作
SetWindowPosをもっと後に書いてみたときの動作
等を試されてみては如何でしょうか
896 :
892 :2008/03/16(日) 21:14:27
すいません、現象を言ってませんでした。 AdjustWindowRectEx を使って取得すると、 予想したよりもウインドウ幅が大きくなって、 ウインドウ高さが小さくなります。 デバッガで追うと、 window_w が 537 window_h が 583 になります。 いろいろ即値で試してみて 523 と 613 にするとぴったりになります。 ::SetWindowPos( hwnd, NULL, 0, 0, 523, 613, SWP_NOMOVE );
たぶん高さは指定した通りになってて 幅は後から広がったんだと思う。 ::GetClientRectか何かで確認してみ
ああ、縦横にスクロールバーついてるのか とりあえず指定したクライアントサイズになってるか調べるんだな
ついでにviewのクライアント領域のサイズも調べたら自己解決するんじゃないか?
MFCにメンバ関数あるやつまで全部apiで書いてるのは どっかから丸ごとコピペしたからだろうか? それでよくMFCスレで質問できるな
>>896 AdjustWindowRectExはクライアント領域のサイズから
ウィンドウ領域の大きさを決めるんだから最終的に
GetClientRectしたときの大きさが(0,0,512,512)に
なっていればいいんじゃないですかね?
自分がVS2003のSDIで簡単にやってみた感じだと
クライアント領域がスクロールバーの分だけ大きくなってました
(0, 0, 512+scrlbar_w, 512+scrlbar_h)
その辺、いつも比率に合わせてウィンドウサイズを変えてほしいって要望がくるけど その仕様どおりに作るとロクなことがない っていうか俺には無理。作れない。 毎回、理由の詳細を書いておけばいいんだけど 絶対に無理。これだけは覚えてる フレームウィンドウを強引に変えるんじゃなくて 幅か高さのどっちか片方にあわせて必要ない クライアント領域は黒く塗りつぶしておく仕様にするとみんな満足する
> AdjustWindowRectEx 関数の計算では、スタイルの WS_VSCROLL と WS_HSCROLL は考慮されません。 > スクロールバーも考慮したサイズを取得するには、SM_CXVSCROLL または SM_CYHSCROLL を指定して > GetSystemMetrics 関数を呼び出してください。 こんな使えねー関数は、ぽいだぽい。
スクロールバーは、必要に応じて表示・非表示を切り替える設定もあるから、 そこは勘弁してやれ。
GetWindowRectとGetClientRectとClientToScreenで計算するのが最善
906 :
デフォルトの名無しさん :2008/03/21(金) 16:30:53
質問です! この様な使い方はマズいでしょうか? やりたい内容は、2回目の印刷ダイアログを開く際 1回目で指定した内容を、初期表示させたいのです。 CPrintDialog cd; cd.DoModal(); (処理1・・・) cd.DoModal(); (処理2・・・) GlobalFree(cd.m_pd.hDevNames); GlobalFree(cd.m_pd.hDevMode); 不安なのは、GlobalFreeで開放していないのに、 2回目のDoModal()を行って良いものかどうか・・・
いくつか質問: 環境:VC++2003 MFC DLL:MFCをスタティックリンクした通常のDLL DLLにダイアログリソースを追加してそのクラスを作成してます class CDllDialog : public CDialog { ... enum{ IDD = IDD_DIALOG1 }; } DLLにこのクラスを作成する関数を作りました CDialog* MakeDllDialog() { return new CDllDialog(); } (Q1) DLLをリンクするEXE側でこのダイアログを使おうと思ったんですが DLLのリソースを利用してのモードレスダイアログの作成はどうすればいいんでしょうか? DLL側でCreateまでやるしかない?? CDialog *dlg = MakeDllDialog(); dlg->Create(/*DLLのリソースIDを入れる??*/, NULL); モーダルは普通にできるみたい CDialog *dlg = MakeDllDialog(); dlg->DoModal(); (Q2) DLL側でnew, CreateまでやってEXE側にポインタを返しdlg->ShowWindow(SW_SHOW)と するとアクセス違反になります。DLL側でCreateの後dlg->ShowWindow(SW_SHOW)なら成功し 表示されました。この違いは?? DLL側でCreateした直後のdlg->m_hWndとEXE側のdlg->m_hWndが異なるのはなぜ??
908 :
907 :2008/03/22(土) 12:42:50
(Q3) ダイアログの実装をDLLに丸投げするならどういう実装にしますか?? EXE側から表示非表示や座標移動等は行いたい 追記:忘れてました EXE側ではCDllDialogのヘッダファイルはありません 以上よろしくお願いしまう
HWNDを返してSendMessageで操作する
(A2) EXE側プロジェクトでMFCを共有リンクしてるんじゃない? スタティックリンクにすればうまくいくのを確認した。 (A3) Q2のShowWindowのようにDLLから取得するポインタで操作すればいい。 とりあえずMoveWindowが効くのは確認した。 (ただしCDllDialog独自の処理はその方法ではムリよん。)
>>907 Q1
MFC限定なら、
EXE側で、DLLをLoadLibraryして得られるHINSTANCEを、AfxSetResourceHandleすれば
DLLのリソースを利用できたと思った。
(A1) dlg->Create(%リソースID%, NULL)でOKだった。 やってみ。
913 :
907 :2008/03/22(土) 18:34:40
早いレスどうもです
>>911 ,912
リソースIDを指定するにはDLLのresource.hをEXE側でインクルードしないと
駄目ってことですか?インクルードしないとそんなの無いよって怒られます。
>>912 の%リソースID%の'%'ってコードに入れるとエラーになったんですが
単なる強調表示と考えていいですか?
>>910 確かにスタティックにすれば上手くいきます。違いが良くわからん。
>>909 ハンドルとメッセージで操作すれば簡単ですね。気付かなかった。
プラグイン形式?でダイアログをどんどん追加できれば便利かなーと
思ってたんですけど、Q2の方法でスタティックライブラリでMFCを使用するなら
出来そうな気がしてきた。
914 :
906 :2008/03/22(土) 18:35:23
もしかして、CPrintDialog::DoModal()内で GlobalFree()してからGlobalAlloc()し直してくれてるのでしょうか? 希望的推測ですが・・・
>912 %リソースID% 可変値の意味だったが通じないね。ごめん。 resource.hでリソースIDに対応する数値を調べて指定して。 (例) dlg->Create(1000, NULL)
916 :
911 :2008/03/22(土) 19:05:00
>>913 ・リソースIDをDLLとEXE共通にする。
・DLLのリソースIDを、新しいIDとしてEXEで定義する。
・即値で指定する
お好きにどうぞ。
917 :
913 :2008/03/22(土) 19:24:29
>>確かにスタティックにすれば上手くいきます。違いが良くわからん。 細かい部分までは分からないが、デバッグで追ってみたら、 ダイアログ作成時の処理のパスが違ってた。 それよりビルドが通るのに驚いた。DLLとexeでそろえないとビルド通らなかった経験があるんだけどな。 基本的には揃えとくのが吉と思う。
918 :
デフォルトの名無しさん :2008/03/22(土) 19:36:24
visualstudio 2005 SDI形式で作ってます。 ある大きさのクライアント領域を指定して、 それにあわせてウインドウを作りたいんですがよくわかりません。 自分なりにググっていろいろ試したんですが、お手上げです。
どこかで似たような質問あって回答あったけど質問者が行方不明
920 :
デフォルトの名無しさん :2008/03/22(土) 19:46:51
>>919 そのスレはこの板ですか? この板なら大体何時ごろのレスか教えて欲しいです。
このスレで最近1週間以内
922 :
デフォルトの名無しさん :2008/03/22(土) 20:14:36
>>921 見つかりました。 回答はないんですね・・・ もうちょっと調べます。
923 :
907 :2008/03/22(土) 20:36:06
>>917 >>DLLとexeでそろえないと...
DLLもEXEも共有にすれば(Q2)の時にアクセス違反にならずに表示できました。
ただこのときに使われたダイアログリソースがEXE側の同ID番号のリソースが使われた。
スタティックリンク同士だとDLL側のリソースが使われた。
今回はDLLのリソースを使いたいので、共有同士でするなら
DLL側で
>>911 のAfxSetResouceHandleをすれば問題無し。
DLLとEXEをそろえていないのが元凶っぽいですね
>>915 ,916
なるほど、覚えときます。
>>922 >>892 のコードでは出来ない?
924 :
913 :2008/03/22(土) 20:55:36
本当だね。AfxSetResouceHandleでリソースを使い分けられるね。APIではどう実現するんだろう。
コモンダイアログとか使ったことない人だろうか?
もうちょいkwsk
解答wktk
AfxSetResouceHandle使える環境なら、 ステップインしてどんなAPIで実現しているかを調べんのは簡単じゃね?
MFCはソース提供されているのに何故読まないのか理解に苦しむ。
「定義の参照」でソースに飛ぶようにしろや いいかげん・・・
読んでるよ。API呼んでない。少なくとも直接的には。 _AFXWIN_INLINE void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource) { ASSERT(hInstResource != NULL); afxCurrentResourceHandle = hInstResource; } #define afxCurrentResourceHandle AfxGetModuleState()->m_hCurrentResourceHandle
あと 911 のMFC限定という発言を考慮してもらえるとありがたかった。
どうせLoadResourceしたやつだろ
934 :
デフォルトの名無しさん :2008/03/23(日) 15:19:10
MFCでグラフを書こうと思ったらどうするの? 手堅い方法を教えてください.
リソグラフ
936 :
934 :2008/03/23(日) 15:40:14
>>935 ガリ版っすかwwwww
gnuplotみたいな処理をしてくれるクラスってないんですか?
グラフでつまずきたくないんで,できるだけ簡単に描画させたいんですけど.
それともみなさんLineToとか使って書いてるんですか?
>>934 ぐぐってみても無さそうですねぇ
gnuplotってwindowsじゃ使えないんですか?
939 :
934 :2008/03/23(日) 20:09:27
941 :
906 :2008/03/24(月) 12:37:20
どなたか、判る方おりますかね?
>>941 MSDNのPRINTDLGの説明は読んだ? ちょっと読んでみた限り、hDevNameなどはNULLを渡すと勝手にallocateするけど
NULL以外を渡した場合はそこを使うって読めるんだけど。
943 :
906 :2008/03/24(月) 15:52:00
>>942 回答ありがとうございます。
そうすると、前回確保した領域をそのまま使うので、
毎回確保するサイズが同じなら、OKという訳ですね。
hDevNameはその都度、サイズが違う可能性が高いっぽいな・・・
ListCtrlの描画についてアドバイスをお願い致します。 見た目は幅の狭いExcelの表のようなものを作っています。 オーナードロー、レポート形式にてアイテムの高さとカラムの幅が全て13x13になっています。 スクロールは別のコントロールが管理し、CPoint(10,20)であればアイテム20番目カラム10番目が左上に描画されます。 表示する文字は1セルに1文字。 このListCtrlの領域が1300x1300であればセルの数は100x100で10000個描画されます。 僅かでも再描画の必要性が出てくるとオーバーライドした描画関数が動き、 左上のセルから右下のセルまで(上記の例ですと10000個)毎回描画されて非常に重いです。 描画関数はListCtrlの領域に収まるアイテム数分繰り返されるだけで 再描画が必要な領域が分からず全て再描画という手段をとっています。 少しでも軽くなればいいのですが良い案はありませんでしょうか。
仮想リストにすればと思うけど オーナードローできるか知らない
>>944 NM_CUSTOMDRAWのオーバーライドで描画していない予感。
まあ、再描画領域自体はRectVisibleとかでクリップ領域を確認すれば、
必要最小限に抑えられる気もするけど。
>>946 msdnにも書かれているDrawItemをオーバーライドして描画していました。
NM_CUSTOMDRAWを初めて知ったのですが、
DrawItemの前に呼び出される・・・つまりNM_CUSTOMDRAWを関知したら
DrawItemの代わりに必要な領域を調べ描画するということで宜しいのでしょうか。
時間的に今から試すのは厳しいので明日触ってみたいと思います。
>>944 セル中の1文字表示はどうやって描いてるの?
TextOut系で描いても「非常に重く」感じるなら
もっと根本的なとこで間違ってる気がする。
ListView(Ctrl)ってリストとして使うと相当使い勝手悪いから何やっても大抵あきらめるw
ゆとりはマジすげぇぞ?? いとこの小学生が遊びに来た時、テストで40℃のお湯と60℃のお湯を同じ量混ぜたら 100℃のお湯になるって答えたら×になったんだけど何で?? とか聞いてきやがった。 もうアホかと思って、それならこの部屋の気温は20℃、廊下の気温は10℃だから ドア開けて空気を混ぜたら30℃になるのか?それだと夏並に暑くなるよな?って言ってやったよ。 そしたら、?ごめんねお兄ちゃん…わたし馬鹿だから…? でもね、お兄ちゃんとわたしが一つになったらきっとずっと熱くなるよね?? そう言って服をするりと
わっふるわっふる
40℃のお湯と60℃のお湯を同じ量混ぜたら 50℃になるかというと実はならないらしいね
まあほぼ50℃にはなるよ。 混合熱とかで微妙に誤差が生じるとは思うが。
「同じ量」の定義によるのかな。 同じ体積なら60℃の方が僅かに軽いからね。
同じ質量
VS2005 CListCtrlの複数削除をやろうとしていますがうまくいきません。 以下のように選択されたアイテムのインデックスを取って削除というループをしています。 POSITION pos = this->m_xcLst.GetFirstSelectedItemPosition(); while(pos != NULL) { index = this->m_xcLst.GetNextSelectedItem(pos); index -= nDel; this->m_xcLst.DeleteItem(index); // アイテム削除 nDel++; } しかし、3つ以上のアイテムを選択していると最後の選択アイテムのインデックスが正しく取れず他のアイテムを削除してしまったりします。 例えば、0〜6のアイテムがあったとして、"1,3,5"を選択していると"1,3,4"と返ってきてしまう。 DeleteItem()が悪いかと思い外してみると、 選択したアイテムのインデックスが正しく返ってくるのを確認しました。 (さっきの例だと"1,3,5"と返ってくる。) インデックスを配列に取得して後ろから削除する方法も考えたのですがいまいちです。 良い解決策はありませんでしょうか。 よろしくお願いします
単純に後ろから削除でいいだろ
やりかた忘れたけど検索したらすぐ見つかった
>>957 >>956 です
m_xcLst.GetNextItem(index, LVNI_ABOVE | LVNI_SELECTED);
として、下から選択アイテムを検索していくことで実現できました
アドバイスありがとうございました
>>961 ちゃんと確認した?
それだとうまくいかないよ。VC.net 2003
VS2005でエディットコントロールを作り、 他のボタンやエディット等のコントロールの上を通った時に説明する機能を作ろうと思っています。 OnNcHitTestを各ボタンごとに設定しれやれば良いかと思ったのですが、 ボタンから作るイベントハンドラにWM_NCHITTESTが有りません。 過去にClassWizardのメッセージフィルタをウィンドウにする、という解決法が 提示されているのは見つけたのですが、 VS2005ではクラスウィザードではなくイベントハンドラウィザードで イベントハンドラを追加しており、そこにはメッセージフィルタといった 機能は存在しないので困っています。 VS2005でも同等のイベントハンドラの追加ができないでしょうか?
>>963 WM_NCHITTESTはダイアログのいべんとにあんじゃね? エディットでなくてさ。
VC6(クラスウィザード)でもダイアログのイベントだし、な。
ウィザード使い方わからなかったら自力で追加することも可能
ツリーって特定のアイテムの入れ替えは出来ないのでしょうか? データ自体をListCtrlなど別に格納しておいて、ツリーの全消去→再構築でも出来ないことはないですがあまり好ましくないですし・・・
>>965 なるほど、リストコントロールのWM_NOTIFYのイベントプロシージャが
ウィザードでは1つのリストコントロールにしか割り振れないが(ClassWizardのバグ?)、
それをやれば複数のリストコントロールのWM_NOTIFYのイベントプロシージャを作成出来ると言うわけだな。
968 :
963 :2008/03/31(月) 21:47:56
確かにダイアログ側のイベントにWM_NCHITTESTは有るようです、ありがとうございます。 しかしCPointが与えられるだけなので、どのボタンの上をマウスが通過した、等の情報は得られないのですね… Spy++だとボタン上にマウスがヒットしたイベントを取れているので、できないかと思ったんですが、他の方法を探すしか無いんでしょうか。 座標テーブルを作ってマウス座標に対応したメッセージを表示する…というのも(本質的には違う問題になってしまいますが)できなくはないですね。
だからボタンから作るイベントハンドラにWM_NCHITTESTでいいんだろ
>>966 InsertItemとDeleteItemで普通にできない?
子があるとちょっと面倒かも。(自信なし)
VC8でダイアログにフレーム間の時間(_秒)をリアルタイムで表示するプログラムを組んでいます。 負荷を増していけば整数値で1〜60になると思ったのですが飛び飛びになります。 具体的には0、15か16、31か32、45か46、61か62と言った具合です。 1FPSでも1000msになって欲しいのですが1015msになりました。 この15ms刻みの値の意味は何なのですか? 以下のようなプログラムです(別スレッド) DWORD BefoeTime = timeGetTime(); while(1){ DWORD dw = timeGetTime(); while( BefoeTime+16 >= dw ) dw = timeGetTime(); DWORD output = dw - BefoeTime; ダイアログのテキストボックスにoutputを表示 } これだと16msと31msのどちらかが表示されて平均値が約25msになりました。
誤爆? MFCと何の関係が?
>>972 あれ、CDialogとかCWndとかをつかっているのでMFCかと思っていたのですが違うのですか?
FPSの固定の方法はCと同じなので違うとすればMFCと思いまして。
974 :
966 :2008/04/01(火) 20:11:02
>>970 レスありがとうございます。
確かに少々処理が面倒でしたが無事に導入できました。
ソートがあるんだからアイテム同士の並び替えもデフォルトで実装されていればよかったのになぁ
>>971 リフレッシュレートに合わせているようにも見えますね。
そのプログラムだと16ms/fだけどDialogBoxの更新で同期が取られて31(30?)ms/fの段階で更新しているのではないでしょうか
CDialogやCWndはMFCだが971にはMFCに関するものが出てきてないからだよ。 ちょっとよく分からないのだけど、971のコードの出力結果が1,2,・・・16に なるのを期待してるの?
976 :
975 :2008/04/01(火) 20:23:07
ごめん。975は勘違いだ。もう少し考える。
>>975 DirectX VC++.net(VS2005)の組み合わせで問題無いから恐らくMFCの仕様
DirectXには垂直同期を切る方法があるがMFCではどうなんだろ
974の通りウィンドウの描画で強制的に同期が行われるのであれば表示更新用スレッドをもう1つ立てることで解決しないかね
NT系のQuantumじゃね?15msといえば。
質問 MFCでウィンドウのタイトルの部分をダブルクリックしたら最大化するのをやめさせるのはどうやればいいのでしょうか?
980 :
デフォルトの名無しさん :2008/04/01(火) 22:45:17
変数の命名規則を教えてください。 例えば CRect myRect; だったら最初小文字で単語と単語のつながりの直後の頭文字を大文字にするって感じであってます? コントロール変数、DDX変数は m_〜 m_ddx_〜 ってやってて統一できてます。
個人の命名規則なんて個人の好きにすればいいさ。
>979 それMFCがやってるわけじゃないだろ
983 :
デフォルトの名無しさん :2008/04/01(火) 23:14:38
VCで一般的な命名規則ってないの?
>>983 ,980です
自分なりに決めます
スレ汚しすみませんです・・・
CRect rect; これが一般的
LPCTSTR lpszStr;
Long Pointer to Constant Tchar STRing
型なんて変数名に反映するのは無意味 グローバルか?メンバか?ローカルか?スタティックか?引数か? ってわかるようにしたほうがいいと思う
元々のハンガリー記法も、型ではなく意味を変数名に付与するものだった。 なぜか型を付与するようにねじ曲げられたが。
秒速20kmで飛んでるロケットと逆方向に秒速30kmで飛んでるロケットをみると 正確には秒速50kmにはならないらしい
>>990 見ている人が動いていなければ秒速0kmだしね。
質問です。 ダイアログの上にタブコントロールとリストコントロールを重ねるような形で置いています。 リストコントロールにフォーカスがある状態で他のウインドウが重なるとリストコントロールが消えるのですが 回避方法などありますでしょうか? タブオーダーはリストコントロールの方が後です。フォーカスがない状態ではちゃんと表示されます。 Win2000, VC++.NET(VS2002)
>>992 今実行環境が無いので憶測ですまんが、リストコントロールのParentをタブにすれば出来ないかな。
Z値が同じであれば恐らく親(タブ)が奥で子(リスト)が手前に表示されると思う。
見た目しか効用の無いタブコントロール使うぐらいなら ダイアログやビューへの埋め込みプロパティシート&複数プロパティページのほうがリソース管理的にもおすすめ 親→シート→ページの関係も自動でできるしね
>>992 当方VS2005
タブ上のダイアログにリストコントロールを置いてるとき同様の現象が起きた
リストコントロールのプロパティでTransparentをTrueにしたら直った
CWnd::SetWindowText("1000ゲット!");
997 :
992 :2008/04/03(木) 21:16:06
>>993 >>994 レスサンクス。
SetWindowPosでwndTopに設定したらなんとか回避できました。
>>995 Transparent=Trueを試したら、こちらでもOKでした。
リソースレベルで回避できるならこちらの方がいいのかな。
その後、トラブルとかないですか?
馬鹿すぎ
999 :
デフォルトの名無しさん :2008/04/03(木) 22:36:10
二月(花札)
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。