mfc-ml

2000年01月

31

[mfc 21849] Re: SDK のプロジェクトを MFCを使用可能なプロジェクトにするには?

自己レス&追加の質問です・・・
長文ですゴメンナサイ。

すみません、その後色々試しましたら
StdAfx.h(内容は#include <afxwin.h>などを含む)を
インクルードすることでエラーは発生しなくなりました。
ところが、今度はMFCがうまく動作しません。
例えば CDialog などを使用しようとすると
DoModal()したとき、異常な処理でハネられます。
MFCのコードを読んだりして、いろいろやったのですが、もうお手上げです。
CWinAppの派生オブジェクトがないからダメなのか、
ウィンドウとCWndを関連付ける(?)必要があるのかか、
色々思い当たるような感じはするのですが、実験するには変更することが
多過ぎて・・・。
このまま少し変更すれば使えるようになるのか、それとも
SDKっぽいコードでCDialogを使おうというのがそもそも間違いなのか
何かご存知の方、アドバイスをお願いします。

以下が関係あると思われる現在のコードの抜粋です、

/* WinMain */
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
   { if(!AfxWinInit(hInstance,NULL,lpCmdLine,nCmdShow))return FALSE;
     if(!InitializeWindow(hInstance,nCmdShow))return FALSE;
     MSG msg;
     while(TRUE)
          { if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
              { if(!GetMessage(&msg,NULL,0,0))return msg.wParam;
                TranslateMessage(&msg);
                DispatchMessage(&msg);
              }
            else
              { WaitMessage();
              } 
          }
   }

/* InitializeWindow */
static BOOL InitializeWindow(HINSTANCE hInstance,int nCmdShow)
    { WNDCLASS wc;
      wc.style=CS_DBLCLKS;
        ~~~wcのメンバ設定(省略)~~~
      if(!AfxRegisterClass(&wc))return FALSE;
      Apprication.hWnd=CreateWindowEx(WS_EX_APPWINDOW,"test","test",・・・・);
      //↑の"Apprication"はhWndなどを保持するグローバルな構造体です
      UpdateWindow(Apprication.hWnd);
      SetFocus(Apprication.hWnd);
      return TRUE;
    }

/* WindowProc() */
static long FAR PASCAL WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    { switch(message)
            { case WM_COMMAND:
                   switch(LOWORD(wParam))
                         { case IDM_SHOWDIALOG:
                                CTestDialog Dialog;
                                Dialog.DoModal();
                                break;
                         }
                   break;
              //他は省略
            }
       return DefWindowProc(hWnd,message,wParam,lParam);
    }

/* CTestDialogの宣言 */
class CTestDialog:public CDialog
    { public:
        CTestDialog(CWnd *parent=NULL);
        virtual BOOL OnInitDialog(void);
    };

/* CTestDialog()コンストラクタ */
CTestDialog::CTestDialog(CWnd *parent):CDialog(IDD_TESTDIALOG,parent)
    {
    }

/* OnInitDialog() */
BOOL CTestDialog::OnInitDialog(void)
    { if(!CDialog::OnInitDialog())
        { return FALSE;
        }
      return TRUE;
    }

以上です。
どこか、MFCに関する設定が抜けていたり、その他致命的に間違っている箇所など
ありましたら教えてください。
どうかよろしくお願いします。

############################################
---------------- Narac ---------------------
Mail: n...@ma.neweb.ne.jp
HP: http://www1.neweb.ne.jp/wa/abysscraft/
############################################
31

[mfc 21848] Re: DDVについて

しげです。

DDXやDDVに関しては、
「新Visual C++ 5.0入門(シニア編)」林晴比古 著 [ソフトバンク]
がわかりやすかった記憶があります。(VC++ 6.0も出版されているかも)

ここのChapter 5 に書いてあります。
ちなみに、DDXに関して、同書のChapter 14に少し触れているので、
参考にされてみてはどうでしょう?
31

[mfc 21847] Re: DDV について

> 松本様

> 小野木です。

> In21844
> >DDV_MinMaxInt(pDX, m_nXXXX, 1, 4);
> >
> > void CxxxDlg::OnDestroy()
> > {
> >  CString str;
> >  ((CEdit*)GetDlgItem(IDC_EDIT2))->GetWindowText(str);
> >  m_nXXXX = atoi(str);
> > }
> > CxxxDlgのIDC_EDIT2に「10」を入力して
> > ウィンドゥを閉じても判定してくれません。

> それは、コントロール上のメモリと、CxxxDlg::m_nXXX が使うメモリ
> が別なためです。DoDataExchangeを直接呼ぶのではなく、
> UpdateData() を実行すると、コントロール→CxxxDlg へ値がコピー
> されて、その際に判定されます。
> CxxxDlg → コントロールは UpdateData(FALSE) です。

> > 例えば、ボタンクリックで判定するようにするには
> ボタンのハンドラ内で
> CxxxDlg::OnButton1()
> {
>   UpdateData();
> }
> でOKです。

> ---------------------------------
> 小野木一樹 o...@z2.zzz.or.jp
>  http://www.aaa-int.or.jp/onogin
> ---------------------------------
31

[mfc 21846] Re: DDV について

松本様

小野木です。

In21844
>DDV_MinMaxInt(pDX, m_nXXXX, 1, 4);
>
> void CxxxDlg::OnDestroy()
> {
>  CString str;
>  ((CEdit*)GetDlgItem(IDC_EDIT2))->GetWindowText(str);
>  m_nXXXX = atoi(str);
> }
> CxxxDlgのIDC_EDIT2に「10」を入力して
> ウィンドゥを閉じても判定してくれません。

それは、コントロール上のメモリと、CxxxDlg::m_nXXX が使うメモリ
が別なためです。DoDataExchangeを直接呼ぶのではなく、
UpdateData() を実行すると、コントロール→CxxxDlg へ値がコピー
されて、その際に判定されます。
CxxxDlg → コントロールは UpdateData(FALSE) です。

> 例えば、ボタンクリックで判定するようにするには
ボタンのハンドラ内で
CxxxDlg::OnButton1()
{
  UpdateData();
}
でOKです。

---------------------------------
小野木一樹 o...@z2.zzz.or.jp
 http://www.aaa-int.or.jp/onogin
---------------------------------
31

[mfc 21845] Re: DDV について

> DDVの使い方について教えて頂けないでしょうか!!

DoDataExchangeまでの主な流れは
OnOK -> UpdateData -> DoDataExchange
です。
CDialog::OnOKを呼んだ時点でのコントロールに入っている中身が
勝負となります。

さて、ヘルプでCWnd::UpdateDataを見ると引数にTRUEを与えて
呼ぶとデータが取得されるとあります。 そこでダイアログの
任意の場所でUpdateData(TRUE);とすると・・・。
# OnDestroyだと結局ダイアログは消えてしまうかな。

-- 
VFC-LINK  P...@nifty.ne.jp
記事検索
Amazon.co.jp
  • ライブドアブログ