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