1 :
デフォルトの名無しさん :
2005/11/14(月) 18:01:44
前スレの990氏ね
3 :
デフォルトの名無しさん :2005/11/14(月) 18:06:51
4 :
前990 :2005/11/14(月) 18:17:23
結局CArrayが良いのかCStringArrayが良いのかどうか分からなくなったので、 CStringList部分をそのままにしてまつ。 でも、どれを積極的に使うべきかわからないですね。 いっそ、文字列リストはSTL?
5 :
3 :2005/11/14(月) 19:06:23
>>4 CStringArray と CArray<CString,CString&> の違い分かる?
6 :
前990 :2005/11/14(月) 19:07:33
分からないから相談室に着ます他。
RichEditCtrlでENLINKを使えばマウスがリンクの上に来たときに メッセージが捕まえられるのですが、リンクから外れたときは どうやって判断すればいいんでしょうか?
リソースの追加で「Dialog」を追加して、そのDialogのクラスを 「クラスを追加」で追加したのですが、「完了」ボタンを押下しても 何の反応もありません…。 何か手順に問題ありますでしょうか…?
リストビューにファイルのリストを表示して、 リストビューで選択状態になっているファイルの総容量を ステータスバーに表示したいです。 リストビューのアイテムの選択状態が変わったことを 知る方法があれば教えてください。
>>9 ItemDataにそのファイルのサイズか
サイズの入った構造体のポインタを1つずつ入れといて
Lボタンダウンかアップで
GetNextItem(index, LVNI_ALL |LVNI_SELECTED)
を使って選択状態のitemをGetItemDataして加算して表示してみるとか
11 :
デフォルトの名無しさん :2005/11/15(火) 18:29:12
PUSHBUTTONをディセイブルにすると、ビットマップが消えてしまいますが、どうしたら良いで塚?
12 :
11 :2005/11/15(火) 18:41:27
ディセイブル時のビットマップも設定できるのかなぁ?
>>11 CBitmapButton クラスでは、ラベルがテキストではなくビットマップ
イメージのプッシュ ボタン コントロールを作成できます。CBitmapButton
オブジェクトは、最大 4 つのビットマップを持ちます。それぞれの
ビットマップのイメージは、ボタンの状態を示します。つまり、ボタンが
押されていない (通常) 状態、押された (選択された) 状態、フォーカスを
得た状態、無効な状態の 4 つです。通常の状態を表すビットマップは
必要ですが、その他のビットマップは省略できます。
14 :
11 :2005/11/15(火) 19:05:56
サンクス>CBitmapButton IDEでペタペタ貼り付けたり、できるんでしょうか?
15 :
11 :2005/11/15(火) 19:24:07
ぐぐってますが、 VC++でCBitmapButtonをCDialogに貼る方法が、 分かりません。
16 :
13 :2005/11/15(火) 19:27:58
俺様用メモ。 ActiveX コントロールの [Microsoft Forms 2.0 CommandButton] でも 画像を貼れるが無効にすると灰色になる。
17 :
11 :2005/11/15(火) 19:29:24
じゃ、解決方法はCBitmapButtonしか無いわけですか。
18 :
13 :2005/11/15(火) 19:36:41
>>11 CBitmapButtonはCButtonの派生クラスなんだから、
サブクラス化してごにょごにょしたらいい。
19 :
7 :2005/11/15(火) 21:23:20
EM_CHARFROMPOSでマウスの位置から文字の位置調べて GetSelectionCharFormatでLINKのフラグ調べて何とかできました。
>>9 LVN_ITEMCHANGED通知メッセージ。前スレくらい、チェックしろよ。
21 :
9 :2005/11/16(水) 04:10:32
LVN_ITEMCHANGEDでいけました。 最近も同じ質問があったとは思わず申し訳ない。
22 :
デフォルトの名無しさん :2005/11/16(水) 08:40:41
>サブクラス化してごにょごにょ ごめん、自分MFC初心者なので、クラス派生なら分かるんだけど、 MFCで逝うサブクラスって何を指すか分からないんだ。 MFC特有が悪いだけじゃなくて、サブクラスって人によって、 「派生」を指したり「メンバ」を指したり、曖昧だおね。
23 :
13 :2005/11/16(水) 08:50:39
>>22 「サブクラス化」で一つの用語。
例えば、ダイアログに貼った元の CButton に、
(CButton のサブクラスである)CBitmapButton の機能を持たせるイメージ。
> MFC特有が悪いだけじゃなくて、サブクラスって人によって、
> 「派生」を指したり「メンバ」を指したり、曖昧だおね。
メンバを指す場合なんかある?
24 :
デフォルトの名無しさん :2005/11/16(水) 09:18:45
VC++のIDEでのサブクラス化手順説明サイトきぼんにゅ。
25 :
24 :2005/11/16(水) 09:28:11
ググッて色々読んで予想しますた。 1.IDEでCButtonを貼る 2.ソースの宣言をCBitmapButtonに変更 3.OnInitDialog()で.SubclassDlgItem で、おk?
26 :
24 :2005/11/16(水) 09:37:56
1.IDEでCButtonを貼る 2.IDEでコントロール変数をCBitmapButtonクラスで宣言 は、どう?
28 :
24 :2005/11/16(水) 09:45:30
>>27 それだけで良いんですか?_?
先ず、それでやってみます。
29 :
24 :2005/11/16(水) 09:55:50
あれ? IDEではPushButtonなのに、ヘッダーではCButtonになってるし、実装部でもインスタンス差し替えも無い。。。 MFCって結構不思議じゃない?
30 :
24 :2005/11/16(水) 10:24:59
.LoadBtimapsだけじゃ動作しませんね。 .AutoLoadするとエラーになるし。。。 .SubclassDlgItemとか色々メソッドコールしないといけないのかなぁ?
31 :
24 :2005/11/16(水) 10:37:22
.SetButtonStyleと.LoadBitmapsでできたっぽいです。 .SubclassDlgItemしなきゃならない局面てどいうときだろう。
32 :
13 :2005/11/16(水) 11:00:00
>>27 の別解
1. ダイアログにボタンを貼る。
2. CBitmapButton派生のクラスを作る(例えばCBmpBtnとか名付ける)。
3. 1.のボタンを右クリックして[変数の追加]。
メンバ変数の追加ウィザードが出るので、
変数の種類をCButtonから(自作の)CBmpBtnに書き換える。
これもSubclassDlgItemは不要。
33 :
13 :2005/11/16(水) 11:10:21
ビットマップ ボタンの場合は
>>32 の処理に加えて
ボタンのプロパティで[オーナー描画]をTrueにする。
>>31 のSetButtonStyle()も動的に同等の処理をやっている。
--------
また、CBitmapButton::SizeToContent() でボタンのサイズを
ビットマップに合わせることができる。
実行時のWindowsのフォント サイズによってはレイアウトが崩れますな。
--------
CBitmapButton::AutoLoad()を使う場合は、
ボタンのキャプションとビットマップのIDをそろえる必要がある。
・ボタンのキャプション。IDは任意。
MYBTN
・4つのビットマップのID
MYBTNU (通常)
MYBTND (選択状態)
MYBTNF (フォーカス)
MYBTNX (無効状態)
参考
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_mfc_cbitmapbutton.asp
レスサンクス 何だか難しいね。 絵でもあれば良いんだろうけど、M$DNも文字ばかり。
35 :
デフォルトの名無しさん :2005/11/16(水) 15:17:07
CBitmapButtonに普通のビットマップとグレイのビットマップを設定して完成しました。 が、フォーカスを受け取った場合はほっといて良いとして、 ボタン押した瞬間の画像も作らないといけなくなるかも知れません。 それって簡単に作れるのでしょうか? それともCBitmapButtonの設定で押されたとき、へこむイメージになったりするのでしょうか?
聞くより先に自分の手を動かせ。
37 :
デフォルトの名無しさん :2005/11/16(水) 15:35:32
CBitmapButtonってCButtonの派生でつか?
38 :
デフォルトの名無しさん :2005/11/16(水) 15:48:00
>それともCBitmapButtonの設定で押されたとき、へこむイメージになったりするのでしょうか? 手を動かさなくても、設定でへこむイメージにする方法きぼんゆ。
39 :
37 :2005/11/16(水) 16:00:39
ヘッダーファイル見たら分かりました。 > class CBitmapButton : public CButton
40 :
デフォルトの名無しさん :2005/11/16(水) 17:26:00
CStatusBar を Create して ステイタスバーを表示したのはいいものの これを 非表示/表示 切り換えるにはどうしたらいいのでしょう?
sdiやmdiがやってるのを真似するだけ
42 :
デフォルトの名無しさん :2005/11/16(水) 17:47:42
OnPaint()イベントで、画面全体にBitBltして、 その後にTextOutコールしてますが、その文字が描画されない場合があります。 画面全体がリフレッシュする場合は問題無いのですが、 例えばエクスプローラを被せて、マウスでスライドした場合等、 BitBltは動作しますが、TextOutが忘れられる場合があるようです。 どうしたら良いでしょうか?
43 :
42 :2005/11/16(水) 18:04:24
CDialogがフォーカス受け取ったとき再描画かけようかと思いましたが、 そんなイベントありますか?
44 :
42 :2005/11/16(水) 18:27:34
WM_KILLFOCUSしか無いよ・゚・(つД`)・゚・ウワアン
45 :
13 :2005/11/16(水) 18:47:53
>>35 フォーカスも用意しておかないと
タブキーを押したときにフォーカスがどこにいくか分からないし、
スペースキーを押したときにどのボタンが押されるか分からない。
BOOL CDC::DrawEdge( LPRECT lpRect, UINT nEdge, UINT nFlags );
void CDC::Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight );
void CDC::Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight );
なんてのもある。
46 :
13 :2005/11/16(水) 18:50:48
>>43 CDialogはそういう描画に向いてない。
>>35 > ボタン押した瞬間の画像
というのが選択状態。ボタンならへこんだところ
TextOutの戻り値は調べた?
OnActivateでいけました
49 :
42 :2005/11/16(水) 19:14:41
CDialogの上にCDialogを貼ってるのが原因でした。 台紙のDialogのWM_PAINTで上のDialogにRedrawWindowコールで解消しました。 でも、画面チラチラします。
>>45 1枚のビットマップから、残りの3種類のビットマップを生成出来るようなツールは無いんでしょうかね?
51 :
13 :2005/11/16(水) 19:26:49
これだ。ボタンでも何でもない場所にでもボタンを描画できるw ボタン、チェック、ラジオ、閉じる、最大化、最小化、スクロールバー、メニューのマーク、など 指定した種類とスタイルでフレーム コントロールを描画します。 BOOL CDC::DrawFrameControl(LPRECT lpRect,UINT nType,UINT nState); DFC_BUTTON DFCS_BUTTON3STATE 3 ステート ボタン DFCS_BUTTONCHECK チェック ボックス DFCS_BUTTONPUSH プッシュ ボタン DFCS_BUTTONRADIO オプション ボタン DFCS_BUTTONRADIOIMAGE オプション ボタンのイメージ (四角形のイメージは必要ありません。) DFCS_BUTTONRADIOMASK オプション ボタンのマスク (四角形のマスクは必要ありません。) DFCS_CHECKED ボタンがチェックされてる DFCS_FLAT ボタンにフラットな境界がある DFCS_HOT ボタンがホット トラックされてる DFCS_INACTIVE ボタンがアクティブでない(灰色) DFCS_MONO ボタンにモノクロの境界がある DFCS_PUSHED ボタンが押されてる DFCS_TRANSPARENT 背景を触らずに残す
CScrollViewを継承したビューのOnDrawでCDC* pDCを使うと勝手に描画位置がオフセットされますが、オフセットさせないためにはどうしたらいいでしょう。
MFCから使えてTHogeTextViewみたいなリッチエディットより軽いのありませんか?
CViewで適切なScroll係イベントハンドラの処理してくれる関数ありませんか。 自分でOnVScrollに switch( SBCode ) { case SB_DOWN...... } とか書かないと駄目ですか? 上のように書いてみて動いたものの、汚いしソース長くなるし、別のScroll使ったVIEWつくったときコピペするのがいやなんです。 CScrollViewは使いたくないのです。
58 :
デフォルトの名無しさん :2005/11/17(木) 08:02:18
CViewにスクロールの処理を自前で書いたらいいじゃない。 CScrollViewもCViewもソースがあるんだし。
MFCのCDialogポトペタって、 後からヘッダーファイルのクラス名変えれるということは、 位置あわせのとりあえずコントロール貼りだと思えば良いのでしょうか?
mfcでフラクタルのプログラムしてるんですが mfcになれないってのもあって苦労してます。 一番困ってるのが処理速度なんですが フラクタルという性質上ランダムウォークさせたり 10万回とかのループも多いのですが なにより描画にものすごく時間がかかります。 高速化を考えているのですが一番気を使うべきところってどこでしょうか? 抽象的な質問で申し訳ありませんが相談乗ってほしいです。
>>60 何を描画してるのか・どうやって描画してるのかも書かずに、何を答えろと言うのか?
SetPixelで1ドットづつ書いてるとかいう話じゃないのかねー
63 :
デフォルトの名無しさん :2005/11/17(木) 16:40:50
UnicodeアプリでCPageSetupDialogを開いてOKすると、 その後の印刷関係の操作でassartがでてしまいます。 現在のプリンタをappのGetPrinterDeviceDefaultsで 取得してCPageSetupDialogにセットしています。 いろいろ検索してみましたが見つかりません。 知っている人がいれば原因を教えてください。
>>63 assertが出たのならそのメッセージ貼れや
65 :
sage :2005/11/17(木) 17:00:31
assartですが、印刷プレビューの場合、 appprnt.cpp 42行 MFCのソースは、 LPDEVNAMES lpDevNames = (LPDEVNAMES)::GlobalLock(m_hDevNames); ASSERT(lpDevNames != NULL); です。 appのm_hDevNamesのハンドルが壊れているようです。 なぜ壊れてしまうんでしょうか
壊してるから。
67 :
63 :2005/11/17(木) 17:46:44
ウィザードで空のdoc/viewアプリ作って、 Viewのコマンドを追加して以下の文を書くだけでも発生しました。 ちなみにVCのバージョンは2003です。 PRINTDLG pd; CPageSetupDialog dlg(PSD_INHUNDREDTHSOFMILLIMETERS, this); AfxGetApp()->GetPrinterDeviceDefaults(&pd); dlg.m_psd.hDevNames = pd.hDevNames; dlg.m_psd.hDevMode = pd.hDevMode; dlg.DoModal();
DoModalがIDOKで戻ってきたときの処理が足りんようだな。 CPageSetupDialogコンストラクタのヘルプサンプル見てみろ
69 :
63 :2005/11/17(木) 18:17:26
IDOKの後にSelectPrinterが必要ということでしょうか? つけて見るとSelectPrinter内で同じようなassartが出ました。 他に何か必要でしょうか?
書いてないけど、SelectPrinterの最後の引数にFALSE指定しないと、 無効なハンドルを解放しようとしてエラーになる。
「この場合は」だけどね。
72 :
63 :2005/11/17(木) 19:05:44
ありがとうございます。FALSE指定でエラーはでなくなりました。 前のハンドルはCPageSetupDialogの中で開放しているのでしょうか? ヘルプとの違いも気になりますが・・・。一応少し調査してみます。
CPageSetupDialogっつか、::PageSetupDlgが解放しやがる。 まあ、あのダイアログからプリンタ変えられるから無理もないんだけど。
74 :
デフォルトの名無しさん :2005/11/17(木) 23:40:28
おたずねします。 3つのビューをスプリッタで分割して表示しているのですが、そのうち2つのViewでGetDocument()が失敗します。 成功するViewはMFCウイザードでデフォルトで作られるViewで、あとの2つは自分で追加したViewです。 どうしたら他のviewでもGetDocumentが使えるようになるのでしょうか。
CView::GetDocumentが失敗することなんか無いはずだが。 CDocumentと関連付けていなければNULLは返るが。
>>75 おっしゃるとおりでした。AddViewをしていませんでした。
しかし、以下のようにするとAddViewで強制終了してしまいます。
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT p,
CCreateContext* pContext)
Splitter1.CreateStatic( this, 2 , 1 );
Splitter2.CreateStatic( &Splitter1 , 1,2,WS_CHILD | WS_VISIBLE | WS_BORDER,
Splitter1.IdFromRowCol(1,0));
Splitter2.CreateView(0,0,RUNTIME_CLASS(CLeftView), CSize(200,0),
pContext);
Splitter2.CreateView(0,1,RUNTIME_CLASS(CHogeView), CSize(0,0), ←デフォルトで作られるview
pContext);
Splitter1.CreateView( 0,0,RUNTIME_CLASS( TopView), CSize(0,180),
pContext);
CView* c = (CView*)Splitter1.GetPane( 0,0);
pContext->m_pCurrentDoc->AddView(c);
}
いったい何が悪いのでしょう。
77 :
76 :2005/11/18(金) 01:39:18
すみません。解決しました。 GetDocument()を呼び出したCViewのインスタンスがそもそも無効なオブジェクトでした。 だから失敗したんですね。 スレを汚してすみません。
78 :
デフォルトの名無しさん :2005/11/19(土) 18:13:27
リソースエディタでみるときに IDR_MAINFRAMEの ファイル(&N),編集(&E)等にはIDは割り当てられていないようなのですが、 IDはないのでしょうか?
GetMenuItemIDで調べてみたけど UINT(-1)になってた。 ルートメニューの検索ためにこうなってるのかな...
>>80 なるほど
「指定された項目がポップアップ メニュー (ポップアップ メニュー内の項目ではなく) の場合は、-1 を返します。」
ポップにするとUINT(-1)になるのか...
>>81 みてみましたが、ポップアップの場合のIDは見あたりませんでした。でも、参考になりました。
ポップアップの項目を見つけるの場合は
メニュー内をトラバースして文字列照合することにしました。
ありがとうございました。
83 :
デフォルトの名無しさん :2005/11/20(日) 06:18:52
ちょっとお聞きしたいのですが、 自アプリのツールバーをCToolBarで作る際、 googleツールバーやMSNツールバーみたいに、 画像のみのボタンで、大きさが違うものって作れますか? 大きな画像を貼ろうとすると、全てのボタンが大きくなってしまうんですよね…。
CToolBarのボタンの大きさは一定。 それが嫌ならCDialogBarで自作しろ。
>>83 ツールバーボタンではなく、コンボボックスをツールバーに持たせる要領で独自のボタンコントロール貼れ
86 :
デフォルトの名無しさん :2005/11/20(日) 14:15:05
CStringやその他のMFCを使いたいのでDLLを作る際に”MFC DLL”というプロジェクトをウイザードから作りました。 よく見てみるとこのDLLにはCWinAppクラスとそのインスタンスがありました。 このDLLをクライアントアプリケーションに動的にリンクした場合、 CWinAppが2つ、つまりプライマリスレッドが2個できてしまうと思うのですが、そうなのですか?
DLL側とクライアント側の両方でAfxGetApp()呼んで比べてみたら?
リソースの言語をプロパティで 日本語->英語 に変更すると エディタで*.rcファイルみると 単に ?で置換されてるようにみえるけど 英語->日本語 に戻すと文字列が復元されてるようなんだけど rcファイル以外のどこかに保存されてるのかな?
89 :
デフォルトの名無しさん :2005/11/21(月) 01:18:34
>>88 rc をコンパイルしたのが aps にキャッシュされるんじゃないかな。
キャッシュを消して言語を変えるとどうなるか報告よろしくな。
90 :
88 :2005/11/21(月) 01:32:12
>>89 thx.
apsファイルを削除したところ、見事
置換された?が表示され、文字列は復元されませんでした。
apsから復元してたのか...
MSDN引用
「filename.aps
現在のリソース スクリプト ファイルのバイナリ形式。このファイルは読み込みを高速化するために使用されます。 」
91 :
デフォルトの名無しさん :2005/11/21(月) 01:36:05
質問です IDD_DIALOGXXが定義されていませんというコンパイルエラーが出ます しかしこれはリソースエディタで定義済みのはずで、今までずっとこのリソースを使ってコンパイルが通っていました。 これまで2回あり、何かの拍子に突然未定義になるのです。 こうなると自分で#define IDD_DIALOGXXと定義しなければコンパイルできません。 リソースエディタを見るとちゃんとIDD_DIALOGXXが入っていて、しかもフォームエディタで作った通りのダイアログが作成できます。 VCのバグでしょうか?
92 :
デフォルトの名無しさん :2005/11/21(月) 01:49:21
>>91 お前の頭のバグ。
・resource.hにIDD_DIALOGXXを定義しろ。
・resource.hを書き換えたらリビルド(クリーン+ビルド)しろ。
・何でもかんでもVCのバグのせいにするな。
93 :
デフォルトの名無しさん :2005/11/21(月) 01:57:57
解決しました。頭のバグでした。 なんとcppでResource.hをインクルードするまえにダイアログのヘッダをインクルードしてました。 基本的なことでおさわがせしてすみまんお(^ω^;)
94 :
86 :2005/11/21(月) 02:03:10
DLL側のtheAppとクライアントアプリ側のtheAppは異なりますね。 エクスポートされた関数の内部でAfxGetAppするとクライアントAPのtheAppではなくDLLのtheAppがとれました。 デバッガでとめてみるとスレッドは一個しかないようです。 なぜスレッドが一個なんですか?
リソースのインクルードで 日本語のリソースファイルのincludeを英語版に変更したところ、 スタティックリンクを指定した場合は変更が反映されたのですが、 なぜか共有DLLの場合は変更が反映されません。 こういうものなのでしょうか? それとすぐ上に LANGUAGE 17, 1 という記述もあるのですが、 プライマリー言語のID,サブ言語のIDでよいのでしょうか? #include "l.jpn\afxres.rc" //標準のコンポーネント(jp) #include "l.jpn\afxprint.rc" //印刷/印刷プレビュー リソース(jp) JP->ENG #include "afxres.rc" // 標準のコンポーネント #include "afxprint.rc" // 印刷/印刷プレビュー リソース
96 :
デフォルトの名無しさん :2005/11/21(月) 15:52:09
ダイアログを表示させた直後に処理を開始したいと思って調べてたら
ttp://mtakahashi.com/old/00125.html#00106 を見つけました。
結論としてこのようになっていました↓
1、
OnInitDialogで、
-----
EnableWindow(FALSE);
m_bFirst = TRUE;
-----
2、
OnPaintで
-----
if (m_bFirst){
m_bFirst = FALSE;
PostMessage(WM_COMMAND, MAKEWPARAM(ID_START, 0), NULL);
}
-----
3、
OnStartで
-----
EnableWindow(TRUE);
(長い処理)
-----
これって独自メッセージを定義しなくても
OnPaintの部分で(長い処理)をやればいいと思ったんですけど
それじゃダメなんですか?
97 :
デフォルトの名無しさん :2005/11/21(月) 17:15:39
IEツールバー作ってるんですが、 GoogleとかMSNのツールバーみたいに、一番左のボタンを画像のみで大きくする方法がわかりません。 苦肉の策でボタンサイズの違うツールバーをもう一つ作って、ドロップダウンコントロールみたいにツールバーを貼り付けると、 貼り付ける側にTBSTYLE_TRANSPARENTを加えると、真っ黒になっちゃうしで苦しんでいます。 できれば1つのツールバーで実現する方法を、もしくは黒くなるのを防ぐ方法をご存知の方、ご教授ください。
98 :
デフォルトの名無しさん :2005/11/21(月) 17:19:55
>>97 だからCDialogBarで作れって。何度も同じこと言わせるな。
分からないならSpy++で他のツールバーがどうなってるか調べろ。
>>96 OnPaintは、他のウィンドウに隠れていた対象のウィンドウが前面に移動したり、
最小化の解除(元のサイズに戻す)やサイズ変更などのイベントが発生すると、
何度でも呼ばれてしまうんだが?
100 :
96 :2005/11/21(月) 17:28:40
>>99 すいません。そこで
if (m_bFirst){
m_bFirst = FALSE;
(長い処理)
}
というふうにOnPaintの if 文の中でやればいいのじゃないかなと思ったんです。
実際やると、うまくいくみたいなんです。
OnPaintで ----- if (m_bFirst){ m_bFirst = FALSE; EnableWindow(TRUE); (長い処理) } ----- と書いたら長い処理の処理時間が長いときは、 入力できる状態になるまでの時間が長くなる。 長い処理は別のスレッドで処理するべき。
102 :
デフォルトの名無しさん :2005/11/21(月) 17:31:26
OnPaint()は描画のためのものなのだから、 本来は描画以外のことは書くべきでない。
103 :
96 :2005/11/21(月) 17:36:59
>>101 あぁ〜なるほど。と思ったんですが、
この独自のメッセージはOnPaintで最初の一回きりでしか呼ばれないんですよね。
となるとやはり同じ気がしてきました。
>>102 なるほど。ただメッセージマップを自分で登録しなきゃいけないのが面倒です。
こういうダイアログってよくあると思うんですけど、本当みんなどうやってるのかな。
>>103 #defineでユーザーメッセージ定義して、メッセージマップにハンドラを登録
して、.hファイルにメッセージ処理関数の宣言書いて、cppファイルにメッ
セージ処理関数の実体を書けば済む話だろ。
ごちゃごちゃ言ってないで、初心者は熟練者の3倍は手を動かせよ。
105 :
96 :2005/11/21(月) 17:42:03
>>103 分かってないな。例えば5秒かかる処理だったら、
ウィンドウが出てきてから操作できる状態になるまで5秒かかる。
長い処理って何だよ。
あと、OnCreate()とかPreCreateWindow()とかあるんだからいろいろ使い分けろ。
107 :
95 :2005/11/21(月) 22:40:15
108 :
デフォルトの名無しさん :2005/11/22(火) 05:33:19
>>98 MSNツールバーってCDialogBarなん?
>>108 MSNツールバーが、MFCを使ってるかどうかって問題もあるんだが?既存の
MFCクラスを活用する近道がCDialogBarであることは間違いない。CWndの
派生クラスを定義して、ドッキングバー相当の機能を独自にゼロから実装
することだってできる。MFCはソースも公開されているしな。いずれにしろ
答え(実装方法)は1つではない。
110 :
デフォルトの名無しさん :2005/11/22(火) 19:31:32
MFCサポートのコンソールアプリから、ダイアログのインスタンス(dlg)を作成しています。 そのdlgにメッセージハンドラを作成し、SendMessage() で呼び出しています。 そのハンドラ内でSetTimer()しているのですが、OnTimerが発効されません。 dlg は、Create() なり、ShowWindow() なりをしてから、等いろいろ やってみたのですが、うまくSetTimer() されません。 何か他にやらなければいけないとか、コンソールアプリの制限とかが あるのでしょうか? (要はCWndの派生クラスを作成して、メッセージとタイマーのハンドラが 登録したいだけなんですが・・・)
>>110 タイマを使うならウィンドウ ハンドルが有効である必要がある。
タイマが終わったことをウィンドウに知らせるからな。
dlg.GetSafeHwnd()の結果を書け。話はそれからだ。
長文のくせに重要なことを書いてない。
>>111 dlg.GetSafeHwnd() の戻りは 0x0019078a で有効なようです。
もうひとつ、大事なことを書いていませんでした。
ダイアログはDLLで実装しています。
そこで問題となったのは、どうしても、コンストラクタのリンクエラーが
取れない為、通常の「MFC共有DLL」ではなく「MFC拡張DLL」を使って、
class の定義を class AFX_EXT_CLASS CMyDlg : public CDialog
としています。
試しに DoModal() の SetTimer() は、問題なく登録されました。 ただ、タイマーとメッセージの実装が目的なので、DoModal() は 目的とズレてしまいます。 DoModal() の内部でやっている「何か登録する部分」だけの CWndのメンバー関数を呼び出せば、いいのだと思います。 Create(IDD_TEST_DLG) と ShowWindow(SW_SHOW) だけでは どうも駄目なようです。
派生クラスでメッセージマップに関数登録すると 基本クラスの関数が検索されなくなって、呼び出されなくなるんだけど。 WindowProcいじるしかないよね?
>>115 派生クラスのオーバーライドした関数内で、基本クラスの関数を呼び出せば
済むだろ。MFC以前にC++を勉強し直した方が賢明だな。
117 :
115 :2005/11/23(水) 07:12:14
>>116 言い方が悪かった。「基本クラスの関数が検索されなくなって」
じゃなくてメッセージマップに登録したことで基本クラスの動作が阻害された場合。
だから関数がCallできるかは不定なのでその手法は使えません。
>>113 俺もやってみたが、コンソールアプリからは、SendMessage() で
メッセージハンドラーの呼び出しは成功するが、その中での
SetTimer() が失敗する
当然の話だがダイアログベースのダミーからは、問題ない
何か必要な手続きがあるのかな
MFCレベルでなくて、Win32APIかAFXのコアなスキルが要るかも
>>118 俺もやってみたが、コンソールアプリからは、SendMessage() で メッセージ
ハンドラーの呼び出しは成功するし、その中での SetTimer() も成功するな。
当然、DLL内のダイアログ派生クラスのWM_TIMERメッセージハンドラである所の、
CDlgInDLL::OnTimer()も呼び出されるのも確認した。
> MFCレベルでなくて、Win32APIかAFXのコアなスキルが要るかも
特に要らんラベルだと思うな。
誘導されてきますた MFCでスレッドを使ったプログラム書いています。 DialogAppを書き換えたものでプログラム自体はWndクラスとAppクラスのみで動いてます。 そいでCXXApp::InitInstance()にてWindowを生成 生成後に m_pThread = ::AfxBeginThread(ThreadProc, this) ; AutoDeleteはfalseに設定 見たいな感じでスレットを開始しています。 呼び出されたスレッドでは UINT CXXApp::ThreadProc(LPVOID pParam) { CXXApp*pApp = (CXXApp*)pParam ; CWnd* pWnd = pApp->m_pMainWnd ; while(pApp->m_isActive == true) { pWnd->SetWindowText(FPSの数値) ; //ここが問題の場所です。 描画処理 } return 0 ; } これでとりあえずは意図した動作はしているのですが 閉じるときにAssertErrorが出てしまいます。 プログラムを閉じる際にExitInstanceにてループしながらスレッドの終了を待つように しています。実際エラーは、スレッドが終える前に起きています。 ASSERTの内容はSetWindowTextの一行目 ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); で出てるみたいです。でもよくわかりません(>< なんかスレッドの場合必要な処理とかがあるんでしょうか?よろしくお願いします。
普通にWM_CLOSEとかで判断すればいいのでは?
スレッド WM_CLOSE の検索結果 約 667 件中 1 - 10 件目 (0.58 秒)
>>120 ワーカスレッド終了前に、プライマリスレッドのウィンドウを破棄して
いるんでは?
>>120 関係あるかどうか分からんけど、CWnd*を別スレッドに持ち出すと、
CWnd::AssertValid()の中で怒られたりするし、そうでなくても
後々変な挙動になったりするので止めた方が良い。
なにかを別スレッドに持ち出すとき 普通に注意スレということですね
>>121-123 やっと出来ました。ExitInstanceでやっていたものをCxxWnd::OnCloseで
やったらASSERTエラーが起きなくなりました。
多分ExitInstanceって呼ばれた時点で既にウィンドウを破棄してるんですね。
物凄い勘違いしてますた
>>124 これもMSDNのヒントのとこで読みました
でネットでいろいろ検索してみたんですがなんかすげぇ難しいっす><
自分の場合は同じウィンドウのCWndだったのでエラーの類や
不具合は出なかった(?)みたいですがいろいろ読んでるとなんかマズイらしいです。
HWNDで渡してattachするって言うのもいまいち理解できてません・・・・
とりあえずもう少しやってみます。有難うございました。
MDIのようなスプリットでない複数のViewをSDIで行いたいんですが、 どのようにすれば良いでしょうか?
スプリットでない複数のViewということは IEのようにウインドウをたくさん開きたい?
131 :
130 :2005/11/27(日) 00:33:58
>>130 の続き
2.で想定外の動作とはMFCで作成したダイアログ上にマウスポインタがあればdll
からメッセージが通知されるが、ダイアログ上からマウスポインタが外れると通知
されない動作です(キーボードのフックはマウスポインタが外れても通知されるの
を確認しました)。
また、dllのフックプロシージャを下記の様に記述しているため、
LRESULT CALLBACK CMyMHook::MProc(int fCode, WPARAM fwParam, LPARAM flParam) {
if( fCode < 0 || fCode == HC_NOREMOVE )
return ::CallNextHookEx( m_hMHook, fCode, fwParam, flParam );
fCodeに上記フィルタに該当する値が設定されているのかと、上記if文にブレーク
を貼ったところ、ブレークがかかりませんでした。
(マウスポインタが外れている時はフックプロシージャ自身がOSからコールされない)
以上の内容から、上記2の私の想定外の動作はどうしてそうなるのか分かる方居
ませんか?
いらっしゃったら何故そうなるのかお教え願います。
要望があればソースをどこかに置きますが、かなり丸写しに近いので少ししのび
がたい状況です。
尚、私の作成しているツールは1で対応しているため特に影響はありません。
単にSetCapture忘れてるだけだったりして。
133 :
130 :2005/11/27(日) 00:43:08
>>132 そういうことではないです。
キャプチャーをダイアログが失っている時に、dllがシステムフックして
ダイアログに通知する仕組みに関する質問です。
>>129 そうです。複数のViewをフレーム付きで子ウィンドウとして扱い、同時に表示したいのですが、
MDIにはしたくないのです。
この考え自体が間違えなのでしょうか?
>>134 学生なら Visual Studio .NET the Spoke Premium 2003 買いなさい。
○ シングル ドキュメント (SDI のこと)
○ マルチ ドキュメント (MDI のこと)
○ ダイアログ ベース
□ HTML ダイアログを使用する
● 複数のトップレベル ドキュメント
>>134 「子ウィンドウ」と「ポップアップウィンドウ」の違いは理解しているのか?
「子ウィンドウ」は「親ウィンドウ」の外には出られない。
137 :
デフォルトの名無しさん :2005/11/27(日) 23:28:46
>>137 Visual Studio 2005 Professionalが無料で手に入る。
>>134 ドキュメント・ビューアキテクチャを使わないのが前提だが、
CViewを格納するArrayクラスを作って、それを持つCWnd派生クラスを作る
140 :
デフォルトの名無しさん :2005/11/28(月) 14:24:00
>>135 が言うように「複数のトップレベル ドキュメント」使えば一発。
最近のはそういう選択肢があるんだ
142 :
139 :2005/11/28(月) 15:07:29
なんだ、タブブラウズ機能みたいの想像してた。orz
143 :
デフォルトの名無しさん :2005/11/29(火) 12:31:13
144 :
デフォルトの名無しさん :2005/11/29(火) 18:51:13
VC6.0のMFCでMSChartを利用してグラフ表示しています。 CFormViewにMSChart貼り付けている グラフを印刷するには、どうすればいいんですか?
印刷処理を入れればいい。
.Net 2003を使用しています。 ライブラリでmfc70d.libが必要と怒られているのですが、mfc71d.libを使用するように プロジェクトの設定をかえる事って出来ないでしょうか?
>>146 プロジェクトメニュー → プロパティ → MFCの使用「スタティック ライブラリでMFCを使用する」
Standard版にもスタティックライブラリが使えたかどうかは不明・・・
なんだ実行時の話か デバッグビルド配布したんだろ
問題は〜d.libなことではなく、70か71かの違いだろ。
>>146 デバッグビルドを配布しちゃいけません。
でもなんで2003なのにmfc70が必要なの?
152 :
146 :2005/11/29(火) 21:47:07
皆様回答ありがとうございます
すいません、実行時ではなくリンク時です。
利用しなければならないライブラリがmfc70でないといけないらしいのですが
開発環境は2003しかないので困っております。
>>147 さんの方法を試しましたが今度は
大量の「〜はすでにmfc71d.libで定義されています」というエラーが吐かれました。
(例:LNK2005: "public: __thiscall CMDIFrameWnd::CMDIFrameWnd(void)" (??0CMDIFrameWnd@@QAE@XZ) は既に mfc71d.lib(MFC71D.DLL) で定義されています。)
どこぞからmfc70.libを入手するしかないのでしょうか…
>利用しなければならないライブラリがmfc70でないといけないらしいのですが アホかと。
>>152 そのエラーはmfc71d.libをすでに君のアプリにリンクしていて、且つ、そのなかに入っている関数とか変数が別のlibにもあって、
どっちを使ったらいいか分りません。っていうエラー。
ランタイムがインストールされていないPCでVC7で作ったexeを実行するとmfc7x.dllがないとか、いっぱい怒られるよ
155 :
146 :2005/12/01(木) 20:22:15
皆様本当に回答ありがとうございます。 対象のライブラリを使用せず書けるめどが立ちそうなので ひとまず自己解決ということでよろしくお願いいたします。
AfxBeginThreadが失敗したときの戻り値はNULLなんでしょうか?
>>156 ソース見るとNULLが返るようになってるが、MSDNには
>Pointer to the newly created thread object.
としか書かれてないな。
まあNULLでいいんでないかい。
MSDNはいい加減だからな
APIの仕様が必ずしも全て記述されてないものがあり困る時がある M$だから仕方ないとあきらめてるが 多分バイトにでも書かせてるんだろう
低学歴を寄せ付けない仕様
162 :
デフォルトの名無しさん :2005/12/04(日) 22:34:02
スレ違いのためこちらに誘導されてきました。 今アプリケーションを作成していまして、検索ダイアログを 作ったのですが、いったん検索ダイアログを閉じてしまうと、 CFindReplaceDialogオブジェクトがNullになってしまうので すが、どうにかして状態を残しておくことはできないでしょうか? CFindReplaceDialogオブジェクトを残しておきたい理由としまして、 ダイアログを閉じても、F3ボタンで検索の続きができるように したいのです。どなたか教えていただけないでしょうか?
ダイアログ閉じてもデストラクタ呼ばれるまでオブジェクトは消えないと思うけど
164 :
デフォルトの名無しさん :2005/12/04(日) 22:49:01
>>163 ご返答のほうありがとうございます。
CFindReplaceDialogのデストラクタを
探しているのですが、CFindReplaceDialogクラスの
定義を見ると、コンストラクタのみで、デストラクタは
存在しません。どこか他の場所に宣言されているの
でしょうか?
それはアプリケーションの別の場所で文字列を持っておいたほうが スマートじゃないかな?
ダイアログベースのC***Dlgクラスで、色々な終了処理をまとめた メンバ関数を作成しました。 この関数をデストラクタから呼ぶと、当然怒られてしまいます。 こういう場合はどのメッセージハンドラを使うのが適切ですか? DestroyWindow,WM_CLOSE,WM_DESTROY等色々ありますが、 どれでも問題ないでしょうか?
>>167 終了処理の内容と、処理の仕方による。デストラクタで問題ないことも
ある。
デストラクタでエラーが出るのは、終了処理の中でGetDlgItem()など、
ダイアログのウィンドウハンドルを必要とするメンバ関数からだろ。
DestroyWindow ウィンドウを破棄する関数であって、破棄されたときに呼ばれる関数じゃない。 WM_CLOSE が来たからといって必ずウィンドウが破棄されるとは限らない。 WM_DESTROY は大丈夫。
>>168 >>169 どうもです。当面WM_DESTROYを使いながらボチボチ勉強していこうと思います。
171 :
デフォルトの名無しさん :2005/12/09(金) 14:50:37
ファイルからデータを読み出してint型変数に格納し、 そのデータを基にOnDraw関数でグラフィックスを描きたいのですが どのようにプログラムを記述すればいいのでしょうか? 誰か教えてください
普通に。
ファイルも読めない、グラフィックも書けないアフォか。
方眼紙にグラフ書くのと同じ
>int型変数に格納し、 CxxxDocクラスにメンバー変数追加 >ファイルからデータを読み出して すでにファイルフォーマットが存在するなら メニューに読み込みのメニューでも追加して、CxxxDocクラスに そのメニューのハンドラ追加して、そこで読み込み。読み込んだらUpdateAllViews() ; ファイル選択したければCFileDialogクラス使う。 まだフォーマットが存在しないのなら MFCのシリアライズを使ってもいいが、フォーマットは自由にはできない >そのデータを基にOnDraw関数で 数値を表示するならpDC->TextOut()とか、 線ならMoveTo(), LineTo()とかCDCのメンバー関数使う。 ※データはCxxxDocクラスに置く、描画はCxxxViewクラスで行う、 データが変更されたらCxxxDocオブジェクトのUpdateAllViews()呼ぶ
そんなレベルのことをいちいち解説する奴も、なかば荒らしだな。
>>175 ありがとうございます
レベル低くてすいませんでした
MFCが嫌スレ見たらひどい言われようなんですけど、 MFCを使ったアプリをパッケージ製品なんかにしたら 作った会社のレベルは低いと業界ではみなされるんですか???
嫌スレでやれ
MFCはフレームワークに合ってれば良いでしょ。 でもウインドウ出さずにタスクトレイに入るユーティリティのような、 純粋なデスクトップアプリでないケースではWTLの方がいいね。
うはっwwwwwwwwwwwwwwwwwwwwwww
>>176 のレベル、テラタカスwwwwwwwwwwwwwwwwwwwww
183 :
デフォルトの名無しさん :2005/12/12(月) 18:24:14
スレに合ってるかちょっと分からないんですが、 templateクラスを自作してドキュメント派生クラスにメンバを加えた所、 Class Viewに表示されず、入力アシストにも出ないばかりか、 CListのメンバも同じ事になってしまいました。 何かよい解決策はありますでしょうか?
仕事でMFCなのにその利点を活かさないという現場にあった事がある。 わざわざVBと全く同じに作るならネットワーク関連だけVCで作ればいいのに。
>>184 実際マイクロソフト以外でそんなパッケージあったら”えっ!!”と思うかな俺は。
(実際あった。)
出来が良けりゃいいってのも正論だけど、なんかねぇ。
>>187 「えっ!!」と思ったといってもアプリの出来が悪かったわけではありません。
またパッケージソフトとも言わんかな?
自分の作ったMFCダイアログアプリケーションをデバッグしながら、暇つぶしに
ネット○ーブルの野○村を裏で走らせてた。クラス名が"#32770"だったから、
てっきり自分のデバッグしているダイアログかと思ってメッセージモニタしてると
何かおかしい。しばらくして"えっ!!野○村ってMFCなの?"って驚いたしだい
です。
ダイアログ出すだけでMFCアプリ認定される日が来ましたか。
190 :
デフォルトの名無しさん :2005/12/14(水) 22:14:14
>>183 です。
templateクラスで参照のつもりでコピーの戻り値を受け取り、内容を変更し損なうのを
防ぐ為、コピー演算子及びコピーコンストラクタをprotectedにし、
template classをfriend classに設定したのですが、何故かそのtemplate classをメンバとして
定義しているファイル内に宣言するとこのような現象が起きました。
templateにするクラスを別のファイルに記述すると、メンバ宣言するファイルにincludeしても
入力アシストが有効になります。
>>186 なんか、何?
MFC は確かに稀代の出来悪フレームワークだが
その事と、それを使ったアプリケーションとの出来に
何の関係が?
MFCダイアログベースアプリってだめなのか?
194 :
デフォルトの名無しさん :2005/12/15(木) 22:56:52
何使って作ろうが出来上がったものが素晴らしけりゃそれでいい
MFCが糞とか言ってる香具師が設計した、自慢のクラスライブラリってのを 見てみたいものだな。
>>195 いやぁ、クソ呼ばわりするタイプの多くは
MFCよりとっつきやすくて自分には便利なライブラリを見つけたってのが
MFCをクソよばわりする根拠なんではないかな?
じっさいデバッグとかでぐちゃつくとMFCのソースも見てるわけでしょ?
ドロドロとまどろっこしい印象も受けるわけで。
クソと言う人も生まれるのも致し方ないのではないかなあと思う。
まぁ、実際糞だしね^^
>>197 いや、クソかどうかはどうでもいいんだよw(頭悪いの?)
クソ呼ばわりするヤツがどの程度かってことを195、196はやってるわけだ?
たとえば、お前とはクソといっては見るものの195には答えられないわけでw
196の言ってるレベルなんでしょ?
ま、それ以前にスレの流れも読めんアホだとするとこの板ならクダすれがお似合いだね
失敗と宣言すべき壮大な実験 それがMFC
VBよりはまだマシ
VBのほうがまだましだろ MFC使うくらいなら 何も使わないほうがいい
198はなんであんなに必死なんだろう
MFCに求めてるのはWin32との親和性だけ。 親和性が低いBorland OWLなんか話にならない。
MFCは何かしら後世に残したものがある 失敗したシリアライズ。失敗した例外。 その実験コードは再利用されている。 VBには何一つない。論外。
>>203 クソしか言えない低脳を煽りたいからかな
207 :
デフォルトの名無しさん :2005/12/20(火) 22:33:24
タブコントロールを用いて、 親ダイアログに子ダイアログを表示させる というものを作っています。 子ダイアログの表示を切り替えることまではできたのですが、 子ダイアログ上の、タブオーダが 最後のコントロールでTabキーを押すと必ずフリーズします。 親ダイアログ: タブコントロール 子ダイアログ: ボタン1、ボタン2 スタイル:チャイルド 境界線 :しない コントロール:チェック有 開発環境:VisualC++6.0 わかる方、教えてください。
208 :
デフォルトの名無しさん :2005/12/20(火) 23:12:33
> 親ダイアログに子ダイアログを表示させる ってなに?
再描画が上手くいってないだけじゃなくて? エンターキーでリストコントロールが消えるとか。 それならInvalidate()で回避出来るけど。
210 :
デフォルトの名無しさん :2005/12/20(火) 23:37:18
PreTranslateMessageで条件付けて何とかすれば?
>>207 MFC雑技団に載ってるTABのと同じ方法だな。
ほんとにフリーズしてるのか気になるところだ。
TAB押した後Shift+TAB押して戻ってくるか確かめた?
213 :
デフォルトの名無しさん :2005/12/21(水) 00:33:27
>>212 shift + Tabを押しても戻ってきませんでした。
フリーズした後、何を押しても反応しないので、
その度、タスクマネージャで終了しています。
どこでフリーズしてるのかデバッガ使って調べたら?
216 :
デフォルトの名無しさん :2005/12/21(水) 01:24:34
217 :
デフォルトの名無しさん :2005/12/23(金) 16:52:05
MFCが糞だとすると、皆さんはどんなフレームワークをお使いで? WindowsAPI?
218 :
デフォルトの名無しさん :2005/12/23(金) 17:08:51
もちろんMFCです
>>217 もういいよ、そのネタは先週でオワタ
MFCがクソかどうかの話になる前に終わったので、このスレでMFCをクソというやつは
利用機会すらなかったヤツか機会はあったが歯が立たなかったヤツらだったらしい。
それに代わるもの提示すらしないまま
>>197 、
>>201 、
>>203 を最後に消えた。
煽りは、
>>206 で終了
以後は普通の流れなんだよ
ドッキングツールバーを作りたいのですが、 どこを参考にすればいいのでしょうか? 作り方としてMicrosoft公式のものがあるのでしょうか? それとも、CodeGuruやCodeProjectを参考にしないといけないのでしょうか?
MFCのでよければソースが公開されてる。
222 :
220 :2005/12/23(金) 22:58:04
>>221 CodeProjectのソースコードはGETしました。
では、そのソースのとおりに組めば問題ないんですね。
できれば、MSDNかなんかに解説があるのをご存知でしたら助かったんですが。
CReBarとかじゃないの?
224 :
220 :2005/12/23(金) 23:10:20
>>223 いえ、VisualStudioで使われているドッキングツールバーです。
MSDNで探してるんですが、
公式のドキュメントが見当たりません。
ご存知なかたはいますか?
// TODO: ツール バーをドッキング可能にしない場合は以下の3行を削除 // してください。 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);
227 :
220 :2005/12/23(金) 23:58:43
CMiniDockFrameWndのドキュメントがMSDN内にないのですが、 どうしてでしょう?
230 :
デフォルトの名無しさん :2005/12/25(日) 10:59:15
VC6.0のダイアログプリケーションを作成しています。 VCのIDEにあるビルド出力のような、コンソールアプリケーション(ダイアログのボタンから呼び出す) の出力を、テキストボックスにリダイレクト(?)する手段を探しています。 どなたか経験のある方、手段について教えていただけますでしょうか?
231 :
デフォルトの名無しさん :2005/12/25(日) 11:10:54
>>230 #include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
extern "C"
{
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nCmdShow);
};
int _tmain(int argc, TCHAR *argv[])
{
TCHAR szBuf[256];
HINSTANCE hInst;
int i;
hInst = (HINSTANCE)GetModuleHandle(NULL);
szBuf[0] = 0;
for (i = 1; i < argc; i++) {
_tcscat(szBuf, av[i]);
_tcscat(szBuf, _T(" "));
}
return _tWinMain(hInst, NULL, szBuf, SW_SHOWNORMAL);
}
あるコントロールpWndに対し、pWnd->EnableWindow(FALSE)とやっても ぜんぜん無効にならないんですが、なぜですか? pWndはスパイで見る限り正しいウインドハンドルをもってるし、EnableWindowの結果もTRUEです。 コントロールにはリソースIDがありますが、これに対応するハンドラが無い場合、無効になったりしますから なにか条件がいろいろあるんですよね。
234 :
233 :2005/12/25(日) 18:34:44
ちなみにダイアログバー上のボタンです。
ああ、それは俺も嵌ったことがある。 「ダイアログバー EnableWindow」あたりでgoogle検索すれば、すぐ分かるよ。
CButton pButton = (CButton*)m_dlg_bar.GetDlgBar(IDC_BUTTON1); pButton->EnableWindow(FALSE); 確かこんな感じで解決したと思う。
237 :
236 :2005/12/25(日) 20:58:05
失礼。一行目は CButton* pButton = (CButton*)m_dlg_bar.GetDlgBar(IDC_BUTTON1); ね。
ダイアログバーに載ってるコントロールも、 ツールバーのボタンと同じように OnUpdateCmdUI じゃないかな?
239 :
235 :2005/12/25(日) 21:22:06
ダイアログバーはCmdUIとダイアログの両方の性質を持ってるから複雑。 CmdUIはツールバー、メニューの項目などのコマンドターゲット。 クリックやアクセラレータなどで始動する。
皆さんありがとうございます。 やっぱOnUpdatCmdUIですか。。 これだとメインスレッドがアイドルの時しか更新されないんですよね。 その場合、本当はボタンを禁止したいタイミングでユーザがボタンを押せちゃうなんていう 心配は無用ですか?
242 :
238 :2005/12/25(日) 23:39:34
メインスレッドがアイドルにならないようなアプリを書かないからキニシナイ。
CFormViewでボタンを貼り付けて作り直したらEnableWindowで変更の方法で大丈夫でしょうか?
244 :
238 :2005/12/25(日) 23:49:08
>>243 もちろん。あるいはCSplitterWndでViewを分割してみるのもいい。
俺は何でもCDialogで作ってしまうけどな。
>>244 さん、ありがとうございます。
とりあえず気にしないことにしてOnUpdateCmdUIで実装して、
万が一、連打操作によってクラッシュ等出てしまったら
そのときFormViewとかにします。
246 :
デフォルトの名無しさん :2005/12/27(火) 18:34:03
環境:WindowsXP,VC++6.0SP5 MFCでOCXを作成しています。 このOCXの中から別のOCXを使おうとしているのですが、うまくいきません。 ソースは次の通りです。 --- //OCXのラップクラスをメンバ変数として宣言 CUserOcx m_OCX; 〜 //OCXのラップクラスを生成 m_OCX.CreateControl("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}", "UserOCX", WS_VISIBLE, CRect(0,0, 10, 10), this, IDC_OCX); --- CreateControlで 実行時エラー'-2147417848(80010108)' オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。 とエラーが出てしまいます。 同じソースをMFCのダイアログベースで作ったEXEに組み込んだ時には ちゃんとOCXのクラスが出来て操作が可能でした。 OCXから別のOCXを使う方法をどなたかご存知でしたらお教え下さい。 よろしくお願いします。
>>246 簡単なOCXを2個作って試してみたけど、うまくいかんね。
ただオブジェクトの作成(CreateDispatch)と解放(ReleaseDispatch)はできる。
自分で追加したOCXオブジェクトの公開メソッド呼び出すと例外が発生する。。
なんでだろ??
248 :
246 :2005/12/28(水) 14:13:52
>>247 私の使ってるOCXに問題があるのかとも思ったのですが、
そうでもないようですね。
うーん、どうすればよいのでしょう…。
双方のOCXを使う側にブリッジ関数を用意してもらうとか。
250 :
246 :2005/12/28(水) 16:10:34
>>249 私の使おうとしているOCXは製品なので改造とかは出来ません。
ブリッジ関数というのがよく分からないのですが、どのようにすればよいのでしょうか?
仮に、作っているOCXをAとして、使っているOCXをBとする。 AからBを呼びたいとき、次のようにブリッジ(橋渡し)を呼び出し元にやってもらう。 ・Aの関数ではBを呼ぶための情報と共に呼び出し元にメッセージを投げるなどして待機。 ・呼び出し元はメッセージを受け取るなどしたらBを呼び出して、結果をAに通知。 ・問題点 *Aと呼び出し元の通信がメッセージなどで巧くできるか。 *AからBを呼ぶために必要な情報を巧く呼び出し元に引き渡せるか。
>>246 &
>>250 今ちょっと試してみたけどOCXの中からOCXを使えたよ。
外側はMFC利用のOCXで中に入れたのはMSFlexGrid。
AfxEnableControlContainer()呼んでる?
試したのはWin2000&VC6SP5
253 :
252 :2005/12/28(水) 21:00:44
あ、SPは最新のだからWin2000&VC6SP6
__int64をCString::Formatやsprintfに渡したいのですが書式は%I64とか言うのがあった気がしたのですが いまやって見ると変換できないらしく、まったく無かったかのように結果の文字列から削除されています。 正しくはどうやるのでしょうか?
事故解決しました 単純にdが抜けてた。。 正しくは%I64dです。皆さんわかりましたね? orz
256 :
246 :2005/12/29(木) 13:17:53
>>252 ありがとうございます。
InitInstance内で、AfxEnableControlContainer()を呼び出したところ、うまくいくようになりました!
そういう落ちかい。
258 :
246 :2005/12/29(木) 16:57:18
もう一つ質問があります。
>>246 の場合、CUserOcx m_OCX からのイベントの受け取り方(イベントマップの書き方)が分かりません。
ON_EVENT(CMyCtrl, IDC_USEROCX, 1 /* StatusUpdateEvent */, OnStatusUpdateEventSuica1, VTS_I4)
と書くと、コンパイルで
error C2440: 'initializing' : 'char [1]' から 'enum AFX_EVENTMAP_FLAGS' に変換することはできません。
などのエラーが沢山出てしまいます。
どなたかご教授お願い致します。
259 :
252 :2005/12/29(木) 22:58:32
>>258 (
>>246 )
おそらくON_EVENTを書く場所を間違えてる。
BEGIN_EVENT_MAP()〜END_EVENT_MAP()の中にでも書いたのでは?
(試しにそこに書いたら同じエラーがズラズラ出た)
イベントの受け取り側だから、取り敢えず↓↓を調べて
・DECLARE_EVENTSINK_MAP()
・BEGIN_EVENTSINK_MAP()〜END_EVENTSINK_MAP()
#外のOCXと中のOCXが頭の中でごっちゃになってるのではないか?
#念のため書いとくと252のAfxEnableControlContainer()は
#中のOCXを使うために外のOCXが準備するためのものであって
#外のOCXを使う準備をするためのものじゃないよ。
#余計混乱させてしまったらゴメン
260 :
246 :2005/12/30(金) 04:19:58
>>259 早速のレスありがとうございます。
確かにBEGIN_EVENT_MAP()〜END_EVENT_MAP()の中に書いていた気がします。
家にはソースが無いので休みが明けたら早速会社で見直してみます。
261 :
デフォルトの名無しさん :2005/12/31(土) 16:15:11
CFileDialogで初期表示されるディレクトリを指定する方法を教えてください。 複数の入力ファイル種類ごとに初期表示させるディレクトリを変えたいので、 CFileDialogで「開く」を押下したときに自動で覚えてくれる動作を変えたいのです。 ちなみに以下のようにしたら、DoModalを呼ぶなり、何も表示されずに戻ってきてしまいました。 static char szfilter[] = "xyzファイル(*.xyz)|*.xyz||"; CFileDialog dlg(TRUE , "xyz" , "c:\\temp\\" , 0 , szfilter); if(dlg.DoModal() == IDOK) { ・・・ よろしくお願いします。
>>261 m_ofn は OPENFILENAME 型の構造体です。
…カスタマイズするには、オブジェクトを構築後、DoModal メンバ関数を使って表示させる前に、この構造体を変更します。
たとえば、ダイアログ ボックスにキャプションを付けるには、m_ofn の lpstrTitle メンバを設定します。
例)初期表示させるディレクトリが e:\testaa だとしたら
CFileDialog cfdg(TRUE,"bmp","*.bmp");
cfdg.m_ofn.lpstrInitialDir ="e:\\testaa";
if(cfdg.DoModal() != IDOK){
以下略
>>262 ありがとうございます!助かりました
来年も今年同様よろしくお願いしますw
だが、断る
264はツンデレ
味も見ておこう
267 :
246 :2006/01/05(木) 09:59:50
>>259 ソースを確認したところ、やはり
1)DECLARE_EVENTSINK_MAP() の漏れ
2)BEGIN_EVENTSINK_MAP()〜 がBEGIN_EVENT_MAP()〜 になっている
の2点でした。
どうもありがとうございました。
268 :
デフォルトの名無しさん :2006/01/05(木) 16:13:43
CListCtrl で, 100個単位で InsertItem() をして, それをまた数十回繰り返すという処理を書きました. ところがその処理の最中に, そのリストヴユーのスクロールバーを動かしたり カラムをクリックしたりすると例外が発生するようになり, ヴユーに対する操作が不安定になりました. 100個単位で InsertItem() している最中はヴユーに対する操作の イベントハンドラをいっさい無視するというようにしたいのですが どう書けばいいのでしょうか?
ヒント: BOOL bInserting = FALSE; ... // 挿入する前 bInserting = TRUE; ... // 挿入した後 bInserting = FALSE; ... // イベントハンドラの先頭 if (bInserting) { return; } // 以降、イベントの処理 ...
270 :
デフォルトの名無しさん :2006/01/05(木) 16:46:03
>>269 というかそれぞれのイベントハンドラに
処理を書くのはきりがないので
ヴユーに対するすべてのイベントを一時的に
停止する方法はないものかと
ShowWindow EnableWindow
272 :
デフォルトの名無しさん :2006/01/05(木) 16:53:57
CWnd::PreTranslateMessage
274 :
デフォルトの名無しさん :2006/01/05(木) 17:10:31
>>273 それはなんですか?
最中はリストヴユーは見せておかなければならないのですが
イヤです。
277 :
デフォルトの名無しさん :2006/01/05(木) 17:48:03
279 :
デフォルトの名無しさん :2006/01/06(金) 12:51:13
VC++ MFC環境(非.NET)で、dllを実装しています。 GetModuleFileName(AfxGetApp()->m_hInstance, path, _MAX_PATH); これだと、ロードしたEXEのパスになっちゃいます。 これではなくて、実際にロードされたときに、DLLがあるパスを(DLL内部)で取得したい のですが、どうすればよいですか? ググッたら、.NETのは有りましたが、MFCなど従来の方法がわかりませんでした。 (.NETでは、Assembly.GetExecutingAssembly().Locationらしい)
>>279 勘だが多分AFX_MANAGE_STATEが関係してる
>>280 す!すばらしい。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
GetModuleFileName(AfxGetInstanceHandle(), path, _MAX_PATH);
これで、いけました。サンクス。多謝
282 :
デフォルトの名無しさん :2006/01/10(火) 09:54:07
リストヴユーのスクロールバーを 全体の半分ほど以降に場所に持っていくと OnNotify のところで例外が発生します スクロールバーを全体の半分ほど以降に場所に 持っていったときに起こるイベントがなんなのかが わからず,調べる手だてがなくて こまっています
284 :
デフォルトの名無しさん :2006/01/10(火) 10:14:07
285 :
デフォルトの名無しさん :2006/01/10(火) 11:29:18
PostMessageで独自のメッセージUM_UNKOを飛ばし、処理させたく存じます。 PreTranslateMessage関数では、ちゃんとメッセージが飛んできて、処理可能ですが、 メッセージマップで追加設定した関数OnUnko()には、処理が飛んで来ません・・・ なにがいけないのでしょうか?? ちなみに、メッセージはPostMessage(UM_UNKO)で飛ばしております (SendMessageでは、PreTranslateMessageに飛んでこない・・・) BEGIN_MESSAGE_MAP(Cxxx, CDialog) ON_MESSAGE(UM_UNKO, OnUnko) END_MESSAGE_MAP() BOOL Cxxx::PreTranslateMessage(MSG* pMsg) { switch (pMsg->message){ case UM_UNKO: ・・・ // 飛んでくる break; } } LRESULT Cxxx:OnUnko(WPARAM wParam, LPARAM lParam) { ・・・ // 飛んでこない return 0; }
286 :
デフォルトの名無しさん :2006/01/10(火) 11:50:54
VBでボタン1をクリックするとテキストボックス1に入力された数を変数su1に 読み取り、1+2+3...+su1の値をテキストボックス2に表示するというプログラムは どうやって書けばいいんでしょうか?
287 :
デフォルトの名無しさん :2006/01/10(火) 11:56:24
>>285 うちでは正しく動く。
君のOnUnkoの定義は問題ない。
UM_UNKOの値は何にしてる? 例えば0なら無理。
ちなみにPreTranslateMessageでなくWindowProcになら両方飛んでくる。
LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
288 :
287 :2006/01/10(火) 12:00:58
>>286 なあお前、この中でどれか1つでもできるやつあるか?
MFCじゃないし、あんまりじゃないか?
・テキストボックス1から値を取得する
・1+2+3...+su1を足し合わせる
・テキストボックス2に値を設定する
>>285 PreTranslateMessage で TRUE 返してた、というオチはないよね?
290 :
286 :2006/01/10(火) 12:15:12
dim su1,goukei,k as integer su1=val(textbox1.text) goukei=0 for k = 1 to su1 goukei=su1+k next k textbox2.text=goukei ではどこが違うんでしょう?
291 :
デフォルトの名無しさん :2006/01/10(火) 12:17:25
292 :
287 :2006/01/10(火) 12:17:30
メモ:呼び出される順番 == SendMessage WindowProc OnWndMsg OnUnko == PostMessage PreTranslateMessage WindowProc OnWndMsg OnUnko
294 :
285 :2006/01/10(火) 12:35:01
>>287 UM_UNKOは(WM_APP + 1)です(WM_USER + 1)でも駄目でした・・・
PostMessageを発行しているのが、ダイアログ上に配置されたボタン(サブクラス化した自作クラス)の
クラス内で行っており、親のダイアログのメッセージマップまで届いていないのでしょうか?
(ダイアログ上に普通のボタン貼って、そこのイベントで発行した場合は上手くいきました。)
295 :
285 :2006/01/10(火) 12:41:04
GetParent()->PostMessage(WM_UNKO) で解決致しました。m(_ _)m PreTranslateMessageでは引っかかったので、 GetParent()が必要だとは思いませんでした・・・
296 :
287 :2006/01/10(火) 12:53:26
大事なことを
>>294 で言うんだもんなあ。
わざわざ試したのに。
>>296 まぁまぁ、気持ちは判るが、その「大事なこと」に気付くくらいなら質問していないだろうから。
ふむ
299 :
285 :2006/01/10(火) 13:05:14
300 :
デフォルトの名無しさん :2006/01/10(火) 14:38:45
CWnd の派生クラスのイベントハンドラで 例外が出ていて, それがなんのクラスのイベントハンドラなのかを 調べる方法はありますか?
301 :
デフォルトの名無しさん :2006/01/10(火) 14:40:37
>>300 実行するときに
メニューの実行(Ctrl+F5)ではなく
F5(デバッグ実行)で実行する。
これ知らない子が多いね。
今書いているファイルとClassViewとの同期ってどうすればいいのですか? 関数をファイルから検索して、「ファイルから検索1」に出てきた奴をダブルクリックすれば 該当のファイルの位置に飛ぶんだが、ソレがどのクラスのどこら辺に居るのか ClassViewのツリーの中を目で追いかけるのが面倒っす。 書いていた関数を削除したいとき、ツリーの該当箇所右クリックしてDELしたいんですけど 左に目をやると、てんで違うクラスの位置に居ることが多く、ClassViewの森の中を 縦横無尽に右往左往してますんで、どなたか助けてください。
303 :
デフォルトの名無しさん :2006/01/10(火) 20:19:39
>>302 ソースエディタの上にクラス名とメンバ関数が出てるじゃない。
>>294 に対し、便乗で質問です。
WM_USER+0x1000(0x300だったか?)ぐらいまでMFCが使っている
と記憶しています。
WM_APPの場合は、それ以降のメッセージIDをMFCで使用しないこ
とが保障されていますか(今後においても)?
今後は知らんが、まぁ大丈夫だろ。
>>304 ヘッダにコメントとして書いてあるはずだ。
Visual C++とPlatform SDKの両方のヘッダを調べるべき。
イヤです
ダメです
>>303 うん。それでも迷っちゃうんだ。
CFORMで良かったのか単にFORMだったのか勝手に脳内変換してごちゃごちゃしてくる。
VC6にて、プロパティシート上で、複数行を有効にしているEDITBOXに フォーカスがあたっているときに、EnterやESCキーでのデフォルトボタン が有効にならないのですが。(無反応となる) 複数行でないEDITBOXであれば、問題ありません。 複数行のEDITBOXの場合、何かコードを追加しないとだめでしょうか?
あのなぁ
>>310 複数行のEditなんだから文字列が「改行」されるのは当たり前。
313 :
310 :2006/01/15(日) 03:09:01
状況足りなすぎなので補足。
プロパティシートでなくて、単純なダイアログ上での、
複数行EDITBOXであれば、EnterやESCは有効でした。
>>312 ES_WANTRETURNは未指定なので、EDITBOX上の文字列は
改行されないです。
314 :
デフォルトの名無しさん :2006/01/15(日) 13:17:54
画像ファイルをスライドショーするフラッシュファイル(swf)を作成する アプリを作りたいのですが、フラッシュファイル(.swf)を書き出すAPI・仕様とか、 サンプルプログラムがあったらURLを教えてください。 (QuickTime APIで可能でしたでしょうか?) ご教授よろしくおねがいします
釣りマルチ乙
ヘルプファイルの作成について質問させてください。 .NET2003を使用しています。 プロジェクトでchmファイルを作成していたのですが、 別のソフトでchmを生成したら作成したソフトから起動ができなくなってしまいました。 その別ソフトでhhkなどが変更された形跡はあるのですが そもそも同ファイル名なのに別ソフトで生成したchmファイルが開けないというのが謎です。 また、プロジェクトをリビルドしても、今まで見えていたDos窓のヘルプファイルのコンパイル画面が 立ち上がらなくなり、コンパイルすらできない状態になってしまいました。 別ソフトで生成したchmファイルを使う方法、もしくは.NETで再度コンパイルできるようにする方法を どなたかご存じであれば、回答宜しくお願いいたします。
CEDITに全角で入った数字をintとして認識したいんだけど どういうソース書いていいのかわからない。
そうですね。
こんなのか? 「六萬五千五百参拾五」
MFCにはそういうのないから自作することになると思うが そういうことでスレ違い。
MFCで線を引くときなど(LineToなど)にアンチエイリアスをかける方法ってありますか?
スレ違い
325 :
デフォルトの名無しさん :2006/01/17(火) 19:43:23
化石コンパイラーVC6sp6と ポンコツ マシンのセレロン2。0+MB815から 最新のマシーンに環境移行を考えていますが、 移行して問題ないですか。 大好評、eMachines6448のAMD64が更にパワーアップ。 グラフィックス、サウンド、HDDなど、 マルチメディアを快適にするスペック満載です。
327 :
デフォルトの名無しさん :2006/01/17(火) 19:59:30
すいません。 理由をきかせて下さい。 アーキテクチャーに共通性がないと思うのですが (8086系というのですか。) しかし、結構売れているのは、何かエミューな仕掛けが 有って、問題ないと勝手に想像してます。 vc6で作られたソフトがごまんとあるので、私のプログラマー 人生も32ビットと一緒に死滅する決意です。 余談ですが、3年ぶりに公開されたEM EDは性器なし、具烈婦なし 逝ってよし、MFC4.2で上等て感じですね。
328 :
デフォルトの名無しさん :2006/01/17(火) 20:40:39
いちよう↓の本は立ち読みしました。 はじめて読むPentium マシン語入門編 蒲地 輝尚 アセングラ系の本はヘたれが書いた本が多いが この本は優秀な本で、★をつける奴がへたれである。 ーていうと 東大卒業してから発言してね。ーて
エスパーより医者が必要だな。それもちょっと特殊な医者が。
おもろい
331 :
デフォルトの名無しさん :2006/01/17(火) 21:21:27
>>325 >絶対ダメだ。移行すべきでない。
VC6SP6はM$最高のコンパイラーですかね。
mfcは使いやすいと思いますよ。
フリーソフトのJWCADなんかMFCで作っている割には、
昨今のcpuではさくさく動作しますね。特にファイル開く
時に3×4列のサムネイルが毎回ご丁寧に再描写してくれる
もんで、これでも動くんだと関心してます。
.NETは安いのに6.0はいまだに高いなと・・・
>>331 開発環境とコンパイラとEXEがごっちゃになってないか?
それ以前に痛すぎる
335 :
デフォルトの名無しさん :2006/01/18(水) 11:00:55
>>331 開発環境とコンパイラとEXEがごっちゃになってないか?
小室哲也は演奏するときに
左にキーボード
正面にシンセサイザー2段置
右にシーケンサー用キーボード
体が1つなのに一杯並べて1つで言いと思うが
さてここで、プロのプログラマーは、左に開発環境マシーン
正面にコンパイラー 右にEXE用のパソコンと揃えるのか聞きたい。
貧乏な俺は、
1台のマシーンでごっちゃになってる。
これって、普通だと思う。
天田64bitで動く、OS、コンパイラーは特別なのか。
MFC が何なのかも、微妙に解って内気ガス
>>327 >EDは性器なし
使えないものは無いも同然、か。深いな。
337 :
デフォルトの名無しさん :2006/01/18(水) 11:51:32
32bitで64bitが動くんたぞ メモリーを2G以上、アロケートできるんだぞ。 つまり、VC6でも今までの制約の上限がなくなるわけで 64専用コンパイラーに移植しなくてもメモリー管理を 見直すだけでMFCモッサリ、遅い、糞ということが無くなる。 今流行の外部アレイメモリーは、邪道で、CPUの近くに 好きなだけメモリーを搭載できる。 ーだから天田64bitはどうなの? お舞等の頭では、理解できないだろ。 俺の脳内は知性のかたまりだ。intel入ってる! (インテル® EM64T) に対応したシステムでは、 物理メモリ、仮想メモリともに 4 GB 以上のアドレス空間が 利用可能になり、パフォーマンスが向上します。また、 インテル EM64T は 64 ビット・コンピューティングもサポートしているため、 将来のアプリケーション環境にも余裕で対応できます。
338 :
デフォルトの名無しさん :2006/01/18(水) 11:59:27
和紙のことを害基地と呼んでおる低脳がおるが お舞等の頭では、理解できないだろ 32bitで64bitが動くんたぞ だからこのマシーンでMFC6を動かした奴はいるのか? AMD64は、32ビット・コンピューティングと 64ビット・コンピューティングを、同時に、 しかも性能を低下することなく実行できるよう設計されています。 ダイレクトコネクト・アーキテクチャを採用した AMD64プロセッサでは、すべてをCPUに直接接続することで、 システム・アーキテクチャが直面する課題に対処し、 ボトルネックを軽減します。
うん、確かに理解できんわ。それは認めるから、 窓に鉄格子の嵌った病院に早く帰ってくれ。
>>310 DM_GETDEFIDを作る必要がありそうです。
Spy++で動作を追ってみました。
WM_GETDLGCODEの後、ページにDM_GETDEFIDが送られ、ページはid=1を返す。
しかし、ページ上にid=1のボタンが無いので、反応しないようです。
ドキュメントビューをサポートしないアプリケーションで、CSplitterWndで 分割ウインドウにすると、分割したペインに割り付けたCWndが表示されません。 これはどうしたら治るでしょうか?
342 :
デフォルトの名無しさん :2006/01/18(水) 21:08:35
>>342 はいはい、もう分かったから消えてくれ。
こいつは、蟲の仕業だな。
この蟲は人間に憑く。普段はおとなしくしているが、
16bit -> 32bit、PC98 -> PC/AT、COM -> .NET のように
移行期になると活動が活発になる。
活発になると憑かれた人間は、盲目的に移行したくなり、
周りの人間も移行させようとし、妙な行動を起こしたりする。
Win95を買うために夜中並んでたのも、おそらく蟲の仕業だろう。
>>325 の行動も蟲に憑かれた人間の典型的な行動だな。
ギンコさんキタ━━━(・∀・)━━━!!
346 :
デフォルトの名無しさん :2006/01/19(木) 17:23:27
すみません、質問です。 MDI形式のアプリにツールバーをドッキングさせてるのですが、 ツールバー以外の領域の色を変更したいのです。 (ドッキングさせたときに、”ニョキ”って出現する領域のことです) …わかりにくくて済みません(^^; この場合、MainFrameで何らかのイベントを取って、変更処理を入れるのか? それともToolBarの方で何らかのイベントを取って、変更処理を入れるのか? 何らかのイベントも含めて教えて下さい。 よろしくお願いします。
347 :
デフォルトの名無しさん :2006/01/19(木) 18:38:48
>盲目的に移行したくなり、 >周りの人間も移行させようとし、妙な行動を起こしたりする。 別に某宗教と違って勧誘してませんよ。 君等は一生カローラを乗り続けるつもりか。 今でも箱スカを乗っている人はカッコイイと思うが VC6にSDKをインストールすれば、環境出来上がりらしい。 報告を求む
349 :
デフォルトの名無しさん :2006/01/19(木) 20:07:06
一生カローラ乗ってろ じじい
一生同じ車を乗り続ける人は俺はかっこいいと思う
351 :
デフォルトの名無しさん :2006/01/19(木) 20:44:57
じじいには ゲイツさまのMSDOSが似合ぞ!
にあぞ!
>>347 ネタにマジレスする、その行動原理が解らない。
どうかスルーでお願いする
355 :
デフォルトの名無しさん :2006/01/21(土) 12:02:24
>>346 同じようなとこで躓いてる人がおった。
同じような質問なのですが、
MDIでチャイルドウィンドウの背景色を変更する方法ってありませんか?
OnDraw()など再描画が必要なタイミングでクライアントのRectを取って範囲内塗りつぶしとかやったのですが、
メッセージに対応し切れていないらしく、
OpenFileDialogを開いたとき、ウィンドウを移動したときなどなど、表示が崩れます。
OnSize()やOnMove()で同じ処理を入れても、まだ崩れます。
CWndか、その派生のCViewの持っているブラシを変更することができればいい…のですかね?
方法が見当たりませんが。
ダイアログの背景色を変更する方法は見つかったのですが、
そのままCView派生クラスに流用できる方法ではなさそうなので、
ご存知の方がいらっしゃいましたらお願いします。
環境はXP、Pen4、VC++6.0です。
viewによる あとsdiだろうがmdiだろうがviewは同じ
>>355 BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
//■ここから追加
CRect rc;
GetClientRect(&rc);
CBrush brush;
brush.CreateSolidBrush(RGB(0xCC, 0xFF, 0xFF));
pDC->FillRect(&rc, &brush);
return TRUE;
//■ここまで追加
return CView::OnEraseBkgnd(pDC);
}
358 :
デフォルトの名無しさん :2006/01/21(土) 12:35:33
>>355 これの方がシンプル。
int elem = COLOR_WINDOW;
COLORREF cr = RGB(0xCC, 0xFF, 0xFF);
SetSysColors(1, &elem, &cr);
359 :
355 :2006/01/22(日) 02:42:15
>>357 ,
>>358 そのあたりの方法で出来るかどうか試してみます。
ありがとうございました〜!
ちょっとお聞きしたいのですが、 ダイアログベースのプログラムについてなのですが、 コンストラクタとOnInitDialogの違いって何でしょうか?
C++はわかるの?
>コンストラクタとOnInitDialogの違いって何でしょうか? これは酷い。
つまり 全く関係がない ということです
Rect内に縦書きにしたいんだけど・・・。 現状270度回転と@付フォントで縦書きまで出来ました。 DT_CENTER||DT_VCENTER||DT_SINGLELINEな配置で縦書きに したいんだけど位置合わせのロジックがわからないんです。 どなたかご教授ください。 //.h CFont m_fontV10; //コンストラクタ m_fontV10.CreateFont(10,0,2700,2700, FW_NORMAL, FALSE,FALSE,FALSE, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_LH_ANGLES, DEFAULT_QUALITY,DEFAULT_PITCH|FF_MODERN,"@MS ゴシック"); //ソース CString str; CRect rect; CFont *pFont; CFont* pOldFont; str="hoge"; rect=CRect(10,10,30,110); *pFont=&m_fontV10; pOldFont=(CFont*)pDC->SelectObject(pFont); pDC->DrawText(str, rect, DT_CALCRECT ); //ここになんて書いたらいいの? pDC->DrawText(str,rect,DT_NOCLIP); pDC->SelectObject(pOldFont);
365 :
346 :2006/01/23(月) 22:17:11
>>355 いや、なんか違います。
ビュー云々の話ではなく、
CDockBarの背景色の変え方がわかりません。
がんばって調べているのですが、うーむ…。
ついでになんですが、
CPropertyPageで背景色を変えたときに
タブ部分(つまみ?)だけ色が変わりません。
OnNCPaintで色を変えてみてもダメでした。
がんばって調べますが、知っている方いたら
教えて下さい。
#MFC難しいッス…orz
366 :
365 :2006/01/24(火) 13:48:01
CPropertyPageのタブの色変更に関しては出来ました。 CDockBarがどうにも…orz
367 :
デフォルトの名無しさん :2006/01/24(火) 17:04:47
CListCtrl の方で InsertItem() すると CListView の方で OnUpdate() しなくても 追加した項目は表示されるんですか?
>>360-362 コンストラクタはダイアログクラスの初期化ですよね。
OnInitDialogはダイアログの初期化ですよね。
どちらも初期化ですし、何か似てるのでどっちで初期化を少しだけ迷うのですよ。
メンバ変数はコンストラクタとか、SetTimer()みたいに
ウィンドウズっぽいものはOnInitDialogへとか、
なんとなくはわかるんですが、クリアにわかってないんです。
369 :
デフォルトの名無しさん :2006/01/25(水) 00:21:59
何だよウィンドウズっぽいものって。はっきりさせろよ。
これは酷い
>>368 コンストラクタの時点とOnInitDialogの時点での
ダイアログの状態の違いは何だ?
入居前入居後
普通はコンストラクタはデストラクタとペアで使う たとえば new と delete とか MFCの場合は基底クラスを継承して使うから 用がなければコンストラクタは使わなくてもいい。
>>368 MSDN の「ダイアログ ボックスの作成と表示」にも
>ダイアログ オブジェクトの作成は 2 段階で行います。
>第 1 段階でダイアログ オブジェクトを構築し、
>第 2 段階でダイアログ ウィンドウを作成します。
と書かれている通り
第 1 段階 → コンストラクタによるインスタンス初期化
第 2 段階 → Create() メンバ関数によるウィンドウ作成・初期化
(実際にウィンドウが作られた後、OnInitDialog() が
呼び出される)
なので、その「なんとなく」は概ね正解。
376 :
デフォルトの名無しさん :2006/01/25(水) 15:18:49
new 出会い OnInitialize セックル delete 別れ ASSERT 妊娠
377 :
デフォルトの名無しさん :2006/01/25(水) 22:38:14
378 :
368 :2006/01/25(水) 23:50:37
おかげさまで、疑問点がクリアになりました。 ありがとうございました。
>>368 >>373 が正解で、
ウィンドウが存在するかしないか、
ウィンドウハンドルが有効か無効か、の違い。
「ウィンドウズっぽいもの」とか言ってたら恥ずかしいぞ。
380 :
デフォルトの名無しさん :2006/01/26(木) 00:10:38
CToolBarで右クリックを感知する方法は何かありませんか?
>>379 なんの価値もないレスだな。
わざわざそんないやみ言う必要があるんかい
>>380 普通にON_WM_LBUTTONDOWN( ) afx_msg void OnLButtonDown( UINT, CPoint ); で、
いいけどCMiniDockFrameWndに入ってたりするときもあるのでそこでも
ON_WM_LBUTTONDOWN( )とかいる。
現在、Sleipnir2のようなタブコントロールを作っているんですけど、 複数行のタブ時に、 デフォルトでは、一番下の行以外の行のタブをクリックすると、 クリックしたタブの行が一番下にシフトされてしまいます。 この機能をなくしたいんですけど、なんとかならないでしょうか? よろしくお願いします。
ボタンとかのスタイルにする
385 :
383 :2006/01/26(木) 17:14:28
386 :
380 :2006/01/26(木) 22:53:39
>>382 AppWizardおよびClassWizardが,
そのあたりをうまいこと隠してしまっていたので困っていたのですが、
その感じだとどうもメッセージはきちんと送られていて、受け取れるみたいですね。
ということはWizardに頼らずに手書きでやればどうにか実装できるという事ですかね。
ちょっといろいろ試してみます。
ありがとうございました。
>>386 ウィザードで派生クラス作ればいいよ。
ツールバーのクラスはCMainFrameにあるのを自分の作ったのに置き換えて
CMiniDockFrameWndは
m_pFloatingFrameClass = RUNTIME_CLASS(MyMiniDockFrameWnd) ;
をCMainFrame::OnCreate()で
388 :
デフォルトの名無しさん :2006/01/27(金) 20:12:08
ところで皆さん、 間違えて追加してしまったリソース、必要なくなったソースファイル、 入力をミスったシンボル、その他諸々どうしています? プロジェクトから作り直すのも手間ですし、 何か削除する方法はないのですかね? シンボルは未使用のものに限り、シンボルブラウザで消せるみたいですが。
Delやって消えたらOK. おかしくなったらマイクロソフトの責任。と自分に言い聞かせながら
IDEとWindowsエクスプローラから普通に消してるが
391 :
デフォルトの名無しさん :2006/01/27(金) 21:45:13
resource.hのIDがとびとびになるのがイヤだから手動で書き換える。
392 :
390 :2006/01/27(金) 21:52:19
あ resource.hは手で直してるな
resource.hを手で書き換えると、明示的にリコンパイルしなきゃ おかしなことになるので注意が必要だ。
シンボルブラウザという便利なものがあったはず。
395 :
394 :2006/01/27(金) 22:20:24
ガイシュツorz
シンボルブラウザって信用できるの?
may be
エクセルみたいなセルを入力できるダイアログを作る エレガントな方法って、何かありますか 調べてはみたんですが。ピンと来るものが無くて・・
>>398 エレガントにサラサラっと自作。チョロいもんだ。
回答ありがとうございます
>>399 中々良さ気ですね
環境的には、アプリ起動の時、MFC42DLLさえあればOKですか?
>>400 COMと言う事は、エクセルがインストールされていないと
APLを作成できない・動かない・・ですか?
>>402 FlexGridは、VC6ならMicrosoft版(MicrosoftFlexGrid)がバンドルされているからocxがあればいいはず。
VC7以降はバンドルされていないから、製品版(FlexGridPro)を買わないとダメ。
Excelがインストールされているなら、名前は忘れたけどFlexGridに似たようなOCXが使えたはず。
MSFlexGrid は直接入力できないんですね 「工夫」すれば何とかなりそうなんですが・・・
>>404 そうだったっけ。それだったら、セルをクリックされたらそのセルに重ねてEditはっつけるとか。
#って、そこまでするならListCtrlでも入力可能なようにみせることが可能だけど。
##そのような例は、確かCodeGuruで幾つか見つけた希ガス。
ちなみに、 エクスプローラでのファイル名の変更のときも 一時的にEditが貼り付けられてる
みたな
>>406 実際には動かしていませんが、そんなこと書いてあるサイトがありました
>CodeGuru
初耳なので、ちょいと調べてみます
>>407 なるほど・・
ひょっとしてエクセルも、そうやってるんですかね??
編集中の時点のすべてのウインドウ一覧を取得するプログラムを書いてみたら分かるお。 タイマーとか使ってさ。
>>393 タイムスタンプ更新されるから関連ソースは自動的にリコンパイルされんか?
412 :
デフォルトの名無しさん :2006/01/30(月) 11:30:19
>>411 resource.hだけ特殊で
//{{NO_DEPENDENCIES}}
が書かれてるので依存関係が無視される。
なのでリビルド必須。
コントロール貼るたびに、
依存関係によって、すべてのソースが再コンパイルされたら大変だからな。
413 :
デフォルトの名無しさん :2006/01/30(月) 23:11:27
質問です。 ドラッグしたときなどに、マウスカーソルが変わったり、 枠が表示されたり、画像が表示されたりするアプリケーションが沢山あるわけですが、 あれはどうやって実装するのでしょうか? アバウトな質問で申し訳ありませんが、 何か調べるor考えるための取っ掛かりが欲しいのです。
>>410 そのサイトのMFC Grid controlが、CodeGuru の発展形みたいです。
これを使うか、
>>405 の様にMSFlexGridに、Editを貼りつけるか・・
(唯。これは貼り付ける時に座標指定が微妙みたいですが・・)
簡単なコントロールがあると思ったのですが、意外と面倒そうです。
あんまり、こう言う入力の仕方は需要が無いんですかね??
初歩的な質問ですが、 クライアント領域に二種類のViewを貼り付けるにはどうすればいいでしょうか? できればSplitterのように動かせたりしないものがいいです。
Splitterを固定なら調べたら一発で見つかったけど いったい何がやりたいんだ?
418 :
デフォルトの名無しさん :2006/01/31(火) 09:26:48
>>415 Viewに子ウィンドウを2枚貼り付ければいいじゃない。
419 :
デフォルトの名無しさん :2006/01/31(火) 14:12:40
CWnd のオブジェクトにメッセージをとばして それに対するイベントハンドラが呼ばれるとき, これはあらたなスレッドが起こされて処理されるんでしょうか?
420 :
デフォルトの名無しさん :2006/01/31(火) 15:23:56
>>419 こんにちは。
イベントハンドラの中でSleep()してみると分かりますよ。
VOID Sleep(
DWORD dwMilliseconds // 中断の時間
);
421 :
デフォルトの名無しさん :2006/01/31(火) 16:16:50
>>420 ありがとうございます
やってみたところ処理が止まるので
あらたなスレッドが起きるわけではないのですね
422 :
デフォルトの名無しさん :2006/01/31(火) 18:10:37
CRichEditCtrlクラスを用いて、エディターを作ってます ベースラインより下の部分の空白を取り除くために、 CHARFORMAT構造体のyOffsetメンバを用いたのですが、 「-」の値を入れても認識してくれず、下にずれてくれません。 フォントの関係等でできないのでしょうか? yOffset以外で現在CHARFORMAT構造体に設定しているのは cf.bPitchAndFamily = FIXED_PITCH | FF_SWISS; strcpy(cf.szFaceName, "FixedSys"); です。 よろしくお願いします。
FixedSysは固定
みなさんフォントを選択して文字列をGDIで描くとき 何をつかってフォントを作りますか? CreateFontはパラメータがいっぱいあってしかもちょっと間違えると ぜんぜん違うフォントが勝手に選ばれるし。 あれってもうどのシステムでも絶対あるフォントを決まった幅とか高さとかその他のパラメータ の組み合わせのみを与えるしか使いようがなくないですか?
>>424 LOGFONT lf;
CFont *pSysFont;
CFont NewFont;
pSysFont=CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
pSysFont->GetLogFont(&lf);
lf.lfHeight=-MulDiv(9,pDC->GetDeviceCaps(LOGPIXELSY),72); // 12Pt
lf.lfWeight=FW_BOLD; // 太字
NewFont.CreateFontIndirect(&lf);
とか。
>>425 ありがとう。そんな難しいやり方ぜんぜん思いつきませんでした。
高さを14Ptにしたかったらどうすればよいのですか・・?
なんども聞いてすいません。
>>427 コピペした時、直し忘れた。orz
× : lf.lfHeight=-MulDiv(9,pDC->GetDeviceCaps(LOGPIXELSY),72); // 12Pt
○ : lf.lfHeight=-MulDiv(12,pDC->GetDeviceCaps(LOGPIXELSY),72); // 12Pt
>>426 lf.lfHeight=-MulDiv(14,pDC->GetDeviceCaps(LOGPIXELSY),72); // 14Pt
>>428 ありがとうございます。さっそくありがたく使わせていただきます。
なんで MulDiv??
431 :
デフォルトの名無しさん :2006/02/02(木) 23:54:39
class MyClass(){ protected: CCriticalSection m_cs; public: void AAA(); void BBB(); } void MyClass::AAA(){ CSingleLock SLA(&m_cs, TRUE); ←ロックされる BBB(); ←何故、m_csは既にロックされているのにデッドロックにならない? } void MyClass::BBB(){ CSingleLock SLB(&m_cs, TRUE); //適当な処理 CString str; str="abcedfg"; } //メインの処理 MyClass myclass; myclass.AAA(); こんなことしてもデッドロックにならないのは何故なのか教えてくれませんか。 AAA()からBBB()が呼び出されている時は、SLAはスコープ外だから?? もし、スコープ外であるのが理由となると、BBB()のstrへの文字列代入処理中は、 SLBはスコープ外になってしまう言うことになると考えて良いでしょうか。 少し混乱しています。この疑問について教えてください。 よろしくお願いします。
433 :
デフォルトの名無しさん :2006/02/03(金) 02:05:14
>>432 登場人物がひとりだからデッドロックにはならないだろう。
CSingleLock SLA(&m_cs, TRUE);
CSingleLock SLB(&m_cs, TRUE);
2回目は無視される?
>>432 ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/entercriticalsection.asp >After a thread has ownership of a critical section,
>it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution.
>This prevents a thread from deadlocking itself while waiting for a critical section that it already owns.
>The thread enters the critical section each time EnterCriticalSection and TryEnterCriticalSection succeed.
>A thread must call LeaveCriticalSection once for each time that it entered the critical section.
435 :
デフォルトの名無しさん :2006/02/03(金) 10:28:02
>>432 各スレッドはクリティカルセクションの所有権を取得した後は、自らの実行を
ブロックすることなく、EnterCriticalSection または TryEnterCriticalSection 関数を
追加で呼び出すことができます。
この結果、スレッドが既に自ら所有しているクリティカルセクションを
待機しようとしてデッドロックに陥ることを防止できます。
以下略
CWinApp(のサブクラス)にコマンドハンドラ(OnFileCloseとか)を記述した場合、 コマンドハンドラ内でそのコマンド(メッセージ)が、どのウィンドウに向けて送られたか分かるのでしょうか? CWnd::GetCurrentMessage()で取れるかと思ったらprotectedでした。orz ご存じの方いましたら教えてください。
そりゃメニューがくっついてるウインドウだな そこから先はメッセージマップによる
CFrameWnd
439 :
デフォルトの名無しさん :2006/02/03(金) 13:23:53
ハンドラをどこに書くかによってFrameWndでもViewでも受け取れる。 コマンドを発動させる方法はメニューだけでなく アクセラレータとかツールバーとかいろいろあるから、 どのウィンドウに送られたかなんて一概には言えないし、言う意味がない。
>>439 それはMFCが内部でやってくれてるだけだ
442 :
436 :2006/02/03(金) 13:52:44
回答ありがとうございます。
>>437 ,438
知りたいのは、「(最初に)送られた先のウィンドウハンドルを取得したい」ということです。
その後のメッセージマップは今は問題にしていません。
TrackPopupMenuを使えば、送り先のウィンドウは自由に指定できるので、フレームウィンドウとは限りません。
>>439 コマンドを送る場合には、必ず送り先のウィンドウを指定しなければならないと思います。
(アクセラレータやツールバーであっても内部的にはそうなっているのでは?)
コマンドがウィンドウ自体に関することであれば、どのウィンドウに送られたか言う意味が出てきます。
443 :
デフォルトの名無しさん :2006/02/03(金) 13:54:47
Viewクラスのメンバ関数内で、メッセージを自分(Viewクラス)に送って、 それをPreTranslateMessage内でキャッチしたいのですが、 SendMessage(WM_APP, 0, 0); で発行しても、キャッチできません・・・ PostMessage(WM_APP, 0, 0); だと、ちゃんとメッセージが飛んでくるのですが・・・ SendMessageでViewクラスからViewクラスにメッセージを送るには、どうしたら良いのですか? また、なんで、PostMessageだと大丈夫なのですか?
>SendMessage メンバ関数は、直接ウィンドウ プロシージャを呼び出し PostMessageはメッセージをキューに入れるだけなので流れが少し違う、 このへんの違いはぐぐればすぐ見つかるんじゃないか?
>>442 なにが聞きたいのかよくわからんね。
MFCのメッセージルーティングとかの類の理解が足りないんじゃないか?
>知りたいのは、「(最初に)送られた先のウィンドウハンドルを取得したい」ということです。
答えはこのあたりと予想。
>現在アクティブな子コマンド ターゲット オブジェクト
>コマンド ターゲット自身
>その他のコマンド ターゲット
446 :
443 :2006/02/03(金) 14:28:10
444様 ウィンドウプロシージャで処理出来ました PreTranslateMessageでなんでも捕まえられると思ってました・・・
>>442 アプリ側でそういう仕組みを作らなきゃ駄目だと思う。(フックするとか)
>コマンドがウィンドウ自体に関することであれば、どのウィンドウに送られたか言う意味が出てきます。
そのウィンドウに関係するコマンドなら、そのウィンドウで処理した方がいいんじゃないの?
子ウィンドウはメニューを持てない
メニューがなければツールバーにすればいいじゃない
つ AfxGetCurrentMessage
CPropertyPage::OnOKってどういうときに使えばいいんでしょうか? 呼ばれないときが時々あるきがするんですが
453 :
436 :2006/02/03(金) 15:40:03
>>450 ありがとうございます。まさにこれが求めていた答えです。
>>447 >>そのウィンドウに関係するコマンドなら、そのウィンドウで処理した方がいいんじゃないの?
それはそうなんですが、複数のウィンドウクラスに同じコマンドを送っているので、処理を1カ所に記述したかったのです。
それらの共通の親クラスを定義して...とも思いましたが、CWinAppで処理できるならそちらの方が簡単なので。
>>453 それらのウィンドウが、全て同じドキュメントを参照しているなら、ドキュメント
クラスで処理すべきだと思うが?
まあくだらない理由で質問してるみたいだし
Doc-Viewのフレームワークというか設計理念を無視してるな。
>コマンドがウィンドウ自体に関することであれば、どのウィンドウに送られたか言う意味が出てきます。 ビューが複数あるってことか? ビューもウインドウだろうけどビューのことウインドウとは呼ばんな
どのウィンドウに送られたかって言っても ・現在のアクティブなビュー ・マウスポインタの位置にあるビュー のどっちかしかないし
なんだ結局CWinAppで処理することにしたのか ウィンドウと全然関係なくなくなってるのが痛い
461 :
432 :2006/02/03(金) 21:44:15
画像ビュワー作ってます。 メモリDCとMM_ANISOTROPICで拡縮させたいのですが 拡縮が上手くいきません。 メモリDC作成は上手くいっているのは確認できましたが、 拡縮が上手くいきません。
463 :
462 :2006/02/04(土) 02:25:42
2倍表示の場合はこれでOK? void CBmpView::OnInitialUpdate() { pDC = GetDC(); m_MemoryDC.CreateCompatibleDC(pDC); m_pBitmap->CreateCompatibleBitmap(pDC, BMP_WIDTH, BMP_HEIGHT); m_pOldBitmap = m_Memory.SelectObject(m_pBitmap); ReleaseDC(pDC); } void CBmpView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) { CScrollView::OnPrepareDC(pDC, pInfo); pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(1, 1); pDC->SetViewportExt(2, 2); } void CBmpView::OnDraw(CDC* pDC) { CRect rcClip; int result = pDC->GetClipBox(rcClip); if(result == ERROR || result==NULLREGION) return; pDC->BitBlt( rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &m_MemoryDC, rcClip.left, rcClip.top, SRCCOPY); }
464 :
デフォルトの名無しさん :2006/02/04(土) 08:05:08
CAsyncSocketについて質問をしたいのですが、 create connect send OnRecieve で、サーバにGETした要求がレスポンスされデータがうまく受信できました。 その後なんですが、 OnCloseが呼び出され、回線が切断されます。 再度sendを呼び出そうと思い、 connect を呼び出すと、エラー(WSAENOTSOCK)になってしまいます。 で、再度 create をして、 connectすると、回線が接続されます。 これはsendでデータ送信すると必ずOnCloseされ、 再度データ送受信をしたい場合は、再度createをしないといけないという仕様なのでしょうか? OnCloseされても、再度connectすれば回線接続されるとばかり思ってました。 私の勘違いなのでしょうか?
>>462 「上手くいかない」じゃわかんねえよ。
現象を具体的に説明しろよ。
>>464 何やってるのか分かりやすく説明しろよ。
行数の割に中身は空っぽじゃないか。
そんなんで分かるわけないだろ。エスパーじゃあるまいし。
>>462 StretchBlt()とかStretchDIBitsは?
MFCなんて糞ライブラリ使ってる奴ってまだいたんだ。 MFC使うくらいなら Windows Forms の方が1000倍マシだわ。
>>468 >MM_ANISOTROPIC限定でお願いします
何を?
それってベクトルじゃなかったかな? ラスタ画像でもできたっけ?
ああビットマップででもできそうだな 関数わけちゃってるのが問題のような気もするけど 調べんのめんどくさいや
475 :
デフォルトの名無しさん :2006/02/05(日) 02:30:17
CHttpConnectionを使ってクッキー認証のページを取得するにはどうすればよいですか?
> 拡大縮小されません。 1:1で描かれるということですか。 とりあえず、ClipBoxの替りに(0, 0, BMP_WIDTH, BMP_HEIGHT)で試すとどうなりますか。 というか、ClipBoxはこのような目的では使いません。
>>476 拡縮されるようになりました!
しかし、拡大は大丈夫ですが、縮小時に画像にノイズが出ます。
所々に赤や紫の線が・・。
478 :
デフォルトの名無しさん :2006/02/05(日) 20:00:55
>>477 縮小するときのどのピクセルを間引くかというのは難しい話。
少しは勉強しなさい。
ちなみに、Windows標準のペイントで縮小してみたら、
Windowsの縮小アルゴリズムの頭の悪さは分かるだろう。
明らかに元画像に無い色のノイズが出ているので、 間引きや補間が原因ではないと思う。
mfcでの外部ツール実行って、 void CMyDlg::OnBnClickedButton1() { // TODO : ここにコントロール通知ハンドラ コードを追加します。 ShellExecute(NULL, "open","explorer.exe",NULL,NULL,SW_SHOWNORMAL); } でいいと思うんだが、VC2005のMFCではLPCWSTRに変換できないとか出る。 2003からアップグレードしたプロジェクトのShellExecuteは正常に実行できるのに…。 ↑のコード間違ってます?
BitBlt()でSetStretchBltMode()は効果ありませんか。 だめならBitBlt()はあきらめてください。 ところで、最初のコードだとどのようになったのですか。 1:1で出力される/描画せず/でたらめな絵が出る/終了する
>>480 何言っての良くわかんないけど
UNICODEビルドになってんじゃないの?
そのまま通したければ
ShellExecute(NULL, _T("open"),_T("explorer.exe"),NULL,NULL,SW_SHOWNORMAL);
これでどう?
483 :
480 :2006/02/05(日) 23:27:25
>>482 ご回答ありがとうございます。
482さんので通りました。
仰るとおりUnicodeになってました…orz
デフォルト設定が変わったからだろう
StretchBltすると綺麗に縮小できますか? DirectShowのレンダラはサイズを変えても綺麗に表示されるけど。 あと、それらはグラフィックボードの機能に依存しますか? つまりStretchBltでもあるマシンでは綺麗で別のマシンではつぶれるなど。
1:1で出力でした。
マシン依存はないと思います。 DirectXは使って無いです
あなたは「スレ違い」という言葉をまず学びなさい。
拡大縮小する場合、BitBlt()はStretchBlt()の中を使います(たぶんPetzold本)。 そして、StretchBlt()の縮小のデフォルト動作は、重なる色のANDを採ると思います。 つまり、予期せぬ色が出る可能性があります。 試しに、BitBlt()の前にSetStretchBltMode(COLORONCOLOR);。 これで駄目だったら、BitBlt()はあきらめ、SetStretchBltMode()とStretchBlt()。
もはやMFCとは何の関係もないな
491 :
デフォルトの名無しさん :2006/02/07(火) 17:26:21
「CFileDialogをDoModal中に削除する」 ってことをやりたい。 具体的に講じた手順は以下。 MFCを使ってDLL1を作成。 DLL1のtheAppは「DoModalされているダイアログのポインタ」を格納する CObArray m_DialogPointerArrayをメンバーとして持つ。 CFileDialog(CDialogではない)を継承したダイアログを newしてDoModalさせ、m_DialogPointerArrayにポインタを登録。 DoModal中に他DLLからDLL1に「今の処理を全部終了」命令を飛ばす。 命令を受け取ったDLL1はCObArrayにポインタを格納されたダイアログを 片っ端から削除(EndDialog)していく。 が、普通にCDialogから生成したダイアログは上記でうまく 消えてくれるのだが、CFileDialogを継承したものは消えてくれない。 (続く)
492 :
デフォルトの名無しさん :2006/02/07(火) 17:27:34
削除する方法は for(i = 0; i < dialogCount; i++) { CDialog* pDialog = (CDialog*)m_DialogPointerArray.GetAt(i); int nRet = 0; //pDialog->EndDialog(nRet); //pDialog->ShowWindow(SW_HIDE); //気休め。しかし、消えない //pDialog->OnClose(); //::PostMessage(pDialog->m_hWnd, WM_CLOSE, NULL, NULL); //::SendMessage(pDialog->m_hWnd, WM_CLOSE, NULL, NULL); pDialog->DestroyWindow(); } などを試した(コメント部分とDestroyWindow)。 最後の手段として出したDestroyWindowしても死なないっていったい。 親ダイアログをdeleteするのも試してみたけどダメだった。 CFileDialogのDoModalの中を追っていくと完全に独自実装されている模様。 解決法はそもそもあるのかないのか? あるなら教えてください。
DoModal中に削除するというのは、要するに手動でボタンとか押さずに プログラムから直接コントロールしてダイアログを終了させたいと?
494 :
デフォルトの名無しさん :2006/02/07(火) 17:35:24
おぉ、サンキュー。 そう。 例えば通信中にいきなり切断されるとかそういうの。
OnCancel呼べば?
496 :
デフォルトの名無しさん :2006/02/07(火) 17:36:02
てっきりdeleteでもするのかと思った
497 :
デフォルトの名無しさん :2006/02/07(火) 17:38:39
普通のダイアログとか普通のメッセージボックスはEndDialog(0)で閉じられる
498 :
デフォルトの名無しさん :2006/02/07(火) 17:40:23
OnCancelはプロテクテッドメソッドだからそもそも違う。 ラッピングして呼んだが無理。 deleteもダメ。
CFileDialogの継承クラスって、実はファイルダイアログの子ダイアログだということは 知っているかね。
500 :
デフォルトの名無しさん :2006/02/07(火) 18:37:27
普通の継承クラスと違うってこと?
YES
502 :
デフォルトの名無しさん :2006/02/07(火) 18:54:55
おぉ、教えてください。 それが解決方法につながれば。
試してないけど。 pDialog->PostMessage(WM_COMMAND, MAKELONG(IDCANCEL, BN_CLICKED), (LPARAM)pDialog->GetSafeHwnd());
((CDialog *)pDialog->GetParent())->EndDialog(IDCANCEL)
505 :
デフォルトの名無しさん :2006/02/07(火) 23:23:22
おぉ、ありがとう。 今環境がないので明日試します。 報告はその時。 サンキュウ。
503とかは一目見て試す価値ないのがわかるな。
507 :
◆G...gjbMvE :2006/02/08(水) 07:47:34
508 :
デフォルトの名無しさん :2006/02/08(水) 09:57:32
キタ━━━━(゚∀゚)━━━━ッ!! 504でできました。 >504 サンキュー。 あんたすげえよ。 >503 やってないけど、ありがとうな。
509 :
デフォルトの名無しさん :2006/02/08(水) 16:39:33
教えてください。お願いします。 コントロールがクリックされたっていうメッセージを そのコントロール自身がうけとって処理するのってどうするんですか? クリックイベントはViewでは受け取れるんですがコントロールの中では 受け取れないんで、困っています。
510 :
デフォルトの名無しさん :2006/02/08(水) 16:43:09
コントロールはダイアログかフォームに貼って使うもの。 FormView以外のViewに貼るのは特殊。そりゃ困るだろ。
>コントロールがクリックされたっていうメッセージを >そのコントロール自身がうけとって処理するのってどうするんですか? コントロールの派生クラスは?
どの種類のビューにどんなコントロールをどう貼ったかとか書いた方が レスしやすいと思うよ。
サブクラス
514 :
デフォルトの名無しさん :2006/02/08(水) 17:50:34
>>511 >>512 一応CStaticです。
CStaticのサブクラスを作ってそこにCButtonとか
いろいろつけようと思ってるんですけど、
CButtonをクリックしたっていうメッセージは
そのコントロールで処理できるんですけど
そのコントロール自体がクリックされたっていうメッセージを
そのサブクラス内で受け取れないんです。
説明不足ですみませんが、お願いします。
CButtonのサブクラスを作ってCStaticのサブクラスに クリックされたっていうメッセージを投げる
516 :
デフォルトの名無しさん :2006/02/08(水) 18:15:38
返答ありがとうございます。 CButtonのサブクラスからCStaticのサブクラスに メッセージを投げるのは、具体的にどうするか 教えてもらいたいんですが。
517 :
デフォルトの名無しさん :2006/02/08(水) 18:19:34
<<515 <516 すみません。 CButtonは関係なくてCStaticがクリックされたていう メッセージをCStatic自身で受け取る方法を知りたいんですけど。 わかりづらくてすみません。
518 :
デフォルトの名無しさん :2006/02/08(水) 18:23:22
上にあるように、フォームビュー以外のビューは コントロールを貼ったりそういうことをするのに向いてない。
521 :
520 :2006/02/08(水) 18:45:05
一行目ちょっと訂正 CStaticのサブクラス内でWM_LBUTTONDOWNなりWM_LBUTTONDBLCLKなり BN_CLICKEDのハンドラを追加。
522 :
デフォルトの名無しさん :2006/02/09(木) 09:29:22
class CSettingBox:public CStatic
{
public:
CSettingBox(void);
~CSettingBox(void);
// 生成された、メッセージ割り当て関数
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnStnClicked();
};
BEGIN_MESSAGE_MAP(CSettingBox, CStatic)
ON_WM_LBUTTONDOWN(IDC_SettingBox,OnStnClicked)
END_MESSAGE_MAP()
void CSettingBox::OnStnClicked()
{
// TODO : ここにコントロール通知ハンドラ コードを追加します。
//ブレイク
}
↑
一応ここにブレイクかけてデバッグしてみたんですけど
引っかかりません。
どうもわからないんですけど、
どなたかわかりませんか。
>>519 申し訳ありません。
一応MFCのFormView上で作成してみたんですけど。
スタティックからの通知メッセージを自分で受けてどうするのか。 ハンドリングするのはWM_LBUTTON*だろ。
525 :
デフォルトの名無しさん :2006/02/09(木) 11:19:18
>>524 すみません。無視する形になって、
自分なりに520-521のおっしゃられたとおりやってみた
つもりだったんですけどだめだったみたいですね。
524の1)に変更してみましたらゲットできました!
ありがとうございます。
普通クリックってBUTTONUPなんだけどね。
527 :
デフォルトの名無しさん :2006/02/09(木) 18:29:12
491ですがまた困ったことがあったので助けてください。 「MessageBoxを表示中に他DLLから終了メッセージが来たらMessageBoxも終了させる」 ということをやりたい。 MessageBoxがコードの中に結構な勢いで埋まっているので なんとか少ない手数で修正したい。 現状使用しているのは全てCWndのMessageBoxメソッド。 Class::Method() { CString strCaption = GetCaption(); CString strText = GetText(); MessageBox(strText, strCaption, MB_ICONWARNING | MB_OK); /*以下処理*/ } みたいな感じ。 結構/*以下処理*/の部分でアプリごと落ちる。 (続く)
528 :
デフォルトの名無しさん :2006/02/09(木) 18:30:30
解決方法としては 1.現状の方法の延長でなんとかMessageBoxクラスで生成するダイアログを捕まえて殺しに行く。 2.現状の方法をあきらめてMessageBoxと同じ機能を持った別クラスを用意して実装する。 3.現状の方法をあきらめて気合で全MessageBoxを個別にCDialogに乗せかえる。 の3パターンが考えられると思うが、どれが良いのだろう。 2はかなり大変そう(あくまで予想)。 3はおそらく解決するだろうがマンパワーが必要だし、スキルのアップにならない。 ちゅうことで、できれば1で。 無理だったら諦めて2か3の方法で。 知恵を貸してください。
529 :
デフォルトの名無しさん :2006/02/09(木) 18:39:43
MFCと関係ない。 メッセージボックスをやめてログウィンドウとか作れ。
530 :
デフォルトの名無しさん :2006/02/09(木) 18:55:46
すまん。 書き方が悪かった。 落ちるのは原因が分かっている。 だからログとか取る必要はない。 別スレッドから親クラスが死ぬと自動的にメッセージボックスが死ぬ。 がPCが残っているので死んだはずのクラス(上記のClass)のメソッド (上記で言えば/*以下処理*/の部分)をプログラムが進行する。 それはチェックすれば良いだけなので死ぬこと自身は問題ない。 最初にも書いているがやりたいことは Modalで走っているMessageBoxのダイアログを別スレッドから殺したいということだ。
531 :
デフォルトの名無しさん :2006/02/09(木) 19:29:01
あちこちでメッセージボックスに何を出したいのか知らないけどさ、 いちいちメッセージボックスを出さなくても、 その内容をログ用のリストボックスとかに追加したりしていけばいいだろ? 頻繁にメッセージボックスが出てくるアプリなんかうざいだろう。 あとCWnd::MessageBox()のソースくらい見れ。 中で::MessageBox()呼んでる。
んなもん、MsgBoxの親のウインドウハンドルからFindWindowExで廻して 探すしかねーだろ。
533 :
デフォルトの名無しさん :2006/02/09(木) 21:59:00
初歩的なことかもしれませんorここで訊いていいものかわかりませんが、すみません教えてください! MFCでプログラムを実行してウィンドウに表示される画像をaiかepsにしてWordなどの文書に貼り付けるにはどうしたらよいのでしょうか? 何かソフトを使って切り取ると聞いたのですが詳細がわかりません。 よろしくお願いいたします!
534 :
デフォルトの名無しさん :2006/02/09(木) 22:41:24
キーボードのPrint Screenボタンを押して Wordなどに貼り付ける
535 :
デフォルトの名無しさん :2006/02/09(木) 22:52:35
>>533 アクティブなウィンドウのみだったら
Altを押しながらPrintScreen。
卒論か何かだろ?ガンガレよ。
>>530 別スレッドでいいんだよね? 別タスクじゃないよね?
だったら、HWNDを確保して PostMessage( WM_CLOSE で解決しないかな?
>>536 違います別タスクです。その場合はどうすればいいのでしょう?
538 :
デフォルトの名無しさん :2006/02/09(木) 23:38:27
>>531 見るくらいなら書く前に見た。
::MessageBox()のなかで結局入力待ちになる。
そこの部分のコードは変更が効かない。
というか、何回も書くが解決したいのは
「MessageBoxが生成するダイアログを別スレッドからの命令で殺す」
ということだ。
悪いけど「アプリが悪い」とか話を変えないでくれ。
>>532 おぉ、サンキュウ。
今環境が手元にないから確認できないんだけど
staticに生成されるMessageBoxクラスの子ダイアログとして生成されるんじゃないのか?
違うか?
そこからでもなんとでもなるのか?
とにかく明日一度スパイで見てみる。
>>536 その確保するためのHWNDをMessageBoxから取得する方法があるんだろうか?
俺は無知なために知らない。
539 :
デフォルトの名無しさん :2006/02/09(木) 23:40:44
537 適当書かないでくれ。
540 :
533 :2006/02/10(金) 13:21:56
>>534 >>535 スミマセンダメでしたorz
exeだからダメなのでしょうか?
もともと専門ではなくCの知識しかないのでよくわかりません(><)
卒論頑張ってるんですケド。。。
542 :
デフォルトの名無しさん :2006/02/10(金) 14:18:15
527だができた。
532の言うとおりFindWindowExでひたすらまわすでいけた。
hWnd = FindWindowEx(pParent->m_hWnd,NULL,_T("#32770"),NULL);
でいけるかと思ったがは取得できなかったので
hWnd = FindWindowEx(NULL,NULL,_T("#32770"),NULL);
while(hWnd) {
if(GetParent(hChild) == pParent->m_hWnd) {
/*処理*/
}
hWnd = FindWindowEx(NULL,hWnd,_T("#32770"),NULL);
}
して処理した。
>>532 サンキュウ
543 :
デフォルトの名無しさん :2006/02/10(金) 20:50:50
質問です MFCで自作のライブラリを使ってみようと思い、使ってみたんですが ↓のようなリンクエラーがずらっと出てきました。 また、ライブラリ使わずに使う関数が書かれた.cppと.hをプロジェクトに入れて ビルドしたら普通に成功しました。 なぜなんでしょうか? AI_chapter2 error LNK2005: _free は既に msvcrtd.lib(MSVCR71D.dll) で定義されています。
MFCに未来はあるのか いやマジで
545 :
デフォルトの名無しさん :2006/02/10(金) 21:08:34
546 :
デフォルトの名無しさん :2006/02/10(金) 21:09:07
文字通り既に定義されているからエラーが出た。
msvcrtd.libの中にある関数が自作のライブラリの中にも あったのでリンクエラーとなった。
548 :
デフォルトの名無しさん :2006/02/10(金) 22:15:28
回避策提示しないと何の意味も無いだろw
549 :
543 :2006/02/10(金) 22:44:18
#pragmaでは、リンクの順番までは指定できない よって、その解決方が正解
自作のライブラリ作るときにマルチスレッド対応ライブラリを リンクしたのか、シングルsureddo用を リンクしたのか確認し、使うときにも乱タイムがどっちになっているのか かくにんしないとけない。
VC6です。AppWizardが作ってくれるスケルトンについてです。 ふと気になったことを質問させて下さい。用語の誤用などあればすみません。 ダイアログベースだと、CDlgから派生させたメインのダイアログオブジェクトを、 CAppのInitInstance内で作成してます。つまり、オブジェクトはスタックに 確保されているんですよね。なぜ、newでメモリを確保しないのでしょう? もちろん、サイズ的に余裕である事が明らかなら別に構わないのでしょうが、 あえてnewしない(自動変数というのでしょうか)メリットが思いつきません。 「deleteとか面倒だし」以外に大人の事情があったりするのでしょうか? // デフォルトのスタックサイズは1MBで、sizeofは100だったので、 // 確かに余裕っちゃ余裕っぽいんすけど
あえてnewするメリットがないから
CStringで考えてみろ いちいちnewしてたらめんどくさくて使ってられないだろ めんどくさいことやんなくていいために存在するクラスなんだし
モーダルの場合はウインドウが1つだからいいけど、 動的に任意の数のダイアログを作りたい場合はnewするしかないのでは? そういえばモードレスダイアログの場合はnewしてdelete thisで自殺させるよね
>>552 deleteとか面倒だし、というのは立派な理由に思える。
スタック上に作成できる場合はそうできるのが
C++のメリットのひとつじゃまいか?
>>552 君の感性に合わないならば書き直してnewすれば?
554の言うとおり、CStringやCPoint,CSizeなんかもちゃんとnewしろよと・・・
普通のintやcharもnewで領域確保せんとな。
Javaあたりから入ったひとなんでしょ・・・
BREW開発に毒されちゃったんじゃね? あれ全部mallocでしょ?
「スタックを使ういんちきガベージコレクション」って言ってた人がいたな
なんかそれガベコレ自体に価値があるという思想だろうか…
563 :
561 :2006/02/12(日) 00:24:34
>なんかそれガベコレ自体に価値があるという思想だろうか… あっ、その人組み込み系の人だから。多分そうだと思う
564 :
552 :2006/02/12(日) 02:51:27
>>553-563 たくさんのお返事ありがとうございます。
色々聞いてすっきりしましたです。
経験の浅い趣味グラマなんすけど、最近メモリ関連の知識を仕入れて、
そういや何でnew/mallocって必要なんだろうと見つめ直してたお年頃なのです。
勉強になりました。ありがとうございました
565 :
デフォルトの名無しさん :2006/02/12(日) 20:07:21
MFC共有DLLにGUI(ダイアログなど)とそのメッセージループを詰め込んで Win32アプリから呼び出したいんですが、どうすれば可能でしょうか?
566 :
デフォルトの名無しさん :2006/02/12(日) 21:45:22
CListCtrl の背景って透過できないのでしょうか? カスタムドローのCDDS_PREPAINTでNULL_BRUSHを使って クライアント領域を塗りつぶしてみたのですがダメでした。
567 :
デフォルトの名無しさん :2006/02/12(日) 22:05:39
568 :
565 :2006/02/12(日) 22:18:27
>>567 あります。でもMFCがどうやってメッセージループを隠匿してるかとかは知りません。
>>565 単に↓みたいな感じのをエクスポートして、
アプリ側でGetProcAddress()して...っていう話じゃないの?
STDAPI ShowMyDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDlg dlg;
return dlg.DoModal();
}
571 :
566 :2006/02/12(日) 22:57:48
>>567 ありがとうございます
残念ながらアイコンビューなのでオーナードローはできないのです
継続調査してみます
MFCに限ったことじゃないのかもしれないんだけど、 作ったアプリが何のエラーも出さずにいきなり終了するのって、 どういう原因が考えられるんだろう? メモリとかリソースとかリークしてる感じもないし、 エラーのログがないから皆目検討つかない。 偉い人教えてください。
573 :
デフォルトの名無しさん :2006/02/13(月) 23:09:24
>>572 エラーが出ないなら自分でエラーを出せばいいじゃない
エラー出さないまでもブレーク貼って何がトリガで死んでるのか探るべし。
575 :
デフォルトの名無しさん :2006/02/13(月) 23:36:42
ブレークポイント絨毯爆撃。 他にもdprintf()とかなんかいろいろあるっしょ。
576 :
572 :2006/02/14(火) 00:06:32
ありがとうです。 やはりしらみつぶしにするしかないですかね。 再現性が低いもんでステップで追っかけてても全然起きないのに、 走らせとくとふっといなくなってて鬱なのです。 検索かけてみるとスタックオーバーフローで発生するみたいなのが 引っかかるんだけど、どうなんでしょう? 今まで異常終了するときにはなんかメッセージ出るような 落ち方しかみたことなかったんだけど、こういう、何も言わずに 異常終了ってのはよくあることなんでしょうか?
じゃあスタックのサイズをふやしてみれば良い。
>>576 俺はOSやフレームワークがエラーを見せてくれるのは
ラッキーとまでは言わないがむしろ良いケースだと思ってる。
例外そのものがズバリ表示されればそれこそ幸運。
それでわからないところからお仕事が始まるわけで。
>>576 スタックオーバーフローはまずいだろ。
後、何も言わずに終了って言っても、ウインドウを終了させる
関数に飛んでるだけかも知れんし、別に不思議だとは思わん。
良くあるとも思わんがな。
スタック使い切るのは異常 実はものすごくでかい領域をメンバで持つオブジェクトを オートで作ったんじゃないのか
ダイアログにツリーコントロール貼り付けてます。 ツリーアイテムのラベルの編集して、Enter押すとダイアログが閉じてしまうんですが、 良い解決法はありますか? ダイアログのOnOKで、閉じるのを禁止すると、ラベルの編集まで終了しなくなって しまう(インプレイスのエディットボックスが消えない)...
582 :
581 :2006/02/15(水) 00:19:28
583 :
デフォルトの名無しさん :2006/02/15(水) 12:06:48
SetWindowRgnした角の丸いウィンドウのリサイズってどうするのでしょうか? サイズ変更枠のあるウィンドウにするとフレームがはみ出てしまいます。 ウィンドウスタイルを変更するとサイズ変更を枠を消してリサイズできるようになるのですが この場合キャプションやシステムメニューも消えてしまいます OnNcHitTestをオーバーライドしてOnMouseMoveでウィンドウリージョンを再設定すれば いいような気もしますが・・・
584 :
デフォルトの名無しさん :2006/02/15(水) 15:20:50
リッチエディットコントロールからリッチエディットコントロールへ 書式ごとコピーするには、どうすれば良いでしょうか?
585 :
584 :2006/02/15(水) 15:22:28
クリップボード非経由でおねがいしますm( _ _ )m
ファイルに書き出して
587 :
デフォルトの名無しさん :2006/02/15(水) 16:57:50
CListView から派生したクラス(のオブジェクト)に WM_APP+n で定義した自前のメッセージを PostMessage() したのですが, それに対するメッセージハンドラが呼ばれません. CListView ではなく CWnd の派生クラスの場合は ちゃんとメッセージを受けて, メッセージハンドラが呼ばれます. なぜこのような違いが起きるのでしょうか?
CListView::GetListCtrl() を使ってリストビューのリストコントロール部分に対して 行ってみる
589 :
587 :2006/02/15(水) 18:00:05
>>588 CListCtrl は CWnd から派生されてないですから
メッセージは受けられないですよね?
はあ?
話変わるけど、メンバ関数呼ぶのにPostMessage使いたがるやつは C++が苦手なのかね?
メンバ関数呼びたいからでなく、「(ウィンドウ)メッセージをポストしたい」 から呼ぶわけですが、何か?
何も
MFCでPostMessage使ってるサンプルあんまり見たことないぞ 一応MFCのソースとMSDNのサンプルで確認したけど、ほとんど使ってない。
サンプルなんぞ基準にされてもなあ
スレッド違うといろいろあるんですよ
CListViewにPostMessageでスレッド?
CListCtrl は CWnd から派生されてないですから メッセージは受けられないですよね?
atlmfc\include>grep CListCtrl * File afxcmn.h: class CListCtrl; // CListCtrl class CListCtrl : public CWnd
>>587 ビューに載ってるリストコントロールの方にpostしちゃってるとか。
>>587 自前のメッセージ受信用にViewをもうひとつ作って
メッセージが来たらCListView から派生したクラスのメッセージハンドラを呼ぶ
CCtrlViewは、無理やりCView派生クラスにしてるから 勘違いが多くなるんだろう。
自前のメッセージならどこでメッセージ受けても良いのでは? Viewにこだわる必要ないような
>>587 >>なぜこのような違いが起きるのでしょうか?
違いが起こるも何も
そもそも前者の現象がおかしい。
今確かめたが、ちゃんと呼ばれる。
どっか間違ったコード書いてるんだろ。
MFCを使ったら負けかなと思ってる
リストコントロールに書かれた内容を吸い出す方法ありませんか? オーナードローの場合も含めて。 リストコントロールを実装しているDLLのフックしかないですか?
>>608 ただ吸い出したいだけなら「ListView to CSV」ってソフトがあるので
それを使えばいい。
自作したいのなら、別プロセスから文字列を吸い出すのはちょっと面倒。
そのソフトのヘルプに簡単な原理とソースが載ってるので
それを参考にすればいい。
611 :
587 :2006/02/16(木) 09:51:33
その後,調べたところ メッセージはたしかに受けていることを確認しました. ところがそれに対するハンドラが起こされていませんでした. なぜなんでしょうか… WM_FUGA という自前のメッセージに対して OnFuga というハンドラを用意しています. メッセージマップに以下にように書いています: BEGIN_MESSAGE_MAP(CHogeView, CListView) ON_MESSAGE(WM_FUGA, OnFuga) END_MESSAGE_MAP() CWnd から派生した場合に, まったく同じように書いて, ハンドラは呼ばれます.
612 :
606 :2006/02/16(木) 12:42:11
>>611 もしかして、テストしているのはダイアログベース?
もしダイアログに貼り付けているリストビューなら、
CListCtrlの派生クラスでやればうまくいくよ。(これも当方で確認済み)
名前が紛らわしいけど、一般にListView,TreeViewと呼ばれているコントロールは
MFCではCListCtrl,CTreeCtrlでカプセル化されている。
MFCのCListView,CTreeViewはDocument/Viewアーキテクチャ用に
カプセル化されているもの。
CEditViewがXPスタイルだと、SJISが扱えなくなるのはもうどうしようもありませんか?
616 :
デフォルトの名無しさん :2006/02/17(金) 00:31:15
>>615 そんなものWindowsとの親和性の低いただのおもちゃだ。
この時期に某を勧めるって・・・釣られた?
クマー
620 :
デフォルトの名無しさん :2006/02/17(金) 10:52:24
すみません、CEditコントロールでenterキー入力を受け取るのって どうしたらいいですか? OnKeyDownでハンドルしてみたんですが ほかの[a]とか[1]とかは受け付けるんですが、 enterキーではイベントが発生しないんです。
>>620 ES_WANTRETURN
だっけか、、、綴り自信が無い
622 :
621 :2006/02/17(金) 11:03:33
エディットコントロールのプロパティに、Want Return と言う項目があるので true を。 マルチラインかな
623 :
デフォルトの名無しさん :2006/02/17(金) 14:48:30
>>621 >>622 おっしゃられたとおりエディットボックスのCreate時にES_WANTRETURNを
加えましたが、やはりEnterキーではイベントが発生しませんでした。
他の数字やアルファベットではできましたが。
Edit.Create(WS_BORDER|WS_CHILD|WS_CLIPSIBLINGS|ES_WANTRETURN,CRect(0,0,60,30),this,ID)
ちなみにシングルラインです。
一度クリックすると凹んだままになり、 もう一度クリックすると元に戻るボタンはどうすれば作れますか?
>>624 チェックボックスを作り、Push Like をtrueにする
>>625 ありがとうございました。
チェックボックスがプッシュボタンになってビックリ。
629 :
623 :2006/02/17(金) 16:45:01
バカでした↓ PreTranslateMessage() でなんとかやってみます。
630 :
デフォルトの名無しさん :2006/02/18(土) 00:45:34
SDIでプロジェクト(hogehoge)内が ・hogehoge.cpp ・hogehogeDoc.cpp ・hogehogeView.cpp ・hogerightView.cpp:右のビュー用クラス ・hogeleftView.cpp:左のビュー用クラス となってる場合、Doc-ViewでhogehogeViewにてデータのやりとりをしていますが、 hogerightViewでhogehogeViewにアクセスするためにhogehogeView.hをインクルードすると public: CPassManagerDoc* GetDocument() const; でなぜかエラーとされます。 やりたいことはhogerightViewでhogehogeView内の関数を使いたいのですが何か良い方法はありますでしょうか? もしくはhogehogeDocのデータをhogerightViewに読み込ませる方法はありますか?
単に〜Doc.hをインクルードしていないからでは? コンパイルエラーは99%「なぜか」ではなく理由があって出ているので、 そのエラーメッセージもちゃんと書くこと。
632 :
デフォルトの名無しさん :2006/02/18(土) 01:03:33
リストコントロールでダブルクリックされた項目のテキストを取得させてます。 ソースはこんなです。 --------------------■ int item = list1.GetHotItem(); CString csItem = list1.GetItemText( item, 0 ); --------------------■ これWinXPなら、int item にはしっかりダブルクリックされた項目のインデックス値が返っているのですが、 なぜかWin2000では -1 が返ってきます。 ググってGetFirstSelectedItemPositionを使えば解決すると知ったのですが、 XPでは正常に値が返ってきてWin2000では-1が返るのはいったい何故?
UNICODEビルドしたMFCアプリ(共有DLL使用)から、 MBCSビルドしたMFC DLL(共有DLL使用)を呼ぶと 内部でメモリリークするみたいなんだけど、しょうがないんだっけ?
635 :
630 :2006/02/18(土) 02:13:00
>>631 さん
ありがとうございます。ご指摘通り〜Doc.hを読み込んだら
public:
CPassManagerDoc* GetDocument() const;
でのエラーはなくなりました。
なぜエラーとなっているか考えることをしませんでした。
今回はありがとうございました。
>>632 「ダブルクリックされた項目」==「ホットアイテム」だっけ?
ダブルクリックイベントのハンドラでフォーカスのある項目を取得するのはできたと思ったけど。
classViewのツリーってMSDNのヘルプ見たく「同期」取る事出来ないんですか? たまに勝手に折りたたまれちゃったり、ひとつ隣のクラスが選択されちゃったり しているんですけど、
CFileクラスでComポートからデータを読み込みたいのですが Readで読み込むところまではうまくいきました。 その際、もしデータがこなかったら制御を返すような方法はないでしょうか。 Readでそのままやると来るまで待ち続けてしまうので、タイムアウトなり設定する方法はないでしょうか。
SetCommTimeouts
MFC限定でお願いします
>>638 system("com1: baud=9600 parity=n data=8 stop=1 to=on xon=on odsr=off octs=off dtr=on rts=on idsr=off");
643 :
デフォルトの名無しさん :2006/02/18(土) 21:06:31
おじゃまします。 C〜Doc.hで public: CString mydata; と宣言されている変数に C〜Doc.cppで mydata = 〜 と代入をした場合 0x7c17787a (mfc71d.dll) で初回の例外が発生しました : 0xC0000005: 場所 0x00000054 を読み込み中にアクセス違反が発生しました。 0x7c17787a (mfc71d.dll) でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000054 を読み込み中にアクセス違反が発生しました。 というエラーが出てしまいます。 直前までのデータは異常がありません。 代入するデータをC〜Doc.cpp内で宣言した変数に入れる場合は問題ありません。 確認すべきことは何でしょうか?
thisがNULL
ぽ
ガ
ッ
648 :
デフォルトの名無しさん :2006/02/19(日) 12:24:20
<わからない理由> 1. 読まない ・・・説明書などを読まない。読む気などさらさらない。 2. 調べない ・・・過去スレ、ググるなど最低限の内容も自分で調べようとしない。 3. 試さない ・・・めんどくさいなどの理由で実行しない。する気もない。 4. 理解力が足りない ・・・理解力以前の問題で理解しようとしない。 5. 人を利用することしか頭にない ・・・甘え根性でその場を乗り切ろうとする。 6.感謝しない・・・教えてもらって当たり前。事がすんだらさようなら。 7.逆切れする・・・自分の思うようにならないと逆切れする。
649 :
デフォルトの名無しさん :2006/02/19(日) 20:54:47
MFCの勉強を始めました。 WinAPIでがりがり書くより楽だわ。
気楽に適当なのをつくるのは楽チンだね。 俺は長く使いそうなのはWinAPI,みたいな使い分けをしているよ。
652 :
デフォルトの名無しさん :2006/02/20(月) 23:04:15
はじめまして、 Jpg画像を、作成しようと思い CImageを使っているのですが、うまく出来ません。 今のところ、テスト段階として、1本かの線があるJPG画像を作ろうと思い、 CImage image; image.Create(120, 120, 8); HDC hDC = image.GetDC(); SetDCPenColor(hDC, RGB(255,0,0)); LineTo(hDC, 110, 10); image.Save("test.jpg"); image.ReleaseDC(); image.Destroy(); としてみましたが、真っ黒なjpg画像が出来るのみでした。 どうしたらよいか教えてください。 環境 WindowsXP Pro Visual C++ .net 2003
まず各呼び出しの戻り値を確認しようか。
ReleaseDCが遅いんじゃね?
>>653 ありがとうございます。
今から確認します。
>>654 ありがとうございます。
Releaseの位置についても確認してみます。
>>652 えーと、、、
8ビットのイメージを作ってるのにパレットが無いから。
とりあえず、24ビットでやってみ。
あと、いきなりLineToだと起点がないけど、平気?
まあ0,0だろうけどな。
657 :
656 :2006/02/21(火) 14:05:21
パレットっていうのはカラーテーブルのことね (もはやパレットは通じないか)
常駐パレットを常駐させておけば済む話
また懐かしいことをw
660 :
623 :2006/02/21(火) 17:01:41
CStatic上でマウスポインタを変更しようと思うんですが、 CStaticのMouseMoveハンドラ内で SetCursor(LoadCursor(NULL,IDC_IBEAM)); としたのですが、変更されませんでした。 直後にGetCursor()で値を調べたところNULLになってました。 ちなみにCViewで同じようにしたところうまくいきました。 どう違うのでしょうか?
マウスカーソル変更のタイミングはWM_MOUSEMOVEなんぞではなく、 WM_SETCURSORなんだけど、それでもだめかね?
662 :
660 :2006/02/21(火) 17:10:55
すみません。解決しました。 SetCursor( を ::SetCursor( としたところうまくいきました。
VC6からVS2005に乗り換えたんですが、 「共有DLLでMFCを使う」でコンパイルしたexeを VS2005のインストしていないマシンで起動させる動作条件を教えてもらえないでしょうか 客先(WinXP Home SP2)で起動してもらったら、 mfc80.dllがないから起動しないと言われたので、 x86のmfc80.dllとmsvcr80.dllを送って起動してもらったら、 「このアプリケーションの構成が正しくないため、 アプリケーションを開始できませんでした。 アプリケーションを再度インストールすることにより 問題が解決する場合があります。」 と出て起動しませんでした。 「スタティックライブラリでMFCを使用する」でコンパイルしたexeなら起動しました。 mfc80.dllとmsvcr80.dll以外に必要なDLLや条件がありましたら教えてもらえないでしょうか よろしくお願いいたします。
>>663 一応MFCとは間接的にしか関係ないが答えとく。
(VSインストールフォルダ)\Common7\Tools\Bin\Depends.Exe
で実行ファイルがどのdllを要求するかがわかる。
(VSインストールフォルダ)\1041\redist.txtに再頒布可能なファイルの一覧があるから
(VSインストールフォルダ)\VC\redist以下にあるファイルを自分で配布しなさい。
手段は実行ファイルと同じフォルダにzipで固めるなりVSでインストーラを作成するなりご自由に。
インストーラ作るとdllはSideBySideでexeと同じフォルダになるから 最近はスタティックリンクにしてる俺。
スタティックリンクにした時の肥大さがもぅたまんない! でももっと小さく出来る仕掛けってないの??
668 :
デフォルトの名無しさん :2006/02/23(木) 11:41:37
SetCapture()でキャプチャリングしたんですが ReleaseCapture()以外でキャプチャが外れることってあるんですか? LButtonDownでキャプチャリングしてドラッグしてるときはちゃんと キャプチャしてるんですが、ボタンを離すとキャプチャが外れるんですけど どうしてなんでしょう?
MSDNに書いてありそうな気がする
670 :
668 :2006/02/23(木) 13:50:39
MSDNでSetCapture調べたら カーソルの位置に関係なく、以降のすべてのマウス入力が現在の CWnd オブジェクトに送信されます。 てかかれてたんですけど、一切ReleaseCapture()を記述してないのに キャプチャが外れたんで どこか中の方の処理でReleaseCaptureみたいなことをやってるのかなぁと おもったんですけど。 なにかこの単語で検索してみたらみたいなことありますか? お願いします。
本当にキャプチャ外れてるか? WM_MOUSEMOVEが来てないだけじゃない?
672 :
デフォルトの名無しさん :2006/02/23(木) 14:04:08
>>671 WM_MOUSEMOVEは来てると思うんですが
あと、不思議なのが、OnLButtonDownでSetCapture()を設けてるとこに
ブレイクポイントを作ってデバッグしたら、F5で復帰時にはちゃんとキャプチャ
できてました。
ブレイクしないとキャプチャできません。
理由がわからないんで困ってます。
キャプチャはマウスを押下している限りにおいて有効だったきもするけど。
プリエンプティブなマルチタスクになってからはそういう挙動になった気がする
英語版SDKのドキュメントによれば >SetCapture captures mouse input either when the mouse is over the capturing window, >or when the mouse button was pressed while the mouse was over the capturing window >and the button is still down. というわけなので、ずっと押してないとだめ(という文章だとおもう)
676 :
デフォルトの名無しさん :2006/02/24(金) 07:06:01
質問です。 常時、とあるデバイスを監視し続け、何らかのアクションがあると それに対応した処理をしたいのです。 デバイスを監視するタイミングは、どのように起こせば良いのでしょうか? WM_ENTERIDLEが良いのでしょうか? とりあえず、1秒以内に反応出来るなら、問題ないのです・・・。
677 :
676 :2006/02/24(金) 07:18:57
ごめんなさい。 追記です。 実験のため、 WM_ENTERIDLEイベントでメッセージボックスを発生させるようにしたら・・・。 普段アイドル状態だと思われる状況でも発生しなくて、、何故かウインドウ上部のタイトルの部分を右クリックしたら 発生するようになりました・・・。 こういうものなのでしょうか?
タイマで監視するか、hEventがもらえるなら、それを(Msg)WaitForするか。
>>676 それ、メインのウインドウ操作してると、永遠にハードウェア監視出来ないぞ。
監視だって、直ぐに完了するのか?その時アイドル状態でも、それが重いと全体のパフォーマンスが落ちる。
恐らく、ハードウェアの監視に関しては、別スレッド作って、メインのウインドウにメッセージ送る形にした方が良いと思われ。
680 :
デフォルトの名無しさん :2006/02/24(金) 10:21:59
エディットボックスで直接入力以外に 近くにリストが出てきてそこから選択できるようにするのって どういうやり方が好ましいんですか? リストボックスとかポップアップメニュー使うんですか?
つ 複数行エディット
683 :
680 :2006/02/24(金) 14:48:08
コンボボックスだと左に表示されてる↓ボタンが少し邪魔なんで デフォルトではエディットボックスと同じで ボタンを押されると(又はフォーカスを得ると)↓ボタンが表示されて 選択可能というようにしたいんです。 Create時には可能なんですけど、 動的に↓ボタンの有無を切り替えるメンバとかってありますか?
ある
Create時に可能なら可能 方法はCreate時に可能の内容による
686 :
デフォルトの名無しさん :2006/02/24(金) 15:42:04
Create時にCBS_DROPDOWNスタイルを指定したら↓ボタン出てきて 指定しなかったから出なかったんで、 そのスタイル変更する関数とかあるのかなと思いまして。 あれば教えていただきたいんですが・・ ShowDropDownとかじゃないですよね。
~CBS_DROPDOWN
688 :
デフォルトの名無しさん :2006/02/24(金) 16:48:40
?
2つ作って切り替える
692 :
デフォルトの名無しさん :2006/02/24(金) 17:48:19
返答ありがとうございます。 コンボボックスのスタイルの変更は難しいんですね。 2つ作って切り替えるっていうのもあれなんで、 ポップアップメニュー使って 同じようになるようにやってみたいと思います。
切り替えるほうが楽だけどな。 表示非表示をかえるだけ。
コンボボックスの矢印部分を何かで上書きして隠したら?w
切り替え法最高〜♪ 何でもこれでさくっと解決
696 :
デフォルトの名無しさん :2006/02/25(土) 01:51:08
CHTMLViewで作ったウィンドウにファイルをドロップした時にIEにドロップする感じじゃなくて OnDropFilesなどで自分で処理したいのですが分かりません。 どうしたら出来ますでしょうか? PreTranslateMessageではWM_DROPFILESが来てなくて出来ませんでした。
697 :
デフォルトの名無しさん :2006/02/25(土) 09:15:52
Visual Studio 2005 を使っています。 ダイアログの生成時のイベントハンドラを追加しようと思ったんですが、 CDialog::OnInitDialog() はもう使われないんでしょうか? リソースエディタで WM_INITDIALOG が見つからないんですが。
698 :
デフォルトの名無しさん :2006/02/25(土) 09:42:11
すんません、そういやオーバーライドでした。 すっかり忘れてました。
699 :
デフォルトの名無しさん :2006/02/26(日) 22:54:47
VS 2003を使っています。 MFCをCFormViewを使ったアプリを作っています。 リソースエディタで、タブコントロールを置いたのですが、 これのプロパティのOwner Draw Fixedという項目が、 グレーアウトしていて選択できない状態なのですが、なぜでしょうか? 通常、オーナードローはプロパティで設定できないものですか?
700 :
デフォルトの名無しさん :2006/02/27(月) 15:50:01
すいません。 コンボボックスをCreate時にサイズを反映できないんですが コンボボックスってサイズ固定なんですか? なんか方法あります?
>>700 > コンボボックスをCreate時にサイズを
日本語でおk
>>700 Createのrectはエディットコントロールのサイズじゃなくてリストボックスのサイズ。
>>701 チョン乙
704 :
デフォルトの名無しさん :2006/02/27(月) 16:13:30
<<702 おおっ なるほど。 ということはエディット部分のサイズ変更はできないってことですか?
705 :
デフォルトの名無しさん :2006/02/27(月) 16:19:42
706 :
デフォルトの名無しさん :2006/02/27(月) 16:34:45
子ウィンドウからビューのハンドラを取得するのってどうするんですか? this->GetParent()->GetParent()->‥ みたいにやっていったらできそうなんですけど、 なにか一気に取得する方法ってありますか? AfxGetApp()みたいな。
>>706 ハンドラでなくハンドル。
この3つの関数を使う
CWnd* ::AfxGetMainWnd()
CView* CFrameWnd::GetActiveView()
HWND CWnd::GetSafeHwnd();
注意点
・型の違い
・返ってきた値が正しいかチェック
・MDIにはビューが複数あること
708 :
デフォルトの名無しさん :2006/02/27(月) 17:18:31
>>707 ヘルプでGetActiveView調べたらできました!
恩に着ます。
CMDIFrameWnd *pFrame =
(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
// Get the active MDI child window.
CMDIChildWnd *pChild =
(CMDIChildWnd *) pFrame->GetActiveFrame();
// or CMDIChildWnd *pChild = pFrame->MDIGetActive();
// Get the active view attached to the active MDI child
// window.
CView *pView = (CView *) pChild->GetActiveView();
>>708 MDIだと子フレームがあるから、もう一段階GetActiveFrameが入るね。
こちらこそどうも。
つまらない質問ですみません。 左にツリービュー、右にリストビューというIEみたいなサンプルコードは どこかに落ちてないですか? ところで、最近MFCの本はさっぱり見ませんね。翔泳社のMFCバイブル全部 持っててよかった。
711 :
デフォルトの名無しさん :2006/02/28(火) 03:43:30
windows media playerのように多重起動をせずに、 2つ目以降の起動で渡されたデータを、一つ目に起動させたアプリケーションに渡したいのですがどうしたらいいのでしょうか? 具体的には、WMPに関連付けられている動画をクリックしてWMPを起動し、 起動したまま、別の動画をクリックすると最初に起動したWMPで再生するような感じにしたいんです。
>>711 多重起動防止→mutex
プロセス間のデータ受け渡し→共有メモリ、WM_COPYDATA、socketなど
713 :
711 :2006/02/28(火) 17:38:13
714 :
デフォルトの名無しさん :2006/02/28(火) 19:19:46
>>710 > 左にツリービュー、右にリストビューというIEみたいなサンプルコードは
ウィザードでスケルトンは作れるじゃない。
ネット将棋の Java アプリが画面に表示している将棋盤のイメージを取得して 局面図を出力する VC++ ツールを作成しています。 9x9 の盤面を表現するウィンドウは、FindWindow(),EnumChildWindows()で取得できました。 そのウィンドウに描画されているイメージはどのように取得すれば良いでしょうか?
>>715 画面をコピーするだけでなく、
何の駒が置かれてるか判断するには、
ビットマップを比較する方法と、
ある座標の点が塗られている色で見分ける方法がある。
前者はすべての駒のビットマップを保持する必要がある。
後者はある座標が黒だったらとか駒の色だったらとか、
場合分けで何の駒が置かれてるか判断する必要がある。
718 :
717 :2006/03/01(水) 11:04:09
720 :
デフォルトの名無しさん :2006/03/01(水) 16:09:28
すみません。質問です。 あるクラスに、 自分自身のオブジェクト情報をファイルに保存する という機能を持った操作を実装したいんですけど、 CArchiveクラスを使って、 CFile outFile( "myfile.txt", CFile::modeWrite | CFile::modeCreate ); CArchive serializer( &outFile, CArchive::store ); serializer << ○○; serializer.Close(); てやるのかなとイメージしてみました。 そこで○○のところに入るクラスの実体を どのようにして得るのかがわからないんです。 thisはポインタなのでだめですよね。 ポインタから実体を作る方法ってありますか? また、なにか他のいいほうがあれば教えていただけないでしょうか?
1. *this 2. WriteObject
722 :
720 :2006/03/01(水) 17:46:18
すみません。 WriteObject(this) で書き込んでみたんですけど 書き込み先のファイルを見たらたかだか32バイトで (どう見ても足らない) arLoad.ReadObjectで読み込んでみても 正しい値を返さないんですが。 はてさて?
複数段タブで、タブを選択してもタブの行が入れ替わらないようにするいい方法ないですかね? 行が入れ変わらないようにするにはBUTTONスタイルを指定すればいいのだけど、 これだとタブ札の間にスキマができてしまう。 あと、タブ札の中身はOnDrawItemでかいてて、タブ札の枠線はOnPaintで書いてるみたいで、 (BUTTONスタイルならボタンの陰影をOnPaintで描画)、 きちんとタブ札の外見にするにはOnPaintをオーバーライドしなきゃいけないのでしょうか。 もしこの場合、各タブ札の描画領域を知るうまい方法ってないでしょうか?
行が入れ替わらないタブなんて見たことない。
727 :
デフォルトの名無しさん :2006/03/01(水) 23:08:35
MFCって、この先も生き残り続けるのか? 勉強して大丈夫? 釣りじゃないぞ。
この先のことは誰にもわからんけど ソースが公開されてるから好きなように使える。
>726 そうだけど、行が入れ替わるってのはUIの使い勝手として悪いと思わない?
>>729 入れ替わらなかったら、隠れるタブが出てくるわけなんだが、それはどうするつもりだ?
選択されたタブは上と横方向にでかくすりゃいいんじゃないの、ぐらいしか考えてないかな。 うん。 隠れるってどんな状態だろう?
732 :
715 :2006/03/02(木) 00:48:28
>>716 的確なアドバイス、ありがとうございます。
確保したメモリDCにイメージを転送してゴニョゴニュできるようになりました。
>>717 ご指摘の通り、解析を行わなければなりません。
今回は駒のビットマップを全て保持して比較する予定です。
>>718 こんなのもあるんですね。知りませんでした。
ソースが付いてるともっとよかったり(何
>>719 まさにコレを作ろうとしていました。やっぱり需要はあったのですね・・・
ただ、作者さんも書いておられますが、MS JavaVM でしか確認していないのか
こちらの Sun JavaVM の環境では動作しませんでした。
いろいろ勉強がてら、ツールの製作は続行しようと思います。
皆様、御指導ありがとうございました。
>>726 今時のタブブラウザにあるような奴かな
>>729 禿胴
コモンコントロールでTCS_MULTILINEスタイルの奴ね
734 :
デフォルトの名無しさん :2006/03/02(木) 03:44:01
>>727 オレもちょと不安。
オレの感じ(あくまでも感じね)では、
もうネイティブGUIアプリは現状のMFCで打ち止めFIX
と考えてるんじゃないだろうか、Microsoftは。
今後出てくるテクノロジは .NET Framework の
インターフェイスで使ってね、ってことで。
Avalon ってネイティブのインターフェイスと
.NET のインターフェイスとどっちもあったっけ?
>>733 タブのスタイルをボタンにしてるんだろ
タブじゃ実現不可能だからみんなボタンにしてるわけだし
それが理解できないやつは池沼
何で怒るんだ・・・('A`;) タブブラウザだと位置固定の多段タブって使われてるけど、 あれってCWndから派生してちまちま書いてたりするんだろうか。 もしくはTCS_MULTILINEを指定して、更にサイズ調整を行って、 ボタンのスキマをぴっちりつめて、オーナードローする方法なんだろうか? TCS_MULTILINEとボタンスタイルを指定した場合に、タブ札のサイズ(横幅)をいじくる 方法って誰か知らんとですか?
('∀`)使えん ちゅーわけで使える人が調べてくれるならとてもうれすぃ
こっちはうれしくない。
>>737 はSpy++が使えなければ、プログラム以前の問題だと、こう申しておる
740 :
デフォルトの名無しさん :2006/03/03(金) 10:57:52
CListCtrlのカスタムドローでプログレスを描画したいと考えています。 任意セル固定プログレスは試してみたんですが、ソートに対応させたいので、 どこかに参考になるソースとか助言なんかいただけませんか? 現状、セル固定だとアイテムデータとCListCtrl&プログレスデータに分けられて 再利用性が高まるのですが、ソートを可能にするとアイテムデータ、CListCtrlと プログレスデータが絡み合って再利用性が減少する(ような気がする)し、 (スマートさからほど遠い)余分な処理が増えるので、コンテナ等データの 持たせかたで悩んでいます。
741 :
デフォルトの名無しさん :2006/03/03(金) 11:17:15
あるダイアログで、 >CDialog::OnOK(); をコールしてます。 ところが、同じ処理をダイアログを非表示にしてメソッドコールすると、 モーダル開いているウィンドウのディセイブルがイネイブルになっちゃうようです。 何でこんなことになるんでしょうか?
>>741 自分には判っていることでも相手に伝わらないこともある。
「ダイアログ」、「ウィンドウ」がそれぞれ何を指しているのか整理してくれたまえ。
実は全部CDialog(の派生)でつ。 「メインDlg モーダルで開く → メニューDlg モーダルで開く→ 処理Dlg」 と3つのDlgがあります。 で、問題無いのですが、 処理Dlgを非表示にして動作させると、 メインDlgのディセイブルが解除されます。 ちょっと変な作りで、処理DlgをnewしてるのはメインDlgです。
>>740 「プログレス」って何だ? プログレスバー?
プログレスバーだったら、ソートは全体の回数が判らないので無理。
ソート自体はMSDNでSortItemsの説明を読めば判る。
ソートに対応すると場合によってはソート用の配列を設ける必要があって余分な手間が
掛かったりはするが、再利用性が高いとか低いとか言う問題は有るはずがない。
そもそも、似て非なるものを創るときくらいしか再利用なんてできない。
これはひどい「俺用語」ですね。
プログレスバーなんだからデータが変わったら更新するわけだろ だったらソート後のデータで普通に更新するだけじゃないか? カスタムドローなんだから自分で描画してるんだろ?
747 :
デフォルトの名無しさん :2006/03/03(金) 13:08:36
CDialogのVisibleはどうやって見るんだっけ? ShowWindowはあるけど、GetShowWindowが無いお。
CWnd::IsWindowVisible() かな >処理Dlgを非表示にして動作させると、 >メインDlgのディセイブルが解除されます。 これが理解できん もう少し翻訳してくれ
>処理Dlgを非表示にして動作させると、 >メインDlgのディセイブルが解除されます。 処理DlgをdoModalして、処理Dlgのボタンを押してCDialog::OnOK(); を行っても問題は発生しません。 ところが、処理Dlgを表示させずにメソッドを読んで、 どうもその中でCDialog::OnOK(); が呼ばれてるのですが、 そこでメインDlgがディセイブルだったのがイネイブルに変わってしまいます。 CWnd::IsWindowVisible() で判定して、CDialog::OnOK(); を呼ばないようにすると直りましたので、 一応解決ですが、MFCの中の人が何やったのか、何が不味かったのか、ヨクワカンネ。
750 :
740 :2006/03/03(金) 13:33:54
>>744 あ、プログレス(進捗状況)ってのはMFCのプログレスバーもどきです。
OnCustomDraw内でFillSolidRect使って任意セルに直接書き込んでます。
(MFCのプログレスバーも使用してみたのですが、ちらつきが激しいのでやめました)
あと、現状ではオーナーデータを考えています。(可能なら拡張も)
ソートはOnColumnclickで勝手に処理してます。
ダウンローダ系やP2P系にありがちな気がしますが、日本語英語その他言語を問わず、
その手のソフトでソースが公開されているものってありませんかね?
(これはスレ違いかな…?)
プログレスバーでちらつくって使い方が悪いだけなんだが、 オチとしてはリストコントロールのセルに被せているってところか。 まあ、どのみちエスパーさんの登場を待つしかないだろうな。
ソートしたら困るような構造なら プログレスバーじゃなくて数字の更新もできないだろ
753 :
740 :2006/03/03(金) 14:20:01
>>751 ちょいと試してみたいので、ちらつかないプログレスバーの使い方を教えてください。
>>753 どうやったらちらつくのか、それを教えてくれよ。
バックグラウンドをいちいち書いてるのか?
チャイルドをクリップして無いのか?
755 :
740 :2006/03/03(金) 17:40:55
>>754 ダイアログにCListCtrlの派生クラスをメンバにもたせ、さらに
その派生クラスにCProgressCtrlを持たせました。
リストヘッダのドラッグは派生クラスのOnNotifyで検知し、そこで
プログレスバーのサイズを変更しています。
派生クラスのOnEraseBkgndでTRUEを返しても、ダイアログで子ウィンドウ
のクリップをしてもちらつきに関して差は感じられません。
相手するのやめようぜ。
やっぱりリストコントロールに被せているってオチか。イトワロス
758 :
デフォルトの名無しさん :2006/03/03(金) 20:08:38
部外者だがこのスレいらねーな
お前がいらねーな
760 :
デフォルトの名無しさん :2006/03/03(金) 20:22:04
俺もいらねーな
>>740 ソートに対応しているかどうかわからんがCodeProjectにある
>737 >739 使ってみたぜ('∀`) で、メッセージ多すぎてどのイベント拾えばいいのかわかんね。 んで、>737と>739の人はspy++を使えば、どう問題に対処対処できるのか って部分を教えて。
お前が無能なことがわかったので、皆さんの問題は解決しますた。
まあ無能だよ('∀`) ↓今ここまで @ >もしくはTCS_MULTILINEを指定して、更にサイズ調整を行って、 >ボタンのスキマをぴっちりつめて、オーナードローする方法なんだろうか? >TCS_MULTILINEとボタンスタイルを指定した場合に、タブ札のサイズ(横幅)をいじくる >方法って誰か知らんとですか? A >お前はSpy++も使えないのか? spy++を使えば問題が解決する見込みがあるらすぃ。 でも、どういう理由で解決する見込みがあるのか、書かれていないので、 わかってないところ。
765 :
デフォルトの名無しさん :2006/03/03(金) 22:15:08
>765 そんなこじゃれた反応もステキだけど、問題解決に寄与してくれるともっとステキだよヾ('∀`)ゞエッサッサ
768 :
デフォルトの名無しさん :2006/03/04(土) 03:03:06
いまCStatic派生クラスを作って棒グラフとか描画するウインドを作成中です。 この上をマウスが通過したときに座標をポップアップしたり、クリックしたときに棒グラフを選択したりしたいと思っています。 スパイでまずはCStaticにくるメッセージをみてみたのですが、 マウスが動くとWM_NCHITTESTはくるのですが、 WM_NCLBUTTONDOWNなどは来ませんでした。 WM_NCLBUTTONDOWNはどうしたら取得できるのですか? あとこういうメッセージはダイアログの子にどういうルールで送られるのですか? たとえばWM_MOUSEMOVEは親のダイアログにはくるけど子供にはきませんね。 ご教授いただけるとありがたいです。
ID
770 :
740 :2006/03/04(土) 10:03:11
771 :
デフォルトの名無しさん :2006/03/04(土) 14:35:52
>>769 シンプルなお答えありがとうございます。
つまりリソースIDの範囲でフィルタがかかってるとかですかね?
勝手にresource.hを編集してIDをつけるとメッセージが届けられないとかありますか?
>>768 >WM_NCLBUTTONDOWNなどは来ませんでした。
>WM_NCLBUTTONDOWNはどうしたら取得できるのですか?
字面だけで来るって思い込んでるでしょ。
名前から予測するのは構わないけど実際使えるかどうかはちゃんとMSDN読まないと。
>あとこういうメッセージはダイアログの子にどういうルールで送られるのですか?
>たとえばWM_MOUSEMOVEは親のダイアログにはくるけど子供にはきませんね。
そんなわけない。来なかったら困る。
他のコントロールでも調べてごらん。
スタティックコントロールの場合はダイアログエディタで「通知」にチェックつけるか
コード上でSS_NOTIFYを追加すれば来るよ。
(WM_NCHITTESTを捕まえてHTCLIENTを返すという方法もある)
あと、座標をポップアップさせるのはCToolTipCtrlを使うのも手の一つ。
775 :
772 :2006/03/04(土) 18:10:47
一応補足。 773が教えてくれてるのは、送られてきた通知メッセージを親ダイアログで捕まえるためのコード。 772で書いたのは、メッセージがどうやったら飛んでくるかって話で、 773のリンク先の2.に書いてあることと同じ。 もし、派生クラス側で捕まえたければ、2.までは同様にして 派生クラス内のハンドラでWM_LBUTTONDOWNを捕まえればいい。 (もちろんWM_LBUTTONUPでもいいが、STN_CLICKEDはWM_LBUTTONUPではなく WM_LBUTTONDOWNで出されるので、一応それを考慮) あと、リンク先のコードで動くだろうし間違いではないが ON_BTN_CLICKEDじゃなくON_STN_CLICKED使うべき。 全く同じものとはいえ、より忠実に。
776 :
772 :2006/03/04(土) 18:15:26
あれ、書いてるうちに。
ちょっと遅かった。
>>774 MSDNなら"Static Control Default Message Processing"(英語)の辺り
とくに最初と最後の文章と表中のWM_NCHITTESTの項とWM_LBUTTON*の項。
>>772 さん、本当にありがとうございます。
この機会にじっくりよんで理解したいと思います。
(いままで苦手で来ていたので)
778 :
デフォルトの名無しさん :2006/03/04(土) 23:28:52
メッセージが来ないのは魅力がないから。 魅力的な俺にはばんばんメッセージが来ます。
779 :
デフォルトの名無しさん :2006/03/05(日) 01:19:15
エムエフシーってなぁにぃ? WindowsAPIマスター達が代表して設計した汎用クラス群?
キチガイ登場
>>778 それは業者からのダイレクトメッセージだろプギャー(AAry
782 :
デフォルトの名無しさん :2006/03/05(日) 21:34:05
男なら黙ってAPIのみでC言語で組め
783 :
デフォルトの名無しさん :2006/03/05(日) 22:06:10
やだ
突然ですが、MFCのSocket通信を使って 指定したIPのPCのレジストリの中身を 参照するようなことはできるのでしょうか?
できる
妹レジストリ。
弟メーション
対義語 兄メーション
笑点の収録会場はここですか?
もう取れる座布団がねーぞ。
爺DI+
婆ちゃるAlloc
793 :
デフォルトの名無しさん :2006/03/07(火) 16:43:54
メニューの表示を変更したいのですが、 ファイル 開く 閉じる この場合、「開く」「閉じる」はUPDATE_COMMAND_UIで処理すれば良い事が分かりました。 では、ルートにある「ファイル」を実行中に変更するには、どのようにするのでしょうか?
ウィンドウにあるメニューが変更されたときは (ウィンドウが表示されているかどうかにかかわらず)、 アプリケーションは CWnd::DrawMenuBar 関数を呼び出す必要があります。
795 :
793 :2006/03/07(火) 17:23:06
あざーす! できました!
796 :
デフォルトの名無しさん :2006/03/07(火) 22:38:17
画像を表示するビューにcScrollViewクラスを使ってスクロールバーをつけているのですが、 スクロールバーをドラッグして動かすとものすごい勢いでちらつきます。 OnVScroll関数およびOnHScroll関数内で表示の更新をしているのが原因かと思い、 試しに更新をやめてみたところ、 残像のように伸びて絵が残るのかと思いきや、同じようにちらつくため、そうでもない様子。 原因は何なのでしょう? ダブルバッファリング的なことはやっています。 アバウトな質問で申し訳ありませんが、よろしくお願いします。
描画処理がおかしい。 以上
WM_ERASEBKGND
CDC::SelectObjectで指定した(CFont)オブジェクトは、その使用中は 保持していないとまずいですか?(そのオブジェクトでCreateFontIndirect に用いたLOGFONTは保持してます) 一応、スコープを外れても動いてますが…
誰がどこでそのフォントを使うかによるだろうね
本当にフォントが破棄されていたら動かないよ
単に代替フォントが使われるだけじゃないのか?
GDIオブジェクトってなんで参照カウントで管理するようになってないんだろうね?
LOGFONTなんかは逆に保持してても無駄。
LOGFONTはフォントの設計図
808 :
799 :2006/03/16(木) 19:18:30
なんで動いたのか分かりませんが、まあCFontをメンバで持たせました。 レスどうもでした。
逆にCFont(HFONT)はSelectされっぱなしでは削除できないからかと。
VC++、MFCを使い始めて2ヶ月の初心者です。 質問ですが、 キーが押された時にキーイベントをどのプロセスよりも早くキャッチして 選択中のプロセスに、本来とは違った動作させるプログラムを作りたいと思ってます。 たとえば、メモ帳を開き 'A'キーを押すと、'AAA'と入力される。 といった具合です。 キーをフックさせるなどの情報にはたどりついたのですが、 他のプロセスに働きかける方法がわかりません。 開発環境はVC++6.0、XPProです。 どうぞよろしくお願いします。
そういうろくでも無いプログラムを、質問されなきゃ作れない低脳が書かないように。
s/されなきゃ/しなきゃ/
そういうろくでもないレスを、頭に批判しか浮かんでこないひねくれものがしないように。 お願いしますね。
がんばれば、いつかは出来ます。 でも、スレ違いなので二度と来ないでください。 お願いしますね。
>>814 ありがとうございました。
なんか僕のせいで荒れてしまってるようで申し訳ないです。
あと、813は僕じゃないです。
>>811-812 確かにろくでもないですねw
ただまだ知識も少なく、自分の作りたいものしか意欲がわかないので・・。
>>815 ありがとう。やっぱりAPIですか。ごめんなさい。
知識のない人間に沸くような意欲の対象となる作りたいものって一体なんだ?
>>817 今作りたいと思っているものは810に書いたような物です。
>>818 817みたいな奴はいくら構っても知識ペイすることはないからほっとけよw
相談室で質問内容にけちつけるだけの奴って何で居るんだろうな。。
>>810 に至っては特に質問内容がおかしいとも思えないが・・
>>819-821 そこまで言う事でも・・w
>>ALL
おかげさまでできそうです。
詳しく解説しているサイトがいくつもあり自分の検索する力が足りなさ過ぎる事を実感しました。
今度からはもう少し気合いれて調べてみます。
ご迷惑をおかけしました。
「選択中のプロセスに、本来とは違った動作させるプログラムを作りたいと思ってます。 たとえば、Web ブラウザを開きパスワードを入力すると、僕のところに送信される。 といった具合です。」 こう書くとあら不思議、碌でもないプログラムになる。
MFCと何の関係もない
キーフックつーとまず思うのがキーロガーだよなあ
キーロガーつーとまず思うのがフェイスハガーだよなあ
フェイスハガーつーとまず思うのが芳賀書店だよなあ
何この流れ?
830 :
823 :2006/03/17(金) 19:57:02
俺かよ!
831 :
デフォルトの名無しさん :2006/03/17(金) 20:02:38
俺は?
君たちやけに浮かれてるが まさか4連休なんて事はないだろうね?
前と後ろにつけて4連休ってわけはないだろ
今年も365連休〜\(^o^)/
836 :
デフォルトの名無しさん :2006/03/18(土) 10:54:50
VC++ 6.0でフラッシュ(swfファイル)をBMPに変換するアプリを作成しています。 今はActiveXを使ってフラッシュを表示し、デバイスコンテキストをコピーして BMPを作成する方法でつくっています。 静止画のswf限定で構わないので、画面に表示する事無くBMPファイルに 変換する方法がわかる方居ましたら教えてください。 よろしくお願いします。
誤爆?
838 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 18:41:25
TextSS の64bit化おながいします もしくは64bitにネイティブ対応した置換ソフトないですか?
VC6をWinXPで使ってます。 ダイアログにCRichEditCtrlを張り付けて タブオーダーを1にセットしたところ、DoModalで最初に表示されたときに コントロール内のテキストが全て選択状態になってしまいます。 (OnInitDialogの最後でテキストをセット) コントロールのSetWindowTextを使っても、SetSel(-1, -1)のあとに ReplaceSelでテキストセットしても同じ現象を起こします。 テキストをセットした後にSetSel(0,0)などをしても直りませんでした。 とりあえずOnInitDialogで1秒後にコールされるようにタイマーをセットしておき OnTimerでタイマー解除とSetSel(0,0)をしたところなんとか対策は出来ましたが、 他にOnInitDialogの後で選択状態を解除するスマートな方法はどんな方法がありますか?
>>840 OnInitDialog()の段階では未だ表示されてないからねぇ。
タイマー使わなくても初回のOnIdle()で選択解除してもよさそうだけど。
>>841 なるほどOnIdleという手もありますが、今回は
子ダイアログ(書き忘れましたが)なのと、モードレスダイアログ時でも
使えるようにメッセージでも試してみました。
1・子ダイアログのOnInitDialogの最後で親ダイアログにPostMessage
2・親ダイアログのWindowProcでメッセージを受信すると、子ダイアログにSendMessage
3・子ダイアログのWindowProcで応答メッセージを受信して、CRichEditCtrlのSetSel(0,0)実行
という具合です。結果は一応これでも出来ました。でもヘッダにメッセージを#defineするのと
両クラスのWindowProcで応答を書く手間を考えたらOnTimerの方がまだマシかも・・・
ブラウザのお気に入りボタンのように、押すと新しいウィンドウを出して、 動的な分割ウィンドウっぽく表示したいのですがどうすればいいのでしょうか? CSplitterWndだとOnCreateClient()内でしか呼べないようで生成できるタイミングが限られてしまうのですが。
>>843 MFC 動的 分割でぐぐればヒットするがな。
それだとほとんど動的分割にヒットしてしまう
847 :
デフォルトの名無しさん :2006/03/24(金) 11:34:17
ダイアログベースのアプリでSetWindowText()しても、ダイアログのタイトルは直ぐに更新されますが、タスクバーの表示がリアルタイムで更新されません。 なにか、おまじないがあるのでしょうか? OSはXP Pro SP2です。
さあ? 別になんともない
849 :
デフォルトの名無しさん :2006/03/24(金) 15:17:24
オブジェクトAがCString Data[256]を保持 オブジェクトBがオブジェクトAのDataのポインタを保持 こうしてオブジェクトAのDataの内容が変わるとオブジェクトBでもそれが 反映されるというようにしました。 この二つのオブジェクトをSerialize()関数をアップデートして、 シリアル化しファイルに保存しました。 これを読みこんで再び関連付けられた二つのオブジェクトを 再生成するにはどうしたらいいのでしょうか? おそらく再生成されたオブジェクトAのDataのアドレスは オブジェクトBの保持しているアドレスと変わってしまっているとおもうので。 あとポインタの指す先のオブジェクトのSeriarize関数を呼び出すには どうしたらいいのでしょうか? (CArchive)Arc<<(CObject*)pObj; としたら error C2678: 二項演算子 '<<' : 型 'CArchive' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。 のように表示されるのですが。
読み込んだ後に オブジェクトB->Data = オブジェクトA->Data する。
851 :
849 :2006/03/24(金) 16:19:51
ということは オブジェクト保存時に、 どれどれのオブジェクトのどのデータを参照する という意味のポインタ(というかポインタ全般)は意味をなさないんですね。 上記以外で解決方法はありませんか? ポインタ以外で参照先のデータを示す方法とか。
独自形式
853 :
851 :2006/03/24(金) 16:36:50
独自形式っていうのは アプリケーションで全オブジェクトの全データにIDかなんかをつけて それを保持させるようなやり方ですか?
ポインタ保存する意味が理解できない
855 :
デフォルトの名無しさん :2006/03/24(金) 17:35:22
ポインタは意味がないってわかったんで ポインタのようなものを保存したいんです。 オブジェクト間の関連を残したまま、 別々に保存するっていうのを。 無理みたいですけど。
独自形式=そんな仕組みはないから自分でこさえろ だと思うYO
アルゴリズムとか一般的なプログラムの手法を勉強したほうがいいよ
コピーしまくりで遅くなるけどCStringArrayじゃだめなのか?
>>840 タブオーダが1番だからRichEditにフォーカスがきて選択状態になってるとか?
860 :
843 :2006/03/25(土) 13:11:37
>>844 >>845 遅ればせながらありがトン。
ググってもCSplitterWndばっかりで困ってたんです。
どうにも「ドッキング」てやつがやりたいことに近そうです。
キーワードに"ドッキング"をつけたらいい感じにでてきました。
>>849 オブジェクトBにどういう働きをさせようとしてるのかいまいちわからないが・・・
そもそものこの表現が不明
>> オブジェクトAがCString Data[256]を保持
>> オブジェクトBがオブジェクトAのDataのポインタを保持
>>
>> こうしてオブジェクトAのDataの内容が変わるとオブジェクトBでもそれが
>> 反映されるというようにしました。
反映されるというか、単純にポインタ持ってるだけでしょ?
つーことで、 保存時 オブジェクトAの値を保存 読み込み時 オブジェクトAを構築し、オブジェクトBにDataのポインタを渡す オブジェクトBは保存する必要はない
ああ、850で答え書いてるじゃん >> オブジェクト間の関連を残したまま、別々に保存するっていうのを。 君が挙げた例だとそもそも関連を保存する必要もなく、後付で関連づけられるのだが。 例は別としてこういうことがやりたいってこと?
仕様がまともじゃないんだから 考えるだけ無駄
ポインタがおぼろげに見えてきたってんだから 教えようとすると先は長いぞ 本人がガンガレ
もういいです。
皆さん口先だけですね。
そりゃ、金のひとつももらわないとな。口先だけでも赤字だ。
トリノは金ひとつでしたが不満でも?
871 :
デフォルトの名無しさん :2006/03/27(月) 12:38:37
JavaやC++はクラスの使い方が解るぐらいでテンプレートは自信なし。 WindowsプログラミングはWin32でちょこっと。 COMやMFCやSTLは言葉は聞いた事あるけどいまいち理解しておらず。 こんな自分ですがMFCを覚えるのに良い本はありますか?
MFC本買ったこと無い。自然に使えた。 MFCの範囲で作るんなら STLやテンプレート要らんよ。
ダイアログに画像を貼り付けて使っています。 その上にのせるコントロールの背景色を透明にして、コントロールの文字:白、背景:下地の画像としたいため、ダイアログの OnCtlColor() で pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255, 255, 255)); CBrush objBrs; objBrs.CreateStockObject(NULL_BRUSH); return (HBRUSH)objBrs; としています。 スタティックテキストの背景を透明にする事は出来たのですが、ラジオボタンの背景が透明にならず、黒くなってしまいます。 色々調べると「スタイル適用時はラジオボタンの背景を透明には出来ないかも」とあったので、スタイル非適用に変えて確かめるとラジオボタンの背景は透明になっていました。 やっぱりラジオボタンの背景はスタイル適用時は透明にできないのでしょうか?
874 :
873 :2006/03/27(月) 18:03:06
ひとまずラジオボタン全てに SetWindowTheme() をかませて、 ラジオボタンのみビジュアルスタイルを適用しない、という逃げで 対応する事にしました。 お騒がせいたしました。
875 :
840 :2006/03/30(木) 08:22:24
>>859 そういうことなんでしょうが、その選択状態になった直後に解除することが出来なかったのでした。
・・・が、無事解決できますた。RichEditCtrlのOnSelChangeをオーバーライド(もちろん初期化時に
ENM_SELCHANGEフラグを登録)して、そのなかで最初の一度だけ実行するように
静的変数のフラグを用意して、そのフラグが立っているときだけSetSel(0,0)を実行すれば
よかったみたいです。
VC6.0でMFCでダイアログベースで開発をしています。 スクロールバーのついた子ダイアログを描画用に作成したんですけど、 派生クラスを作って機能を追加したいんですが、どのように作成するのが一般的なんでしょうか。
877 :
840 :2006/03/30(木) 20:30:56
度々スマソ。OnSelChange()でもダメポ。 RichEditCtrlを初期化するときに SetOptions(ECOOP_OR, ECO_SAVESEL) を使うのが正解だた。
878 :
デフォルトの名無しさん :2006/03/31(金) 09:29:46
MFC ってこれからどうなっていくんだろう。 これからもメンテナンスされ続けるんだろうか。
api使えれば使える api使えないと使えない
880 :
デフォルトの名無しさん :2006/04/03(月) 07:06:09
メインウィンドウとは別に CFrameWnd派生のウィンドウクラスを作って、 LoadFrame(IDR_xxx, WS_OVERLAPPEDWINDOW, NULL, NULL) として、タスクバーに表示されるモードレスダイアログを実装してみた。 そのダイアログから、 AfxMessageBox(Message, MB_OKCANCEL|MB_DEFBUTTON2|MB_ICONQUESTION, 0); を呼ぶと、メインウィンドウの中央にメッセージボックスが表示されてしまうんだが、 これをダイアログの中央にできないかな?
MessageBox
882 :
876 :2006/04/03(月) 13:42:38
派生元のクラスでクラスウィザードが作成したafx_msgのついた関数の宣言にvirtualをつけたら 派生クラスで関数のオーバーライドができるようになったけど、これって一般的なやり方なんでしょうか? 初心者なんで自分のやり方が合ってるか間違ってるのかわかりません。
派生先でオーバーライドしたいメッセージハンドラを登録するんじゃないの普通は。
884 :
876 :2006/04/04(火) 14:43:45
>>883 クラスウィザードでメッセージハンドラをつけることができませんでした。
派生先のクラスの作成するときに「クラスの新規作成」ダイアログで
クラスの種類に「Genericクラス」を選んでクラスを作成してました。
派生先のクラスの作成の仕方をこう変えてみました。
1.クラスウィザードで基本クラスがCDialogクラスのクラスを作成する。
2.クラスの宣言でClass xxxx : public CDialog ←ここを派生元のクラスに替える
これでクラスの継承っぽいことはできるようになりました。
派生クラスを作るときの一般的なやり方というものを知らないため、変な作り方になったのかも知れません。
SAFEARRAY *p; get_safearray(&p) みたいにLPSAFEARRAYを返すAPIがあるんだけど、そのポインタって そのままCOleSafeArrayに変換できるんでしょうか?
「そのまま変換」はできない。 コンストラクタに渡せるので、要素の型も与えて、 COleSafeArray a(p, VT_UI1) とかする。 作成されるのはコピーなので、元のSAFEARRAYは 破棄すること。 コピーじゃなくそのまま納めて欲しいときには、 COleSafeArray a; VARIANT v; v.parray = p; v.vt = VT_ARRAY | VT_UI1; a.Attach( &v ); とか。
887 :
885 :2006/04/05(水) 14:45:23
>>886 サンクス、Attachでできた。
ASSERT(vt & VT_ARRAY)の意味を逆に取ってた。
VT_SAFEARRAYじゃなくてVT_ARRAYなんだね。
SAFEARRAYの配列の時にVT_ARRAY | VT_SAFEARRAYって感じで使うものなのかな。
888 :
デフォルトの名無しさん :2006/04/07(金) 00:03:13
>>847 以前、タイトルバーに進捗率を表示する(SetWindowTextを連続的に呼ぶ)場合に
XP/2003で同じ現象を確認しました。
いろいろ試したところ、どうもSetWindowTextの呼び出し間隔が短い場合
(〜数10ms)に現象が発生するようです。詳しい原因や回避策(おまじない)に
ついては良く分かりません。
そりゃぁ、タスクバーとしては一アプリの都合なんていちいち構ってられないしな。
889はタスクバーの中の人
APIの質問かもしれませんが、質問させてください。 あるアプリケーションのウィンドウクラスがマシンが違うと Afx:400000:8:10013 Afx:400000:8:10011 というように、(コロンで区切って)4番目の値が変わります。 Afxで始まるのでMFCを使っていると仮定すると、4番目はLoadCursorの 戻り値だと思うのですが、なぜLoadCursorの戻り値がマシンによって変わるのでしょうか。
そういう実装になっているから、としか答えられない。 ついでに言うと、カーソルハンドルはプロセス内で固有値になっていればいいので 同一マシンでもプロセスが違えば違うハンドル値になってもおかしくない。
ダイアログベースのアプリを作りました。 そのダイアログからボタンクリックでモードレスダイアログを発生させ、交互に操作が可能です。 モードレスダイアログの方は、ダイアログを選択する度にダイアログは前に表示されますが、元々のダイアログの方は選択しても画面が前に来ません。 調べてみると、選択したときダイアログを前に表示するにはリソースエディタ上ではなく、リソースコードをいじる必要があるみたいですがそこから行き詰まってしまいました。
なるほど。
ザ・ワールド
春の祭典
ポロリもあるよ
898 :
デフォルトの名無しさん :2006/04/13(木) 19:34:35
おまえら死ね
899 :
デフォルトの名無しさん :2006/04/13(木) 23:53:38
>>893 CreateWindowの第2引数に、this を指定してて、親(Modal)より
前にいけんだけでは?
GetDesktopWindow()を第2引数に指定したらうまく動くと思われ。
モードレスダイアログ2個たてるほうが楽な気がするなぁ
画面分割で上下にわけて、 下っかわをCEditViewでつくってるんだけど CEditViewに文字を表示する事ができないんですが、 CEditViewでthis->SetWindows("あああ"); とやっても表示されないんですが、どうやったらいいでしょうか。。。 どうやって表示すれば。。。
SetWindowText
903 :
901 :2006/04/14(金) 15:28:01
あああ、みすです。 this->SetWindowText("あああ"); でできなかったです><
this->SetWindowText(_T("あああ"));
そのCEditViewは本当に表示されているの? 非表示になってたり、領域外に隠れちゃってるとかはない?
GetEditCtrl
907 :
デフォルトの名無しさん :2006/04/14(金) 17:29:00
質問です。 メンバ変数を参照、代入するときに自動的にget,set関数を 呼び出してアクセスしたいんですけど、 どうやるんでしょうか?
本日は超能力者が出払っております。 日を改めてお越しください。
>>907 C++, MFC にはそのような機能はない。
BCBにはあったような気がする。
>>907 メンバ変数をその変数を管理するクラスに置き換えりゃ良いんじゃないの?
プロパティシートのウイザードモードでラジオの選択肢によって 次へ進むボタン押すと表示されるページを分岐できますか?
>>907 __declspec( property(...) )
非標準だけど。
ここはMFC相談室
ラジオぐらい作れるだろ もちろんラ製とトラ技は読んでるだろうし
ラジオボタンじゃないか
それぐらいできないとウイザードモード使う意味がないな
919 :
デフォルトの名無しさん :2006/04/14(金) 20:35:57
アプリの最大化領域の制限について質問です。 画面いっぱいを使って、自作の2つのアプリを上下で表示させています。 (下に「ソフトキーボード」プログラムを表示させ、その上に「業務アプリ」を表示) 業務アプリ(やその他のアプリ)の最大化実行時に、 ソフトキーボードを除いた領域で最大化させたいのですが どうすればよいでしょうか? 「ソフトキーボード」がグーグルのサイドバー的な立場になればよい ようなきがしますが…
OnWizardNext
ダイアログボックスのeditboxの背景色を変更できません。 教えてください。
マジレスすると、ラジオとラジオボタンは違う。 ラジオのボタンってのもある。
うお
MFCのエディットってプロパティで変更できないですね OnCtlColor使う方法がありましたがうまく変更されないです。
WM_CTLCOLOREDIT WM_CTLCOLORSTATIC
フォント、文字色、背景色、複数行の背景色、 全部やると結構めんどくさいな
入力チェックの時にエラーのあったコントロールの色だけを変えたいのですが その場合はどのタイミングがいいですか?
作る人と使う人の好みの問題
入力チェックしたとき
MFCでアプリを作りました。 リンクする外部ライブラリで、 結果を stdout、stderr に出力するものがあるのですが、 これをアプリで受け取るにはどうすればいいでしょうか? MFCアプリだと、stdout、stderr が閉じられているのか、 NULL参照になります。
コンソールアプリでMFCを使う設定にすればいい
933 :
931 :2006/04/16(日) 16:34:25
>>932 普通の Windows アプリで、ライブラリの出力はコンソールに吐くんじゃなくて
アプリ側で受け取りたいんだけど。
コンパイラみたいなコンソールアプリをWindowsアプリから呼んで使う場合は stdin stdout stderrで受け渡しするわけだけど それと同じだろ
freopen?
>>933 パイプ作って、stderrを置き換える。
938 :
931 :2006/04/17(月) 22:55:41
>>936 stderr を置き換えるところがよくわからんかった。
パイプを作って、SetStdHandle で stderr に設定してみたんだが、
stderr に fprintf してみても、パイプから読み出せなかった。
>>937 別プロセスなら楽なんだが、Windowsアプリが自分の stderr を作って、
それを読み出す方法がわからないんだ。
すでにMFCと関係ないし
>>938 だったら別スレッドでその外部ライブラリとやらを呼び出せばいいだろうに。
941 :
931 :2006/04/19(水) 12:58:59
>>940 Windowsサブシステムのexeファイルなので、
そもそも stdout、stderr がないわけだ。
その、stderr を自分でつくるところではまってるんだが。
別スレッドとかいう問題ではない。
だから、MFCと関係ないでしょって。
>>941 よく調べれば、MSDNに乗っていたはず。
つーか、俺、昔やったことあるし。
_AfxDispatchCmdMsgのなかで (pTarget->*mmf.pfn_COMMAND)(); を呼ぶとON_COMMANDに登録したメンバ関数に飛ぶのはpTargetがメンバ関数のthisになってるから だろうけどこれはC++的に正しいの?それともMFCだけの拡張(実装依存?)なの?
945 :
944 :2006/04/20(木) 13:10:34
すまん、自分で調べたら実装依存だった AfxFindMessageEntryで関数ポインタテーブル(?)から検索するときにインラインアセンブラで書いてあるところまで追っかけれた すまそ
946 :
デフォルトの名無しさん :2006/04/20(木) 22:53:42
画面上に複数(不定)の線を描くために、始点と終点、線の色をまとめた構造体 の配列を作って、描画部分を書いていたのですが、うまくいきませんでした。 // 構造体 typedef struct _LINEPROT{ POINT poFrom; POINT poTo; COLORREF LineColor; } LINEPROT, *LPLINEPROT; // 失敗部分(抜き出し) LINEPROT m_LineList[10]; CPen cpLine, *pPenOld; for(uiCnt = 0; uiCnt < 10; uiCnt++){ // ペンの色を指定 cpLine.CreatePen(PS_SOLID, 1, m_LineList[uiCnt]->LineColor); //ここでASSERT pPenOld = pDC->SelectObject(&cpLine); pDC->MoveTo(m_LineList[uiCnt].poFrom); pDC->LineTo(m_LineList[uiCnt].poTo); pDC->SelectObject(pPenOld); cpLine.DeleteObject(); } 色の変更をもくろんでこういう書き方にしてみたのですが、CreatePen()のところでASSERT。 ループ外でCreatePen()して固定色で書く事は成功しているので、抜き出し範囲外の問題 では無いと思います。 上のようなことをやろうとする場合、どのような書き方が正しいのでしょうか?
わざわざASSERT出して原因教えてくれてるのに なぜか読もうとさえしないんだよな
>947 ヘタレなのと英語読めないのとで、適切な手段思い浮かぶより前に 時間切れになってしまいまして orz
初めてこれを使わなければいけなくなったんですが 皆さんどんな本で・もしくはサイトで?勉強しました? よろしければ分かりやすい本など教えてください。 ド素人なのでスレ違いでしたらすみません。
いや、スレ違いではなく存在自体が間違い。
そこまでですか… すみませんでした。
上のは私です。連投すみません。 出直してきます。
954 :
946 :2006/04/21(金) 14:43:53
>>953 こんなスレあったんですね。
テンプレにMFCのこともありましたしかなり助かりました。
ありがとうございます。
955 :
デフォルトの名無しさん :2006/04/21(金) 17:48:06
SDIでViewにコントロールをクリエイトしたいのですが どこに書けばいいんでしょう? OnDrawだと再描画時にエラーになってしまうんですが。
OnInitialUpdateはどう?
957 :
デフォルトの名無しさん :2006/04/21(金) 18:00:34
ViewにOnInitialUpdateがありませーん。 SDIだから? どうしよ。
無いって…
ろくに勉強もしないでいきなり作ろうとしたって壁にぶち当たるぞ 基礎ぐらいちゃんとやっとけ
960 :
デフォルトの名無しさん :2006/04/22(土) 17:29:46
MFCでVisualStudio2005にあるメニューバーやツールバーなど、 マネージコードで使えるようなコントロールはどうすればできますか? 基本クラスから独自に派生していちいち作らないとだめなのでしょうか?
>>960 無理。
MFC のプロジェクトを /clr:pure でビルドするつもり?
そういうの使いたかったらさっさと引越し引越し
963 :
デフォルトの名無しさん :2006/04/23(日) 15:29:44
MFCでファイルを圧縮するクラスまたはメンバはあるのでしょうか?
964 :
デフォルトの名無しさん :2006/04/23(日) 16:12:42
expressでソリューションのビルドを したんですが、実行ファイルは何処にできてるんでつか あと、フォームのコマンドボタンを押したときの コードはふぉーむのとこにしかかけないんでつか おしえてください。
expressでMFCでフォームなんだ へぇー
967 :
デフォルトの名無しさん :2006/04/23(日) 16:54:15
MFCとATL無しで頑張ります。ありがとうございました。
お前ら冷たいな MFCぐらい買ってやれよ
>>968 お前「ら」?
買ってやれ?
どういう流れそういうレスをつけたのかわからん
MSDNよりわからん
970 :
デフォルトの名無しさん :2006/04/25(火) 12:01:32
ここでいいのかな。質問させてください。 エクスプローラみたいなものを作っています。 縮小版表示アイコンを表示させたいです。 画像のサムネイル表示は出来ましたが、画像以外ファイルのアイコンを エクスプローラで表示されているような、 黒枠の中に小さいアイコンがぽつんとあるアイコンが取れません。 32×32のアイコンを引き伸ばして表示することは現在可能です。 IExtractImage, IExtractIcon, SHGetFileInfoなどつかいましたが同じ状況です。 開発環境はWin2000, VC++6.0です。
なんだろね アイコン持ってないファイルのアイコン表示? MFCとかんけあるかな?
無いよ
973 :
デフォルトの名無しさん :2006/04/25(火) 12:59:42
どこのスレできけばいいでしょうかね?
>974 ありがとうございました。
どういたしまして。
978 :
デフォルトの名無しさん :2006/04/25(火) 23:52:23
libファイルを作成するプロジェクトにリソースファイルを追加して、ダイアログボックスを表示させるメソッドを作成しました。 実行ファイルを作成するプロジェクトのほうで上記のメソッドを実行してもダイアログボックスが表示されないんですけど(DoModal()の戻り値が-1になる)、どうすればよろしいのでしょうか。
リソースってlibに入れられなかったような希ガス
どうしてもリソースを分離したかったらdllにしてLoadResource。
981 :
デフォルトの名無しさん :2006/04/27(木) 02:57:34
VisualStudio2005ではWindowsフォームプロジェクトの デザインでコントロールを移動すると、たて横に線が表示され、 均等な配置ができますが、MFCプロジェクトのダイアログエディタでは 何もでないので調整が難しいです。 これはどうにかならないのでしょうか?
どうにでもなる
どうにでもして
>>981 Win32アプリでリソースファイルをテキスト編集使ったことない?
猫も使ったことない?
なんたら.rcをコピーして.txtに変換して、テキストでメタ数値で編集
そして、.rcに戻して、プロジェクトに吸い込むんだよ
MFCというかVCの基本
>>984 素朴な疑問なんだが、何で又一々変換なんかするんだ?
普通に*.rcを編集すればいいと思うのだが。
> .txtに変換 初耳だ。
VBのようにスナップ・グリッド使うわけでもなし ターゲット(たて横に線)の重なりで調整じゃ コントロールの正確な位置決めできてないな
>>986 .rcを.txtに変換して開いてからレスヨロシク
普通やらないめんどうな方法しか教えないのはわざとですか? それともマジでそうやってる?
990 :
985 :2006/04/27(木) 13:09:17
>>989 少なくとも漏れはグリッドを設定してそれを使って位置調整しているが。
でもコピペした部品の調整やら大量の部品の順序変更は*.rc直接編集だな。
>大量の部品の順序変更 タブオーダという言葉くらい使って欲しい
>>981 ん?6.0 にも 2003 にもあったグリッドが 2005 ではなくなったの?
>>984 ん?6.0 でも 2003 でもテキストファイルだった .rc が 2005 ではバイナリなの?
>>988 やってみたけど、理解不能です
ソリューションエクスプローラーの.rcを右クリックでコードの表示とどう違うの?
994 :
985 :2006/04/27(木) 13:24:05
>>991 んじゃ、大量の部品のタブオーダの変更ってことで。
#数点ならダイアログエディタでやっちゃうよっと。
>ソリューションエクスプローラーの.rcを右クリックでコードの表示 2005にはその機能が追加されてるんですか。6.0には無かった。
ちなみに、6.0でプロジェクトフォルダから右クリックでアプリケーションから開く>メモ帳でやって 変更して保存するやり方だと、 何故か、プロジェクト上の.rcアイコンが.txtのアイコンになってしまう。 だから、コピーして.txtで変更しておいて、.rcに戻して吸い込んだほうがよい
元がfoo.rcならフォーー.txtにでも変えておいて、 それで数値で編集して、foo.rcに戻してやるのがよいと思う。
VC5の頃から(たぶんもっと前から) ファイル-開く からなら、テキストファイルとして開けるわけだが。
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。