[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 09/12 19:35 / Filesize : 114 KB / Number-of Response : 423
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

■MFC相談室 mfc18d.dll■



1 名前:デフォルトの名無しさん [2007/08/01(水) 06:23:28 ]
Microsoft Foundation Classライブラリ専用スレです。

83 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 12:42:25 ]
>>82
CButton::Create

84 名前:82 mailto:sage [2007/09/03(月) 13:39:19 ]
>>83
ありがとうございます。

85 名前:デフォルトの名無しさん [2007/09/03(月) 20:50:30 ]
MFCって関数ポインタテーブルを使いたい「だけ」のためにC++使ってるんだろ?
C with class でしかないじゃん、C++と言うより

86 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:58:27 ]
>>85
"C with class"であることの何が悪いのか知らんけど、クラス継承もあるし、オペレータオーバロードもある。
新しいMFCならテンプレートも使っているね。

87 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:46:56 ]
ダイアログ上にタブコントロールを配置してます。
ダイアログの表面色を塗りつぶしてるんですけど、
タブコントロールのタブが並んでいる部分の横の余った空間や、
タブコントロールの周囲の微小な背景がグレーのままです。
ここを塗るにはどうしたらいいんでしょうか。
塗るでもいいし、背景を透過にできればいいんですけど。


88 名前:デフォルトの名無しさん [2007/09/03(月) 23:53:19 ]
rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200704/07040003.txt
場所は↑この方が説明してるのと同じです。


89 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:26:42 ]
CHtmlViewでURLのドロップを受け取れるようにするにはどうすればいいの?
SetRegisterAsDropTarget(TRUE)をしてもダメだった

90 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:03:19 ]
中味はIEだし、特に何もしなくてもできるだろ

91 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:12:42 ]
ちょっと興味あったんで試したけどデフォルトじゃ無理みたい。
WM_DROPFILESのイベントハンドラ追加のみで出来ました。
ショートカットだけじゃなく、htmlファイルやtxtファイルも表示可。



92 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:36:09 ]
ウイザードでCHtmlViewにして、あとは何もいじらない状態でできたよ

93 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:33:26 ]
>>90,92
通常のCHtmlViewではドロップできませんでした
MFCのバージョンが関係あるかもしれないでしょうか?
自分はVisual Studio 2005 Standard Edition SP1を使ってます(WinXP&IE6)

>>91
OnCreateでDragAcceptFiles()してWM_DROPFILESを追加したら、
ローカルのファイルはドロップできるのですが
IEからのURLのドラッグ&ドロップはできませんでした・・・
IEからのURLのドロップをしたいのです

94 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 09:49:06 ]
CDC::DrawDragRect()の説明には、座標は「論理座標」と書かれてるのに、
指定した位置にちゃんと描かれず、ネットで使用例を漁ってみたところ、

dc.LPtoDP(&rect);
dc.DrawDragRect(rect, Last_draw_size, NULL, CSize(0, 0));

という記述がありました。
これに倣ってLPtoDP()してみたらちゃんと描かれたんですけど、
LPtoDP()するということはデバイス座標ですよね?
MSDNの「論理座標」というのはどういう意図なんでしょうか?

CDC::Rectangle()のほうにも論理座標と書かれていて、
こっちはLPtoDP()は必要無いんですけど。

95 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:55:19 ]
>>94
MSDNの説明が間違っているな、これ。英語版でも駄目だな。
VS2005のCDC::DrawDragRectのコードだと、
矩形描画の範囲を指定するのにSelectClipRgnを使っているが、
この関数はデバイス単位での指定を仮定しているにも関わらず、
単位変換無しでそのまま渡している。

96 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:49:14 ]
mfc(VC++ 2005)で開発をしているのですが、
ステータスバーをスレッド中から参照しようとすると、
Assertion Failedで怒られてしまいます。
ダイアログに変数で CStatusBar m_statubar を追加して
OnInitDialog でCreate、ペインの初期化を行い
ダイアログのコンストラクタで外部変数で定義した CStatusBar *m_sb に
m_sb = &m_statusBar でアドレスを渡してスレッドで参照しているのですが
どこがいけないのでしょうか?

