1 :
デフォルトの名無しさん :
2009/08/22(土) 14:34:39
4 :
デフォルトの名無しさん :2009/08/22(土) 16:45:11
まさかのdat落ちいちおつ
MFCなんてまだ需要あるの?
重要性はかなり低くなったね。 リソースがいっぱいあって、実行速度もそれほど気にしないけど、 多機能なアプリを開発したいって人には.NETとC#の方がコストパフォーマンスが良いし、 (C++/CLIは本来のC++を無視した気持ちの悪い独自拡張が多すぎる…) 軽量・高速が重要なネイティブアプリにはATL/WTLが使われるようになったから。 実際、MFCの関連書籍も大半は6.0でとまっていて もう7.0以降にはほとんど需要がない事実を物語っている。
7.0以降でCStringが急激に強まった事実が殆ど知られていのは一寸悲しい。
未だにA2Wとか書いてそうだ。
>リソースがいっぱいあって、実行速度もそれほど気にしないけど、
>多機能なアプリを開発したいって人には.NETとC#の方がコストパフォーマンスが良いし、
その為か、9.0SP1(VS2008SP1)で進化が極端な方向に進み始めたな。
元々GUIアプリの基本的な機能を提供するという目的ではあったけど、
今や、表示テーマの変更や、キーボードショートカットのカスタマイズUIまで、
初めから提供されるようになった。
VS2010以降もやる気満々らしいし。開発チームの暴走発言かもしれないけどw
ttp://blogs.msdn.com/dd_jpn/archive/2008/12/04/9174764.aspx
個人的なことを言えば、.NET とか C# とかいった新しいものをマスターする時間がない & もったいないのでMFCを使っているのが現状。 ATL/WTL にも興味はあるが、やはりマスターするには時間的なものが・・・。 もっとも、単純なプログラムは なんちゃってMFC 的な独自のクラスを使って書いている。 実質 100KB 程度の実行ファイルが MFC をスタティックリンクしただけで 3MB超になるんじゃ、どっちが主役かわからないもの。(笑)
10 :
デフォルトの名無しさん :2009/08/24(月) 00:36:02
漏れの親父がパソコン30万だして買ったけど なんもできんので、機能をごく必要なものに限って、 ブラウザとメーラーとワープロつくってやったよ。 喜んでくれた。別に質問じゃないけど、MFC使って作ったから・・誰かに報告したくてね。 すれ汚しスマソ。
>>9 afxcontrolbars.h はずせばそんな巨大なサイズにならないんじゃない?
>>9 3MB超はデバッグビルドだべ?リリースでも1Mぐらいあるけど
まぁ最近の環境だと昔ほど気にする必要がなくてよいかなよいかな
リボンインターフェース用のリソース入れちゃうからでかくなるんじゃないの?
14 :
デフォルトの名無しさん :2009/08/24(月) 20:40:48
button = new CButton[button_num]; button[0].Create(・・・); こんな感じでボタンを動的に生成して、Viewに配置した時に ボタンのイベントをViewで受け取るにはどうすれば良いですか? (ボタンの数は、動的に変化します。) ド素人の僕にご教授お願い致します。
>>12 いや気にするよ。新しい機能なにも使ってないようなダイアログベースのちょっとした
アプリで実行ファイルメガ単位って嫌すぎる。まぁ、無駄な機能使わなければ小さくも
出来るからいいんだけど。
>>14 ビューのメッセージマップにON_BN_CLICKEDで出来るんじゃない?
WM_NOTIFYで通知受け取って捌くしかないんじゃね? BN_CLICKEDとかボタンから親ウィンドウに通知してくる ボタンコントロールはWM_NOTIFYじゃなくてWM_COMMANDだったかもしれん またはCButtonの派生クラス作ってBN_CLICKEDマップして自前で通知送る
>>14 ボタンの親を当然ながら View にしておいて、View のメッセージマップに
ON_CONTROL_RANGE( BN_CLICKED, 最初のボタンのID, MAXで作成されたときの最後のボタンのID, OnControlRange)
と書く。
Viewのヘッダに下記を追加
afx_msg void OnControlRange(UINT nID);
あとは View で処理。
void CxxxView::OnControlRange(UINT nID)
{
if ( nID == xxx) ToDO...
}
エディットボックスから文字列を取得する際、 GetWindowTextを使うと思うんですが、データ型は必ずCStringになってしまうのでしょうか? ここでCharを使う事って出来ますか?
>>18 CWnd::GetWindowText には下記の二つがある。前者を使えばいい。
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount) const;
void GetWindowText( CString& rString) const;
exp.
TCHAR sz[128];
GetWindowText( sz, 128);
>>19 レスありがとうございます
例でTCHARとなっているところはcharでも問題ないですよね・・?
また、LPTSTRが引数になるということは、エディットボックスの中身がcharポインタに入るってイメージでいいのでしょうか?
すみません勉強不足で変な表現があるかも知れませんが
>>20 プロジェクトの設定で Unicode 文字セットを使っていないなら char でいい。
「Unicode 文字セットを使用する」にしている場合は char は使えない。
>エディットボックスの中身がcharポインタに入る
まあ、そんな感じのイメージ。難しく言うと、「エディットボックスの中身が、配列 sz の先頭要素のアドレスが示すメモリエリアに入る」
22 :
デフォルトの名無しさん :2009/08/26(水) 09:14:48
FormViewにボタンやMSFlexGridを配置しました。 このFormViewを印刷するにはどうしたら良いですか?
普通のFormViewと同じようにどうぞ。
24 :
デフォルトの名無しさん :2009/08/26(水) 21:56:36
>>22 です
>>23 ボタンをどう印刷すれば良いのか、全く解りません。
MSFlexGridについては、pDCを使って線とテキストで
あたかもMSFlexGridをそのまま印刷してるような感じに出来る事は解ったのですが・・・
よろしくお願い致します
>>25 pDCを使って線とテキストで描く。
あるいはそれ用のビットマップリソースを用意して貼り付ける。
26 :
25 :2009/08/26(水) 22:48:14
・・・行ってきた♪
すいません質問があります. VC++のダイアログ形式でプログラムしているのですが 下記のプログラムで myDLG.DoModal() を行うと最初からあったOKボタンを押してもプログラムが死に切っていないようなのですが どのようにすればいいのでしょうか. ググったら無限ループとか永久に待機してるとかっぽかったんですが解決法が良く分かりませんでした. プログラム開始→OKボタン 普通に終了する プログラム開始→ボタン8→ファイル選ぶ→OKボタン ダイアログは消えるがプログラムは完全に死んでないみたい といった状況です. void CtestDlg::OnBnClickedButton8() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 //ファイルダイアログを表示してファイル指定する CFileDialog myDLG(TRUE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "AVIファイル(*.AVI)|*.AVI||"); if(myDLG.DoModal() != IDOK)return; }
>>30 おそらく問題は、示されたコード以外の場所にある
32 :
30 :2009/09/07(月) 18:57:41
if(myDLG.DoModal() != IDOK)return; をコメントアウトすると問題なく動いていたのでここがだめなのかと思っていたのですが… ダイアログウィンドウがきえてもプログラムが終了しきれてないのはどういったのが考えられるのでしょうか
33 :
30 :2009/09/07(月) 19:11:50
さすがにそれはエスパーすぎるか… んーなんなんだろ… そして何故かボタンをダブクリしても関数つくれなくなった…クラスウィザードとかいうのが立ち上がる…
>ダイアログウィンドウがきえてもプログラムが終了しきれてない 何を根拠として、こう判断したのかな?
>>34 画面下部のウォッチと出力のウィンドウが残ったまま
タスクマネージャでみるとtest.exeが起動中
の2点からです.
そして今ダイアログのボタンとか配置する画面で
ボタンをクリックして右のプロパティのところを雷マーククリックして管理イベント開きたいのに
そこが真っ白になってて操作できないという新しい問題が…
作ったボタンダブルクリックしてもMFC クラスウィザードとかいうのが立ち上がるし…
>>35 プロジェクトのフォルダにある
*.ncb
*.suo
*.user
を一度削除してみろ。
MFCは良く知らんけど、Win32APIではモーダルダイアログの終了には return の前に EndDialog を明示的に呼び出す必要がある。 これはモーダルダイアログのウィンドウプロシージャはOSの内部にあるからだ。 (アプリケーションのウィンドウプロシージャがアプリ自身の中にあるのと異なるという意味ネ) で、MFCにもCDialog::EndDialogがあり、OKとキャンセルではデフォルトで呼ばれるけど それ以外の場所から終わるときにはこれを呼ぶ必要があるとmsdn様が…
あと、ちょっと思ったけど、IDOK っていう定数マクロが TNOK って見えちゃうこと、よくあるよね?
>>36 消したら関数の追加などはできるようになりましたありがとうございます.
>>37 OK キャンセル などのボタンは最初に出来ているものでやってます.
ダイアログの×をクリックしても終わらないみたいです.
そのtest.exeが残ってるときにデバッグの中断して スタックトレースみるとどうなってるよ?
スタックトレースってどうやってみるんでしょうか? VS.NET 2005ですが… google-glogとかいうのいれなきゃむりなんかな?
・・・まさか 『実はそのダイアログはモードレスでした』 なんてオチじゃないだろうなあ。
特にいじってないはずなのでモーダルだと思います. 2つファイル名取得して画像の合成とかやってるんですが 画像の合成の関数とかは普通に動くんですよね. ただダイアログのOKボタン押してもexeが終わらないと….
>2つファイル名取得して画像の合成とかやってるんですが
>画像の合成の関数とかは普通に動くんですよね.
問題なのはこのあたり以降のコトだろうから、
>>31 だと言っている。
回答者はエスパーじゃないんだぞ。
今試しにファイルネームの読み込みを 上にかいたようなものでなく 最初からプログラムにかいておいて上記の関数を呼び出さないでやってみると 処理が終わった後OKボタンをクリックすると無事にexeが終了しました. ファイルネーム取得関数になんかしらあるとしか思えないのですが… んでもってファイルネーム取得関数を後半部分コメントアウトして どの行を行うと終了しないかやってみたところ if(myDLG.DoModal() != IDOK)return; を書くと終了しなくなってしまうようでした….
if(myDLG.DoModal() == IDOK) だった場合はどう処理しているのか?
>>30 にはそのあたりのことが書かれていないんだが。
void CtesthaloDlg::OnBnClickedButton7() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 //ファイルダイアログを表示してファイル指定する CFileDialog myDLG(TRUE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "AVIファイル(*.AVI)|*.AVI||"); @ } void CtesthaloDlg::OnBnClickedButton6() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 filename1=("C:\\Documents and Settings\\…\\videocamera3.avi"); filename2=("C:\\Documents and Settings\\…\\videocamera4.avi"); gousei(filename1,filename2); } ならOKで@のところにif(myDLG.DoModal() != IDOK)return;をいれると終了しないと言った感じ なんか複合的に問題が発生してそうでエスパーじゃなきゃむりそうですね… 一回プロジェクト作り直してみて確認してみようかな
>>30 のコードをそのままコピペして試したけど、ウチでは何の問題もないよ。
>>46 今はコメントアウトされてます
本来なら画像を取り込んでピクチャーコントロールに表示する感じです.
>>48 やっぱりDoModalの問題じゃなさそうですね…
プロジェクト作り直してやってみます
もう意味が分からなくなってしまった.
新しいプロジェクトで
>>30 作る
終了できた!(ボタン1)
二つ目のボタン作る
こっちでも
>>30 まではできたので画像読み込みもやる
やっぱ終了しない…
>>30 まで戻すが何故か終了せず
いやな予感してボタン1を試してみるとボタン1も終了しなくなってた
なんだろう.なんかデバック情報が変な事になるんだろうか
ボタン1については出来た後いじってないのになぁ
エスパーじゃないと無理そうなのであきらめることにします.
そうだね。君の言っていることをすべて理解するのはエスパーじゃないと無理そう。
付き合ってくださった方ありがとうございました.
スタックトレースはVC++だと呼び出し履歴とかの名前であるだろ
VC++.net 2002で猫でもわかるに掲載されているサンプルコードをビルドすると リンクエラーとなるのですがなぜでしょうか? #include <afxwin.h> class CMyWindow : public CFrameWnd { public: CMyWindow(); }; CMyWindow::CMyWindow() { Create(NULL, "猫でもわかるMFC", WS_OVERLAPPEDWINDOW); } class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMyApp MyApp; エラー error LNK2019: 未解決の外部シンボル __endthreadex が関数 "void __stdcall AfxEndThread(unsigned int,int)" (?AfxEndThread@@YGXIH@Z) で参照されました。 error LNK2019: 未解決の外部シンボル __beginthreadex が関数 "public: int __thiscall CWinThread::CreateThread(unsigned long,unsigned int,struct _SECURITY_ATTRIBUTES *)" (?CreateThread@CWinThread@@QAEHKIPAU_SECURITY_ATTRIBUTES@@@Z) で参照されました。
56 :
54 :2009/09/09(水) 21:21:08
57 :
54 :2009/09/09(水) 21:38:46
、「ファイル」「新規作成」「プロジェクト」で 「Win32 Application」を選択して アプリケーションの設定でWindowsアプリケーション、空のプロジェクトで設定しているのですが どこが間違いなのでしょうか?
>>57 おまえウザイな。
自分で勉強するこ覚えろよ、屑
>>57 参考にしている「猫」のページに書いてある。
60 :
54 :2009/09/09(水) 21:59:11
61 :
デフォルトの名無しさん :2009/09/09(水) 22:23:41
afxbeginthreadでAとBを生成しました。 AでnewしたデータをBに渡して、Bが使い終わったらBの中でdeleteしています。 そうするとBがdeleteした時にheapエラーで落ちるのですが。 どうしてなのか、全く解りません。 Aの中でdeleteしているような個所やB内で2度deleteを実行しているような所 初歩的なバグはありません。 教えて下さい
悪い例 A:「作ったよ」 B:「ありがとう。・・・使い終わったから削除するね♪」 A:「・・・私が作ったのに勝手に削除しないでよ!この甲斐性なしっ!」 良い例 A:「作ったよ」 B:「ありがとう。・・・使い終わったよ♪」 A:「ん、じゃ削除するねっ」
ホントこのAで作ったもんをBで削除するプログラムを書こうって奴の気がしれない ふつーに特になんの経験もなく気持ち悪いと思わないのか? センスねぇなマジでw これ結構経験ある奴でもやるんだよね manko(new chinko); みたいにnewで作ったもんしか引数うけつけねーようなクラス書くキチガイ ポインタで渡すと中で強引にdeleteしようとしやがるのw なんでこんなもん作るんだマジでw センス0野郎の書くPGは本当にわからないw
マウスをドラッグ&ドロップするとき 新しいGDIオブジェクトを生成したとき …などなど、MFC(というよりWin32APIのせいなんだろうが)は RAIIの原則をしばしば無視する。 だからその感覚が染み付いている人は マルチスレッドについても 作る場所と壊す場所が別々で当たり前と感じてしまうのかもしれない。 っていうか、MFCはC++的に見るとキモい使わせ方するライブラリ多いよね。
65 :
デフォルトの名無しさん :2009/09/09(水) 23:20:55
>>61 バグがあるんじゃね?
>>62 組み込みでOS使ってたりするとタイミングとか生存期間が非常にしびやな時が多くて
タスク同士の同期をとってたりすると、もうグダグダな〜時が多いから
悪い例の方を使う事が多い
ウィンドウズの場合は、new、deleteする代わりにvectorとかStringとか使って
データの完コピする場合が多いからね〜
確かに組込みでは、ポインタを渡して相手に全てをほおりなげる場合が多いね。 ウィンドウズも昔はCPU、ソフトが非力だったから相手に後処理を任せて終わりと 昔からの流れが残ってるんだと思ってる。 マルチ・スレッド/タスクで、相手が使い終わったのを待ったりとか 意識しようとすると無駄な時間が多くなる。
うろ覚えでなんだが、会社の新入りがこんなコードを書いてきた。 -- if (pCombo->getCurSel()) { pCombo->setCurSel(pCombo->getCurSel() - 1); pCombo->deleteString(pCombo->getCurSel() + 1); } else { pCombo->setCurSel(pCombo->getCurSel() + 1); pCombo->deleteString(pCombo->getCurSel() - 1); } -- 私みたいにXlibの時代から書いている人間にとって、値を取得してからセットして もう一回取得するなんてどう見ても待たされそうな処理はなんとももにょってしまう。 それも然り乍ら、なんとも胡乱な振る舞いをさせようとすることよ。 彼奴の頭の中を覗いてみたくもあり、覗きたくなくもあり。
63が、特になんの経験もない事はよく解ったwwwwwww
69 :
デフォルトの名無しさん :2009/09/10(木) 00:20:59
>>62 まともな経験がある人ならば、どれが良くてどれが悪いとは安易には言えないはず。
どこで誰がどう削除するかはそのシステムに合わせてインターフェースを
きっちり決めとけば良い話。
A:「頼まれていた会議の書類を作成して、印刷しておきました。」
B:「ありがとう」
↓
(B会議終了)
↓
B:「書類返すよ」
A:(てめーで、捨てろや死ね)
その例は、Bに「まともな経験」がないだけの話。
71 :
デフォルトの名無しさん :2009/09/10(木) 00:35:43
62=70
結局はモジュール間で決めとけば、どうでも良い 俺はくみこみ知らんが、ポインタ投げて終了の仕組みも作る時もある こっちはもう使わないのに相手の顔色見ながら、返却待ちのタイミングを 伺うなんてアホらしい 以上、終了
すみません、
>>61 です
色々とお騒がせして、申し訳ございません
私の考えは、
>>72 さんと同じ考えでした
それぞれが非同期で動いてる場合、同期をとる仕組みを入れるのが面倒ですし
もう必要ないから、B側で削除してもらっていました
もう少し詳しく言うとスレッドが10個ほどあり、使った奴が削除すると言った仕組みで
動いています
AはBに渡す
Bは使わないならCへ、CはDへと・・・
だからこそ、使った人に削除して貰いたかったのです
それとvectorの話が出ていましたが、vectorとかを使ってデータをコピーしても
構わないと言えば構わないのですが
データサイズが大きい時はそれなりのサイズになってしまうので
データをコピー(newして代入)なんて言う無駄な処理とメモリのフラグメンテーションを
起こすような処理はさせたくなかったのでポインタでやってました
>>72 >こっちはもう使わないのに
かどうかはわからないよね?
もし、使いたくなっとしても使わないんじゃなくて使えない状態じゃん
しかも、それがわかるのは組んだ自分だけだろ?
下手糞実装ってことは認識して使えよ
MFCだったらdelete this が常識
>>53 呼び出し履歴のことでよかったんですか教えてくださってありがとうございます.
ntdll.dll!7c94e514()
[下のフレームは間違っているか、または見つかりません。ntdll.dll に対して読み込まれたシンボルはありません。]
ntdll.dll!7c94df5a()
kernel32.dll!7c8025cb()
kernel32.dll!7c802532()
ole32.dll!769f5532()
ole32.dll!769e3551()
ole32.dll!769e34c1()
ole32.dll!769d4ecc()
msvcr80.dll!78132bd9()
ole32.dll!76984212()
> highgui110.dll!_CRT_INIT(void * hDllHandle=0x10000000, unsigned long dwReason=4038497417, void * lpreserved=0x00000001) 行 412 + 0x9 バイト C
highgui110.dll!__DllMainCRTStartup(void * hDllHandle=0x10000000, unsigned long dwReason=0, void * lpreserved=0x00000000) 行 512 + 0x8 バイト C
highgui110.dll!_DllMainCRTStartup(void * hDllHandle=0x10000000, unsigned long dwReason=0, void * lpreserved=0x00000001) 行 462 + 0x11 バイト C
上から数行だとこんな感じで highfui110〜の3行が黒文字,他灰色文字になってました.
.dllばっかりならんでてよくわからないですが
>>76 だからなんだよ。
いい加減、ウザイから氏ね
>>72 音声のRTPパケットだから二度と使わないし、使いたくなる事は100%ありえない
使いたい頃に使ったら、プロトコルに違反するし、音声がめちゃくちゃになる
二度と使えないのは、仕様書にしてあるから、チーム全員知ってる
なんで、そんなに自分の考えが完璧だなんて、ゴリ押しするんだ
お前はどんだけ偉いんだ
どうせ、お前みたいな奴なんて、そこらへんの派遣野郎だろ
Producer - Consumer Pattern だと、 Producer で new, Consumer で delete するのが素直。
>>74 て、アホだね
生きてて恥ずかしくないの??
早く死ねば良いのに
一番自分が下手くそなのにWWWWWWWWWWWWWWWWWWW
>>80 (訳:論破されちゃった!くやしい!ビクッビクッ!)
笑
CScrollViewのOnInitialUpdate()でCToolTipCtrlクラスをm_cToolTipCtrl.Create( this ); ってやると落ちる。。。 これってダメ?
>>82 OnInitialUpdateが呼ばれるのは一度だけじゃない。
よって、何度も作ろうとするからエラーになる。
>>83 ありがとう。
なるほどねー…。
久々にMFCやったから気づかなかった。。。
とりあえず
if( !cToolTipCtrl )
{
m_cToolTipCtrl.Create( this );
}
ってしたらいけた!
Visual Studio 2005 Pro/Visual C++/MFCで開発をしています。
IPアドレスコントロール(CIPAddressCtrl)の背景色を変更したいのですが、
CIPAddressCtrlのサブクラスとしてCMyIPAddrCtrlを作成し、
以下のようにコンストラクタとOnCtlColorをオーバーライドしても、
背景の一部の色しか変更できません(リンク先の画像を参照ください)。
CMyIPAddrCtrl::CMyIPAddrCtrl()
{
m_Brush.CreateSolidBrush(RGB(255, 0, 0)); // m_Brushはヘッダーで「CBrush m_Brush;」と宣言済み
}
BEGIN_MESSAGE_MAP(CMyIPAddrCtrl, CIPAddressCtrl)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
HBRUSH CMyIPAddrCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CIPAddressCtrl::OnCtlColor(pDC, pWnd, nCtlColor);
pDC->SetBkColor(RGB(0, 255, 0));
pDC->SetTextColor(RGB(0, 0, 255)); // 試しにテキスト色も変更しています
return m_Brush;
}
結果:
ttp://nukkorosu.80code.com/img/nukkorosu11151.png 上記画像で白色になっている部分の色を変更するにはどうしたらよいでしょうか?
一寸試してみたけど、結局OnPaintをオーバーライドするしかないっぽい。 まあ、普通のテキストボックスに変えてしまうのが一番だろうね。
>>85 IP アドレスコントロール は複数のウィンドウからできているので、そのコードでは
子ウィンドウであるエディットコントロールの部分しか変更できない。
白い部分の色を変えるには OnPaint() をオーバーライドして自前で背景を塗りつぶすしかないが、
このときは数値の間にあるドットも自前で描画する必要がある。
>m_Brush.CreateSolidBrush(RGB(255, 0, 0)); // m_Brushはヘッダーで「CBrush m_Brush;」と宣言済み
>pDC->SetBkColor(RGB(0, 255, 0));
・・・背景色と背景ブラシの色が違うなんて。
88 :
87 :2009/09/16(水) 21:29:43
>>86 すまん、かぶったね。
>普通のテキストボックスに変えてしまうのが一番
そう、それが一番。
他プロセスのリストコントロールに表示されている数値を監視するプログラムを作ってます。 ぐぐったらVirtualAllocExとLVM_GETITEMTEXTメッセージを組み合わせれば良いとわかったので、以下を繰り返して取得しています。 相手ウィンドウのHWNDからpidを求め、PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITEでOpenProcessする ↓ VirtualAllocExで、アドレス指定はNULL、MEM_COMMIT、PAGE_READWRITE、サイズは文字列バッファ(64バイト固定長)+sizeof(LVITEM)ぶんのメモリを確保 ↓ ローカル変数でLVITEM変数を宣言、ゼロクリアした後以下を代入 iItem,iSubItem←必要なマス目の座標(いつも同じ場所) pszText←上記確保したメモリ+sizeof(LVITEM) cchTextMax←64 ↓ そのLVITEM変数のポインタから確保した先頭アドレスにWriteProcessMemoryする ↓ LVM_GETITEMTEXTをSendMessageする ↓ 確保したメモリの先頭+sizeof(LVITEM)を64バイトReadProcessMemoryして文字列ゲット ↓ 確保した先頭アドレスを指定、MEM_RELEASEにてVirtualFreeExする ↓ プロセスハンドルをCloseHandleする 実際、おおむねこれで取得できているのですが、数十回ほど取得を繰り返すと相手側が「Visual C++ RunTime Error! Abnormal Program Termination」と表示して落ちてしまいます。取得するたびSleep(100)などしてみましたが駄目でした。どなたか解決策をご存知ないでしょうか?
>>89 自分の書いた処理内容をよく見て、デバッガで追え。
悪いのはおまえだ。
91 :
85 :2009/09/17(木) 10:29:06
>>86 >>87 ご回答ありがとうございます。
挙動から入力部分のウィンドウの下にもう一個ウィンドウがあるように
見えたのですが、やっぱりそうだったのですね…。
OnPaintのオーバーライドまでするとなるとちょっと手間なので、
おっしゃるとおりテキストボックスで実装してみたいと思います。
> ・・・背景色と背景ブラシの色が違うなんて。
このほうが何を書いたらどこが変わるかわかりやすいかなぁと思ったので(^^;
実際には同じ色で塗りつぶします。
92 :
85 :2009/09/17(木) 20:25:10
85です。ちょっと気になったのでOnPaint()のオーバーライドに挑戦してみました。
あまり考えずに
>>85 に下記のコードを追加したら、それっぽいのができました。
BEGIN_MESSAGE_MAP(CMyIPAddrCtrl, CIPAddressCtrl)
ON_WM_CTLCOLOR()
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyIPAddrCtrl::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect(rect, RGB(255, 255, 0));
int w = rect.Width() / 4;
for (int i = 1; i < 4; i++) {
dc.SetPixel(w * i + 1, 11, RGB(0, 0, 0));
dc.SetPixel(w * i + 1, 12, RGB(0, 0, 0));
}
}
これでなんとか目的の動作を組み込めそうです。本当にありがとうございました!
そしてディフォルトじゃない色の設定にしている環境で阿呆を見ると。 あーフォントサイズもやばいかなw
> int w = rect.Width() / 4; もうちょっと真面目に計算すべしw >dc.SetPixel(w * i + 1, 11, RGB(0, 0, 0)); >dc.SetPixel(w * i + 1, 12, RGB(0, 0, 0)); RGB( 0,0,0) → ::GetSysColor( COLOR_WINDOWTEXT)
AfxSetAllocStop の使い方を超知りたいのに、MSDNに載ってないってどういうことよ^^;;;
>>95 _CrtSetBreakAlloc() を呼んでいるだけだから、使い方はそっちを参照すればよろし。
>>96 おぉ、すばらしい!載ってました!
サンクスです。^^
SetTimer()でセットしたタイマを 残り時間を保持したまま一時停止や再開する方法はありますでしょうか。 別のダイアログをDoModal()で出して待っている最中も WM_TIMERが発生するようなので、その間はタイマを止めておきたいのですが、 いったんKillTimer()で止めてしまうと待ち時間が戻ってしまい、 タイミングによっては延々と発生しない状態になってしまいます。
>>98 もっとも簡単な方法は、DoModal() する前にある種のフラグをたててタイマー処理を回避し、
制御が戻ってくればタイマー処理を復帰させればいい。
CMyDialog dlg;
m_bDisableTimer = TRUE;
dlg.DoModal();
m_bDisableTimer = FALSE;
CxxWnd::OnTimer( ...)
{
if ( m_bDisableTimer) return;
// ToDo...
}
100 :
98 :2009/09/28(月) 15:15:03
>>99 ありがとうございます。
やっぱりそういう方法になるのですね。
この場合もダイアログ表示のタイミングによっては
ToDoのところまで行かない状態が続いてしまいますが、
タイマでやっている以上は避けられないのかな。
>この場合もダイアログ表示のタイミングによっては >ToDoのところまで行かない ダイアログが表示された時点( WM_INITDIALOG を処理する時点)で、 m_bDisableTimer = TRUE; にする。
>>100 タイマー+カウンターでやる、という手もある。
例えば5000msなら500ms×10カウントとか。
で、OnTimerはこんな感じで。
if ( (counter += (counter < 10)) < 10 ) return;
if ( m_bDisableTimer ) return;
// なんか色々処理
counter = 0;
WM_TIMER直後かつ500ms以内にダイアログを開きなおす、
とかやらなければ実行されるはず。
104 :
98 :2009/09/29(火) 09:28:18
>>101 >>103 ありがとうございます。
自腹でカウンタ処理をやれば、一時停止に近いことはできますね。
タイマ自体を一時停止する方法は無さそうですし、
タイマ+モーダルダイアログって、
やってることはモードレスダイアログっぽくなってしまうんですね。
うかつにメッセージボックスも出せないってことだったのか。
残り時間を保持とか言ってるから根本的に勘違いしてる。
>>104 ↓ 知ってる?
The WM_TIMER message is a low-priority message.
The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue.
皆様に質問です。 Visual Studio 2008 MFC FeaturePackを調査していますが、 追いきれない箇所があったので投稿します。 MFCのSDIで作成したフレームワークで CFrameWndのメンバにm_wndMenuBar(CMFCMenuBar型)ってのがあります。 これから、m_wndMenuBar.GetHMenu()でメニューハンドルを取得し DeleteMenu、EnableMenuItem、ModifyMenuなど 今までどおりCMenuと同等な操作をしても、 表示されているメニューバーに変化が無いのです。 何かやり忘れの処理とかあるんでしょうか? それとも、そういうものなんでしょうか? ※たとえば、DeleteMenuの実行結果はTRUEを返し、 メニューバー[表示(V)]→[ツールバーとドッキング ウィンドウ(T)]→[カスタマイズ...]の カスタマイズダイアログのコマンドからは消えていますが、 メニューバーの一覧からは消えないのです・・・ 何か、コツがあるんでしょうか? 知っている方、情報を願います・・・
>>107 CMenuをいじった後で、CMFCMenuBar::CreateFromMenuで戻してやると反映するけど。
109 :
107 :2009/10/05(月) 23:53:12
たとえば、CMainFrame::OnCreateの最後に { HMENU hMenu = m_wndMenuBar.GetHMenu(); if (hMenu){ BOOL bRet = ::DeleteMenu(hMenu, ID_EDIT_CUT, MF_BYCOMMAND); m_wndMenuBar.CreateFromMenu(hMenu); } と入れてみたけど変化なし。 OnCreate時じゃダメなんですかね?
>>109 ほんと馬鹿は始末に負えないな。
ここまで教えてもらって、なんで自力で解決しようとしないのか。
できない馬鹿だからこそ質問を繰り返すんだろうが、そんな自分は屑だと自覚しろ。
>>109 >BOOL bRet = ::DeleteMenu(hMenu, ID_EDIT_CUT, MF_BYCOMMAND);
言っておくが、ポップアップメニューの項目を削除したいなら CMFCMenuBar をいじってもダメ。
CMFCPopupMenu::RemoveItem() を使う。
でもわからんでもないな ホントMFCって意味不明なとこあるものな 正直、はじめはなんかのサンプルをコピペして作っていくしかないと思うな んでメッセージの流れとか覚えたらそういうのやっとチョボチョボ手が出せるようになる 1度動くもんとコードを誰かに一致させてもらわない限り 人に聞くしかねぇだろうな 俺もサンプル漁るたびにそう思うわ 自分でヘルプ読みながら研究すると大抵糞くだらないことでも1日作業 このフレームワークだりぃよw 最近、VBでは楽にできるらしいエクセルなんかの機能を組み込め的要求がウゼェ
>>112 ドキュメントも読めない、サンプルソースもおえないアフォは氏ねば?
ヘルプ読みで1日とか、調べ方もしらないんじゃその方がいいだろ。
114 :
デフォルトの名無しさん :2009/10/06(火) 08:00:34
過去そうやって偉そうなこと言ってて いざやらせてみると時間かかる人ばっかりだったからお前も似たようなもんだと思う(笑) 微妙なところで時間くうだろ?
115 :
107 :2009/10/08(木) 08:20:16
CWinAppEx::CleanState()を実行したら反映されました。 どうも、メニューカスタマイズ情報とか保持してるようですね・・・ みなさまありがとうございます
>>112 オートメーション?
であれば、MFC関連ドキュメント探すよりVBAのヘルプ見た方が速いよ
日本語版MSDN読んでる限りはMFCは躓きの連続だろうね。 英語版と比べると情報省きすぎ。^^;;;;;;;;;;;;;;;;;;;;;オコルゾ
>>117 英語版読みなさい^^;;;;;;;;;;;;;
たいていのことはソース読めばわかる
ドキュメント・ビュー・アーキテクチャを使っている場合で、読み書きする ファイルの拡張子を設定するには、どのような方法があるでしょうか?
CDocument は、ドキュメントの新規作成、読み込み、保存のような標準の操作をサポートします。 フレームワークは、CDocument で定義されたインターフェイスを使って、ドキュメントを操作します。
>>120 CWinApp::OnFileOpen() と CDocument::OnFileSaveAs() を
好きなようにオーバーライドすりゃいい。
>>120 ワークスペース新規作成時のメニューをよく観察する事
>>122 CDocument::OnFileOpen()と CDocument::OnFileSaveAs()じゃね?
124 :
122 :2009/10/16(金) 00:11:13
>>123 >CDocument::OnFileOpen()
残念だが、こういうメソッドはない。
CDocManager::OnFileOpen() と書きたかったのかもしれないが、
これとて、ファイルオープンダイアログを表示して得られたファイル名を CWinApp::OpenDocumentFile() に
渡しているだけなので、CWinApp::OnFileOpen() 内でこの操作をすれば、回り道する必要は何もない。
いつもダイアログベースでドキュメントクラスなんて使ったことねーけど なんかいいことあるの?
void PleaseReadExplanation() { 『ドキュメント/ビュー アーキテクチャが適さない場合もあります。たとえば、次のような場合です。 ・C で記述された Windows 対応のアプリケーションを移植していて、アプリケーションにドキュメント/ビューのサポートを 追加することよりも、移植作業自体を完了することの方が先である場合。 ・簡単なユーティリティを作成していて、ドキュメント/ビュー アーキテクチャは不要と判断できる場合。 ・元のコードで既にデータ管理とデータ表示が混在している場合。』 } MFCのドキュメント・ビュー・アーキテクチャがいい悪いは別にして、 MVC的な手法のほうがコードがごちゃごちゃしなくていい場合も多々。
CDocTemplate アプリケーションはサポートするドキュメントの型それぞれに 1 つのドキュメント テンプレートを持ちます。 たとえば、アプリケーションがスプレッドシート (表計算) とテキストのドキュメントをサポートしていれば、 アプリケーションは、2 つのドキュメント テンプレート オブジェクトを持ちます。 それぞれのドキュメント テンプレートは、対応する型のすべてのドキュメントの作成、管理を行います。 ドキュメント テンプレートは、ドキュメントの型とともに使われるリソース (メニュー、アイコン、アクセラレータ テーブルなど) の ID を保持します。 ドキュメント テンプレートは、またドキュメントの型についての付加情報を持つ文字列も持っています。 これらは、ドキュメントの型の名前 (例 : "Worksheet")、ファイルの拡張子 (例 : ".xls")、そしてオプションで、 ファイル マネージャや OLE などのユーザー インターフェイスで使われる文字列などを含みます。
そんなアプリねーよーなぁ?w VCだって設計微妙だしなw ええーwそこでこの構造使うの〜?w的なw
CMap<CString, LPCTSTR, CString, LPCTSTR> と CMapStringToString って、 やってることは結局まったく同じですか? それとも、効率や安全などの面でこっちを使うべきとかありますか?
MFCは慣れればすんごい便利なんだよな。ウチみたいに組み込み系で UI付きツール作ってくれってときにね。いろんなC++のSDK使うから C#とかも使えない。 それよりも困ってるのがリソースかな。特にアイコン。 もっとカッコいいのとか、統一されたデザインとか要求されて困る。 ここはアニメーションさせてくれとか言われると泣きたくなる。 みんなはどうしてる?有料でもいいんでビジネス用途で使える アイコン集ってものはないかな?ぐぐればいろいろ出てくるけど どうにも種類が足りなくて。
具満タンとかイラ満タンとかなら商利用可能じゃよ。
>>125 使い捨てツールを作る場合に便利だな。あんまし余計な事を考えなくて済む。
本体となるとさすがに自作ライブラリを優先するけど。
2010でスタンダードエディションなくなるってさー。 今までupg15kで便利なMFCが使えてたけど これからはupg55k必要。ますます絶滅方向だ。
CClientDC dc(this)でクラスを作り、 デストラクタでリリースされるにもかかわらず、 this->ReleaseDC(&dc);としたらどうなりますか? 逆にリークの原因になったりしますか?
試せばわかるので質問するよーなことではないと思うが、いちおう応えておく。 答はNO。 デストラクタでの ::ReleaseDC() が失敗するだけ。
138 :
デフォルトの名無しさん :2009/10/26(月) 01:39:34
CDialogを親クラスに持つクラスで、OnPaint()以外の場所でdcを取得したいときはどうすればいいんでしょうか?
GetDC()、ReleaseDC()。 CWnd::GetDC, CWnd::ReleaseDC
140 :
デフォルトの名無しさん :2009/10/26(月) 02:23:37
CDC *pDC=CWnd::GetDC(); CWnd::ReleaseDC(pDC); とするとコンパイルできるのですが、実行するとエラーが出てしまい困ってるんです。
そのエラーの原因は別のところにある
CWnd::GetDC()という書き方は・・・ スタティックな関数じゃないんだし、CDialogはCWndの派生クラスだし そのままGetDC()と書けるだろう
むすどん読んだ限りではGetDCはvirtualじゃないから 理屈としてはCWnd::GetDC()でも通るんじゃないか? 実験してないけど。w
>通るんじゃないか? 通るよ。だから、あえてそこは指摘せずに「原因は別にある」と書いた。
WS_EX_APPWINDOWの属性を持つウィンドウで、 最小化したときに右下では無く、左下にアニメーションさせることって可能? なんかコツあるんですかね?
それやってるのMFCなのか?
147 :
145 :2009/10/27(火) 22:02:06
ごめん逆 左下を右下への間違い
148 :
145 :2009/10/27(火) 22:11:10
>>146 MFCでいじっています。
MFCのCMainFrame::OnSize(UINT nType, int cx, int cy)にて、
苦戦中。
SetWindowPlacementでできる
タスクバーを右にしてるオレの環境だと左下にいかないけど
そもそもタスクバーにある最小化したアプリの場所にアニメーションするな、Vistaだけど
CMainFrameの拡張ウィンドウスタイルで WS_EX_APPWINDOWを外し、WS_EX_TOOLWINDOWを加える んで、最小化する手前で // タスクバーのハンドル HWND hTaskbar = ::FindWindow(_T("Shell_TrayWnd"), NULL); // タスクトレイのハンドル HWND hTasktray = ::FindWindowEx(hTaskbar, NULL, _T("TrayNotifyWnd"), NULL); hTasktrayにGetWindowRect使えば位置がわかる。 ※隠れていてもその位置が求まる。 あとはGetWindowPlacementで現在値を取得し、 WINDOWPLACEMENTのptMinPositionを差し替え、 flagsにWPF_SETMINPOSITIONをセット。 SetWindowPlacementで更新って感じ
質問です、文字列を扱う場合MFC使いの皆さんは、 またはchar* なのでしょうか? std::string は使わない派ですか?
訂正です 質問です、文字列を扱う場合MFC使いの皆さんは、CString またはchar* なのでしょうか? std::string は使わない派ですか?
CString使う前提で設計されてる
MFCを使う関数では大抵CStringで済ませるが、文字列処理をする関数ではstd::stringを使う。
おいらはCStringでstlは使わないに統一 サイズ可変配列もCArray<>とかCTypedPtrArray<>とかで まぁ個人で作ってるものだからだけど
>>154 です
レスサンクスです
stl を多用したtemplate 非MFCのライブラリがあるのですが
そのライブラリへCString を渡す場合、何か注意すべきところがあれば教えて頂けないでしょうか?
渡さないほうが良い stringへのらっぱー書く方が良い
>>158 そのライブラリがconst char * を受け取るならそのまま渡していいと思う。
そのライブラリがstd::stringを受け取るなら、std::stringのラッバを用意した方がいい。
>>154 です。おはようございます、
ラッパークラスを意識して書いたことが無いので、勘違いをしている可能性があるので
駄目出し、及びご指導お願いします。
/**
* @brief std::stringからCString(MFC)へ変換
* @date 2009/11/7
* @param[in] std::string str
* @return str.c_str()
*/
class ConvertToCString {
public:
ConvertToCString() : str_("") {}
const CString operator()(std::string str) const {return str.c_str();}
private:
std::string str_;
};
/**
* @brief CString(MFC)からstd::stringへ変換
* @date 2009/11/7
* @param[in] CString cstr
* @return static_cast<LPCTSTR>(cstr)
*/
class ConvertTostring {
ConvertTostring() : cstr_("") {}
const std::string operator()(CString cstr) const {return static_cast<LPCTSTR>(cstr);}
private:
CString cstr_;
};
おかしいな? std::string str = "CString_convert"; CString cstr = ConvertToCString(str); cstr = "std;;string_convert"; str = ConvertTostring(cstr); こうすると error C2440: '初期化中' : 'ConvertToCString' から 'ATL::CStringT<BaseType,StringTraits>' に変換できません。 何処が悪いのでしょうか? CString cs("Hello"); std::string s((LPCTSTR)cs); std::string ss("Hello"); CString ccs(ss.c_str()); これは動くので、簡単にできると思ったんですが・・・・
>>163 一応、↓で出来るとは思うが、どうせ c_str() の呼び出しか LPCTSTR へのキャストで済むんだから、
わざわざクラスまで作る必要はないと思う。
コードを見た感じだと、Unicode文字セットを使っている訳ではないようだし。
class ConvertToCString {
public:
ConvertToCString(std::string str) : str_(str) {}
operator CString() const {return str_.c_str();}
private:
std::string str_;
};
class ConvertTostring {
public:
ConvertTostring(CString cstr) : cstr_(cstr) {}
operator std::string() const {return static_cast<LPCTSTR>(cstr_);}
private:
CString cstr_;
};
>>164 ありがとう、やっぱり勘違いしていました^^;
>わざわざクラスまで作る必要はないと思う。
そうですね、自分もそう思います、ただ一点お聞きしたいのですが
ラッパークラスのイメージといいますか、認識はこのような感じでいいのでしょうか?
お前は物事の一部だけを見て すべてを分かったつもりになる香具師なのか?
一を聞いて十を知る、それがわたしです。
一を聞いて十を知ったつもりになる、の間違いでは?
おまえは俺の何を知っているのだ。
CWinAppExでレジストリを使わないようにする方法ある?
自動生成されるコードの該当部分を消せばいい
InitInstanceのあの1行さえ消せばIniファイルが使われるようになる
余談でCWinAppExで追加されたCleanStateメソッドってのがある。 MFC Feature Packの影響で、レジストリ情報との差異による問題とかでてきたら、 コマンドラインとかで呼び出せる様にした方がいいかもね。 (それこそ、InitInstanceのあの1行の次の行あたりで)
オーナードローでXPやvistaのような外観のボタンにするにはどうしたらいいでしょうか?
>>174 ::OpenThemeData() でテーマハンドルを取得したのち、::DrawThemeBackground() でパーツを描画する。
VC2005でMFCで画面つくってますが ボタンを押したときにOnButtonで呼ばれる処理を ボタン押し続けで連続処理させるいい方法ありませんか?
ボタン関係のメッセージで可能
>>178 具体的にどんか感じですか?
ボタン押し続けだと1回しかメッセージきませんよね??
連続にできるってことですか?
タイマー起動して押してある間、適当なメッセージ送りつづけるとか。
>ボタン押し続けで連続処理させるいい方法 (1) ボタン押す→WM_LBUTTONDOWNがボタンに飛んでくる。 (2) ボタン放す→WM_LBUTTONUPがボタンに飛んでくる。 →(1) のタイミングでタイマなりを動かして、一定間隔で親にWM_COMMANDを送る。 →(2) のタイミングでタイマを切る。 ボタンを押さえたままウィンドウが非アクティブになるとWM_LBUTTONUPは飛んでこないから それなりに工夫は必要。
タイマー等で自分で実装するしかないんですね もう少しスマートな方法があるといいんですが…
>>183 見たところ、確かに非アクティブ対応は甘いね。
OnLButtonUp() では、ReleaseCapture() だけ実行すればいい。
その他の処理は WM_CAPTURECHANGED を捕まえて、そこで実行する。
PeekMessageを使ってWM_LBUTTONDOWNのみNOREMOVEなループの中で処理したらどうだ? 割り当て可能なすべてのアイドル時間がボタンダウンのために処理されるから ものすごい勢いだぞ^^
押した時と離した時しかメッセージ発生しないから タイマー嫌なら離したメッセージが来るまで永遠にループさせるしかないな。
キーみたいにリピート設定できた気がするんだが忘れ散った
ゲームマウスでも買って好きなように設定して使え。
キーボードもハードの方でタイマー使ってるようなもんだしな
MFCがサポートしてない機能はスレ違い
Win32APIスレで聞いた方が良いと思う
CListなどのPOSITION値って、 その値を取ったあとに追加や削除などの操作を行っても 当初の場所を指す値としてずっと有効のままなのでしょうか? それとも、CWnd::GetDlgItem()などのように どこかのタイミングで無効になるのでしょうか?
動かさなければ同じ場所に留まり続けると思うが。GetDlgItem()もまた然り。
> 動かさなければ同じ場所に留まり続けると思うが。 これはMSDNのどこかに明示されていますでしょうか? 「ブックマークとして使うと、リスト内の位置を保持できます」 という説明はあるのですが、要素を追加したり、 他の要素を削除をしても対象要素のPOSITION値自体は変わらないものなのか、 そのへんの記述を見つけられません。 > GetDlgItem()もまた然り。 CWnd::GetDlgItem()の説明には 「返されるポインタは、一時的なポインタです。 後で使用するために保存しておくことはできません。」 と書いてあり、実際、アイドル時だかどこかで無効になります。 ダイアログクラス内にDDXメンバとして実体があれば常に有効かもしれませんが。
>POSITION 型の変数はリストのキーとして使います。 だからキーが使えなくなったらキーの意味ないだろ 心配ならソースついてるんだからMFCソース読めよ
ダイアログベースで、ファイルを指定したフォルダにコピーするソフト を作っています。(ウォークマンにmp3をランダムに転送するため) SHFileOperationAを使ってコピーを行っているのですが、 ダイアログにコピー処理を書いているので、コピー中にダイアログの操作ができません。 コピーの時間が30〜60分と長いので、もどかしいです。 コピー中もダイアログの操作ができるようにするにはどうすればいいでしょうか? (コピー用のスレッドを作って、そこでコピー処理をすればいい?
yes we can
これで君もワーカースレッド使いにレベルアップだ
お茶くみとコピーばかりはもう飽きた!
ボタンにビットマップを設定し、 ビットマップの白色に部分は透過させて表示したいので ネットで調べた結果以下のプログラムを描いてみましたが 透過になってくれません 何か間違っていますか?正しい方法を教えてください 環境はXPのVS2005(MFC)です COLORMAP cm; cm.from = RGB(255,255,255); cm.to = GetSysColor(COLOR_3DFACE); m_bmp.LoadMappedBitmap(IDB_BITMAP, 0, &cm, 1); m_btn.SetBitmap(m_bmp);
201 :
デフォルトの名無しさん :2009/11/16(月) 15:35:40
お頼み申しageます
正しく表示されたコード m_wndMenuBar.Createのあとで、 LOGFONT logfont = {0}; ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0); CMFCMenuBar::SetMenuFont(&logfont);
>201 たまたま見つけたコードを意味もわからずいじって見たけど動きません。 だったら関わるだけ時間の無駄。
>>200 そのコードは、透過ではなく特定の色をボタン表面の色に変更して載せてるだけ。
透過させたかったらCButton::SetImageListを使え。
これならVista以降の徐々に色の変わるようなボタンでも正しく透過で描画される。
>>202 >この人の方法だとOnCreateの時点ではフォント情報が取得できず、メニューが化ける。
WINVER >= 0x0600 に設定して、そのプログラムを Vista 以前の環境で実行すると
::SystemParametersInfo( SPI_GETNONCLIENTMETRICS,,,) が失敗するというのは知ってる?
>>196 そのとおり、コピー用スレッドを作れば良い。
また、一個一個が小さいコピーをたくさんやっているなら、
コピーの合間にメッセージループをはさむ方法もある。
メッセージループの具体形はぐぐれば出てくる。
スタティックコントロールでCenterImageしてるんですが その場合は\rつけても改行されてくれません 改行可能なCenterImageって方法ありませんか? 余白を設定できたりも考えましたが見つかりません オーナードロー以外でなにかいい案ありましたら お願いします
209 :
196 :2009/11/18(水) 22:16:48
なんとか、スレッドで処理させることで、コピー中もダイアログを操作できるようにできました。
ありがとうございました。
>>198 裏で処理をさせるのをワーカースレッドっていうんですね。
>>207 コピーの時にOS標準のコピーダイアログを出したかったので
SHFileOperationAを使ってのコピーです。
コピーは全部SHFileOperationAに任せますので、メッセージループは使いませんでした。
210 :
デフォルトの名無しさん :2009/11/19(木) 19:13:35
MFCでも.NETアプリ動くようにしてくれればいいのにね。
211 :
デフォルトの名無しさん :2009/11/19(木) 19:14:42
C#の方が簡単。どの環境でも動く… MFCで作るのがいやんなるよ…
リソースとして埋め込んだリッチテキストファイルをRichEditCtrlに読み込ませようとして苦戦しております 外部ファイルの読み込みに関してはEDITSTREAMのコールバック関数を設定して出来ましたが、リソースからRTF形式で読み込むのは難しいのでしょうか?
LockResourceしてデータを取り出せば良いんじゃね?
>>212 HRSRC hResInfo = ::FindResource( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDF_RICHTXT), RT_HTML);
HGLOBAL hResData = ::LoadResource( AfxGetInstanceHandle(), hResInfo);
DWORD dwData = ::SizeofResource( AfxGetInstanceHandle(), hResInfo);
LPVOID lpData = ::LockResource( hResData);
CString strBuf( reinterpret_cast<TCHAR*>( lpData), dwData/sizeof(TCHAR));
m_wndRichEdit.SetWindowText( strBuf);
エクスプローラでファイルを詳細表示したときにファイル一覧の上に「名前」「サイズ」といった 区切りが表示され、その表示幅を自分で変更できたりしますが、この機能は標準で付いてる ものなのでしょうか? 使ってるヴァージョンはVisual C++.net Version2003です やりたい事はテキストファイルの一覧を表示して、その幅を自分で調整したいと考えています。 _____________________ | 名前 | 電話番号 | 住所 | | 山田 03-xxxx 東京都xxxx 最初から表示されているダイヤログエディタのコントロールを見ても使える様な物が 見つからないので、後から追加できるものなのかそれとも自分で作らなければならない 物なのでしょうか?
手元にVS2008しかないからそれで説明すると、 そのコントロールは「List Control」という表記なっている。 プロパティでViewを「レポート」に変更すると、そのようなヘッダの付いた表示形式になる。 VS2003でも大体同じような感じだったと思う。 試しに張ってみて、黄・赤・緑とかのアイコンが表示されるならそれでほぼ間違いない。 そういえば、このアイコンはVC4から殆ど変わらないよなあ。
>>216 List Controlに欲しい機能が付いておりました。
ただ追加した時点では色のアイコンがあるだけで、それらしい機能は
持っていないと思ってしまっていました。
レポートに変更したら上の方に区切りの付いたバーが表示されました。
ありがとうございます。
>>213 >>214 返答が遅くなりましたが無事読み込ませることが出来ました、ありがとうございます
てっきりリッチテキストそのままだと読み込めないものだと思っていたので意外でした
>>62 A:「作ったよ」
B:「ありがとう。こっちで作ったのにコピーさせてもらうね」
A:「ん、じゃとりあえずBの仕事が終わるまで待ってるね」
B:「ありがとう。終わったよ〜」
A:「ん、じゃこっちの仕事も終了するねw」
B:「じゃあAの仕事が終わったらこっちで作ったものは削除するね〜」
A:「こっちはもちっと仕事があるから終わったら削除するよ〜」
B:「あれ、いつの間にやらCStringのヒープニオイタモノガコワレテr」
orz
220 :
219 :2009/11/26(木) 21:10:39
(windows ce用アプリ)
A:「作ったよ」 B:「ありがとう。こっちで作ったのにコピーさせてもらうね」 A:「・・・ああん、バカ。コピーするならポインタじゃなくて実体をコピーしてよん」
なにそれ、エロい
えっ
えっ
, - , -─ - 、 /:::::::::::::::::::::::::::::::::`‐、 /::::::::::::::::::::::::::::::::::::::::::::::\ /::::::::::;:ィ::::::::';:::::::::::`ヽ::::::::::::::ヽ ,'::::::;':::/ l:::i::::::ヽ:::\:::::::';:::::::::::::::', i:::l::::i:/ ';:::';:::::::',\::ヽ:::::::::::☆::: l::l::;イ__, ヽ、ト、::::ヽ、\:',ヽ〃l:::::: ';l l::l ` ‐- l:::::l:::::: こ、ここ、これ読んで下さいっ! l::::l == 、 ,.ィ== l:::::l::::::::: l:::::li //////////// l:::::l:::::::::: , -ーl::::lヽ、 r....::´`ヽ /l:::;'> 、::::: , -ー 、'´`ヽl::::l// ` ‐-r‐ァ' ´ ,':/ー、 '; / , ノ ` l::::l li /ニく /⌒ヽ \.i , └ '´  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / ノ__ ', ,イ: / \ (⌒⌒) , └ '´ / i/ / ヽ / ー ' / /,.イ ∠ __ / / /  ̄ ̄ ̄ ̄ ̄─── -------/-‐'´ /
ィ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;゙t, 彡;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ イ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r''ソ~ヾ:;;;;;;゙i, t;;;;;;;リ~`゙ヾ、;;;;;;;;;;;;;;;;;;;;ノ i,;;;;;;! / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ゙i,;;;;t ヾ-‐''"~´_,,.ィ"゙ ヾ;;f^! / お嬢ちゃん、ここはMFCの相談室だぜ。 ト.;;;;;》 =ニー-彡ニ''"~´,,...,,. レ')l. < その手紙をMFCで書いて出直しな。 t゙ヾ;l __,, .. ,,_ ,.テ:ro=r''"゙ !.f'l. \_______________ ヽ.ヽ ー=rtσフ= ; ('"^'=''′ リノ ,,.. -‐ゝ.>、 `゙゙゙゙´ ,' ヽ . : :! / ~´ : : : : : `ヽ:. ,rf :. . :.: j 、 . : : ト、.、 : : : : : : : : : : ヽ、 /. .゙ー:、_,.r'゙: :ヽ. : :/ ヽ\、 :f: r: : : : : : : : !丶 r-、=一=''チ^ ,/ !:: : :`丶、_ : /: : : : : : : : :! ヽ、 ゙ ''' ''¨´ / ,i: : : l!: : : : :`ヽ、 〃: :j: : : : : : : ゙i `ヽ、..,,__,, :ィ":: ,ノ:: : : : : : : : : : : :\ ノ: : : : : : : : : : :丶 : : ::::::::: : : : /: : : MFC : : : : : : : :\
CPaneDialog派生させたオブジェクトをドッキングで使ってるんだが、 何故かボタンコントロールだけディスエーブルされるのは、仕様?バグ? チェックボックスとかは全く問題ないんだが・・・・OnCreate()内でEnaqbleWindowやっても 効果無し。MFCのソース バックグラウンドの更新も変だ・・・・ダイアログアイテムにちゃんとメッセージがポストされてない気がする。 2008で拡張されたMFCは便利だけど、どうも問題が多いし、肝心な情報が公開されてない 気がする。いい加減にM$は、開発環境ぐらいソースを全公開して欲しいよ。w
>>227 ダイアログバーのときは、コマンドハンドラやON_UPDATE_COMMAND_UIが無いと
ボタンは無効になってたけど、それとは関係無いですか?
>>228 それだ!!ありがとうございます。ボタンの件はそれでした。
ダイアログバーはメッセージマップがMainFrame側に実装される謎仕様とかあったな
231 :
デフォルトの名無しさん :2009/12/04(金) 16:51:04
リストコントロールについて質問です。 レポート形式で使用しています。(VC2005) (1) リスト行数100で1ページ表示5行で 現在10ページ目の1番目の項目が選択されています。 この状態で一度全ての項目を削除し再入力して 新たに10ページ目の1番目の項目を選択させたいので SetItemStateなどで選びなおしました。 しかし、10ページ目の1番目が選択されているようですが 表示は1ページ目になっています。 これを10ページ目にしたくてSetScrollPosをしましたが うまくいかず、表示が変になります どうやったら10ページ目の表示にできるのでしょうか? (2) 拡張スタイルにLVS_EX_GRIDLINESを使用していますが スクロールしたときにグリッドラインの残像が残ってしまいます この残像を綺麗にけすのはどうしたらいいのでしょうか?
>どうやったら10ページ目の表示にできるのでしょうか CListCtrl::EnsureVisible() >この残像を綺麗にけすのはどうしたらいいのでしょうか ウチでは残らないけど? 何か変わったコトしてない?
俺も昔LVS_EX_GRIDLINESで残像が残った記憶があるな。 市販アプリでも普通に残像が残っていたので、環境依存なのかもなあ。 昔なった時は、IE3.x時代のだからMSもまともにサポートする気無いのか、 という程度に思っていたのだけど。.NETだと自前で正しく描画していたし。
235 :
231 :2009/12/08(火) 13:26:25
返事がおくれてすみません 1は232で解決しました 2は画面のプロパティのデザインで治りました
236 :
231 :2009/12/08(火) 14:11:12
来客が来て途中送信してしまいました。 改めて、 返事がおくれてすみません 1は232で解決しました 2は画面のプロパティのデザインの効果の 次のアニメーション効果をメニューとヒントに使用するのチェックを外すと 治りました。 ありがとうございました。
237 :
デフォルトの名無しさん :2009/12/09(水) 15:29:32
CButton でクイックされたらそのまま凹んだまま、押しボタンのように動きにしたいのですが、 (もう一度クリックすると元に戻る) どのようなコードでできるでしょうか?
>>237 チェックボックスのスタイルをBS_PUSHLIKEにすればいいかも
239 :
237 :2009/12/09(水) 18:10:21
>>238 ありがとうございます。 ためしてみますm(_ _)m
エラーで困っているので助けてください。 error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です。 error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です。 error LNK2019: 未解決の外部シンボル "public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ) が 関数"public: virtual int __thiscall CprototypeApp::InitInstance(void)"(?InitInstance@CprototypeApp@@UAEHXZ) で参照されました とエラーが出ていますが、原因がわからず困っています。 同じソースを別の人の環境で実行すると何もエラーも出ずにコンパイル・リンカーが通ります。 私も昨日までは通っていましたが、コーディングを設定ファイル?とかがおかしくなってしまったのか、 昨日のデータを使ってもリンカーエラーが出て困っています。 環境として、 自分 VisualStadio 2008 VC++(MFC) 別の人 VisualStadio 2008 VC++(MFC) 本当に困っています。何か知っている方がいらっしゃったら力を貸してください。
出力ファイルを全て消してリビルドしる。 C/C++関係はそれで解決することが良くある。
242 :
240 :2009/12/10(木) 00:07:23
>>241 出力ファイルとは、Solution内のDebugフォルダ内のことをさすのでしょうか?
昨日から勉強を始めたため、ほんとにわからないことが多くてすみません。
MFCにライブラリパスが通ってないんだろ。 ライブラリパスはソースではなく、コンパイラの設定だから PCが変われば設定が違う可能性がある。 ちょっと2008が手元にないんでアレだが2005で見ると ツール→オプション→プロジェクトおよびソリューション→VC++ディレクトリ→ライブラリファイル で設定できる。2008も似たようなもんだろ。 その設定をコンパイルが通るやつに合わせてみろ。
何だマルチだったのか
CWnd使ってVSの入力候補みたいな小窓を表示させたいんだけど、 popupで表示して小窓がアクティブ状態になると、メインウィンドウが 非アクティブ状態になってしまいます。小窓がアクティブ状態になっても メインウィンドウがアクティブ状態を失わないようにするにはどうしたら良いですか?
WS_EX_PALETTEWINDOW
>>246 レスありがとう。ただ、WS_EX_PALETTEWINDOW指定しても、メインウィンドウが
非アクティブになってしまいます。何か他の設定が悪いのかも?
ダイアログベースで以下のような感じ
//CtestAppの中でウィンドウ登録
WNDCLASSEX wndclass;
wndclass.lpszClassName = L"TESTWINDOW";
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = DefWindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = m_hInstance;
wndclass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
wndclass.lpszMenuName = NULL;
wndclass.hIcon = LoadIcon(IDI_APPLICATION);
wndclass.hCursor = LoadCursor(IDC_ARROW);
wndclass.hIconSm = LoadIcon(IDI_APPLICATION);
RegisterClassEx(&wndclass);
//ボタン押された時にウィンドウ表示
void CtestDlg::OnBnClickedButton1()
{
CRect cr;
GetWindowRect(&cr);
m_cwnd.CreateEx(WS_EX_PALETTEWINDOW, L"TESTWINDOW", L"", WS_VISIBLE | WS_POPUP, cr.left, cr.top, 50, 50, GetSafeHwnd(), NULL, NULL);
}
戻してやればいいだけの気がするけど MFCなんだからドッキングツールバーのソースでも読んで勉強すればいいよ
ツールウィンドウで作るんじゃなかったっけ?
#define WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
251 :
245 :2009/12/12(土) 09:54:12
とりあえずソース読んで勉強してみます。レスしてくれた人たちありがとう。
メインウィンドウは非アクティブでいいんじゃね? 手持ちのアプリの動作でいうと VC6はアクティブがどうであろうとメインもツールウィンドウもアクティブになりっぱなしでおかしい VC2008はアクティブによってメインもツールウィンドウもちゃんと切り替わる ってなってる 俺もツールウィンドウ作ったときにメッセージのやり取りがおかしくなったときに VC6みたいにアクティブになりっぱなしになったことあるから VC6ってバグりっぱで放置してあるだけだと思う
253 :
245 :2009/12/12(土) 12:39:18
>>252 確かにVS2008だとアクティブ状態が移動しますね。ただ、作りたいのがツールウィンドウではなく、
VS2008で例えると、入力候補ウィンドウみたいなヤツなんです。これポップアップで出ますが、
フォーカスが移っても、親ウィンドウのアクティブ状態は変化ないですよね。
248さんが言ってた”戻せばいい”というのをヒントに、親ウィンドウの
WM_NCACTIVATEとWM_ACTIVATEAPPで細工したら希望通りの動作になりました。
WS_EX_NOACTIVATEは使えないか?
どなたかXPでマルチモニタ環境のあるかたに試していただきたいのですが、 VS2005やVS2008でダイアログベースのプロジェクトを作り、 標準で用意される2つのダイアログ(メインとバージョン情報)に 「サイズ変更枠」と「最大化ボタン」のプロパティをセットしてビルド。 デバッグ開始し、メインダイアログを最大化。 ↓ 特に問題無い。 そのままバージョン情報ダイアログを出してこっちも最大化。 ↓ セカンダリモニタにほんのちょっとウィンドウ枠がはみ出る。 という現象が発生するのですが、 他のかたの環境でも発生しますでしょうか。
特に問題無い
>>256 あれ、発生しませんか。
社内ではXPマシンすべてで発生するんです。
同じモニタだから、ハードウェア的な問題なんだろうか。
ありがとうございます。
画面端同士で同じ場所参照してそうな仕様だな それだと他のウィンドウでも同じ現象が出るか
259 :
ぷれ :2009/12/16(水) 23:51:16
はじめまして、画像ビューアを作ろうと思っているのですが CWinthreadにCScrollView派生クラスのハンドルを渡してスレッド側から、 CScrollViewのOnPrepareDC(&dc)をコールすると以下でエラーが発生します。 CWnd::AssertValid() CHandleMap* pMap = afxMapHWND(); ASSERT(pMap != NULL);//<--ここでエラー どうすれば問題解決するでしょうか。 よろしくお願いします。(関連するソースは以下) CThreadxxx ::CThead(HWND hwnd) { m_pMainWnd = AfxGetMainWnd(); m_pView = (CScrollViewxxx*)CWnd::FromHandle(hwnd); } int CThreadxxx ::Run() { while (WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT){ if(m_hWndView){ CClientDC dc(m_pView); m_pView->OnPrepareDC(&dc); m_pView->Render(&dc);//計算描画処理(重い) } } }
MFCのドキュメント・ビューアーキテクチャ関数はワーカースレッドから呼ぶとエラーになるものあるんだよね ワーカースレッドからはユーザーメッセージ定義してメッセージハンドラで凌いでた SendMessage()で渡せばメインスレッドで処理されて帰ってくる
261 :
ぷれ :2009/12/17(木) 09:20:35
>>269 回答ありがとうございます。
メッセージで処理してみましたが遅くなってしまいました。
早くする方法はありますでしょうか?ソースは↓みたいな感じです。
int CThreadxxx ::Run()
{
if(m_hWndView)
{
PostMessage(m_hWndView,WM_USER_START_RENDER, 0, 0);
if(WaitForSingleObject(m_hEventEndRender,10000) == WAIT_TIMEOUT));
{
return ;
}
}
BOOL CScrollViewxxx::PreTranslateMessage(MSG* pMsg)
{
CDC *pDC = NULL ;
CClientDC dc(this);
switch (pMsg->message){
case WM_USER_START_RENDER:
OnPrepareDC(&dc);
SetOrigin(&dc);
Render(&dc);
//m_pThreadRender:スレッド
SetEvent(m_pThreadRender->m_hEventEndRender);
break;
}
}
Render()はワーカースレッドに置いたままでいいんじゃないのか? こんなイメージ int CThreadxxx::Run() { while(WaitForSingleObject(m_hEventEndRender,10000) == WAIT_TIMEOUT)){ if(m_hWndView){ CClientDC dc(m_pView); m_pView->SendMessage(WM_USER_START_RENDER, 0, (LPARAM)(CDC*)&dc)) //制御待たせるためにSendMessage m_pView->Render(&dc); } } } LRESULT CScrollViewxxx::WindowProc(UINT msg, WPARAM wParam, LPARAM lParam) { switch (pMsg->message){ case WM_USER_START_RENDER: { ASSERT_KINDOF(CDC, lParam); CDC* pDC((CDC*)lParam); if(pDC->GetSafeHdc() != NULL) { OnPrepareDC(pDC); SetOrigin(pDC); } return 0; } return CView::WindowProc(msg, wParam, lParam); }
263 :
ぷれ :2009/12/17(木) 11:33:51
>>262 ありがとうございます。
早速試してみます。
264 :
ぷれ :2009/12/17(木) 12:58:42
>>262 試してみましたがまだ遅いです。メッセージ処理を改良すべきだとは思うのですが何か案はございますでしょうか?
試したソースはこんな感じです。
int CThreadxxx::Run()
{
if(m_hWndView)
{
CClientDC dc(m_pView);
m_pView->SendMessage(WM_USER_START_RENDER, 0, (LPARAM)(CDC*)&dc);
CRenderInfo renderInfo;
m_pView->Render(&dc);
SetEvent(m_hEventStop);
}
}
LRESULT CGdsView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
CDC* pDC = (CDC*)lParam;
switch (message)
{
case WM_USER_START_RENDER:
ASSERT_KINDOF(CDC, pDC);
if(pDC->GetSafeHdc() != NULL)
{
OnPrepareDC(pDC);
SetOrigin(pDC);
}
return 0;
default:
break;
}
return CScrollView::WindowProc(message, wParam, lParam);
}
265 :
ぷれ :2009/12/17(木) 13:01:47
↓見たいな処理をどこかに入れ込めばいいと思うのですがどのタイミングに埋め込むべきか 判断に迷ってます。 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ if(msg.message == WM_USER_START_RENDER) { CDC* pDC = (CDC*)lParam; ASSERT_KINDOF(CDC, pDC); if(pDC->GetSafeHdc() != NULL) { OnPrepareDC(pDC); SetOrigin(pDC); } }else{ TranslateMessage(&msg); DispatchMessage(&msg); } } }
ワーカースレッドでDIBを作らせれば済む話じゃないの? 何か無駄に話を難しくしているように見えるぞ。
クラス A CListBox m_listA クラス B CListBox m_listB クラス C fnCommon() クラスA、クラスBの処理が共通なので、 クラスCの関数を共通処理関数としようと思っています・ クラスCの関数に、クラスAのm_listAなどのメンバを引数に渡せなくて 困っています。どうやればいいでしょうか? クラスAの処理 { クラスC: :fnCommon( m_listA ); } クラスCの処理 クラスC::fnCommon( ClistBox a) { a.set・・・(); } ではうまくいきませんでした、どうすれば別のクラスのメンバを引数として渡せるのでしょうか? 最近はじめたばかりでググっても解決策が見つかりません。 よろしくお願いします。
>>267 ポインタを渡す、もしくは、CListBoxの派生クラスを作ってそこで処理する。
ClassC::fnCommon(&m_listA);
クラスC::fnCommon(CListBox* a)
{
a->set・・・();
}
CMyListBoxクラス内にfnCommon関数を宣言・定義
クラスAの処理
CMyListBox m_listA;
m_listA.fnCommon();
Windowsのコントロールって複数のウィンドウで同時に共用できないんでしたっけ? 具体的にはCPropertySheetで作成したコントロールを複数のCPropertyPageに貼りつけて 共用するとか。これができると、CListCtrlやCTreeCtrlやカスタムコントロールで便利なもんで・・・・ 試しにやってみたら1枚目には貼れるのですが、2枚目以降は駄目でした。(表示されない。エラー は無し。)
コントロールはただのウインドウだからどこにでも張り付くし、後から移動することも可能。
左側のツリーで右側のプロパティページを切り替えるのはよくあるな
>>270 >>271 サンクス。OnSetActive()の段階でコントロールにSetParent()したらイベントが行く様に
なったんだけど、開始ページ以外のCTreeCtrlの文字が表示されない。(マウスクリックすると
表示される。)コントロールにUpdateWindow()などしても更新されないから、更新イベントが
CTreeCtrl内のコントロールに行き渡ってないみたいだ・・・・
273 :
268 :2009/12/21(月) 00:01:39
>>267 親切にありがとうございました。
無事解決しました。
MFC SDI のプログラムで、このように取得したドキュメントの文字を、CString 型の変数に取得し、 配列へ格納したいのですがどうしたらできますでしょうか CxxxDoc *pDoc = (CxxxDoc*)((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument();
>このように取得したドキュメントの文字を どのように取得したって? 取得できてないじゃん。
>>257 >>254 です、
一応これでエディットビュー のドキュメント(テキスト)が
取得できるようになったのですが、このままでは256 文字がべたで配列に代入されてしまいます
一行づつ取得して、配列へ格納するにはどうしたらいいでしょうか?
CxxxDoc *pDoc = (CxxxDoc*)((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument();
void* P = m_viewList.GetHead();
char buf[_MAX_PATH];
CEdit* pE;
pE = (CEdit*) P;
pE->GetWindowTextA((LPTSTR)buf,_MAX_PATH);
一行づつ切り分けて取得して、配列へ格納する。Enterの文字列で切り分ければ良い。
1行の読み込みを、 pE->GetLine(i, (LPTSTR)buf); として、得ることにしたのですが、当然のことながら、改行コード以降にゴミが入っています sizeof(buf); とかstrlen(buf); でサイズを得たいのですが上手く行きません 目的のデータ(文字列+改行コード)を得るコードを教えてもらえませんか?
CEditのメンバ一覧に目を通す時間すらないとは大変ですね。 あと、CEdit::GetLine(nIndex, lpszBuffer)は lpszBufferの中身の先頭WORDにバッファ長が入っていることが前提だ。
CEditはCString と相性いいから簡単に扱えたはずだけど わざわざ手間がかかるやり方でやってないか? 行数がとてつもなく多いとか、効率考えて普通と違う方法でやろうとしてるならいいけど
どうもみなさん、thxですこんな感じでできましたが、もう一息です、pE->ReplaceSel(result.c_str());で置換をしているのですが
置換後の文字列を置換前の文字列の位置に上書きしたいのですが、今のままだと、置換前、置換後の文字列両方表示されています、どこがおかしいでしょうか?
>>280 CString を使いたいのですが、<boost/regex.hpp> が使いたいので、文字列は*char かstd::string の方がベターなのです
char szBuf[256];
const int nRow = pE->GetLineCount();
for(int nIdx = 0; nIdx < nRow; ++nIdx) {
// テキストデータ取得。
const int iSize = pE->GetLine(nIdx, szBuf, sizeof(szBuf) - 1);
szBuf[iSize] = '\0';
reg_ex = "<.*?>";
result = re.RegularTagReplace(szBuf, reg_ex);// <boost/regex.hpp> でHTML タグを削除している
const int end = pE->GetWindowTextLength();
pE->SetSel(end, end); // 一番最後に持ってくる
result += "\r\n";
pE->ReplaceSel(result.c_str());
}
いちいち質問しないと解決しない問題とは思えないが
pE->SetSel(0, 0); とかやってみるができないorz
全然関係ないけど、行単位でTAGを取り除く意味あるのか? HTMLは特別な場合を除いて改行を無視するから TAGのカッコの途中で改行が入ったりしてる場合もあるわけだが
>>284 行単位でタグを取り除くのには、他に目的があります、改行の必要な部分は、あとで
<br> をつけます、しかし上手くいかんな・・・
質問です。 いろんなファイル形式の画像ファイル(特に48bitカラー)を読み込んで、データストリーム (ピクセルごとのRGB情報)を取得したいと思ってます。 いまはGDI+のImageクラスで画像ファイルを開いて、Image.SaveでIStreamにデータ ストリームをコピーした後、IStream.Writeでunsigned char[]にコピーするというコードを 試しているんですが、IStreamからunsigned char[]へのコピーがうまくいきません。 Writeの返り値はOkになってるし、コピーされたバイト数も正しいのに、配列は全て 0が入っているという状態です。 考えられる原因は何でしょうか? あるいはもっと確実な方法があれば、お教えいただけると助かります。
>>287 IStream::Writeは、IStreamに書き出す、という意味だぞ。
取り出すならIStream::Read。引数の型で気付かなかったのか?
>>288 ありがとうございます。
明日試してみます。
VisualStudio2010のMFCってもう仕様変わらなそうかな。 主力は.netだろうしRCやRTMに向けてはそっちの調整だろうな。 リボンアプリの案件が来てて困ってる。2010はデザイナが付いてるし、 βで作っても問題なさそうな気がする。そう思いたいだけなんだけどね。 納期は5月だからβで作ったのを引き継げればいいのだが・・・。
291 :
デフォルトの名無しさん :2009/12/30(水) 01:47:52
>リボンアプリの案件 需要あんのか
OfficeはOffice2007、2010で始めて触りましたって人や Win7が始めて使ったWindows(ペイントなんかがリボンアプリ)ですって人が大勢を占めるようになったら 需要としては結構出てきそう。 市販アプリでもPerfectDiskなんかは既にリボンUI採用してるね。
見た目の問題っぽい。客先は来年末までにWindows7にするみたいだし、 Officeも2010にもするらしいから、見た目を同じにしたいらしい。 個人的には今までのツールバーみたいに、他の処理と無関係なアイコンが 並ばなくていいという点だけは評価できる。ツールバー消したりとか しなくていいし。機能別にタブみたいなグループでまとめちゃえばいいし。 ただ無駄に高さを取るのがどうしても馴染めない。
馬鹿は使うな! 以上!
295 :
デフォルトの名無しさん :2010/01/05(火) 08:20:54
VC6から2008に以降したら文字列でえらい苦労した。 出来上がったソフトを他のPCで動かそうとしたら起動せず、 イベントログでSideBySideエラーになっていた。 他の人に送ったらマニフェストがどうたらこうたらとか・・・ わけわかんないのでもう一台のPCでコンパイルしようとしたらエラーが出る。 そうか、ExpressにはMFCが入っていないんだね。 最近、自分が浦島太郎に思えることが多いですよ・・・
MFC付きの有料のを買えばいいだけですよ。
VC6のランタイムはXP以降ならOS標準で入っているからな。 まあ2008の場合はWinSxSへのコピーのみでマニフェストでアクセス、 という今までと違う変則的な方法だから解り難くてもしようがない。 不評だったのか、2010ではシステムフォルダにもコピーされる仕様に戻るらしい。
VC2008でMFCダイアログベースなどのプロジェクトを作ると、 メッセージマップのところに //}}AFX_MSG_MAP というものが入っているのですが(閉じるほうのみ)、 これってVC6などでClassWizardのために入っていたものですよね? VC2008でもなにか意味のあるものなのでしょうか? それともテンプレートの残骸?
ISAPIフィルタでレスポンスの内容を編集したく OnSendRawData()ではレスポンスを返さないようにするために pRawData->cbInData = (DWORD)0; pRawData->cbInBuffer = (DWORD)0; として OnEndOfRequest()で pfc->WriteClient() で編集した内容を返そうとしています。 しかし、OnSendRawData()で pRawData->cbInData = (DWORD)0; pRawData->cbInBuffer = (DWORD)0; を入れるとOnEndOfRequest()でWriteClient()をしてもレスポンスが 返されません。 なぜこのような結果になるのでしょうか?
300 :
299 :2010/01/06(水) 10:11:46
わかりました。 WriteClient()を呼ぶとOnSendRawData()が発生するんですね。
CInternetSessionのメンバの GetFtpConnectionとかでタイムアウトを設定できないでしょうか?
試したことないから知らんけど設定自体はあるね
ミューテックスオブジェクトについて、質問です。 環境は、VC6でMFCダイアログベースです。 2つのアプリケーションAとBを作っているのですが、 以下の処理をそれぞれ追加します。 A:ボタン押下でBをミューテックスオブジェクトを使って排他的に呼出す。 B:ミューテックスオブジェクトを保持。 @Aにあるボタン押下でBだけは呼出せたのですが、ミューテックスオブジェクトを 使って排他的な呼出し方にする方法が分かりません。 ABでミューテックスオブジェクトを保持する方法が分かりません。 自アプリケーション の2重起動禁止の場合、CreateMutexを使っていたのですが、 上記の場合、AとBをどのようにすればいいでしょうか?どなたか宜しくお願いします。
>>303 Aからボタン押下でBを起動、
ただし以前Aから起動した事のあるBが残っている場合は
新たに起動はしない、ってことでOK?
そういうのだったら、B起動時にそのプロセスハンドルを残しておいて、
次のボタン押下時にGetExitCodeProcessで以前起動したプロセスが終了したか確認、とか。
手動でならBを複数起動できる、という必要性がないならBの二重起動禁止で十分だけど。
305 :
デフォルトの名無しさん :2010/02/03(水) 10:08:47
CStringArrayのシリアライズ化で、ファイル保存はできたのですが、 これを読み込んでCStringArrayに再格納できませんでした。どのようにすればいいのでしょうか? //シリアライズ CStringArray aBuf; aBuf.Add( _T("aaa") ); aBuf.Add( _T("bbb") ); aBuf.Add( _T("ccc") ); CFile f; BOOL bRet = f.Open( _T("hoge.txt"), CFile::modeCreate | CFile::modeWrite ); if( bRet == FALSE) { return true; } // アーカイブを作成 CArchive ar( &f, CArchive::store ); TRY { aBuf.Serialize( ar ); } CATCH_ALL(e) { ar.Close(); f.Close(); return 0; }
>>305 読み込むほうのソースを出さないと誰もわからない。
307 :
305 :2010/02/03(水) 15:41:45
>>306 失礼しました。
サンプルをみて書いたのですが、以下のコードになります。
try{
CStringArray m_saMyArray;
CFile in(_T("hoge.txt"), CFile::modeRead);
CArchive ar(&in, CArchive::load);
CString buffer;
m_saMyArray.SetSize(0);
for(int i = 0; ar.ReadString(buffer); i++) {
m_saMyArray.Add(buffer);
}
ar.Close();
in.Close();
} catch(CFileException e)
{
AfxMessageBox(_T("Read Error !!"));
}
ar.ReadString(buffer)で bufferにすべてのデータが格納されました。
根本的に、読込み方法が間違っているのでしょうか?
ご教授おねがいしますm(_ _)m
>>307 CStringArray::Serialize()で保存したものは
CStringArray::Serialize()で読み込まないとダメ。
> CString buffer;
> m_saMyArray.SetSize(0);
> for(int i = 0; ar.ReadString(buffer); i++) {
> m_saMyArray.Add(buffer);
> }
m_saMyArray.Serialize(ar);
309 :
305 :2010/02/03(水) 18:14:02
>> 308 ありがとうございます(>< ためしてみます。。
310 :
303 :2010/02/05(金) 21:42:09
>>304 GetExitCodeProcessを使ってやってみます。
ありがとうございました。
311 :
デフォルトの名無しさん :2010/02/06(土) 13:24:05
CToolBarのボタンのイメージはリソースからしか設定できないみたいなんですが、 iconファイル(拡張子ico)を読み込んでイメージを設定する方法ってありますか? サイトアイコン(favicon.ico)をダウンロードして、動的にツールバーボタンにイメージ登録するようなことがやりたいのです。
>>311 の件の自己レスです。
icoファイルから読み込む方法は下記のようにできることが分かりました。
HICON hIcon;
ICONINFO iconinfo;
ExtractIconEx(_T("favicon.ico"), 0, NULL, &hIcon, 1);
GetIconInfo(hIcon, &iconinfo);
m_toolbar.SetBitmap(iconinfo.hbmColor);
DestroyIcon(hIcon);
しかしこれでは1種類のアイコンイメージしか使えません。
複数のイメージを使いたい場合は、横方向に連結した1個のbitmapを作る必要があるようです。
どうやって連結するかはまだ分かりませんが、ものすごい不便ですね。
コントロールは汎用的に作られてるから 気に入らなかったら自作すればいい。
TBBUTTON配列受け取るAddButtons()とかなかったっけ?CToolBarCtrlだったか?
>>314 CToolBarCtrlというのがあったんですか。
これだとAddBitmap()で1個ずつ追加できそうですね。
ありがとうございました。
316 :
デフォルトの名無しさん :2010/02/08(月) 16:28:36
C#のsplitContainerなどに相当するコンテナクラスはC++(MFC)にありますでしょうか?
317 :
デフォルトの名無しさん :2010/02/08(月) 16:54:48
ウインドウが表示されてるかどうかわかる方法ありますか? IsShowみたいなのが欲しいです CWndには無いようです
>>317 CWnd::IsWindowVisible
319 :
316 :2010/02/08(月) 17:05:26
自己解決しました WTLにありますね
320 :
317 :2010/02/09(火) 09:49:26
MFCで、 CWnd;;OnSysKeyDonwではAltのみのキーも拾うのに CWnd::OnSysKeyUpでは拾わないのはなぜなんだぜ・・・ AltのみのUPイベントを拾うにはどうすればいいですか、 教えてエロい人
あーPreTranslateMessageか・・・
いきなりの質問ですが・・・ Visual Studio 2008の拡張MFCで、CDockablePaneのタブ付きウィンドウ内に 上下分割ウィンドウ(VisualStudioのClass Viewみたいな)って作れます か?タブウィンドウにする前にドッキング出来ちゃえば簡単に作れそうな 気はするのですが、DockToWindow使ってみても駄目でした。 結局ドキュメントの更新無し=不備なままで2010が出そうですね。 何だかいい加減だなぁ。
>上下分割ウィンドウ(VisualStudioのClass Viewみたいな)って作れますか? 作れる。ただし自前。
ダイアログベース、オーナードローでボタン描画してるんですが 構成プロパティ - 文字セットが「Unicode文字セット〜」 だとOnDrawItem関数でlpDrawItemStruct->itemActionが ODA_SELECTを返してこない理由わかる人いますか? OS:Xp,Vista,Windows7 環境:vs2008 .Net FrameWork:2.0〜3.5 以上の環境で再現できました。
>>326 Comctl32の6.0以降とそれ以前で挙動が違う、というのが正解。
stdafx.hを見てみればそのからくりが分かる。
328 :
326 :2010/02/20(土) 16:50:43
>>327 stdafx.h見てみました。
そういうことだったのですね。
ありがとうございました。
関数ではなくクラスをエクスポートするMFC標準DLLを作る場合、 AFX_MANAGE_STATE(AfxGetStaticModuleState())は エクスポートされたクラスのすべてのメンバ関数に入れることになるのでしょうか? メンバ関数の中でダイアログなどのリソースを使う箇所があります。 クラス自体はMFCのクラスを派生させたものではないので、 拡張DLLではなく標準DLLを選びました。
すみません。 CWndを継承して新しく定義したウインドウをCDialogの子ウインドウとして作成しましたが、 ウインドウに対するキー入力メッセージが正常に送られません。 このウインドウをクリックしてから矢印キーを押すと、 親のCDialogに一緒に貼り付けたリストボックスにフォーカスが移って選択が上下してしまいます。 新しいウインドウのイベント関数を色々オーバーライドして調べると、矢印キーを押すと同時に何故かKillFocusが呼ばれていました。 何が原因でしょうか。
331 :
330 :2010/02/25(木) 20:40:07
試行錯誤の結果、OnGetDlgCode()でSetFocus()を呼び出すことで解決できました。 なんかよくわかりませんが、解決しました。 失礼しました。
>>331 OnGetDlgCode()まで調べたのなら、そこでSetFocus()なんて強引なことをせずに、
DLGC_WANTARROWS や DLGC_WANTCHARS を設定すればよいと思う。
>>332 クリック時に何が呼び出されるか手当たり次第に関数をオーバーライドして試してたので、
OnGetDlgCodeがそのものズバリの関数だったとは気づきませんでした。
DLGC_WANTARROWSで正常に出来ました。ありがとうございました。
FeaturePackの解説本ってさすがに出ないかねぇ。
MFC解説VisualStudio2010対応ってタイトルにした本のほうが売れそうだ。 問題はMFCという言葉で買う人がどれくらいいるかだw
MFCで提供されていない機能がほしかったらMFC以外で探すか自作するしかない。 要するにスレ違い
>>337 確かにそのとおりですね。ご指摘ありがとうございました。
339 :
デフォルトの名無しさん :2010/03/15(月) 10:00:07
MFCを使用したプログラムで CoInitializeEx()を使うとエラーが出てしまいます… 普通のWin32コンソールプログラムだと以下でなんの問題もないのですが #define _WIN32_DCOM CoInitializeEx(0, COINIT_MULTITHREADED); MFCプログラムだと、以下の定義エラーが出てしまいます… error C2065: 'CoInitializeEx' : 定義されていない識別子です。 error C2065: 'COINIT_MULTITHREADED' : 定義されていない識別子です。 どうぞご教授下さいm(__)m
include し忘れだろ
341 :
デフォルトの名無しさん :2010/03/15(月) 10:12:34
>>340 ちょっと書き方が悪かったですね…
コンソールプログラムだと、以下でOKなんですが
#define _WIN32_DCOM
#include <comdef.h>
CoInitializeEx(0, COINIT_MULTITHREADED);
MFCアプリだと、この上述のコードではエラーになるんです…
何故なんでしょうか?
include し忘れだろ
343 :
デフォルトの名無しさん :2010/03/15(月) 10:44:23
>>342 すみません… 具体的に何か教えていただけませんか?
よろしくお願いしますm(__)m
>>341 _WIN32_DCOMをプロジェクト設定に書くかstdafx.hの上のほうに持って行く
>>344 stdafx.hの上ではダメでしたが、
プロジェクト設定に書いたら見事OKでした!
ありがとうございます!助かりました!
本当にいい人だ。 うぅ (/Д`)・゜・。
stdafx.hの中という手はあるがな
>>345 上ってどこに書きました?
#include <stdafx.h>より上の行ではなく、stdafx.h内の上のほうですよ。
自分の環境では、afx〜.hのインクルードより上に書けば大丈夫でしたが。
348 :
345 :2010/03/15(月) 13:18:45
>>347 ああ、なるほど、そうでしたか。
それは勘違いしてました。ご指摘ありがとうございます。
AfxOleInit()の説明だとmfcプロジェクトはマルチで初期化は無理ってあったが裏技があったのか
MFCで作るMDIアプリのメニューの有効/無効の切替を教えてくださいな ドキュメントなしのとき→IDR_MAINFRAMEのメニュー ドキュメントが開かれているとき→IDR_MYFILE(仮)のメニュー このIDR_MYFILEに含まれるメニューの有効/無効を切り替えたいんだけど、 GetMenu()->EnableMenuItem( ID_MENU_IN_IDR_MYFILE(仮), MF_GRAYED ) みたいなことしても反映されません。なぜ??
>>350 ON_UPDATE_COMMAND_UIに任せるべきかと。
>>350 サンクス
とりあえずそれでググってくる
ツールバーのボタンとかメニューの項目は、 暇な時(OnIdle)に項目の状態を更新できるコールバックを呼び出してくれるからな。 外側から明示的に状態を更新することはあまり無い。
Editコントロールを0文字にしたときに出る "整数を入力してください"ってーのがクソうざいんだけど
EM_LIMITTEXTが0文字を受け付けない仕様だから諦めろ。
>>354 エディットボックスにintを関連付けなければよい。
357 :
デフォルトの名無しさん :2010/03/16(火) 11:10:58
CButton でボタンをスイッチのように、クイックすると凹んだ状態、もう一度クイックすると元に戻るように したいのですが、どうすればよいでしょうか?
クリックだろ チェックボックスにしてPushLikeにするのがいいかも
>>359 break pointしかけてデバックしてみろや
煽るだけの奴って、技術的な話からは逃げてるんでしょ?
こぴぺ乙
猫でもは時間の無駄にしかならないと思う。
煽るだけ、答えねぇやつばっかw かわいそうだから・・・ /D "_WINDOWS" でOK
MDIでプログラムしているんですが、各子ウィンドウでメッセージが来ない間、 ウィンドウ別にCWinApp::OnIdleのように処理をするようにしたいのですが、 何か方法なないでしょうか? 単純に思いついた方法はCWinApp::OnIdleで各子ウィンドウを調べて一つずつ 処理させるくらいしか思いつきませんでした。 各子ウィンドウにスレッド処理させる方法も考えたのですが、案件の仕様で ダメなので使えません。
>>365 アイドル時の処理というのがどの程度の頻度なのかにもよるけど、
定期的にというものなら、タイマじゃダメ?
windowが増えたら増えた分だけたくさん仕事ができるんならあれだけど、 ウインドウごとにアイドル調べる意味がわからん。 各子ウィンドウにスレッドじゃないんだから中の人はひとりなんだろ
368 :
357 :2010/03/17(水) 10:05:09
>>358 ありがとうございます。
CButtonのスタイルをPushLikeにしてみて、それで無理そうならチェックボックスに変更してみます
>368 MFCならFeature Packも視野に入れるといい。
へこんだボタンなら大昔から普通にあるけど
371 :
256 :2010/03/17(水) 13:02:45
>>365 DocView使ってるなら
UINT __cdecl CMyEditApp::OnIdleWT(LPVOID pParam) // ワーカースレッド
{
POSITION pos(theApp.GetFirstDocTemplatePosition());
CDocTemplate* pdt(theApp.GetNextDocTemplate(pos));
CMyDoc* pDoc;
if(pdt == NULL || (pos = pdt->GetFirstDocPosition()) == NULL)
{
ml.Unlock();
continue;
}
while(pos != NULL)
{
pDoc = (CMyDoc*)pdt->GetNextDoc(pos);
pDoc->OnIdleWT();
} // 改行がおおすぎますだとー!
372 :
371 :2010/03/17(水) 13:09:06
名前に勝手に数字が・・・256さんごめんよ ソース結構削ってるから脳内補完してね theApp::OnIdle()とExitInstance()からSetEventで起きるワーカースレッドでwhile(1)の中をWaitforMulti〜してます
ワロタw何たる偶然w
アプリ起動したときに、タスクバーに表示される物?を右クイックして 表示させたメニュー(CMenu)てどうやって取得しますか? GetSystemMenu()だと思ってたらとれなかった
また君か
CMFCRibbonEditでエディットを作成したんですけど、ReadOnlyになっています。 Enableさせるにはどうしたらいいでしょうか?
378 :
365 :2010/03/18(木) 00:49:36
なるほど。いろいろ方法がありますね。 DocViewは使ってないんですが、少し実験してみます。 ありがとうございます。
379 :
デフォルトの名無しさん :2010/03/18(木) 16:20:40
.netのフォームコントロール(グラフ関係のコントロール) をMFCダイアログ上に持ってきて使うとか可能ですか?・ VS2008を使ってます 宜しくお願いします
可能じゃなかったらVCで.netやる意味がないだろ
381 :
デフォルトの名無しさん :2010/03/19(金) 08:17:22
具体的にはどうやるんでしょうか? MFCと.netじゃあ言語が違いますし DLL?とか使うんでしょうか?
Windows フォーム コントロールをホストする
383 :
デフォルトの名無しさん :2010/03/19(金) 09:06:30
ありがとうございます Windows フォーム コントロールをホストでぐぐったら CWinFormsDialogっていうのがあるみたいですね ただ、これはマネージドC++?ってやつですね 未経験で動くか不安ですがやってみます
CHtmlViewで更新をかけたときに読み込みのため一瞬白い画面になるのですが、 完全に読み込みが終了したときに再描画をするにはどうすればいいでしょうか? Visual C++ 2005
自前でDCに描画すれば?
CWnd::LockWindowUpdateじゃだめか?
CListCtrlで選択状態となった、選択状態が変化したってことをしるには どのメッセージを受け取るの?
>>387 ON_NOTIFY メッセージで LVN_ITEMCHANGED をキャッチする
CFormViewにCPropertySheetをCreateし、CPropertyPageをAddPage してそのPage内にエディット、ボタンなどのコントロールを配置しました。 ボタンが押されたことをCFormViewがで知りたいので、イベントハンドラウィザード でCFormViewにOnBnClickedButton11を追加しましたが OnBnClickedButton11が呼ばれません。 お分かりになる方、ご助言願います。 Visual Studio 2008
子(ボタン)が押されたコトを知ることができるのは親(ボタンのあるページ)だけ。 だから、それを曾祖母さんに知らせるのは親の役目。
親が曾祖母さんに知らせるのはどうやればいいのですか? 子から曾祖母さんのCWnd*は取得できて、曾祖母さんのメソッドをコールするために 曾祖母さんのヘッダをincludeしたら、循環参照でビルドできないんで、 他に通知する術はありますか?
>循環参照でビルドできない 前方宣言すりゃよかろ。 >他に通知する術はありますか? 曾祖母さんのCWnd*が取得できてるなら、曾祖母->SendMessage(「押されちゃったよ〜ん」)してもよかろ。 ナニゴトにも会話は大事。 「押されちゃったよ〜ん」は WM_APP+1 でよかろ。
ワーカースレッドの実装例をネットで調べてると、 ダイアログクラス内のメンバをいじる重い処理をワーカースレッドにする際、 AfxBeginThreadにthisを渡しているものをよく見かけるんだけど、 これって、CWndオブジェクトをスレッドを跨いで使っていることにはならない?
スレッドを跨いで使っちゃいけないとでも?
わざわざ「通常」と断ってるんだから、当然そうでないやり方があるということ
まぁ、日本語の理解力がこの程度じゃ、PG能力も知れてるわな。 つか、痴れてるかw
CListCtrlでLVNI_SELECTED もしくは LVNI_FOCUSEDが立ってるItemの検索って GetNextItem(-1,LVNI_SELECTED|LVNI_FOCUSED); でいいですか?
なぜ試さんのか
VisualC++2008 MDI リボンにエディットボックスをつけようと思い、 MainFrameのInitializeRibbonでpPanel->Add(new CMFCRibbonEdit(IDC_RIBBON, 200) ); としていますが、実行してみるとエディットはありますが、グレイになっています。 どうすれば、エディットを使用できるようになるのでしょうか?
vs2010 のVC++ 新機能 ・MFC FeaturePack 機能をリソースエディタで使える ・リソースエディタにリボンデザイナーの追加 ・インテリセンス機能の大幅改善(1行入力した時点でコンパイルエラーを指摘) ・ClassWizard をVC6 形式で復活 ・Find 機能の大幅拡張 これは買いだな
>・インテリセンス機能の大幅改善(1行入力した時点でコンパイルエラーを指摘) 1行でよかった。もし1字だと使いもんにならん。w
CMFC〜関係使用時のレジストリ強制使用仕様はどうなったの? ベータ版ではまだダメだったけど。
CDC::DrawTextでこの表示横幅とこの文字列で縦何ドット必要になるかって 自分でシコシコ計算するの?なんか便利なメンバある?
>>403 >・ClassWizard をVC6 形式で復活
Ctrl+W!!
>>408 即レスありがとー。教えてもらったのでうまく出来ました。
CComboBoxをオーナードローをやってるんですが、 リソースエディタでのデザイン時より、実行時のほうの高さが高いんですけど なんでですか?
仕様です。
親ダイアログを閉じたときに子ダイアログを全部閉じるにはどうすればいいですか?
DestroyWindow
特に何もしなくても親が閉じたら子も閉じるはず
CWnd派生クラスが、任意のタイミングで、自分自身のスタイルに依存せずに 「いま自分自身にスクロールバーが表示されているか(グレー化も含む)」を 知る方法はありますか? スクロールバー領域も含めたクライアント領域のサイズが欲しいのですが、 GetClientRect()はスクロールバー領域は含まれないので、 「表示されているときにはGetSystemMetrics(SM_CXVSCROLL)の値を加える」 という処理を付けたいのです。
>>416 >自分自身のスタイルに依存せず
の意味が不明だが、WS_VSCROLLが付加されているかどうかを調べればよいのでは?
>>417 これでよかったのですね。
WS_HSCROLLやWS_VSCROLLって、作成時に使うものであって、
SetScrollInfo()でスクロール幅をいじって表示状態が変わったときに
勝手に連動して切り替わってくれるものではないと思ってました。
ありがとうございます。
Direct2Dに対応したMFCって出る予定ある? 例えばDirectWriteに対応したCEditDWクラスとか。
ない。
421 :
デフォルトの名無しさん :2010/04/15(木) 15:47:33
VS2008でMFCやってます リストBOXをクリック(又はダブルクリック)したら 小窓を出すようにしたいのですがうまくいきません リスト項目が存在しててクリックした場所が 項目の上にあれば問題ないのですが 項目が無いところをクリックしても無反応です。 ハンドラは以下のを使ってます。 ON_LBN_DBLCLK ON_LBN_SELCHANGE 項目が無いところをクリックしても 小窓が出るようにするうまい方法ありませんか?
>>421 CListBoxを派生してWM_LBUTTONDBLCLKあたりを自分で処理すればよいかと。
「小窓」などというワケのわからん独自の単語を使わないように。 リストボックスをリストコントロールに変えれば、お望みのことができる。
424 :
デフォルトの名無しさん :2010/04/15(木) 16:11:13
親側で処理は不可能ですか;; ちょっと小窓開くだけの処理で派生とかしたくない;;
425 :
デフォルトの名無しさん :2010/04/15(木) 19:31:19
リストコントロール用のLBN_*じゃなくて コモンコントロール汎用のNM_CLICKとかで対応できるんじゃないか?
>ちょっと小窓開くだけの処理で派生とかしたくない 。。。
427 :
デフォルトの名無しさん :2010/04/17(土) 18:18:50
VS2008でMFCを使用しています。 CMFCPropertyGridCtrl内のプロパティの値が変化したときのメッセージを 受け取ろうと思って以下のコードを入れてみたのですが、 プロパティを変更しても呼ばれないです・・・ メッセージマップ BEGIN_MESSAGE_MAP(CPropertiesWnd, CDockablePane) (中略) ON_MESSAGE(AFX_WM_PROPERTY_CHANGED, &CPropertiesWnd::OnChangePropList) END_MESSAGE_MAP() int CPropertiesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) (中略) // CMFCPropertyGridCtrlの作成 m_wndPropList.Create(WS_VISIBLE | WS_CHILD, rectDummy, this, ID_PROP_LIST) (中略) } LRESULT CPropertiesWnd::OnChangePropList(WPARAM wParam, LPARAM lParam) { プロパティ変更時の処理 }
428 :
427 :2010/04/17(土) 18:27:20
途中で投稿してしまいました。 申し訳ないです。 CMFCPropertyGridCtrl内のプロパティ値が変更されたときのメッセージを 受け取る方法は無いのでしょうか? ご教授お願いします・・・。
ON_MESSAGE()の2番目の引数って'&'いるんだっけ?
>>428 CMFCPropertyGridCtrlを派生させ、
仮想関数ValidateItemData内で
CMFCPropertyGridPropertyのポインタpPropから必要な値を取得し処理をする。
432 :
427-428 :2010/04/18(日) 01:04:04
>>431 氏
派生先で処理を書いたらできました。
ありがとうございました!
ダイアログベースで作成したアプリに最小化ボタンを追加したくwwwを探すと WS_MINIMIZEBOXを設定すればいいらしいのですが、Createされた後に このフラグをセットするにはどうすればいいのですか?
なんでCreateされた後なの? リソースエディタで設定すればいいだけじゃないの? 何かのタイミングで最小化ボタンを追加するの?
>>434 プロパティウィンドウにありましたね
お手数おかけしました。
ありがとうございました。
SDIウインドウの子にCEditを表示して使っているのですが、 例えばアクセラレータキーで[A]キーを使用していると、Aの文字が打てなくなります。 これでは困るので、一時的にアクセラレータキーを無効にする方法を相談したいです。 わかる方いらっしゃいましたらどうかご教示お願いします。
>例えばアクセラレータキーで[A]キーを使用していると これが間違い。Ctrl+A とかにする。
>>437 ありがとうございます。
一応[A]キーってのは極端な例のつもりだったのですが、
WM_CHARで使うキーは避けるしかないということなんですね。
使う方だってこれから押すキーがショートカットなのか入力なのか 常に気にしてなきゃいけなくなるだろう
>>436 メインウィンドウのPreTranslateMessage()で。
CFrameWnd::PreTranslateMessage()のソースを読めば分かる
>>421 ついでに、そちらも派生したくないのであればPreTranslateMessage()でいける。
PreTranslateMessage?
デフォルト状態ではリターンやエスケープでダイアログが閉じるけど 複数行のedit上にフォーカスある時はリターンで閉じないだったかな みんなリターンやエスケープで閉じないよう直してるから忘れた。
ES_WANTRETURNスタイルつけないと複数行でもいくよ
CStringに円マークが入れれません CString str(_T("\")); とするとコンパイルエラーなるから CString str(_T("\\")); としたら、本当に2つ入っている・・・
CString str(_T("\x5c"));
知ったか乙
VS2010で試したら、「\\」で一つしか入っていなかったぞ。 確認方法自体が間違っていないか?デバッガで中身を覗いてみろ。
CFormViewやCPaneDialogに子ダイアログを置いているのですが、 その子ダイアログの中のコントロールにフォーカスがある状態だと、 ALTを押してもメニュー(CMFCMenuBar)に移ってくれません。 さらに、逆にメニュー表示中にそれらのコントロールをクリックすると、 メニューが消えないままフォーカスが移ってしまいます。 CFormViewやCPaneDialog自身に置いてあるコントロールからだと ちゃんと動くのですが、このへんの仕組みに詳しいかたはいらっしゃいませんか?
CListCtrlにLVS_EX_DOUBLEBUFFERを設定しようと SetExtendedStyleを実行してますが、設定されていないようです。 spy++で確認 なぜですか?
CFormViewだって子ダイアログだろ というか子ダイアログだとか置くだとかどうにでも取れる表現だな
>>450 確認方法が間違っているから。
ウィンドウの拡張スタイルとLVS_EX_???とは無関係。
>>450 これで確認してみては?
CListCtrl::GetExtendedStyle
>>450 LVS_EX_DOUBLEBUFFERはcomctl32のバージョン6からのものだから
manifestでバージョン6のものが適用されているかどうか確認してみ。
あと、「LVS_EX_DOUBLEBUFFER」がちゃんと設定されていても
spy++のバージョンによっては拡張スタイル欄に出てこないものがある。
VC2008付属のspy++(ver9.00.30729)ではちゃんと出るが、
例えばVC6付属のspy++(ver6.00.8168)では出ない。
VC6のは新しいスタイルができる前のものなんだから当然のこと。
マルチスレッドのプログラミングで質問です。 プログラムの概要は、社内LANの複数のIPアドレスに対し、 スレッドを複数立てて順番にpingを打ち、対象アドレスの生死を判定するものです。 IPアドレスは概算で3000件以上で、それを50個ほどのスレッドを立てて 順番に処理していく事を想定しています。 pingを打つ処理はクラス化してあり、クラス構築時にDLLのハンドルを渡し、 pingを打つ関数は、アドレスを文字列で渡し、結果をintで返します。 このクラスオブジェクトをスレッドに持たせて実行したいと考えてます。 スレッドの挙動としては、起動したらICMPの初期化をし、一覧からIPアドレスを引き取り、 pingを打って結果を格納し、また次のアドレスへと進んでいきます。 そして、全てが終わったら自殺するものを想定しています。 また呼び出し側では、処理状況をダイアログのブログレスバーに表示し、 全てのスレッドが終了したら開始前の状態に戻ります。 中止ボタンを押せば、その時点で全てのスレッドを終了させます。 このようなスレッドの実装方法を教えてください。 環境はVC6です。 なお、セキュリティ管理の都合上、Vector等で探してきた既存ツールの使用は禁止です。
pingはよろしくない arpにしよう
一つのIPアドレスにpingを打つ処理を一つのタスクと考えて、 pingを打つ処理を担当する50個のスレッドを生成。 スレッド側は新しいタスクの取得しては応答を戻し、 新しいタスクが無い時は終了する。 コントローラ側は全スレッドが完了したら作業終了と判断する。 こんな感じ?
458 :
299 :2010/04/24(土) 18:58:26
C#で作ればいいのに
そんな素人が思いつきで作った方法で突っ走る前に 既存のまともなネットワーク管理ツールがどうやってるかぐらい調べた方がいい。
社内LANならそういうやり方はあり得ないよな 本気でそういう方法がよけりゃスパムメール送るツールでも参考にすればいい。
遅かれ早かれ本物の管理者から苦情が来て禁止される
VS2010からまたMFCが面白いことになりそうだね 今は前より選択肢が増えてるから最盛期には及ばないかな? ツールはMFC派な俺には楽しみな限り 資料とかいっぱい出てくれると最高なんだが
MFCがバージョンアップするなら.netを駆逐できるか
.netなんかのマネージドコードとは別の方向へ特化して進化するみたいだからどうだろう? Vistaや7なんかの新世代OS向けの 最新機能を備えたネイティブアプリを開発する上では強力なツールにはなりそうだ
CEditViewベースでドキュメントビューMDIアプリを作成してます 標準で作成される ウィンドウメニューの「新しいウィンドウを開く」の挙動を VisualStudioと同じように現在のビューと同じ内容のウィンドウを開くにしたいのですが とりあえず泥臭い方法ですが void CMainFrame::On*******() { // 現在アクティブなドキュメントとヴューを取得 CMDIChildWnd* pActiveChild = MDIGetActive(); CDocument* pDocument = pActiveChild->GetActiveDocument() ; CView* pView = pActiveChild->GetActiveView() ; // 現在のビューのテキストを取得 int ndx = pView->GetWindowTextLength()+1; wchar_t *buff = new wchar_t[ndx] ; pView->GetWindowText(buff, ndx) ; // ドキュメントに新しいビューを追加し有効にする CDocTemplate* pTemplate = pDocument->GetDocTemplate(); CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild); pTemplate->InitialUpdateFrame(pFrame, pDocument); // 新しく開かれたビューにテキストを書き込む pView = pFrame->GetActiveView() ; pView->SetWindowText ( buff ) ; pView->UpdateData() ; delete [] buff ; } と実装したのですが もう少しスマートな方法ないですか? 標準で用意されててもいいような気もするのですが・・・
わざわざコピーペしてるぐらいだから片方を編集したらもう一方も更新するんだろ チュートリアルにスプリッタでそういう仕様のサンプルがあった
// 現在のビューのテキストを取得 >int ndx = pView->GetWindowTextLength()+1; >wchar_t *buff = new wchar_t[ndx] ; >pView->GetWindowText(buff, ndx) ; CEdit::GetHandle()を使えば、バッファを用意しなくてすむ・・・程度かな。
CCtrlView* pView = (CCtrlView*)GetActiveView() ; みたいなダウンキャストをしてもちゃんと動いてるっぽいんですが MFCではそれが安全なように設計されてると考えてOKですか? それとも危険な場合がありますか?
曰く、 MFC がサポートする CObject の実行時型指定機構では、マクロ DECLARE_DYNAMIC、IMPLEMENT_DYNAMIC、 DECLARE_DYNCREATE、IMPLEMENT_DYNCREATE、DECLARE_SERIAL、IMPLEMENT_SERIAL を使います。 これらのマクロは、実行時の型チェックによって安全なダウンキャストを保証します。
Visual Studio .NET 2003を使ってリストコントロールを操作してるのですが、 以下の関数がビルド時にエラーになって使えないのですが、原因がなにかわからないでしょうか? : error C2039: 'SetSelectedColumn' : 'CListCtrl' のメンバではありません。 GetItemCount()などは問題なく使えているんですが、SetSelectedColumnやSetViewが 上のエラーが出てしまいます。 自分のマウスによる操作以外でアイテムを選択状態にしたいのですが、 上の関数以外を使って実現することってできるのでしょうか?
>>470 #define _WIN32_WINNT 0x0501
>>471 ビルドは_WIN32_WINNTの変更だけでは更にエラーがでたので、
stdafx.hにある4つを書き換えることでエラーは消えたのですが、SetSelectedColumnを
つかっても選択状態になることはありませんでした。
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0501
べつのキーワードでググったら使える関数(SetItemState)が見つかったので、問題は
解決しました。ありがとうございました。
MFCのCIpAddressCtrlのGetAddressが返す値と inet_addrが返す値がちがうんですけどどういうことですか? どのように使用してますか? 例えば”127.0.0.1”の場合 GetAddressは0x7f000001 inet_addrは0x0100007f を返します
>>473 inet_addrはビッグエンディアンで返すから。
ntohlとかで変換する。
というか、socket系はその関数群で完結したらそのまま使えるよ 他のライブラリと行ったり来たりするから変換が必要になる
初歩的な質問でもうしわけありません。 CFileDialogを使用中にカレントディレクトリが変わらないようにする方法ってありますか? OFN_NOCHANGEDIRを指定した場合、ファイル選択後に元に戻るのは確認しましたが 選択中はどうしても選択しているフォルダにかわってしまいました。
もう少し分かり易い日本語で頼む
MFCのみで起きる問題ならCFileDialogのソース見て対策考えるか CFileDialogやめて直にapi呼べばいい。
api側のGetOpenFileNameが変更してるのか ならMFC関係ないな
カレントディレクトリに頼る実装に問題が・・・
>>480 ヴァカは氏ねば? コモンダイアログ使ったことないだろ、雑魚PGが。
>>476 呼ぶ前にGetCurrentDirectory、呼んだ後にSetCurrentDirectory。
・・・。
>481 質問者が OFN_NOCHANGEDIRを指定した場合、ファイル選択後に元に戻る と言ってるからそんなことしても意味ないだろ
>>481 質問者がOFN_NOCHANGEDIRも出してるのに
それすらも知らないとはw
それとも3行以上の文章は読めないとか
>>476 >CFileDialogを使用中にカレントディレクトリが変わらないようにする
具体例を示せ。
どういう状況のとき、どうしたいのか。
Qtとどっちが使いやすいですか?
慣れている方。
MFCのソースって今公開されてるの? VC6の時はついてたけど。今はどこにあるのかな?
HDDの中
VS2010でもきちんとインストールされているぜ。 というか入っていなかった日には非難轟轟だな。
ChtmlViewを使っているのですが、URLを指定して表示させたものに対して、 LineToなどで線を引いいたりするにはどうすればいいでしょうか?
492 :
491 :2010/06/03(木) 00:29:39
すみません、書き忘れました VC++2005です
し! _ -── ‐- 、 , -─-、 -‐─_ノ M 小 M // ̄> ´  ̄  ̄ `ヽ Y , ´ ) F え 学 F L_ / / ヽ C | 生 C / ' ' i マ ま が / / く !? ジ で 許 l ,ィ/! / /l/!,l /厶, だ さ i ,.lrH‐|'| /‐!-Lハ_ l /-!'|/l /`'メ、_iヽ よ れ l | |_|_|_|/| / /__!__ |/!トi i/-- 、 レ!/ / ,-- レ、⌒Y⌒ヽ ね る _ゝ|/'/⌒ヽ ヽト、|/ '/ ̄`ヾ 、ヽト、N'/⌒ヾ ,イ ̄`ヾ,ノ! l の 「 l ′ 「1 /てヽ′| | | 「L! ' i'ひ} リ は ヽ | ヽ__U, 、ヽ シノ ノ! ! |ヽ_、ソ, ヾシ _ノ _ノ -┐ ,√ !  ̄ リ l !  ̄  ̄ 7/ レ'⌒ヽ/ ! | 〈 _人__人ノ_ i く //! 人_,、ノL_,iノ! /! ヽ r─‐- 、 「 L_ヽ r─‐- 、 u ノ/ / / lト、 \ ヽ, -‐┤ ノ キ 了\ ヽ, -‐┤ // ハ キ { / ヽ,ト、ヽ/!`hノ ) モ |/! 「ヽ, `ー /) _ ‐' ハ ャ ヽ/ r-、‐' // / |-‐ く | > / / `'//-‐、 / ハ ハ > /\\// / /ヽ_ ! イ ( / / // / `ァ-‐ ' ハ ハ / /! ヽ レ'/ ノ > ' ∠ -‐  ̄ノヽ / { i l ! / フ / -‐ / ̄/〉 〈 \ /!
あ〜普通にMFCのソースインストールされてるね。 気がつかなかった。
リストコントロールで例えば10個ほどアイテムがあり、5番目を上から2番目に 移動させたい場合に用意されている関数で実現する方法ってないでしょうか? ググってもソートはあるのですがアイテム単体での移動をしてる例題が ありませんでした。 左の表示を右のように並べ替えたい。 0001 テストデータ1 サンプル1 0001 テストデータ1 サンプル1 0002 テストデータ2 サンプル2 0005 テストデータ5 サンプル5 0003 テストデータ3 サンプル3 0002 テストデータ2 サンプル2 0004 テストデータ4 サンプル4 0003 テストデータ3 サンプル3 0005 テストデータ5 サンプル5 0004 テストデータ4 サンプル4 … … itemMove(5,2)みたいに出来ればいいのですが・・・ ごり押しで書き換えれば実現できそうですが、内容のコピーの処理時間が無駄に 成りそうなので挿入1回で済む方法があればと思いまして。
リストビューコントロールならいちいち移動しなくても可能
>>495 ググりかたが悪いんだろ。いや、悪いのは頭か。
ドラッグで順番入れ替えるサンプルとか見たことないのか、この低脳。
オーナーデータで処理すればコピーは発生しないよ。 コントロールに全部任すのは楽だけど、いろいろ拡張したいときに 不便になるからオーナーデータがお勧め。
MFC、VS無償版で使えないからキライ
500 :
495 :2010/06/06(日) 17:20:35
なんか難しく考えすぎてました・・・ 挿入はInsertItemのアイテムのインデックス値を指定してやれば可能でした。 最初のリストを作ったときはアイテム数をインデクス値にして最後に追加する処理をしていたので、 思い込みでリストの最後にしか追加されないと思って、この関数は全くチェックしていませんでした。
>>500 難しいとかじゃなくて、センスのなさだろ。
ふつうに考えて、どこに挿入するかなんて、指定できて当然。
そういうことに頭の回らない、ヴァカさ加減を自覚しろ。
>>500 質問してみてから自分なりの回答に気がつくパターンだな。
まぁ慣れだ。いろいろ試してみるといい。
イベントハンドラを追加しようとすると 表示がグレーになって追加できません。 他のプロジェクトはできるのですが、、、 プロジェクトファイルが壊れちゃったんでしょうか?
そのイベントを受け取らないんだろ
すみません自己解決しました ncbファイル消したら治りました。。。クソVSめ。。。
506 :
デフォルトの名無しさん :2010/06/16(水) 12:00:05
CStringとかでGetLengthで文字数をかえしますが これをバイト数で返す方法ありますか? 大文字小文字混在文字列だと単純に×2にもできませんよね??
GetLength() * sizeof (TCHAR) でどう? UNICODEの時は単純に文字数×2だし マルチバイトの時はGetLength==バイト数だし
リストコントロール.SetView(LV_VIEW_DETAILS) ってやってもレポートビューになりません。
リソースエディタをいじったらOKでした
510 :
デフォルトの名無しさん :2010/06/20(日) 19:06:49
VC6でテキストの文字をコピーしたバッファを操作したいのですが どのような関数を使用するのか教えてください。
>>510 クリップボードの内容を弄りたい、って事でOK?
MFCに拘るなら、
COleDataObject::AttachClipboardでデータを持って来たり、
COleDataSource::SetClipboardでデータをセットしたりとか、
そんな感じかと。
512 :
デフォルトの名無しさん :2010/06/20(日) 20:00:44
>>511 ありがとうございました。
>>506 BOOL bDefault=FALSE;
size_t nSize = WideCharToMultiByte(CP_ACP, 0, szData/*データ*/, -1, NULL, 0, NULL, &bDefault);
でどう?
タブコントロールでタブをクリックしたときに、 そのタブが前に来ないようにするのってどうやんの?
まるちんこ
300x300pxのピクチャコントロールについて、 ・→―― ↓ | というデフォルトの座標系を | ↑ ・→―― | | このように変換したいと考えています。 (原点を左上隅から、(左隅、コントロール中央)に移動し、Y軸を反転させる) pDC->SetViewportExt(300, -300); pDC->SetViewportOrg(0, 300/2); とやってみましたが、Y軸は反転せず、ピクチャコントロールの 上半分も描画されない状態です。どなたか解決方法ご教示お願いします。
日本語でおk
リストビューのアイテムにツリーを使うことってどうすればできますか?
ググってみるとVisual Studioのウォッチウィンドウ云々と出てくるのですが、
まさにそういったことがしたいのです。
ヒントでもよいので、教えていただけると嬉しいです。
>>519 VC++ならクラスビューで、クラスを選択してプロパティ。
プロパティビューの中でメッセージボタンをクリックするとWM_TIMERがあるはずです。
そうです。 色んなサイト見てみたのですけど、 「自前で」と書かれてるものばかりで困ってしまったもので。
おお。ソースファイルがあるのですね。失礼しました。 読んでみます。 ありがとうございます。
IPアドレスの変更をアプリで無理でしょうか?
address transfer か
netsh
そう書けば教えてもらえると思ったら甘いよ
どっかのスレでソース貼ってあったのを見覚えがある
ip helper apiでググレばおk
MFCじゃないし
Windows7 でシャットダウンや再起動を中止させる方法を教えてください。 OnQueryEndSession で FALSE を返しても画面が暗くなり、 終了しないプログラム一覧が表示されてしまいますが、これを回避したいです。
>>533 MFC関係ないし。
なんとなく文面もムカつくから、スレチとだけ言っておく。
何がお前をむかつかせるのか
この暑さのせいだな。
キーボードアクセラレーターのTranslateAcceleratorが生成した WM_COMMAND内で、どのアクセラレーターが押されたのか 判別する方法ってない? もしくは、アクセラレーターに付属のパラメーターをつけて、 WM_COMMANDで取得する方法。 ユーザーが動的に追加していくコマンドとして 一つのCOMMANDを複数のアクセラレーターで共有しているので、 それぞれを判別したい。
wParamのhighをまだ使ってないならそれで 使ってるなら、lParamでアクセスできるようにして入れるとか?
539 :
537 :2010/07/28(水) 14:22:33
アクセラレーターの場合、wParamの上位ワードは1で固定らしい。 lParamは0だった。
CListCtrlを継承して作っているのですが、 PreCreateWindow を上書きしてもコールされません。 OnCreateも駄目でした。 クラス内で生成時にスタイルを設定させたいのですが どうやればいいのでしょうか?
DDX_CONTROLでアタッチしている予感。 あれは、既に作成済みのコントロールに対してサブクラス化することで、 派生クラスにメッセージをルーティングしているだけだから。 普通にCreateから始めるしか無いんじゃないか?
どうしても担当者がやれやれうるさかったらリストをリソースにスタイル数分貼り付けて 目的のスタイルのものを表示してアクティブにしてやれば解決だぜ
CAsyncSocket使ってメールチェッカー作りたいんだけど、非同期ソケットだと順番バラバラで脳みそ軽く膿んだ。 この場合CAsyncSocketをCSocketみたいな同期クラスに作り直して使った方がいいんだろうか?(CSocketは嫌) 「非同期ソケットでいけるだろ」とか「同期ソケットでマルチスレッドの方が簡単だろ」とかアドバイスよろしく。
>>543 普通に非同期でいけるだろ。
そもそも同期ソケットでマルチスレッドとか、複数アカウントを同時にチェックしたいとか
そういうことか? せいぜい数個のアカウントならどっちでもいいだろ。アフォか。
このまま非同期で続ける事にしたよ。レスありがと。
てすと。
シングルダイアログのプログラムを新規作成するときに 最小化ボタンを付けるのを忘れてしまいました、後から追加することはできないのでしょうか?
すんません、いろんなキーワード(CListCtrl、改行、Multiline、リストビュー、オーナードロー) などでググったんだけどわからなかったから教えてください。 CListCtrlのサブアイテムのテキストを複数行にして、 セル(?)の高さも適切に調節したいんだけど、やる方法はありますか?
オーナードローしかないな オーナードローのやり方がわからないって話か?
わざわざMFC限定スレで質問してるから MFCのみでやりたいんじゃないか
>>549 サンプルなんて、普通に見つかるじゃん。
それとも、英語はダメなヴァカ?
CAsyncSocketを使用して、TCPサーバを作成しています。 複数のクライアントからの接続を受付られるようにしようとしてます。 1対1で通信できるところまでは作成できました。 OnReceiveで、受信できる準備ができたことはわかるが、どのソケットから受信可能なのか 知る方法はありますか?複数との通信の場合は、どのようにしたらいいのでしょうか?
1対1が複数
>>554 クライアントからの接続要求は、
Acceptメソッドで別々のCAsyncSocketに振り分ける事になると思うのだが。
何か作り方を間違っていないか?
>>556 作り方は間違ってないだろ。
複数セッションの概念は理解してなさそうだが。
554です。自己解決しました。 CAsyncServerDlgクラスで CArray<CServerASock*> m_lstcSockをメンバに持たせること。 OnAcceptで、クライアントと通信するソケットを配列に追加する。 CServerASock::OnReceiveで以下のようにソケット自身も渡す。 void CServerASock::OnReceive(int nErrorCode) { //if (m_dlgP) m_dlgP->OnReceive(nErrorCode); //修正前 if (m_dlgP) m_dlgP->OnReceive(this, nErrorCode); //修正後 CAsyncSocket::OnReceive(nErrorCode); } このようにしてみると、CAsyncServerDlgで管理するソケット配列と受信できるソケット との対応が取れるようになり、うまくいきました。
559 :
デフォルトの名無しさん :2010/09/17(金) 10:09:29
MFCでVC2005を使ってます ハンドラを追加しようとしたら コード要素’XXXX’が読み取り専用であるため、追加削除操作は実行できません と、エラーになります。 いろいろネットで探して解決策をやってみました ・関連するソースを閉じる ・ncbファイルを削除する しかし、どれをやっても解決しません 手動で追加できなくもないですがかなり不便です どうか解決策しってたら教えてください
メッセージの言ってる通り、読み取り専用なんじゃないか?
2008だけど宣言だけ残ってたりするとそんなメッセージでるな。
562 :
559 :2010/09/17(金) 11:05:19
すいません 色々いじってたら治りました 恐らくxxxxのヘッダファイルをプロジェクトに 登録してなかったから見たいです #includeで読んでたから大丈夫かと思ったんですが VS側からみるとヘッダどこ?って感じだったんだと思います
VS2005です。 ダイアログの中にリストコントロールを置いておいて、 セルをクリックするとエディットコントロールが起動するって機能を作っています。 このときのエディットコントロールはCEditを継承したもの(CMyEditとします)です。 このエディットは複数行OKであり、Enterキーにより改行させるところまでは実装しました。 改行キーが押されたときに、テキストの高さからRectを計算し、MoveWindowしています。 現状、このコントロールは、改行を増やしていっても、 親ウィンドウ(この場合はリスト)の最下部より下には表示できません。 これをなんとか、親ウィンドウ高さに関係なく、エディットコントロールの高さを決めることはできませんか? 1つだけ、試したみた方法がありますがうまくいきませんでした↓↓ CreateのときにWS_CHILDを指定していると親ウィンドウの内部にしか表示できない、 という情報を見つけたので、CreateExを使ってWS_POPUPを指示してCreateしようとしましたが、 エラーが発生しました(戻り値0)。下のように書きました。 myEdit.CreateEx(0, "EDIT", 0, WS_POPUP|ES_MULTILINE.(略), rect, parent, -1);
親なしでコントロール出したことないな 別にウインドウ出してそこにコントロール貼るのが普通な気がする
なんでググらないんだ? キーワードが分からんのか? 根本的な部分で、Windowsプログラミングを理解してない気がするが、 MFCとかC#とか、Win32 APIを直に使った経験がないからそうなるんだろうか。 いまどきProgramming Windowsを読めとはいいにくいが、ネット上での情報収集ぐらいできんものか。
>>564 なるほど、最悪それで回避可能かもしれません
>>565 ググッたか→4時間ぐらい戦った
Win32 API→経験なし
MFC経験だったそんなにないけど、やらなきゃいけないんですよ。
CreateExのやり方調べたり、自作クラスをRegisterしてみたりもしましたよ。
でもたどり着けなかったんです。
そんなに言うならきっと経験豊富だと思うので
キーワードだけでも教えてくれるとうれしいなぁ
Code Project、codeGuruで一発で出てくるんじゃね?
568 :
デフォルトの名無しさん :2010/09/17(金) 16:21:41
>>566 たとえば、ツリービュー、リストビューのラベル編集。
ツールバーのサブメニューだったり、ドロップダウンリストのリスト部だったり。
イベントを受けて、領域を決めて、ウインドウを表示する。
表示内容は異なるが、やってることは全部一緒。ラベル編集はともかく、他のは親のサイズに関係なく表示できてるでしょう?
(ラベル編集でもできるけど)
>>568-569 実は今回修正しているソースにリストから起動するコンボボックスがあるので見てみました。
確かに、コンボボックスは親のサイズに関係なく描画できていました。
ただ、そのコンボボックスのCreateにはWS_CHILDを使っているし、
特別なことをやっているようには見えませんでしたが…
POPUPだということなので(ありがとうございます)、さらに調べてみます。
コンボボックスも親のサイズに関係するよ はみ出るのはドロップダウンだけ
test
574 :
571 :2010/09/17(金) 16:51:48
>>572 あー、そういえばCBS_DROPDOWNでした。
ではそいつは参考にはならないってことですね
コンボボックスのドロップダウンリストなんかは、デスクトップを親にしてるけどな。
鸚鵡返しは嫌われる例
577 :
571 :2010/09/17(金) 19:07:27
今週は詰んだわ。また来週やります。 もし、心優しい誰かが、ここ見ればすぐわかるからてめぇで読めやっつって どこか教えてくれると最高。 では、ひとまずお世話んなりました
>>563 なんか難しく考えすぎてないか?
親をリストコントロールにしてるから、コントロールの領域でクリップされてるんだろ?
親の指定をダイアログにしてやれば解決するよ。試してみれ。
580 :
563 :2010/09/17(金) 23:10:49
親子関係がダイアログ→リスト→エディットってなってるとこを、 ダイアログ→エディットになるようにしてみたけど、確かだめだったような… ちなみにエディットはリストがcreateしています。 せっかくアドバイスいただいたとこ申し訳無いのですが、 確認できないので、また来ます。
>>580 ダイアログを親にしたところで、結局そのダイアログの外には出せないよ。
そういうのやったことないな。 参考になるサイトない?
popup(またはダイアログ)のサイズを子供のサイズに合わせて変えるしかない
>>580 VS2010で調べてみたが、nIDに-1を指定しているのが原因っぽい。
Win32レベルでエラー返しているので2005でも事情は変わらないかと。
WS_POPUPだと、この引数はメニューハンドルと解釈されるので、
こんなメニューハンドル知らね、ってところなんじゃないか?
>>581 リストコントロールでクリップされる→ダイアログを親に
これだけ分かってりゃ、そんなこと言われなくても分かるだろ。ヴァカが。
ダイアログでのクリップを避けるなら、デスクトップを親にして、ダイアログの
移動にあわせてMoveWindow。
他人の揚げ足とるぐらいしか能(脳だな)がないなら、部屋から出てくるなよ。
なんで燃え上がっちゃうのかワケわからん
MFCは今後衰退していく?
中の人の趣味で進化は続いていくよ、 というか、最近の拡張は全部趣味でやっているとしか思えんw
Windowsのデバイスドライバを作る場合MFCは活躍するの?
MFC使ったデバドラなんてたぶんこの世にないと思う
インストールや設定その他で使うんじゃないか?
それはドライバとは言わない
594 :
デフォルトの名無しさん :2010/09/23(木) 18:08:11
ユーザーがOKボタンを押さなくても メッセージボックスを閉じるにはどうしたらいいでしょうか?
時間きめればいい
596 :
デフォルトの名無しさん :2010/09/24(金) 15:25:50
MFCで作ったプログラムですけどおかしな現象があります 4台の最近買ったサーバー機(WindowsServer2008-32bit)があります そのうち3台は買ってきたそのままで、1台は自分でクリーンインストールしなおしました。 ここに同じプログラムを起動してfor文の重い処理を走らすと クリーンしたPCだけまともな速さで動いて他の3台は遅すぎです 処理が動いてない時は0%なので他のプログラムが邪魔してるようにも思えず どうしてこんなに処理速度に影響がでてるんでしょうか? CPUはXeon E3110 3GHzです このような現象を知っていたら解決策を教えてください
フォアグラウンド優先かバックグラウンド優先かの選択がある
ウィルスバスターが入ってるんだ
599 :
デフォルトの名無しさん :2010/09/24(金) 17:13:21
全てバックグラウンド優先になってますが変更しても効果なしでした ウイルス対策ソフト関係は入ってないです もう、全Pcインストールし直しを考えてます 全然原因がわからない
質問の仕方を勉強し直せ
MFC関係ないだろ MFCがプログラムの全部の動きを仕切ってるとでも思ってるのか?
起動してるプロセスとかサービスとか全部比較しろよな
サポートセンターへ
>>601 MFCで作ったプログラムで問題が出ていると書いてある
つまるMFCを使わないプログラムなら差が出ないのかどうかをはっきりさせろ
605 :
デフォルトの名無しさん :2010/09/28(火) 11:27:57
MFCで作りましたアプリについてですが。 VCのセットアッププロジェクトであるPCにソフトを入れました。 その時のアイコンが気に入らなかったので作りなおして 新たにソフトを入れ直しました。 その後に、デスクトップに手動でショートカットを作ったら デスクトップ上だけ前のアイコンに変わりました。 前のアイコンを保持していたexe等はアンインストール&完全削除してるのに なぜ前のアイコンが出てくるんでしょうか。 最新のexe内には前のアイコンは保持されてません 恐らくWindowsが保持してる?気がするんですが Windowsが保持してるアイコン情報削除する方法ありますか?
ありますが、鼬害です。
Windowsの問題と思ってるのにMFCスレで質問する意図がわからん
611 :
デフォルトの名無しさん :2010/09/28(火) 13:00:33
>>610 クリアして再起動してもダメでした
午後もつぶれそう
Windowsは時々OSの再インストールするのがいいらしいよ
613 :
デフォルトの名無しさん :2010/09/28(火) 14:09:45
605 自己解決しますた
質問先でいろいろやり取りがあって解決したのを見て こっち来たら自己解決って、、、吹いた 騙り?
615 :
デフォルトの名無しさん :2010/09/30(木) 13:58:33
VS2005のMFCでMDIにして、最近はやりのタブ切り替えがドキュメントごとにできるようになる? 中古でVS2005買うかもしれないので・・
できるかと聞くなら、できると答える。 が、2008 or 2010の方がいいな。
>>616 オヌヌメは2008か2010ですか。ありがとうございます。
私のPCは2008Expのソースを保存するたびに固まるので
2005にしたいんです(;ω;)
できると聞いて、うれちんこ☆
出来ると言ってるだけで簡単に出来るとは言ってない。 ここでこんな質問をしてる時点でほぼ不可能だとは思うが・・・。
MFC使うつもりなら2008もExpじゃないんだよね? だったら2008か2010のがいいし、2008Sp1以降なら ウィザードでクリックするだけでタブ付きMDIが出来上がるw
>>619 ぽっくんのDDR1512MBのマシンじゃ、2008は固まってしまうんです><;
>>620 家のPCもDDRの1.5GBだが、x64Win7+VS2010を動かせているぞ。
……とかボケてみたり。環境は嘘じゃないけど。
自助努力
623 :
デフォルトの名無しさん :2010/10/04(月) 10:48:24
MFCを使ってファイルに高速にアクセスする方法ないでしょうか? 自分で考えたのはファイルサイズ分のメモリを動的に確保して ファイルの内容をごそっとメモリに展開します。 そして、CMemFileか何かにメモリを割り付けて ファイルのごとくアクセスするってやり方です。 もっと簡単に出来そうな方法ありますでしょうか? VSは2005です ちなみに読ませたいファイルはテキストファイルで カンマ区切りで情報が格納されています。 したがってfgetsで1行1行読み込ませています 行が10万行とかあるので読み込むのに 20秒とかかかってしまいます。 3秒くらいでサクッと読めたら嬉しいです
・HDDにアクセスするときは一行ずつ読まずに固定サイズで読み込む (シークタイムとヘッダ移動の発生回数を減らす) プログラム的な解決ではないが、 ・Ramphantomを入れる ・SSDを使う
「VC++で、CFileを使ったファイルの一気読み、一気書き」 でぐぐるといいと思う
カンマ区切りなら1バイトずつ頭から最後まで見ることになるから 結局時間かかるよ
627 :
623 :2010/10/04(月) 13:24:29
みなさんありがとうございます。 626さんのおっしゃるとおりで実はカンマ区切りの処理を取り込むのに 処理全体の95%近く処理時間がかかっていました。 ファイル読み込みだけにしたら1秒もかからず起動しました。 カンマ区切りの読み取り部分を高速化してみます。
バイナリデータにしてヘッダ情報に読みたいデータの番地を書いておいて fseekで一発で飛べるようにしろよ
>>628 単純なテキストををバイナリに変更要求するとか、おまえセンスなさすぎ
>>629 10万行とか続いた時点で単純なテキストじゃねーよすでにw
えっ?
>>631 経験が少ないとわかんないんだろ?
大量にデータが増えたときにかなり多くのリスクも入ってしまっているから
データが少ないときと同じように管理したって駄目なんですぅー(笑)
ハイ、残念♪
>>632 残念なのはおまえの頭だ。
データ量のリスクとかアフォかと。
おまえが考えるシステムってのは、さぞや穴と虫だらけなんだろうなw
>>633 横から突っ込むけど
今回の場合ってテキストでやるよりバイナリでやったほうがメリット多いんじゃないの?
10万行もあって処理速度が大事なのにテキストでやり続けるメリットは何?
なんか論点がずれてるな。
>>623 が求めるのは、高速なファイルアクセス処理であって、データの変換は必要ない。
コンバートしてから処理するより、普通に考えたらそのままテキストで処理した方が速いよな。
バイナリにしろとか言ってる馬鹿は、全体の処理時間を考えてないだろ。
特に制限がないなら、いったんデータを全部メモリに読み込んでそれから処理。
これでいいんじゃね?
>>635 リリース時に決まっているデータであれば
はじめからバイナリにしておいたほうがよくないか?
そこの仕様は
>>623 には書いてないが・・・
つーか、高々10万行で何がたがた言っているんだ? 精々数10MBだろ。普通に一括読み込みするだけじゃん。
バイナリ厨はなにこだわってるの?
>>623 を読む限り、なんども処理するから高速化したいんだろう? (違ってたらアレだが)
どう考えても
>>637 が正解としか思えん。
時間コストが、(変換+処理)<(テキストベタ処理)にならん限りバイナリにするメリットが
まったくないわけだが。
>>638 テキスト10MBを読む(1文字ずつ処理すると)とPC固まるぞ
文字列処理は結構重い
自分でやってみた経験がないなら黙ってたほうがいいとおもうけどね
PCが固まるってwwwwwww
マルチスレッドも知らないカスかw
>>640 たかが数十MBを1byteづつ処理したってPC固まったりしねぇよw
PCもプログラムのヘボそうだが、一番ヘボいのは脳味噌だなwww
>>643 はい、やったことないのバレバレ
なんだかんだいって重くなんだよ
てめーが想定してんのは10万行のデータをなんの比較・加工もしねーで
領域に格納した場合だけしか脳みそにねーだろ?
普通によくある処理をしただけでも1MBだって3秒は動かないね
>>644 残念だったな。経験してるよ普通になw
アニメーション付き3Dのモデルデータのコンバータなんか作ったことあるか?
テキスト形式の.xで100MBぐらいのやつを処理すると、まさにそんな感じだ。
PCが固まる? おまえとおまえのpgが糞だからだお? www
これ以上恥かく前にキエロよな?
100万行程度なら日常的にawkで処理しているんだが。 まさか、Cでawkより重くなるほど器用なプログラムの話がしたいわけでもあるまいに。
>>647 例を出すにしても
100万行のテキストファイルとか頭悪いな
今のエクセルでも限界まであとちょっとってところだな
パース処理よりvectorとかCArrayに領域確保なしに突っ込んでるから遅いとかじゃないのか?
>>627 テキストでトークン分解してるのが遅いんでしょ?
早くはできないと思う
んなばかな。初心者が自前で分解しようとするから遅いんだろ。
CStringのGetBuffer()って引数ありと無しの二つありますけど、 無い方を使うとヒープが壊れる事があったりして困ります。 両者の違いって何ですか? 調べてみても引数無の方は情報が無くって・・・
656 :
デフォルトの名無しさん :2010/10/10(日) 03:14:36
別cppファイルの別クラスからIDC_EDIT1に値を入れようしています。 下記コードで▼hogehoge.cppのEditChange()を呼び出すと、 関数内で呼ばれる別クラス関数CHogeDlg::ChangeEdit1の edit1->SetWindowText(text); の部分でEXEが落ちてしまいます。(コンパイルは出来る) 同じCHogeDlgクラス内からChangeEdit1を呼んだ時は 問題なく値が挿入されるのですが…。 あとedit1->SetWindowText(text);の一文を消して 代わりにAfxMessageBox(text);の一文を入れてやると、 別クラスから呼んでもtextの中身がメッセージボックスで表示されるので、 別クラスからの呼び出し方に問題があるわけではなさそうです。 どなたかアドバイスいただけますでしょうか。 ■hogeDlg.hのpubulicに void ChangeEdit1(char* text); ●hogeDlg.cppに #include "HogeDlg.h" void CHogeDlg::ChangeEdit1(char* text){ CEdit* edit1 = (CEdit*)GetDlgItem(IDC_EDIT1); edit1->SetWindowText(text);} ▼hogehoge.cppに #include "HogeDlg.h" void HogeHoge::EditChange(){ CHogeDlg cdd; char* t="unko"; cdd.ChangeEdit1(t);}
657 :
656 :2010/10/10(日) 03:17:15
長くなりますがhogeDlg.hの内容を書き出しておきますね、こんな感じです。 #pragma once #include "afxwin.h" #define WM_NOTIFYICON (WM_USER+1) class CHogeDlg : public CDialog{ public: CHogeDlg(CWnd* pParent = NULL); // 標準コンストラクタ enum { IDD = IDD_Hoge_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート private: NOTIFYICONDATA m_Icon; protected: HICON m_hIcon; afx_msg HRESULT OnNotifyIcon(WPARAM wPram, LPARAM lParam); virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedStart(); protected: virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam); public: void ChangeEdit1(char* text); afx_msg void OnSysCommand(UINT nID, LPARAM lParam);};
>>656 >CHogeDlg cdd;
が違う。
あとMFCなんだからCString使えば?
ダイアログクラスのインスタンスへのポインタを渡してやらなきゃ無理。 CHogeDlgのインスタンスを持っているクラスか関数からHogeHogeクラスのインスタンスに何らかの形で引き渡すか、 いっそのことアプリケーションクラスから辿れるように作るか。
何をやりたいのか知らないけど、 例えば、ファイルを読んで、何か編集処理をして、結果をeditへ表示 みたいな処理だとすると 1 dialogクラスで領域を確保 2 dialogクラスからファイルを読む外部ルーチンを呼ぶ 3 dialogクラスから編集用の外部ルーチンを呼ぶ 4 dialogクラスで結果をeditへ表示 2と3を外部ルーチンでやるとしても 外部からeditを触る必要はないと思うんだけど どういう考えで外からeditを触ろうとしているのかな?
>>658 >>659 > ダイアログクラスのインスタンスへのポインタを渡してやらなきゃ無理
とのことなので
CHogeDlg* cdd=new CHogeDlg;
cdd->ChangeEdit1(t);
あるいは
void (CHogeDlg::*pChangeEdit1)(char*) = &CHogeDlg::ChangeEdit1;
CHogeDlg cdd;
CHogeDlg* pCdd = &cdd;
(pCdd->*pChangeEdit)(t);
のように書いてみたいんですがIDC_EDIT1に代入できませんでした
>>660 >外部からeditを触る必要はないと思うんだけど
実際にIDC_EDIT1に値を代入する部分(SetWindowText)はCHogeDlgクラスに書いてあるので
そもそも外部から触っているという意識はありませんでした…
意図はネットワーク越しに変数が動的に送られてくるのでダイアログクラス外からアクセスした方が簡単だったからです。
頓珍漢な答えになっているかも知れませんが。
なんつーか、VB的な発想は捨てて、一度真面目にC++の講習を受けた方がよさそうな気がする。 そんな行き当たりばったりの書き方じゃいつか破綻するぞ。
663 :
656 :2010/10/10(日) 14:10:07
CHogeDlg* cdd=new CHogeDlg; cdd->CreateDialog(IDD_DIALOG??); cdd->ShowWindow(SW_SHOW); (cdd->GetDlgItem(IDC_EDIT1))->SetWindowText("abc"); cdd->UpdateData(FALSE); こんな感じでどうだ?
UpdateData(FALSE)だと戻ってしまうので、削除 orz
666 :
656 :2010/10/10(日) 15:40:22
>>664 別クラスのhogehoge.cppからIDC_EDIT1への値の代入までやってしまう方法ですね、なるほど
resourse.hを見てIDD_HOGE_DIALOGに変更してUpdateData(FALSE)を削除してやってみましたが、
マクロ 'CreateDialogA' に指定された実引数の数が少なすぎます。
'CreateDialogParamA' : 'CHogeDlg' のメンバではありません。
のエラーが出ました
MFCの基本なので、 モードレスダイアログ あたりでぐぐってくれ。 cdd->CreateDialog(XXXX) ↓ cdd->Create(this) 必要なくなったら、下記も忘れずにな。 cdd->DestroyWindow(); delete cdd;
>>668 ありがとうございます!
なるほどモードレスダイアログかあ
RichEditCtrl 上のテキストの位置およびサイズ取得方法を教えてください。 すみませんクレ厨で…
XP以前はシステムにdwmapi.dllが無い為に、 通常の検索ルートを通ってしまうわけか。
673 :
デフォルトの名無しさん :2010/11/02(火) 19:05:46
すみません、基本的な質問ですが、 CString a[10]; char b[10][256]; lstpcpy(b[0],a[0]); でa[0]="abc"の値がb[0]にコピーされません。 何か問題ありますでしょうか?他の方法がありましたら教えていただけますようお願いします。
デバッガで確認
>>673 lstpcpyはlstrcpyの間違いと思える。
そうなら、引数に渡すものが違う。lstrcpyの第二引数はLPCTSTR。
他人が書いた関数を使わせてもらうのだから、こっちがそれに合わせなければならない。
CStringにoperator LPCTSTRがあるのでそれ使う。
「CString LPCTSTR」でググると説明いっぱい出るよ。
>>675 lstrcpy なら自動的に型変換(operator LPCTSTR)が呼び出されるんじゃないの?
コピーの前にちゃんとa[0]に"abc"が入ってる? b[0]に入ってないってのは何で確認してる?
679 :
673 :2010/11/02(火) 19:32:45
レスありがとうございます。 はいlstrcpyの間違いです。VS2005ですが、ワーニングは出てません。 デバッガで関数は実行されるのですが、値が入りません。
Release ビルド? Debug ビルド ?
大抵こういうのって書いてないところに問題があったりするんだよな・・・。 きちんと全部そのまま書けばいいのに・・・。
682 :
デフォルトの名無しさん :2010/11/02(火) 19:37:25
>>678 はい値は入ってます。
関数実行後、第一引数に値が入ってません。
うまく動かなかったので、デバッグモードでステップ運転で確認してます。
683 :
673 :2010/11/02(火) 19:39:35
CString a[10]; TCHAR b[10][256]; a[0] = _T("abc"); lstrcpy(b[0], a[0]); MessageBox(b[0]); これをそのままコピーして実行して"abc"と表示されれば問題なし。 他の部分に問題がある。
685 :
質問者 :2010/11/02(火) 19:48:19
ありがとうございます。 家にはデバッグ環境がないため、明日会社で実行してみます。
>>673 この程度の内容なら
MFCをサポートするコンソールアプリケーションを新規に作って、
問題を単純化したソースを作成し、
ソース全文を貼り付ける。
エラーや警告が出ればその内容を示す。
異常だとした判断基準や、出力結果などを示す。
ことは簡単に出来そう。
多くのケースで、
問題を単純化したソースを作成
の段階で自己解決する。
掲示板で聞くより速くて効率的。
Microsoft Web Browser ActiveXコントロールを ダイアログベースアプリケーションで使っています。 ExecWB関数にOLECMDID_FINDを使うとページ内検索ウィンドウが出るところまで来ました。 この検索ウィンドウを閉じたことを知りたいのですが、どうしたらいいでしょう。 コールバック関数を設定してあげればいいとは思うのですが、設定する関数がどれなのか、 どこなのか、理解出来ていません。どうかご教示願えませんでしょうか。
vs2008でVC#だと、ツールボックスに沢山コンポーネントがありますが、 VC++MFCだとちょっとしかありませんよね VC++ってWindowsアプリケーションを作成するには不向きなのですか?
後発のC#を売るには、C#の機能を上げて、C++の機能を下げるしかあるまい。
そうだよ不向きだからC#で作るのがいいよ
VS2008SP1入れたか? 訳判らん位MFCクラスが一気に増えるぞ。
不向きというわけではない 基本的にすべてのアプリをネイティブで作れる たとえると、C++ & MFC は一昔前のアセンブラみたいなもので、 C#/VB はRAD の延長だな 生産性も、経験豊富でなれたやつな人なら C#に負けない ただ、欠点は習得(実用レベルを作るまで)にえらい時間がかかること だから、新人教育には使わない -> MFC 人口は減るという運命にある しかし無くなることはない なぜなら、ネイティブアプリを作るほぼ唯一の手段だから
>>692 > なぜなら、ネイティブアプリを作るほぼ唯一の手段だから
"ほぼ"を考慮しても言いすぎ。
MFCは糞 大事なことなのでもう一度言う MFCは糞
でも、.NETよりはましだな あの、ポトペタ環境がどうもなじめない 下手な奴一緒だと、メインフォームで数千行なんてコード書いてきそうw
>>695 数千行のmain()とどっこいどっこいではないかと。
下手な奴が触るとユーザーインターフェースとビジネスロジックがごっちゃになるのは C#もMFCも同じだな。
MFCをちゃんと使えるやつは、C#もちゃんと使えるけど、 むしろかゆいところに手が届かずに不便さを感じる。 C#から入ってしまったやつには、MFCを使いこなすのはほぼ無理。
MFCもダイアログベースで充分ポトペタじゃないか? C#も.netが用意してないことはDllImport("user32")でSendMessage()とかなっちゃうのがなぁ。 ListViewのスクロールが見つからなくてぐぐって結局SendMessage(LVM_SCROLL)。 なんかがっかり。台無し。
CListCtrl::Scroll リスト ビュー コントロールの内容をスクロールします。
>>698 MFCをちゃんと使えるやつが、C#を使う理由がわからん
どんなにMFCを使いこなせていてもC#で作れる物ならC#の方が生産性高いから
>>703 それは、C++やMFCが使いこなせていない証拠
MFCを使って色々アプリ作ってるが、 全然"MFCをちゃんと使"ってない自信がる。 つーか"C++すらちゃんと使"ってねぇな。
>>704 そう思うのはC#を使いこなせていない証拠
>>706 C#なんて使いこなせてもなんのやくにもたたん
次VSでは外されるんだからw
708 :
デフォルトの名無しさん :2010/11/21(日) 22:07:44
>>707 話しがズレててアホにしか見えないけど、C#が時期VSから外れるってマジ?
表現の自由は大切だよね。
次VSで外されるの意味が分からんのだけど誰か教えて。
まず、VSとは何か? ここからつめていったほうがいいとおもう
MFC vs C#
C#で出来るならC#でいいだろ。MFCを選ぶ理由が無い。まぁスレ違いだが。
714 :
699 :2010/11/22(月) 09:52:28
>>701 それなの?
ってか単純にSendMessage(LVM_SCROLL)を置き換えてもスクロールしないんだけど、
なんかやりようがあるのかな。
CListCtrl::Scroll相当のものなら名前「Scroll」にしそうだけど。
ってスレ違いだね。C#スレ行くわ。
毎回思うんだけど MSはサンプルコード書けよな ドキュメントなんていっくら詳しく書いたって動作がわからなきゃ意味ねーんだっつの 通常のとCEで違うコード書かなきゃいけないとか普通にやりやがるし それ、やるんだったらサンプルコード書けと
動作は実行してからのお楽しみです(キリ
MFCがサンプルの代わりになってる面はあるな
MSDNもサンプルあるけど、MSのサンプルコードって汚いよね。 外人のセンスってこうなのかってよく思う。
英語版のMSDNは割とサンプルコード載ってない? 日本語版のMDSNはクソみたいなページだらけだけど。
載ってるか載ってないかじゃなくて汚いって話だろ
>715 は載ってないと言ってるように見えるけど
タイトルバーの右上にある、ウィンドの最大化(サイズの復元)のボタンを押したときの動作と同じことを 自作のボタンでやりたいのですが、SendMessageなどで簡単に実装可能でしょうか?
可能
>>715 ドキュメントはいくら詳しくても動作の理解の助けにはならない、の意か?
サンプルが欲しいのは、どっちの理由
・実際のコードの方が解説より分かりやすい
・コピペで自分のプログラムに取り込める方が役に立つ
>>725 >・実際のコードの方が解説より分かりやすい
これ
実際に動くために必要なコードがわからない場合が多い
〜メッセージ処理中にやらないと動作しないとか
そういう暗黙的な取り決めが多すぎ
書いてある意味が判らなくて結局メーカーのソースに当たって見たら 実は記事の方が出鱈目でしたっていう日経新聞みたいな
プログラムがどういう仕組みで動いているのか洞察する能力が要求される 技術文書に書いてないカラクリてんこ盛り MFCは特にその傾向が強い MFC使いになるのが難しいのはその辺に原因がありそう
生のWin32APIを便利なフレームワークにした訳でもなく ただブラックボックスにして使い難くしただけの糞クラス
>>726 俺今、技術文書書いてる所
詳しく解説しようと思っているが、サンプルも沢山入れるようにしよう
MFCは昔からソース付けてるじゃねえか。 そういうのはブラックボックスとは言わない。 まあソースが無かったらキレていただろうけどw
ほとんどはMFC経由でWin32API呼んでるだけで、 仕組みも何もやってることは同じだから説明するまでもないんだよ 特にわかりにくいと思われる部分はちゃんと解説あったはず。
>>730 あんまり詳しい解説入れられても動くコードがないとこのまわりはさっぱりわからない
逆に動くコードさえあったらあんまり解説はいらない
面倒だからといって他の機能もはいったごった煮サンプルを作られると
今度はどの要素がその注目部分を動かしているのか特定できない
それはあほすぎる
今たまたま通知領域(タスクトレイ)にアイコンを登録するアプリを作っていたんだ。 それで気付いたんだが、explorerが再起動したら通知領域に再登録しないといけないんだよな。 市販アプリでもそれをしていないのがあって、タスクトレイに無いのに気付かず最小化すると二度と復旧できないと言う。 おまけに、登録してあるときに強制終了されるとアイコンが残骸として残ってしまうし。 そう言う、所謂TIPSだらけなのがMFCのいやらしいところだよね。
MFCは何か独自な方法でやってるということか
.NETのSystem.Windows.Forms.NotifyIconのような実装は、 MFCに標準で含まれていなかったと思うのだが。
単にMFCでプロジェクト作っただけなのに MFCとほとんど関係ないC言語の質問するやつとかいるから そういうたぐいの人間かもしれない。
つーか、SDKで書いている人間にとってはWellKnownなのに、MFCを使っている人間は知らない類の話は多いな。
うんこなう
windows7でAeroにしたら リボンバー使ったウィンドウの外枠の表示がおかしくなるんだが どうにかならん?
742 :
デフォルトの名無しさん :2010/12/04(土) 12:43:39
質問です。 作画の全てをOnDrawでやると動作がモッサリしてしまうので、 下記の処理にしています。 1.ViewのコンストラクタでCDCとCBitmapのオブジェクトを作成し、 2.必要な時にCDCとCBitmapを書き直す。 3.OnDrawでは用意された上記CBitmapを貼り付ける処理だけを行う。 4.ViewのOnDestroyでCDCとCBitmapのオブジェクトを削除する。 上記処理に何か問題ありますか? 問題あるとしたらどういった問題でしょうか? 色んなサイトを見ると、 "使い終わったCDC,CBitmapはすぐに削除しなさい" 見たいな事が書かれているので、上記処理をやって良いのかどうか迷っています。
>>742 CDC絡みは、Win9x系でシステム全体の共有DCの使える数の制限がきつかったからだな。
WinNT系はメモリ量に制限されるだけだから、直ぐ解放とかは特に不要。
ただ、毎回GetDCしたところで大したコストにならない気もするけど。
CBitmapはViewが閉じられる時に使い終わったと解釈できるから、
そのやり方で問題ないかと。頻繁に生成・削除を繰り返すものじゃないし。
>>743 どうも。
CBitmapはそれでOK。
CDCはそれでもまず問題ないが、
毎回作り直しても大した負荷にならんから、
作業が終わったら破棄するのがあえて言えば無難。
って感じですかね。
MFCを使いたいわけじゃなく、 基板(チップ)のサンプルがMFCベースでした。 Expressエディションでコンパイルできなくて困ってまつorz
UIにMFC使ってるだけで 基板とやりとりする部分はMFCだろうが何だろうが関係ないはず
スタンダードエディションを買えばおk
Expression Studioにくっつてくるやつか。 Expression Studioも前バージョンは3万円くらいだったはずなのに 現バージョンは1200万円くらいするんだっけ?高いなー。忘れたけど。
ACの方がお得だが? 別ににんしょうなんてないし
おまえが馬鹿っていってる八割以上の人間も 少なくともおまえよりは優秀なんだが。
公務員乙
他人を貶めることで相対的に自分の地位を上げようとする人はそれが意図的であれ無意識であれその人が愚かなだけだって誰かが言ってた。
2chは愚か者の溜まり場だから何を言っても無駄
♪おいで金と銀の器を抱いて ♪罪と罰の酒を飲もうよ ♪ここは愚か者 の酒場さ
MFCて拙速で作った失敗作なんだろ
MSのことだからじっくり作っても失敗してると思うよ
757 :
デフォルトの名無しさん :2011/01/11(火) 10:45:51
20〜30個のコントロール(CStatic,CButtonなど)を、EnableWindow()で有効無効を同時に切り替える処理を作って いるのですが、ボタンすべてが一斉に切り替わって欲しいところで、パラパラと目で見てわかる程度の速度で 切り替わる結果になってしまっています。 これを一気に切り替えるか、最低でも速度を上げたいと考えているのですが、CWnd::Invalidate()などを利用して もうまくいってくれません。 Aero(というか、パフォーマンスオプションの視覚効果)が邪魔をしているのではないかという当たりをつけたのですが、 これを、当該処理中だけ切り替えるなどの方法、またはそうまでしなくても速く切り替えを行う方法などはありますでしょうか? 環境はWindows 7 Pro、Visual Studio 2008で、動作実施を行う対象はXP〜7までとなっています。
>>757 ダイアログ自身のSetRedraw()で行けるかも
759 :
757 :2011/01/11(火) 12:44:09
>>758 > ダイアログ自身のSetRedraw()で行けるかも
それも思いついて試したのですが、やはりだめでした。
症状が出ているのが開発用のノーパソで、現在のところはほかのマシンでは同様にならないので大きな
問題とは認識されていないのですが、実際に動かす環境で起こるのは可能な限り避けたいところなのです。
プロパティシートでダイアログ切り替えがスムーズなら 頭使えば可能なはずだし、無理ならマシンの問題
その手の実装で、タブコントロールを使ったことがある 同時に有効・無効にしたいコントロールを一つのタブに乗せる
CTabCtrlにそんな機能ないだろ
MFCでActiveXコントロールを作成していますが、 「安全マーク」のつけ方がわかりません。 「IObjectSafety」を実装すればよい、という記述は見つけましたが、 実際どうするかわかりませんでした。 ご教授いただけないでしょうか? ATLでやる場合の情報は見つけたのですが、MFCは見つけられませんでした。。
そんなやつが作ったの怖くて使えないよ
766 :
デフォルトの名無しさん :2011/01/19(水) 09:57:42
CPaneDialogをドッキング状態で、リサイズできなくする方法を ご存知でしたら教えていただけないでしょうか。 過去ログで、CanBeResizedをオーバーライドすればいいような ことが書いてあったので、やってみたんですけどリサイズ出来 てしまうんです。
>>766 Create()時にAFX_CBRS_RESIZEを付けてないですか?
>>767 付けてました。というかデフォルトでAFX_DEFAULT_DOCKING_PANE_STYLE
を渡していました。
AFX_CBRS_RESIZEとAFX_CBRS_FLOATをはずすとリサイズしなくなりました。
ありがとうございました。
猫でもわかるプログラミングを見ながらSDKでちょこちょこ動かしてますが、 MFCやる時、少しは役に立つもの?それとも、もう時代遅れ? 家のPC環境でMFC動かせないのだが、少しは近いことやろうと思うんだけど・・
Windows APIを知っているとMFCを理解するのに役立つけど その前に、MFCはC++前提なのでC++を理解することのほうが Windows APIを理解するよりもずっとむつかしーあるよ。
Win32APIは現役 MFCのがアナクロ
なるほど〜 猫プログラミングのC++も並行してやってるけど、C++を先に固めた方が良さそうすね
C〜C&Win32API〜C++〜C++&Win32API〜MFC ではMFCにたどり着く頃には爺になっちゃうよ C〜C/C++(ベターC)&Win32API〜C#orJava〜MFC がオススメ
C#にいったら帰ってこない気がするぜ
C++をBetter Cとしてしか使わないなら C++なんてめんどい言語勉強するより C#やJava学んだほうがずっと早いし有意義だよ。
いまどき MFC にこだわる香具師は情報弱
MFCはexpressにつかないからなー
MFCにこだわりすぎるのも問題だが、検証もしないで新しいものに飛びつくヤツも困る。 ウチは組み込み系だからツール作るのにMFCは結構ありがたい。 必要ないときはC#使うけど。
もうMFCの時代はとっくに終わってるんだが
代わりに何がいいのん? .netとかあんまり手間変わらんかったよ
>>778 組み込み系は、Cのライブラリとか使う事もザラにあるから、
MFCは割と気軽に組み込めてお手軽で良いよな。
大方がAPIのラッパー程度な設計なのが逆に役立つ。
じりじりと俺の中で マイクロソフトに対する評価が下がっていく…。 さっさとアナウンスしろや。
全然違うところに書き込んでた ごめん
質問です。 VisualStudio2005でダイアログベースのMFCアプリケーションを作っているのですが、 同一のコードから簡略版と高級版の両方をビルドできるようにしたいと考えて、stdafx.h の中にフラグ(#define MY_FLAG)を書いておき、切り替えの必要な場所はそのフラグの 有無でビルド時に書き換わるようにしました(#ifdef MY_FLAG〜#endifでくくった)。 それはそれで機能しているんですが、以下の3つについてはこの方法で切り替える事が できずにいます。 ・生成される実行ファイルの名前(=プロジェクト名) ・生成される実行ファイルのアイコン(=IDR_MAINFRAMEで指定されているアイコン) ・生成される実行ファイルを右クリックした際の詳細情報(=VS_VERSION_INFO) これらも同様の方法で切り替えるようにするべくresource.hや.rcファイルにも#ifdef〜を 手で書き込んでみたのですが、これらは頻繁にVisualStudioによって書き換えられて しまうため、すぐに#ifdef節が消されてしまってうまく機能させることができません。 何かよい方法は無いでしょうか。
makefile にする
>>785 *.rcの方は専用の記述方法があったと思う。TEXTINCLUDEとかそんなタグだったかと。
その辺りの記述をよく見て味噌。
あとで書き換えられる場所と 書き換えられない場所がちゃんとあr
MFCってあんまりC++のSTLとか使われないよね? 基本的なクラスの概念が分かっていればOkな気がするんだが
>>785 ですが、解決したのでご報告。
.rcファイルはresディレクトリ直下の.rc2ファイルをincludeしてて、これはVisualStudioに
変更されたくないリソースを記述する場所として用意されているようです。
>>789 さんの
言うところの書き換えられない場所ということですね。
試しに、.rcファイルのIconセクションとVersionセクションを、コメント書きのキャプションごと
カット&ペーストで.rc2に移植したところ、VisualStudioのリソースビュー上ではIconフィルタ
とVersionフィルタが丸々無くなりましたが、ビルドされるアプリケーションで元のリソースの
構成が崩れることはありませんでした。つまりVisualStudioによっては触れないが、ビルドに
はきちんと反映されるということです。そこで
>>785 の#ifdef〜#endifを用いたところ、思惑通り
に機能させることができました(ただし、フラグの書いてある場所を.rc2からも参照させる必要
があるため、フラグを書くためだけのヘッダーファイルを別に作って、stdafx.hと.rc2の両方に
includeさせる必要がありましたが)。
この方法ではアイコンとVS_VERSION_INFOの切り替えのみ対応することができ、依然として
実行ファイル名の切り替えは出来ませんが、そのくらいだけなら手動でも問題ないので、
これにて解決としたいと思います。お騒がせいたしました。
>>790 STLがまともに実装されていない時代にベースが開発されてるからね。
互換性の意味でもテンプレート化はされていない。
さらに、VC自体がテンプレートの動作がおかしいというのもある。
VCは名前解決のルールからしておかしいので
テンプレートメタプログラミングとかやると、動かないことがしばしば。
プロジェクトの構成新規につくればいいだろう。 デフォルトでは出力ファイル名は $(projectname).exe だから プロジェクトのプロパティで それを好きな名前に変えればいい。 リソースの ifdef で使う定義も リソースコンパイルのコマンドラインへの追加で対応すればいい。 /d "***"
>>792 なるほど。そんな時代的な背景が有ったとは・・。
20年くらい前の話だぬ
>>793 試してみました。
まず
>>791 で作ったフラグ用ヘッダーファイルのincludeを取り除き、現在のプロジェクト構成を
元にして新しいプロジェクト構成を新規作成し、そのプロパティに以下の変更を加えました。
・[C/C++]→[コマンドライン]の「追加のオプション欄」に「/D "MY_FLAG"」を書き加えた。
・[リソース]→[コマンドライン]の「追加のオプション欄」に「/d "MY_FLAG"」を書き加えた。
・出力ファイル名を書き換えた。
これにより、VisualStudioのツールバー上で構成を切り替えるだけでビルドの内容を切り替える
ことができるようになりました。これは全くもって自分が欲していたとおりの結果です。お教え
いただき、本当にありがとうございました。
>>794 VC4〜6あたりで開発していたころは、
MFCと相性悪いという理由でSTLは会社から禁止されていたな。
タブコントロールの、ビラビラ(アイテム名表示部分)を除く表示領域ってどうやって取得すんの? CTabCtrl::AdjustRectでもビラビラを含んだ領域でしか取れないよね? 手動で適当にrect.top+=20したりするしかないの?
タブコントロールは何で「タブ」コントロールと言う名前なのか小一時間(ry
"タグ"の読み間違いがそのまま定着
「タグ」と「タブ」の区別ができないやつがほんとにいるから始末に負えない。
そうは言うがな大佐、TCN_SELCHANGEのハンドラで最前面に表示する 子ダイアログを切りかえる実装方法だと、子ダイアログを表示する位置を 合わせるのに、ビラビラ以外の表示領域を取得しないわけにはいかんだろう。
まだわかってないとか大丈夫か? ググればいくらでも出てくるだろ?
あんまり小陰唇の俗語を連呼しないでくれないか。恥ずかしいじゃないか
びらびら
806 :
デフォルトの名無しさん :2011/02/22(火) 21:41:47.56
MFCのDestructElements関数について教えて欲しいんですけど、 これってVS2008では廃止?? 今後廃止予定だから 推奨されないだけで機能としてはまだ使えるんですかね?
808 :
デフォルトの名無しさん :2011/02/23(水) 10:11:01.87
>>807 コメントアウト・・・。
ってことは。
これに代わる機能があるからそっち使ってね。
ってこと?
探したけどそれすらもないような。
とゆーか、配列の解放ってVSでコンパイルしたときに
デストラクタとして自動生成され・・・ない?
普通に対象クラスのデストラクタが呼び出せるようになったから、とかじゃないか? Visual C++6.0以前は、テンプレート絡みが色々怪しいところも多いし。
810 :
デフォルトの名無しさん :2011/02/24(木) 17:04:00.42
MFCのCWinFormsDialogつかって フォームコントロールを画面表示させようとしてます コントロール側には3Dグラフを描画します。 MFC側からグラフ用のデータを渡したいんですが どのようにして渡すんでしょうか? 渡す周期は500msくらいです。 VS2008使ってます。 普通のダイアログ画面が相手ならSet関数でメモリ渡しするんですけど MFCとフォームコントロールとプロジェクトが別になってます
ソケット通信
812 :
810 :2011/02/25(金) 14:59:20.24
普通にCWinFormsDialogのGetControlで 関数渡し出来ました
ダイアログに貼り付けたCTabCtrlって他のコントロールみたく自動で表示してくれないんですか?
814 :
813 :2011/02/27(日) 22:55:28.51
自己解決しました失礼しました groupboxが原因でした(Zオーダーの問題かな?)
ちょっとはまったので助言をおくれ。 時刻コントロールの背景色を変更したいのだが、 WinXPでは色が変わっているのだが、Win7では変わらなかった。 Win7でもちゃんと背景色が変わるようにするにはどうしたらいいのか…… 以下、ソース CDateTimeCtrlEx : CDateTimeCtrl BOOL CDateTimeCtrlEx::OnEraseBkgnd( CDC* pDC ) { BOOL bRet = CDateTimeCtrl::OnEraseBkgnd( pDC ); CRect rect; GetClientRect( &rect ); pDC->FillSolidRect( &rect. RGB( 0, 255, 0 ); return bRet; }
817 :
デフォルトの名無しさん :2011/03/02(水) 11:17:08.64
親子Dialogがあって子Dialog上のスクロールバーのl処理を 親Dialogでやりたいんですけど良い方法ありますか? 子のHScrollの引数を親にSendMessageする感じですか? 直接親のHScrollにかけたらうれしいんですが スクロール関数が呼ばれないようです
CWndから派生させて作ったものをツールバーに置いてみました。 しかしここから何かアクションを起こしてもビュークラスに対して ON_COMMAND を発生させることはできません。 WM_COMMANDとCN_COMMAND使えばできるように見えたのですが、 うまく行きませんでした。どのようにすればいいのでしょう?
819 :
デフォルトの名無しさん :2011/03/05(土) 19:13:44.53
初心者の質問で申し訳ございません。 演習で「afxcoll.h」というファイルが必要でして自PCに存在せず ググるとMFC クラスなるものの中にあるようなのですが、 MFC クラスはどうやったらダウンロード出来るのでしょうか? 無料でインストールできるものなんでしょうか? お手数ですがご教授のほどよろしくお願い致します。
821 :
819 :2011/03/05(土) 19:34:32.78
>>820 ご教授ありがとうございます。
ご指摘いただいた場所は実は見つけていて、
コピーして入れたんですが、次から次にヘッダが要求されて
エラーの嵐で・・・
MFC自体売り者らしいので買わないととてもじゃないけど
無理ですかね。。JNIの演習なんですけど。。
afxcoll.hってMFCの昔のコレクションクラスだろ。 大した機能は無いから、必要最小限のクラスとメソッドをでっち上げるのも 一つの手じゃないか? シリアライズとか使っていたら少々面倒だけど。
MFCって、32bit用と64bit用に、 それぞれ別々にあるの? MFC自体のソースコードからして 完全に別物としてあるの?
ソースコードレベルならほぼ共通かと。 完全に別物とか正気の沙汰じゃない。 DLLはOSの仕様上別々に用意しないと話にならないな。
825 :
818 :2011/03/07(月) 23:03:27.96
メッセージをメインフレームに送ってました。 MDIで作ってたので子フレームに送信したらいけました。 失礼しました。
826 :
デフォルトの名無しさん :2011/03/15(火) 10:52:12.58
ipodtouch版アプリ mfc買ったんですけど 基本一緒ですよね?
ポップアップメニュー上でミドルクリックを検出するにはどうすればいい?
ダイアログアプリ上のエディットボックスに、CString::Format()で書式化した数値を SetWindowText()で表示しようとしています。 このとき文字列中の数値で、小数点を揃えて出すために、以下のような書式を組みました。 CString str; double a=100.05; double b=10.1; double c=1.0; double d=1000.11 str.format("%4.2f\n%4.2f\n%4.2f\n4.2f\n", a, b, c, d); これをSetWindowText()したところ、小数点の位置が揃いませんでした。 ダイアログのOnShowWindow()中で、エディットボックスに対してフォントの指定を行い、 固定ピッチフォントを指定したりしたのですが、フォントは変わっているにもかかわらず、 数値の部分だけ、数値の前に入ってほしいスペースの数が変わらないままです。 (コピペでチェックして、スペースの数自体が少ないことを確認) フォントの指定は以下の通りです。 logfont.lfCharSet = DEFAULT_CHARSET; logfont.lfOutPrecision = OUT_DEFAULT_PRECIS; logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logfont.lfQuality = DEFAULT_QUALITY; logfont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN; ::_stprintf_s(logfont.lfFaceName, LF_FACESIZE, _T("%s"), _T("MS ゴシック"));//フォント名 どこかに見落としがありますでしょうか? また、他に確認すべき項目はありますでしょうか?
>>828 "%4.2f"というのは、全体で4文字、そのうち小数点以下に2文字という意味。
3倍くらいでかくなった。 ついでにWin2000で動かないバイナリになった!
CWinAppExを使ったプロジェクトでは変わらないね。 まぁ元々サイズがでかいけど。
>>832 ユーザーのMFCが更新されただけで動かなくなるから
2000切ったわ
835 :
デフォルトの名無しさん :2011/04/27(水) 09:51:55.40
質問です。 VS2008で、ダイアログアプリケーションのリソースをDLLに分離し、 AfxSetResourceHandle()で読み込む、という手順を取ろうとしています。 (DLLはリソースのみ、リンカで/NOENTRY指定) DLLのロード、AfxSetResourceHandle()まではうまくいくのですが、 メインとなるダイアログ上にタブコントロールを作り、その上にダイアログを 貼り付けようとするところで失敗してしまいます。 BOOL CMyApp::InitInstance() { HINSTANCE hinst; hinst = LoadLibrary(_T("Resource.dll")); ASSERT(hinst); AfxSetResourceHandle(hinst); ←ここは成功する …… BOOL CMy3Dlg::OnInitDialog() { CDialog::OnInitDialog(); bRet = TRUE; if(this->m_MyTabPage1.Create(CTabMyPage1::IDD, this) == 0){bRet = FALSE;} ←ここで失敗 if(this->m_MyTabPage2.Create(CTabMyPage2::IDD, this) == 0){bRet = FALSE;} ←ここも失敗 …… これ以外のリソースについては全て読み込まれているようなのですが、ここだけ失敗してしまいます。 リソースの分離以前は正しく動作しており、何が問題なのか想像がつかない状態です。 なにをどうしたら良いか、教えてください。
win7 64bit, vs2005でmfcにてopenGLでピクチャボックスに描画をしています。 xp 32bitではピクチャボックスをBitBltにて画像保存できたのですが、 win7、64bitでは保存はできるのですが、保存した画像になにも表示されていません。 (シングルディスプレイでも) どうすれば、キャプチャできるようになるでしょうか。
勉強する
>>836 OpenGLはよく分からないけど、テクスチャに描画して、
そのテクスチャを保存してはどうだろうか。
画面に出したい場合はそのテクスチャを貼り付けた
四角形ポリゴンを描画すればいい気がする。
840 :
デフォルトの名無しさん :2011/05/15(日) 18:51:11.32
mfcのよいとこはかわらないとこ
841 :
デフォルトの名無しさん :2011/05/26(木) 10:47:36.05
ダイアログベースのサイズ変更不可で作成し、ウィンドウサイズを横幅801以上縦幅601以上にしたアプリ。 これをディスプレイ解像度800×600の状態で起動した後、ディスプレイ解像度を大きなサイズ(例:1280×1024)に変更すると、アプリがめっちゃ大きなサイズになってしまいます。 OnInitDialogで取得したウィンドウサイズを保持しておいて、OnWindowPosChangingの引数WINDOWPOS構造体のcxとcyを修正してやると現象は抑えられるのですが、いまいちスマートでない気がします。 何か原因をご存知の方いらしたら教えてください。 ちなみに、Win7でもXPでも起きます。
>>841 原因は知らないけどOnWindowPosChanging()の先頭に以下を追加すればいいと思う。
lpwndpos->flags |= SWP_NOSIZE;
>>842 なるほど。
確かに、cx、cyを無視で良いですね。
ありがとうございます。
これでスッキリしました。
MFCもがんばるなあ。もう15年くらい? これからも、がんばってください。
845 :
デフォルトの名無しさん :2011/06/01(水) 18:27:32.03
プログラムのダイアログ内でウェブブラウザを表示したくて IEコンポーネントを埋め込んでいるのですが、 OSにインストールしているIEがバージョン9.0なのに、 IEコンポーネント内のIEのバージョン判定をすると7.0になっています。 IEコンポーネント内のIEのバージョンは、何に基づいて決まるのでしょうか? この問題で非常に悩んでいますので、教えてください。
CPaneDialogでビットマップ貼ったら、CStaticは通常の方法で透過でき たんだが、チェックボックスなどの他のコントロールのテキストの バックグラウンドが透過できない。ブラシをビットマップにすると ちゃんと全てのコントロールのバックグラウンドがビットマップで塗られる。 m_beBackgroundをNULL_BRUSHでクリエイトすると透過せずに、デフォルトのバック グラウンドカラーが塗られる。これはバグかなぁ。 どなたか解決した方いますか?透過が使えないのは非常に不便ですね。
>>847 コントロールの透過は実際に透過してるわけではなくて背景色で
塗りつぶしているからね。
だからNULL_BRUSHで透過しないのはある意味「仕様」になる。
>>848 CStaicの場合もそういう動作になるなら仕様なんだけどね。
相変わらず仕様が統一されてないのが何とも・・・
>>849 CStaticが特別だと思うべきでは?
昔からそうなってるんだから「相変わらず」も何もないと思うけど。
だから、『ある意味「仕様」』と書いたんだけど。
まあ、その「仕様」がクソなのは間違いないな。
16ビット時代の仕様に今更。 まあ、MSに倣って自前で用意するのが一番なんだろうな。
順序は不要で、値の存在だけを高速に確認できる集合を用意したいんですが、 MFCだとCMapのKEYに値を詰め込んでいく方式になりますか? VALUEにあたるものはなにもないので、ちょっと変な感じもするのですが。
>>852 C++0xかboostのunordered_set
順序付きならstd::set
わざわざMFCスレで質問してるんだからMFC限定でやれよ
データ管理まで心中することもないだろ。
ここはMFCスレ
MFCプロジェクトを作るとき、 「スタティックリンクライブラリでMFCを使用する」にして プロジェクト作ると、デバッグ出力に SXS: Invalid parameter(s) passed to FindActCtxSection*() dwFlags = 0x00000001 ReturnedData = 002BF750 ->cbSize = 0 って、感じのメッセージが5つくらい出るんだけど、なにこれ? 一応動作してるぽいから気にしなくて良いのかもしれんが・・・ 環境は、Win7 64bit VS2008 pro SP1
861 :
857 :2011/06/15(水) 12:17:59.79
>>858-860 ありがとう。
今月の定例のWindowsアップデートで、
>>860 の更新入ってた。
それいれたらメッセージ出なくなりました。
MFCってちょっと込み入ったUIを作ろうとすると とたんに難しく感じるのは私だけ?
いいえ、その「ちょっと」の基準は違えど、誰もが感じるところでしょう。
何でやっても同じじゃね?
いえ、C#だとコーディングレスでそこそこまでのUIは作れますよ
何使ったって用意されてるものをそのまま使うなら同じようなもんだし 無いものを構築するならどれもそこそこ大変だろ
>>864 mfcは.netやvclと違って、win32を機能ごとに纏めただけで、抽象化度合いが低いから、より理解はし難い
gui部分もほとんど手入力
自分自身で「Foundation」って言ってるし。
でもMFCが使えるようになれば自分を神と思える
まわりの人からは邪神扱いだけどな
↑ イミフ
>>870 それはあんたの神レベルが低いだけ
高レベルなら、まわりから神扱い
MFCわからんから使うな言われる場合がある。 そんな職場はSTLもわからん屑の集まり。
>>873 今ならともかく、10年前とかは何で作ってたんだよ。その現場は。。。
昔は客の方から指定されて嫌でも使わざるを得なかったはずだが。。。
未だにMFC4.2の顧客とか。
mfcって、グリットコントロールもないのね・・・ しかも、Viewっていうものも、ウィンドウに1つしかおけないし、しょぼい エディットや、リスト程度・・・ これじゃ、大したアプリつくれなくないですか? もしかしてMFCって初心者?
>>876 .netではどうか知らんが、昔はvbのコンポーネントはvcとmfcで開発されてた
昔のを引きずってるならともかく、今からMFCやるの?
用意されたライブラリにないから「出来ない」って言う奴は 素晴らしいライブラリがあっても大したアプリは作れないと思う。
>876 View1個という制約はないよ
POPUP "サブメニュー" BEGIN MENUITEM "コマンド1", ID_COMMAND1 MENUITEM "コマンド2", ID_COMMAND2 END MFCのアプリケーションで上記のようなサブメニューがあって、 コマンド1もコマンド2もグレー化すべき状態のときに、 親メニュー内の"サブメニュー"のポップアップ項目自体(IDなし)を グレー化する方法がMSDNのどこかに書いてあった記憶があるのですが、 どなたか憶えていらっしゃいませんでしょうか。
nPopUpPos == POPUP "サブメニュー" の位置 pMenu->EnableMenuItem(nPopUpPos,MF_BYPOSITION|MF_DISABLED|MF_GRAYED); のこと?
MFCでEXCELみたいな、編集可能なグリッドコントロールってないのかしらん?
885 :
デフォルトの名無しさん :2011/07/04(月) 00:18:22.83
編集可能なだけなら、ListViewから作ってもすぐじゃん
>>883 それを、メニューの位置関係に依存せずに
ID_COMMAND1などのCCmdUI更新時のタイミングで行う方法が
どこかに書いてあったと思ったのですが、勘違いですかね。
887 :
デフォルトの名無しさん :2011/07/06(水) 07:39:50.75
CListCtrlを派生させて、CYListCtrlというコントロールを作成しました このコントロールをViewとして使用した場合はどうすればいいのですか? CListCtrlのCListViewみたいに使いたいです。
CYListCtrへのポインタにcastすれば、終わりじゃん なに言ってんの?
CListCtrlと書いてある部分をCYListCtrlにするだけだな
>>890 馬鹿のやり方だな。
CViewからの派生クラスに、メンバでCYListCtrを持たせて使うのが常道だろ。
ググればその手のサンプルもあるし、少しは勉強しろよ屑。
VS2008 sp1以降ならプロジェクト形式をVisual StudioにすればCMFC〜系はそうやって使ってあるよね。 CMFCListCtrlとかCMFCTreeCtrlとか。
895 :
デフォルトの名無しさん :2011/07/07(木) 15:15:05.76
アドバイスお願いします。 VB6のプログラムをMFCに移植するにあたって、 画面上のオブジェクト(コントロール)の、座標とかテキストとかフォント設定とかを頻繁に弄るわけですが、 VBではプロパティで値を入出力する仕組みになっていて、例えば座標は m_edit.Left = 10 m_edit.Top = 10 m_edit.Width = 100 m_edit.Height = 100 みたいに書けるわけです。 しかしMFCでは RECT r; r.left = 10; r.top = 10; r.bottom = 110; r.right = 110; m_edit.MoveWindow(&r); みたいに書かないといけません。 移植の効率と、ミスをなくすために、 ”プロパティ”を後から多重継承で実装できるようなインターフェースクラスのサンプルってどこかにないでしょうか?
void MoveControl( CWnd*ctrl, int left, int top, int width, int height) などの移植用の関数を作ればいいんじゃないカナ あとMFCと多重継承は相性が悪いのでやめたほうがいいと思う
>>895 では移植のややこしさがイマイチ伝わらなかったかもしれません。
例えば、VBで下のように一行で書けるものを移植するには、
m_edit.Width = m_edit.Width + 10
MFCでは、
RECT r;
m_edit.GetWindowRect(&r);
r.right += 10;
m_edit.MoveWindow(&r);
というように、結構見た目が違うようなソース変更を強いられる訳です。
VC++にも一応propertyの実装があって、
http://msdn.microsoft.com/en-us/library/yhfk0thd (v=vs.80).aspx
それを使ってCWnd派生のコントロールをすべてVBと同じインターフェースで操作できるようにすることも
可能っぽいので聞いてみました。
手作業じゃなくて、プログラム、スクリプト、マクロ等で自動化すればいい
899 :
895 :2011/07/07(木) 18:03:06.66
試しに作ってみた多重継承用のプロパティインターフェースクラスがうまく機能しました。 ほぼVBのソースコードのまま移植できることが確認できました。 感動です。 MFCのボタン、エディット、コンボボックス、チェックボックス、ダイアログ・・・etcの各クラスに 多重継承して使っていこうと思います。
移植つうかVBライクでコーディングしたいだけなんだろ 自己満足なソースだと他の人が保守しにくいんだよな
>>896 MFCのクラスはすべてCObjectからの派生なので、MFCクラス同士の多重継承ができないというだけで、
相性が悪いわけではない。
「なんかよく分からないけど多重継承したらコンパイルエラーが出た。相性悪いなぁ。」
とか言ってる人は、多重継承を根本的に理解していない。
>>901 揚げ足取りみたいですまんが、すべてではない。
程度の低い馬鹿ほど、こういう情報を確認もせずに信じ込んで他へ垂れ流すので気をつけて欲しい。
MFCはWin32APIに皮を被せただけのド変態ヤッツケクラス群だから。 MSが本当にやりたかったのはC#とかだろう。 新しいことが覚えられないお爺ちゃんプログラマが、ほとんどC言語の感覚でMFCを使うケースが多い。 だから「MFCで多重継承?そんなの邪道wwwwwwつか保守しにくいwwwww」と脊髄反射してしまう。
最初からmfc使う必要ないだろ
↑ こいう奴らって大抵は、MFCに挫折した奴がおおいよねw
907 :
デフォルトの名無しさん :2011/07/10(日) 10:11:17.39
MFCは訳あって使ってるが、画面関係以外は極力STLを使ってるよ。 CStringって気持ち悪いし、C○○Arrayとか何それ?vecor使えよって。
CStringだけ使いたいという話はよく聞く
CStringArrayとかの非テンプレートベースのコレクションクラスの話なら、 あれは互換用に残してあるだけの旧クラスだから。 配列ならCArrayかCTypedPtrArrayを使うのが普通。 まあSTLが大体機能する今となっては、vectorでも一向に構わないと思うが。
910 :
デフォルトの名無しさん :2011/07/10(日) 17:16:29.11
プロジェクトをUnicodeでビルドするとき、CStringはUnicodeを扱うことになるだろ? でもUnicodeとMBCSを同じプログラムの中で両方とも使いたい場合もあるのよ。 STLならstringとwstringで明確に共存できるけど、CStringの場合はどうなってしまうのか意味不明。
ああそんなのがあったのかw
C#でいうところのdatagridviewってないの?
CListViewじゃダメなの?
バージョンとかわからんけど、MSGridとかMSDataGridとかMSFlexGridとかついてないか? MS純正でなくても良ければ売り物も有るし、codeguruとかにfreeでなかったかな。
MFCにないものはスレ違い
CEditViewでCEdit派生クラスを使うには ?
普通に動的にCreate()するだけでは?
SetWindowExtとSetViewportExtってどう違うのですか?
922 :
デフォルトの名無しさん :2011/07/14(木) 13:32:24.15
ダイアログアプリのエディットボックス(リードオンリー)の文字色を、行ごとに任意で変える方法を探しています。 どこかにサンプルがあったと思ったのですが、ググっても見つからずに困っています。 たしかCEditの派生でやってたと思うのですが……ご存じの方、教えていただけたら幸いです。
>>922 WM_ERASEBKGNDメッセージで。行の高さはGetTextMetricsで調べてね
>WM_ERASEBKGNDメッセージで。 どうやって? なんとかmzは馬鹿だと思っていたが、間抜けだったのか。
VC++MFCって是非はともかく、やっぱりこれができなきゃ一人前のWindowsプログラマとは 言えないって風潮ないですか? .NETなんてインタプリタみたいなwのなんてできてもって感じ
ないない。 MFCに関しては、それが客に求められていない限り、できれば避けて通った方がいい。 Win32APIをMSDNのヘルプを見て使える程度の知識があれば十分。
>>925 2、3年前まではその通りだった
今じゃ過去のメンテや特殊なケース以外はないな
新規プロジェクトはほぼ.NETの方向にいっとる
要は使えるレベルのMFC使いが少ないことが原因
なぜ少ないか?
習得に時間がかかりすぎるから
つまり、MFCは非効率な開発体系ということを認識したMSが
.NET の方へ誘導している
言語人口は減る一方で増えることはない
かつてのCOBOLの運命にあるな
けど、Windowsでネイティブを作成しようとしたら 事実上はデファクトスタンダードであることに疑問を挟む余地はない
ネイティブである必要がなくなってきたんだよな
ネイティブよりマネージを選択する理由が分からん
ただこれだけは言える MFCを習得したやつは、どの言語も短期間で習得できる なぜなら、どの言語もMFCよりもはるかに簡単だから
クラスライブラリと言語を比較するのってどうなの?
Javaの言語仕様は全部把握しているのに 標準付属のライブラリの使い方は全然分からない奴がいたら面白いなあ。
おれはその口だな。 ライブラリはオンラインマニュアルないと使えないわ。
まあ、言わんとしてる事は分かるけどね c++も難解 mfcも難解 だから、他の言語やクラスライブラリ覚えるのは楽になる (と言うか、mfc覚えないで済むなら覚えなくて良い)
936 :
922 :2011/07/19(火) 07:57:37.84
>>924 やっぱむりだよねぇ? 別の物と勘違いしてるんじゃ無いかと……
連休中、英語の技術文書も検索してみたけど見つからなかった……
答え知ってる方、教えてください……orz
RichEditBoxってなかったっけ?
サブクラス化してたら何でもできるけど、一発でを期待してるなら 別の手段考えたほうがいいね
MFC関係ない
てすと
どうやってPNGを描画しているか書かないと答えようが無い
944 :
942 :2011/07/19(火) 22:07:00.41
失礼。 CStatic m_PCAboutImage; CImage m_ImageAbout; LoadFromResourceGraphic( IDB_PNG1, _T("PNG"), AfxGetInstanceHandle(), &m_ImageAbout ); これで、OnCreate時にリソースから画像を取得して HDC hDC = m_PCAboutImage.GetDC()->GetSafeHdc(); m_ImageAbout.BitBlt( hDC, 0, 0, 600, 150, 0, 0, SRCCOPY ); これで、OnPaint時描画してます。
偶々それっぽく描画されているだけな予感。 StaticコントロールはCS_PARENTDCだから、 親のクライアントに直接描画するのと殆ど変わらないし、 その上にStaticコントロールの描画が重ねられた結果、 描画されないように見えている、ってオチじゃね?
(0, 0, 600, 150)ってのはどこから来たの? 決め打ちならPictureControlを使う意味があるの? OnPaint時ってメインダイアログの? なら直接メインダイアログに描画すればいいんじゃないの?
947 :
デフォルトの名無しさん :2011/08/09(火) 22:41:56.83
CDialogのモーダルダイアログは SendMessage(WM_CLOSE)でも EndDialog(IDCANCEL)でも閉じるのに CFileDialogのモーダルダイアログだと閉じないんですが、 どうすれば閉じられるでしょうか?
>>947 CFileDialogというクラスの正体は、ファイルダイアログ内の子ダイアログなので、
CFileDialogのGetParent()に対してSendMessage()なりEndDialog()なりを行う。
949 :
デフォルトの名無しさん :2011/08/20(土) 16:57:19.34
CToolBarCtrlについて質問です。 このコントロールは、AddBitmap(), AddString(), AddButtons()という順番でボタンを追加していくのですが、 追加されたボタンを削除することはDeleteButton()でできます。 しかしAddBitmap(), AddString()で追加されたイメージや文字列を削除する方法がありません。 これはコントロールオブジェクトそのものをdeleteしないとダメなんでしょうか。
MFC初心者です。 DoModal()を読んだ後に、子ダイアログのエディットボックスへ 1から100までカウントアップを表示させたものを作りたいです。 方法を教えてください。よろしくお願いします。
好きなようにやればいいと思うけど、 どの辺で引っかかってるの?
>>951 イベントハンドラなしに動かしたいと考えてます。
OnInitDialogでの処理では駄目だと思うのですが、
何を使ったらよいのか分からない状態です。
便利なクラスとかサンプルなどを教えて頂けると幸いです。
よろしくお願い致します。
>>950 タイマーで経過表示でもしたいのか?
何故OnInitDialog()ではダメだと思ったのか?
ダイアログの外からの指示でかきかえたいのか、 ダイアログの中だけで完結してもいいのか、 とか聞こうと思ったんだけど、イベントハンドラとか 言ってるってことは、実行中に画面書き替えたいとか そういうこと? InvalidateしてUpdateWindowするとか、 DoEventみたいなことしたいなら、 {MSG msg; while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { AfxGetThread()->PumpMessage(); }} 呼ぶとかしてみては
955 :
デフォルトの名無しさん :2011/08/22(月) 16:19:57.18
MFCが(に限らないだろうが)嫌いなのは、MS独自のtypedefが多すぎ。 おまいらは社内規格で良いだろうが、それにつき合わされる外部の 人間はウンザリ。もう、いいかげんにしろと。
スレ違いだ。消えろ
957 :
デフォルトの名無しさん :2011/08/22(月) 16:37:32.53
いやだ。廃棄物のお前にいわれたくねw
952です。
>>953 子ダイアログでプログレスバーみたいなものを作りたいためです。
OnInitDialog()では、処理はするけど1,2,3・・・99,100のように順々に表示されず、いきなり100が子ダイアログ表示されるのではないのでしょうか。
そのため、OnInitDialog()では駄目だと思いました。間違ってたらすいません。
>>954 私はダイアログの中だけで完結させたものを作りたいと考えてます。
子ダイアログ生成後に画面を書き換えるという操作をしたいと考えてます。
InvalidateしてUpdateWindowするというのと、DoEventについて調べてみようと思います。
アドバイスありがとうございました。
>>958 OnInitDialogの中でSetTimerでタイマーセットして、
OnTimerでカウントアップすればいいんじゃないの?
もしかして: モードレスダイアログ? つーか、MFCだからポップアップウインドウか。
961 :
デフォルトの名無しさん :2011/08/29(月) 18:43:55.64
初期表示の際にピクチャーコントロールの上に図形を描写するには どうすればいいでしょうか。
もっと詳細を書かないと分からないよ。 ビットマップを貼りたいだけなら ・リソースにビットマップを追加する ・リソースエディタでTypeをビットマップにする ・Imageに追加したビットマップのIDを指定する で出来る。 プログラム内部で色々な図形を書きたいならオーナー描画を勉強すべし。 (その場合ピクチャーコントロールは忘れていい)
963 :
デフォルトの名無しさん :2011/08/29(月) 22:32:02.79
>>962 ありがとうございます
ピクチャーコントロールはできてるんですが
その上に図形を描写したいんです。
画面のちらつきについて質問 あるダイアログにスタティックテキストとリストコントロール載せてるんですが、 スタティックテキストの内容を1秒に1回更新していて結構ちらつきます。 このちらつきを抑えるためにダイアログにWS_EX_COMPOSITEDっていうウィンドウスタイル指定してるんですが、 この方法だと、リストコントロールのヘッダ以外が描画されなくなってしまいます。 なんかいい方法ありますか? 環境 Vista VC2008 Pro
>>964 普通だと内容更新は即再描画に繋がっているから、
WM_SETREDRAW+InvalidateRectで描画をWM_PAINTまで遅延させてみたらどう?
DWMが何か空気呼んでうまくやってくれそうな気がしないでもない。
ドッキングダイアログってまだないの?.netでも良いの無かったな
SDIでCMDIChildWndを作りたいんだけど無理っぽいです
MDI自体はMFCとは無関係だから 作ろうと思えばいつでも作れる
MFCプロジェクトをVisual Studio上で作成しました。 何もしなくても、アプリケーションの再起動時にCDockablePaneの状態やスタイルやリボンの状態が復元されるのですが この情報の保存先はどこにあるのでしょうか?
レジストリ
971 :
964 :2011/09/06(火) 07:14:17.47
>>965 ありがとうございます。
試してみます。
972 :
969 :2011/09/06(火) 08:24:47.15
VisualStudio2010と2008のMFCは違うのか。 再起動マネージャとかちょっと試してみたいな。 2008用に更新パッケージとかないのかな。
MFC で新規プロジェクトを作成すると、StdAfx.hができますが このファイルの目的は何で、何が記述されているんですか?
>>974 そのままヘッダーファイル読めば良いじゃん
mfcの理解が深まるぞ
Visual Studio 2010 です。 MFC でDLLを作りたいです、しかしダイアログなどは必要ありません、このようなMFC のDLL の作り方なのですが、これでいいでしょうか? 新規プロジェクト→Win32 コンソール アプリケーション→アプリケーションの設定より下記の項目にチェックを入れる アプリケーションの種類 コンソールアプリケーション 追加のオプション 空のプロジェクト 共通ヘッダーファイルを追加 MFC
一点間違えてました アプリケーションの種類 ☓コンソールアプリケーション ○DLL です
978 :
デフォルトの名無しさん :2011/09/10(土) 23:33:27.39
それでいいです
CHtmlEditViewって、GUI操作でブラウザ画面?の文字や画像をDeleteしたりできますか?
_, ,_ | | | || ヤダァ(`Д´(ω・´川)<おばさんが君の布団でオナラしてあげるよ | ̄ ̄ ̄ ̄ ̄ ̄ ゙̄| | | ̄ ̄ ̄ ̄| | | | @ @| | | |@ @ | | | |____| | |__________| (⌒ ⌒;:゙:ヽ.' 。 /. ゚ 从 `(´⌒;`:;ノ:人;;⌒`:" / 从 。 .(´;(´⌒(;・"⌒`);/`):';⌒`)`)。.' ゚ 。((;;; _, ,_). | | | ||" :';))’: (⌒ ⌒;:゙: (`Д´(ω;´川) ゚(⌒ ;:゙。:ヽ.'/) | ̄ ̄ ̄ ̄ ̄ ̄ ゙̄|`):';⌒`)`)。.' ゚ | | ̄ ̄ ̄ ̄| |⌒`).(´;(´⌒(;・"⌒`); | | @ @| | ブボボ!ブボボボボボボボボボボボボ!!! | |@ @ | |⌒`) :; 从 ) | |____| |(⌒)) \ )) |__________| ヽ
981 :
デフォルトの名無しさん :2011/09/14(水) 08:54:23.66
MFCの32bitアプリがあります。 64bitに移行するのは可能ですか?
変なことしてなきゃ64bitOSでも動作するだろ
CMDIChildWnd ではなく、CWnd (あるいはCMainFrameのような) 上に、(Splitterのある2ペインの)分割Windowを作成したいのですが、可能ですか? MDIとは無縁のただの分割ウィンドウを作りたいだけなのですが、サンプルはMDIのものばかりで、どのように実現すればよいのかよく分かりませんでした というより、Splitterの付いた(汎用?)2ペインウィンドウの作成方法を教えてください。お願いします。
CSplitterWnd 使うやつでいいのかな?
プロジェクトを作るとき、アプリケーションの種類をシングルドキュメントにし、 プロジェクト形式をWindows エクスプローラにすれば要望通りのものになるかと。
986 :
983 :2011/09/15(木) 12:11:08.62
>>984-985 プロジェクト時にシングル&エクスプローラー形式のソースを見た所、
CMainFrame上に
CSplitterWnd m_wndSplitter; を配置し、
OnCreateClient 上にて
CreateStatic(this, 1, 2);
CreateView(0, 0, RUNTIME_CLASS(CHogeView), CSize(100,100), pContext);
CreateView(0, 0, RUNTIME_CLASS(CFugaView), CSize(100,100), pContext);
とすることで望み通りに動きました
ありがとうございました。
987 :
983 :2011/09/15(木) 12:12:11.12
CreateView(0, 0, RUNTIME_CLASS(CHogeView), CSize(100,100), pContext); CreateView(0, 1, RUNTIME_CLASS(CFugaView), CSize(100,100), pContext); ちょっとミスしたので訂正しときます。
988 :
デフォルトの名無しさん :2011/09/15(木) 18:02:13.12
OS:Windows7 開発環境:VisualStudio2005 回答お願いします。 MFCのエディットコントロールにログを吐き出すプログラムを作ってみました。 大量のログを表示させると途中で止まってしまいます。 なので100行毎に古いログを消すと言う処理を入れてみたのですが上手く行きません。 どうすれば良いか誰か教えて下さい。 引数:エディットボックスに表示する文字列(可変長で\0終端) CEdit m_EdLogMsg; void testDlg::__printf_s(CHAR szMsgBuffer[]) { UINT EditMax; // テキストの最大値 // エディットボックスに表示できる最大バイト数を取得する EditMax = m_EdLogMsg.GetLimitText(); // 100行を超えたら古いログを消す(本当はEditMax Byteを超えた場合に古いログを消したい) if(m_EdLogMsg.GetLineCount() > 100){ printf("Log Over.\n"); m_EdLogMsg.SetSel(0, 1); m_EdLogMsg.Clear(); } // カーソルを最後に移動させる m_EdLogMsg.SetSel( EditMax, EditMax, FALSE ); m_EdLogMsg.ReplaceSel(szMsgBuffer,0); m_EdLogMsg.ReplaceSel("\n",0); }
プロジェクト作成時に追加できる出力ペインを使ってみるとかは?
回答お願いしますとか、むかつく聞き方だな 自分で調べろ、屑
>>990 988ではないがそんなに気になるか?
単に質問か解答を区別して書き込んでるだけだと思うのだが
>>988 どこまでを古いログと見なすつもりなんだ?
>>988 この手の質問で「上手く行きません」ってよく書くけど、どこがどううまくいかないか書けば答えやすいのに・・・。
それはともかく、ツッコミどころ満載だけど、
100行超えたとき全部クリアするなら、SetWindowTextで設定すれば良いんじゃないの?
>m_EdLogMsg.SetSel(0, 1);
>m_EdLogMsg.Clear();
の意味わかってる?
>>988 >void testDlg::__printf_s(CHAR szMsgBuffer[])
中身と逸脱した糞みたいな関数名だな。
以前windowsのメモ貼でどれぐらいのサイズまで扱えるか実験したけど editコントロールの上限(0x7FFFFFFE)越えるサイズでも大丈夫だった。 自前で メモリ用意すればいけるみたい
997 :
デフォルトの名無しさん :2011/09/15(木) 23:51:56.26
>>993 一行増える度に一番古い行を一行消す様にしたいです。
ListViewのほうがよさそう
un
ko
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。