vc++2005 MFC Dialogベースで新規アプリを作成し、
最初にあるコントロールを全て削除して、
ダイアログにEditコントロールを作る。
これを、メンバ変数 CEdit m_Edit; として追加。
また、PreTranslateMessageを追加し、以下の処理にする。
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN:
m_EnterKeyCount++; // .hにて定義したint型
(OnInitDialogで=0している)
if(m_EnterKeyCount == 1)
{
// Editの内容をクリアする
m_Edit.SetWindowTextA(_T("));
m_EnterKeyCount = 0;
}
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
この状態でEditボックスに文字を入れていくと、
タスクマネージャで確認するとメモリ使用量が増える一方になっています。
増え続けてしまうのは何故なのでしょうか?
また、解決策として使った分のメモリを開放するには
どうしたらいいのか教えてください。よろしくお願いします。
> タスクマネージャで確認するとメモリ使用量が増える一方になっています。
> 増え続けてしまうのは何故なのでしょうか?
これに「正確に」答えられる人はいないでしょう。
以下は憶測です。
エディットボックスは事実上無限回のUndo機能を持っています。
Undo機能を実現するには行ったことを全て記憶しておかなければ
なりません。このUndoのための情報は、文字の削除でも入力でも
常に増加していきます。従って、操作をすればするほどメモリーを
消費することになります。
> また、解決策として使った分のメモリを開放するには
> どうしたらいいのか教えてください。よろしくお願いします。
自分が確保したのでないメモリーを解放してはいけません。
つまり、ご指摘の現象に如何なる対策もしてはいけません。
(する方法もありません)
間違い修正。
「標準」エディットボックスのUndoは1回ですね。
リッチと間違えました。
>m_EnterKeyCount++;
せっかく m_EnterKeyCount++;しているなら
ココカラ-------------------------
if(m_EnterKeyCount == 1)
{
// Editの内容をクリアする
m_Edit.SetWindowTextA(_T("));
m_EnterKeyCount = 0;
}
ココマデ----------------------------
の処理をタイマ-ルーチンに入れたほうがいいと思います。
PreTranslateMessage(MSG* pMsg)
等のルーチンではあまり処理をしないほうがいいです。
> if(m_EnterKeyCount == 1)
if(m_EnterKeyCount > 0)
のほうがいいですね。