97 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:55:33 ]
>>95
解析情報ありがとうございます。
やっぱりCDC::DrawDragRect()ってデバイス単位で渡すのですよね。
昔からある関数なのにドキュメント修正すらされてないのか…。

98 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:59:24 ]
たまたま指摘が無かったんじゃね?
ちゃんとMSに言えば多分直してくれるよ。

99 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 00:11:21 ]
>>96
メインスレッド以外からコントロールを操作してはいけないからと思われ。

100 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 00:13:46 ]
>>99
msdn2.microsoft.com/ja-jp/library/h14y172e(VS.80).aspx

101 名前:100 mailto:sage [2007/09/06(木) 00:14:51 ]
アンカー間違えた、ごめん。
99じゃなくて96宛です。



102 名前:96 mailto:sage [2007/09/06(木) 00:47:54 ]
>>99 >>100
スレッドから参照できないんですね。
ということで、タイマーで監視することにしました。
ありがとうございました。

103 名前:デフォルトの名無しさん [2007/09/06(木) 01:28:16 ]
>>102
作り方によってはタイマー監視でもいいけど、同期オブジェクト使った方がいいかも
スレッドプログラミングをタイマーで監視するプログラムは安易でいいけど嵌ることもあるから

104 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 01:32:44 ]
あ、スマン96のようなステータスバー監視だったら
タイマーで良いや

105 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 07:34:25 ]
>スレッドプログラミングをタイマーで監視するプログラム
何を監視するんだか。

106 名前:デフォルトの名無しさん [2007/09/06(木) 08:20:53 ]
>>94
さぁ、ドキュメントのフィードバックをしよう

107 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:14:58 ]
VC++ 2005, OSはXPProを用いているものです。
DLLを作成し、そこからAfxBeginThreadでスレッドを複数立ち上げているのですが、
メモリリークが起こってしまいます。 同様のコードをDLL経由でなく、EXEから直接動かすとリークしません。
恐らく、何らかの初期化処理が足りてないためと思っているのですが、心当たりのある方がいらっしゃいましたら、教えてください。

//--- 以下ソース
#pragma once
#include "TestThread.h"

class CThreadManager
{
public:
CThreadManager() {
m_pThreads = NULL;
}
virtual ~CThreadManager() {
delete [] m_pThreads;
}
void Run() {
if (m_pThreads == NULL) {m_pThreads = new CTestThread[50];}
for (int i = 0; i < 50; i ++) {
if (m_pThreads[i].IsEnable()) {
m_pThreads[i].SetEnable(FALSE);
m_pThreads[i].Run();
return;
}
}
}
private:
CTestThread* m_pThreads;
};


108 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:15:43 ]
//続き
#pragma once

class CTestThread
{
public:
CTestThread()
{
m_pThread = NULL;
m_bEnable = TRUE;
}
virtual ~CTestThread(void)
{
EndThread();
}
void Run()
{
EndThread();
m_pThread = ::AfxBeginThread(TestProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (m_pThread != NULL)
{
m_pThread->m_bAutoDelete = FALSE;
m_pThread->ResumeThread();
}
}


109 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:16:15 ]
//続き
BOOL IsEnable() {return m_bEnable;}
void SetEnable(BOOL bEnable) {m_bEnable = bEnable;}
private:
void EndThread()
{
if (m_pThread != NULL)
{
m_bEnable = -1;
::WaitForSingleObject(m_pThread->m_hThread, INFINITE);
delete m_pThread;
m_pThread = NULL;
}
}
static UINT TestProc(LPVOID pParam)
{
for (int i = 0; (i < 50) && (((CTestThread*)pParam)->m_bEnable == FALSE); i ++) ::Sleep(5);
((CTestThread*)pParam)->m_bEnable = TRUE;
return 0;
}
CWinThread* m_pThread;
BOOL m_bEnable;
};


110 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:16:58 ]
以上です。
108,109は一つのファイルを分割しています。
それと、掲示板に登校するサイズを減らすためにヘッダファイルのみで書いてみました……


よろしくお願いします。

111 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:44:11 ]
>>107に追加です。
CThreadManager::Run(); 関数をタイマーで何回も呼ぶと、どんどんメモリが消費されていくという現象です。
確認は[管理ツール]→[パフォーマンス]から行い、一日ほど回し続けました。



112 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 00:28:50 ]

初心者です、質問させてください。

OnFileNewなどMFCが用意してくれた関数の中身(=ソースコード)って

見る事ができないのでしょうか?

もしできるのなら、その方法を教えてください。

よろしくお願いします。


113 名前:デフォルトの名無しさん [2007/09/09(日) 00:55:01 ]
初心者を自称する人がMFCのソースコードが読めるとでも?

114 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:54:18 ]
>>107
もっと簡素化したソースで検証したほうがいいんでねえの?
あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、
メモリリークが発生しているかどうかをどのように見極めているとか、
メモリリークは、1スレッドあたりどの程度発生しているとか、記載すべきことがあるんでねえの?

>>112
どのクラスのOnFileNewだかしらねーけど、MFCのソースはインストールされてんの?
されてんなら検索すればいいだろう。 されてねーならインストールすればいいだろう。

115 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:56:48 ]
検証方法は>>111に書いてるつもりなんじゃね?

116 名前:112 mailto:sage [2007/09/09(日) 02:15:39 ]
>>114

「OnFileNew」をキーワードに、下記フォルダを検索したら探せました。

ありがとうございました!!


C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc

117 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:24:10 ]
WIN32開発、java、C#とやってきて
最近MFCを始めました。
MFCってすごく難しく感じます。
実際どうなんですか?

118 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:25:59 ]
>>117
あなたにとって難しい。それだけのことです。

119 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:16:30 ]
>>117
平然と並列でないものを並べられると、頭がグラグラする。

漢文、英語、中国語とやってきて、
最近2ch語を始めました。
2ch語って凄く難しく感じます。

とかそんな感じか?

120 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:24:08 ]
とりあえず、107のソース使って、dllとexeから実行してみたけど
リーク検出できなかったな
1日実行してみて、どれくらいリークしてるの?

121 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:17:53 ]
>>117
win32の経験があるのなら、mfcはそんなに難しくないと思うが。



122 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:15:43 ]
フレームワーク「郷に入っては郷に従え」
の考え方ができればいける。

123 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:48:24 ]
>>114
もっと簡素化したソースについては今から作る事にします。
>あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、
何らかの初期化処理というのは、単にスレッドを起こす前に、おまじない的なものが必要なのかと思って書いただけです。
また、DLLMain関数はMFC側で作っているものを使っているので、こちらの初期化処理については不明です。

>メモリリークが発生しているかどうかをどのように見極めているとか、
管理ツールからパフォーマンスモニタを開きまして、そこでプロセスを選択して、15秒おきにワーキングセットを監視しています。
直接のメモリリークではないと思いますが、exeとの比較により、ワーキングセットの増え方があまりに異常なので問題かと……

>メモリリークは、1スレッドあたりどの程度発生しているとか
1スレッドあたりのリークは調べていませんが、15秒おきのワーキングセット増加値は平均で23kBほどです。
これは、CThreadManager::Run();をタイマーで、90msごとに動かした結果です。

一日動かしたときは、これよりも間隔をあけて1000msでやりました。割合は減りますが、同じようにリークします。
なお、1000msで一日動かしたときの、一日のリーク量は1MBほどです。


>>120
1000ms間隔で1MB程度です。

ちなみに、事情がありまして、DLLエクスポートの部分は少々特殊かなぁ……と。
そこのソースも書いてみます。

124 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:49:25 ]
// エクスポート部分のソース。
__declspec(dllexport) void CreateThreadManager(DWORD** ppObject)
{
*ppObject = (DWORD*)(new CThreadManager());
}
__declspec(dllexport) void RunThread(DWORD* pObject)
{
((CThreadManager*)pObject)->Run();
}
__declspec(dllexport) void DeleteThreadManager(DWORD* pObject)
{
delete (CThreadManager*)pObject;
}

//アプリ側の使用部分
#include "stdafx.h"
#include "ThreadTest.h"
#include "ThreadTestDlg.h"
#include "ThreadDll.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CThreadTestDlg::CThreadTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CThreadTestDlg::IDD, pParent)
{
m_pManager = NULL;
m_nTimerEvent = 0;
}
// 続く


125 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:50:08 ]
//続き
BEGIN_MESSAGE_MAP(CThreadTestDlg, CDialog)
ON_WM_TIMER()
ON_WM_DESTROY()
END_MESSAGE_MAP()

BOOL CThreadTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
::CreateThreadManager(&m_pManager);
m_nTimerEvent = SetTimer(1, 89, NULL);
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
void CThreadTestDlg::OnTimer(UINT_PTR nIDEvent)
{
if (m_pManager)
{
RunThread(m_pManager);
}
CDialog::OnTimer(nIDEvent);
}
void CThreadTestDlg::OnDestroy()
{
CDialog::OnDestroy();
if (m_nTimerEvent != 0)
{
KillTimer(m_nTimerEvent);
}
DeleteThreadManager(m_pManager);
}


126 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:51:26 ]
てな具合で、動かしています。正直な話タイマー間隔をこのぐらい短く設定すると一日は多分動きません。
もうちょっと空けてやらないと、マシンスペックの弱いPCだと落ちてしまうのではないかと……

127 名前:デフォルトの名無しさん [2007/09/09(日) 13:59:38 ]
>>122
そうですか?
BCBやVC#と比べると何をどうしていいのかまったく分からん

128 名前:デフォルトの名無しさん [2007/09/09(日) 14:11:26 ]
>>127
>何をどうしていいのかまったく分からん

たとえば、何をどうしたいのかな?
よほど難解なことをしようとしてるのか。それともごく標準的なGUIツールも作れないのか。

129 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:18:07 ]
>>127
ぶっちゃけ、すぐ上のサンプルコードは動かせる?

130 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:10:07 ]
>>126
とりあえず、そのもたないと思われる状態で一日動かしてみるべき

131 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 10:16:49 ]
CObjectから派生させていないデータクラスでも
Serializeでないファイル読み書きに
CArchiveを使ってしまってよいものでしょうか?

virtual void LoadData(CArchive& ar);
virtual void SaveData(CArchive& ar) const;
こんな感じのメンバ関数を用意しようかと思っているんですけど。

それとも、CFile*を引数にしてしまうべきですか?



132 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:42:47 ]
>>131
シリアル化にIMPLEMENT_SERIALを使わないなら、
CObject派生の意味は殆ど無いし、良いんじゃないかな。
結局は単純なバイト列の読み書きなのだし。

133 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 09:47:20 ]
>>132
ありがとうございます。
自作データクラス群は大元の親クラスが純粋仮想クラスで、
また、自分自身がCObjectから派生することに慣れていないため、
この形のままCArchiveだけ使えないかなと思いました。

このデータクラス群の一つが内部でCArrayのメンバを持っているのですが、
これを保存するためにCArray::Serializeを呼ぼうとすると、
SaveDataはconstにはできないですね…。

まぁconstを取り外してしまえば、とりあえず動きそうですが、
SaveDataの中でMFCクラスメンバのSerializeをコールというのが
かなりまずい構造なのかなぁ。

134 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 10:05:42 ]
>>133
MFC - 概念 - シリアル化 - シリアル化 : オブジェクトのシリアル化
- アーカイブを通じた CObject の格納と読み込み

135 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:03:21 ]
質問です
CDialogの派生クラスを作成して、そのダイアログに
CButtonやCStaticなどのコントロールを貼り付けています
そのコントロールの上に色々描画したいんですが
やり方が解りません。どうすればいいでしょうか?

OnPaintを作ってその中で
CPaintDC dc(this);
dc.MoveTo(*,*);
dc.LintTo(**,**);
としてみましたが、コントロールの上でなく背後に描画されてしまいます

136 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:57:38 ]
>>135
ダイアログを派生させるまで分かって、
コントロールを派生させることに思いつかなかったってことでいいの?

137 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:53:45 ]
>>136
CStaticを派生させてそのOnPaintを処理したら
キャプションが表示されなくなりました。

やりたいことはCStaticのコントロールがあれば、そのコントロールに
縁取りして線を描いたり、コントロールの上にビットマップを表示したり
したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。

イメージとしてはダイアログを表示してそれをビットマップで保存し、
その上に落書きする、みたいな。

138 名前:デフォルトの名無しさん [2007/09/14(金) 12:06:25 ]
DLLの関数をコールした時に、よく解らない現象が起きます。

char Buff[1000];
int nRet = ((PT_FUNC)*m_fpFunc)( Buff, sizeof(Buff) );

1行目でBuff領域を確保した後、
2行目のDLLをコールするとBuffのアドレス値が変化してしまいます。
しかもthis変数の値も変化してしまい、エリアの破壊が起きている感じです。
DLL側(自作)では無処理のreturn としています。

2行目のBuff宣言を static char Buff[1000] とすると正常に動作します。
DLL関数には 静的なバッファしか渡せないという事なんでしょうか?
教えて下さい

139 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 12:26:52 ]
>>138
m_fpFuncの中身をさらせ

140 名前:138 mailto:sage [2007/09/14(金) 12:38:29 ]
>>139
FARPROC  m_fpFunc;
です。ここが違うのでしょうか?

141 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 12:53:40 ]
>>140

FARPROCやめて実体と同じ型で宣言してみ
引数と戻値が呼び出しと実体で違っててスタックを壊してるだけだと思うぞ



142 名前:138 mailto:sage [2007/09/14(金) 13:30:42 ]
>>141
指摘の通りでした。
ありがとうございました。


143 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 17:31:24 ]
>>137
> やりたいことはCStaticのコントロールがあれば、そのコントロールに
> 縁取りして線を描いたり、コントロールの上にビットマップを表示したり
> したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。

CStaticのOnEranseBkGroundって作れるっけ? 作れるんなら、そこで処理してみたら?
作れないなら、無理っぽい。

144 名前:143 mailto:sage [2007/09/15(土) 17:34:21 ]
×OnEranseBkGround
○OnEraseBkgnd

145 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 19:40:30 ]
>>143
結局CStaticから派生してOnPaintの中で
DrawTextとかFrameRectとかを使用するようにしました

今OnEraseBkgndでFrameRectを使ってみましたが、
これでも出来そうな気がします
しかし、テキストの描画時にFrameRectで描いた枠が消されて
しまうようで他にも幾つかいじらなければいけないっぽいですね

一応解決です、皆さんアリガト

146 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 14:26:04 ]

CHtmlView::Navigate2のエラー検知を行いたいのですが、
どうすれば良いのでしょうか?
どなたか教えてください。





147 名前:デフォルトの名無しさん [2007/09/16(日) 14:49:26 ]
自作DLLでダイアログを表示しようとしています。
m_pcDebugDlg->Create(IDD_TEST);
を実行すると、
ERROR: Cannot find dialog template with IDD 0x36B1.
というエラーが発生します。

何かの設定が足りないのでしょうか?
よろしくお願いします。

148 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:25:03 ]
そこに書いてある通りじゃないの?

149 名前:147 mailto:sage [2007/09/16(日) 17:25:10 ]
>>148
IDD_TEST は resource.h に定義されていました。

プロジェクト/プロパティ/MFCの使用を「共有DLLでMFCを使用する」から
「スタティックライブラリでMFCを使用」に変更したら、ダイアログが表示される様になりました。
ただし、客先からは「共有MFC」でと指示があります。
何が悪いのでしょうか?

150 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 17:33:08 ]
リソースをビルドしなおしても同じ?

151 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 17:44:40 ]
>IDD_TEST は resource.h に定義されていました。

.rc ではどうなってますか
まあ>>150でおkだと思うけど



152 名前:147 mailto:sage [2007/09/16(日) 18:02:30 ]
..rc には
IDD_TEST DIALOGEX 0, 0, 250, 170
という記述がありました。

リソースをビルドという方法がよくわからなかったのですが、
 ソリューションのリビルド 
. rcファイルのコンパイル
の両方とも、現象は変わりませんでした。
リソースのビルドって、他のやり方でしょうか?


153 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:10:28 ]
つ AFX_MANAGE_STATE

154 名前:147 mailto:sage [2007/09/16(日) 18:43:56 ]
>>153
DLL関数の先頭に
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
を追加したらうまくいきました。

どうもありがとうございました。

155 名前:デフォルトの名無しさん [2007/09/19(水) 17:46:56 ]
ダイアログの上でエンターキーを押すと、
プログラムが正常終了してしまいます。
プログラムを終了させたくないのですが、どうすればいいのか教えて下さい。
よろしくお願いします

156 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:47:04 ]
>>155
つ[OnOK()]

157 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:23:59 ]
いや俺は PreTranslateMessageで処理するほうが好きだ

158 名前:155 mailto:sage [2007/09/19(水) 20:06:07 ]
>>156,157
ありがとうございました
OnOK()で対応しました

159 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:57:01 ]
OnOK()で対応するというのは間違っていると思う。
OnOK()の意味をちゃんと考えるべき。
そして「Enterキーを押したときにダイアログを終了させない」という仕様の意味をちゃんと考えるべき。
するとどうやって実現するのが正しい形かわかるでしょ。
面倒でも、何事も正しい形ってものを常に意識して作っておかないと後悔するよ。大袈裟だがw

160 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:19:33 ]
MFCが勝手に定義してる機能を殺すだけだろ
元のダイアログにはそんな機能ない

161 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:50:34 ]
リターンキーが押される→OnOK()が呼び出される→OnOK()の処理をキャンセルする
よりは
リターンキーが押される→OnOK()を呼ばないようにする
の方がスマート。
よってPreTranslateMessageを推奨するよ。
他の用途にも使えるし覚えといて損はない。



162 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 23:14:48 ]
そこまで気にするんなら
メッセージ発生するごとにPreTranslateMessage呼ばれるのも気にした方がいいよ
OnOKよりはるかにオーバヘッドになってるはず

163 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 12:46:43 ]
Okボタンが在る場合、
Okボタンがデフォルトボタン形状なのはUI的にまずい。

164 名前:デフォルトの名無しさん [2007/09/20(木) 17:56:11 ]
フォトショップ等、メインウィンドウの他に、
レイヤー情報などを表示するウィンドウがあるんですが、
それをCDialogで作ろうと思っているんです

m_dlg.Create( CTestDialog::IDD , this );
m_dlg.ShowWindow( SW_SHOW );

で、一応表示されるんですが、
ダイアログにフォーカスが写ると、
メインウィンドウのタイトルバーが灰色になるのです。

正しい、子ウィンドウの作り方ってありますか?


165 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:38:14 ]
正しいかどうか知らんけどツールウィンドウ

166 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 12:26:58 ]
Enterキーは、OKボタンを押すのではなく、デフォルトボタンを押す操作です。
PreTranslateMessageでEnterキーを弾いてしまうと、
OKボタン以外のボタン上でEnterキーを押したときにも無視されてしまいます
(そのときにはそのボタンが押されるべき)。

もちろん、PreTranslateMessageでフォーカス位置を調べてもいいけど、
そこまで面倒なことをするのなら、
OKボタンをDisable・非表示にしたほうが早いです。

OKボタン自体は残しておきたいのであれば、
なにもしない非表示ボタンをデフォルトにすればよいです。

PreTranslateMessageの方法だと、デフォルトボタン枠が出ているのに
Enterキーが効かないというGUI上の矛盾もあります。

167 名前:392 mailto:sage [2007/09/21(金) 21:55:41 ]
> OKボタン自体は残しておきたいのであれば、
> なにもしない非表示ボタンをデフォルトにすればよいです。
デフォルトボタンは何ですか、と問われたときに、ありませんと答える方が良いかと。

168 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:03:04 ]
今、以下の方法で自作ボタンを作ろうとしています。
・CStaticを派生させる。SS_BITMAPとSS_NOTIFYを設定する。
・OnMouseMoveでカーソルが乗ったらSetCaptureなどして降りるまでハイライト用のビットマップをSetBitmapする。
・カーソルが降りたらReleaseCaptuerして通常のボタン用ビットマップをSetBitmapする。
・OnLButtonUpで親ウインド(CDialog)にWM_COMMAND,BN_CLICKEDをPostMessageする。下記ソース参照。あと押された時のビットマップをセットする。
CMyButton::OnLButtonUp
{
 WPARAM w = MAKEWPARAM(id,BN_CLICKED);
 ::PostMessage(hParent,WM_COMMAND,w,0);
 ごにょごにょ
}

すると確かにLボタンを押下すると親のダイアログに通知されます。
しかしながら親ダイアログではON_BN_CLICKEDマクロで登録したハンドラが2回呼ばれます。
一回目は不明。2回目は私の作ったCMyButton::OnLButtonUpから。

誰が一回目のBN_CLICKEDを送るの?CStaticの規定クラス??

169 名前:392 mailto:sage [2007/09/22(土) 22:02:59 ]
winuser.h
#define STN_CLICKED 0
#define BN_CLICKED 0

170 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:19:04 ]
>>169
ありがとうございます。

171 名前:デフォルトの名無しさん [2007/09/22(土) 23:31:42 ]
本当にMFCが全くわかりません。
とにかく、GUIを作るのが難しすぎに感じます。

VC#なんて超簡単にGUI作れるのに・・・

まだまだ、VC+++MFCはデファクトスタンダードなんですかね?



172 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:33:02 ]
>>171
MFCは欠陥製品だと思う

対抗するボーランドがコケちゃったんでMSの一人天下になっていますが
これに付き合わされる開発者はたまらない

C#を使いましょう


173 名前:デフォルトの名無しさん [2007/09/23(日) 00:42:51 ]
慣れの問題ですよ
VC#が簡単に、作れるって言っても例えばテキストエディタを作る場合
商用を考えたら標準のTextBoxなんて使い物になりません。
一から書くことになります。

だったら、WIN32APIを手間なく呼べるVC++に利がある。
VC#だと使う、WIN32APIをいちいち宣言しなくてはいけない。

174 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:58:19 ]
MFC使わねばならん環境なら、頑張って使えるようになればいいだけだし、
使わなくて言い環境なら、C#でやればいいだろう。
何故このスレで愚痴るのか理解できない。

175 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 23:52:49 ]
>>174
MFCの習得に挫折した人がMFC叩きしてるだけ。
穏やかになだめてあげてください。

176 名前:デフォルトの名無しさん [2007/09/24(月) 00:10:51 ]
確かに他のライブラリと比較すると挫折率はダントツに高いかもしれん
よく、Cはポインタで躓いたなんて人いるけど似たようなもん

177 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 01:45:06 ]
ていうかあまりの複雑さと面倒臭さに死にたくなるときあるな
なんでもかんでもメッセージって逆に面倒臭いだけだったんじゃないだろうか・・・

178 名前:デフォルトの名無しさん [2007/09/24(月) 02:17:59 ]
けど、大抵の商用ソフトはMFCが使われている。
.NETなんて皆無では???

179 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 02:47:39 ]
>>178
だって糞おせぇし

180 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 02:54:45 ]
Vistaならネイティブとほとんど変わらんが?

181 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:10:20 ]
>>180
それって普通に作ってた奴の方が遅くなったんでしょ?w



182 名前:デフォルトの名無しさん [2007/09/24(月) 05:07:52 ]
MFCは隠蔽化というより隠蔽工作だというようなことがかかれた本があった。
本来仕組みなど知らなくても簡単に使用できるのが隠蔽化だが
MFCには仕組みを知らなければバグの原因がまったく理解できない不可解な現象も多い。
それらを苦労して乗り越えて来た人間は威張り腐りって、
「MFCが糞なんじゃなくて理解できないやつが糞」と言いたいのだろう。気持ちはわかる。
だが世間一般ではそういう場合ライブラリが糞だという。
自分の腕前を自慢したいからって言葉を捻じ曲げてはいけない。



183 名前:デフォルトの名無しさん [2007/09/24(月) 05:31:44 ]
あの当時に書かれたライブラリで今まで通用したものってほかに何かあるかな?
OLEを隠蔽するフレームワークとして十分納得いくし、フル機能のウインドウズ
ソフトウエアを書くのにほかにいいライブラリが無かったのも事実だと思う。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<114KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef