皆さんはじめまして開発環境はDevStudio97のVC5.0です
メインウィンドウ上にボタン「終了」を作って「ID_APP_EXT」
を割り当てただけだと何も起こらないのですが、どうしてでしょうか
メニューの「ファイル」→「アプリケーションの終了」には「ID_APP_EXT」があって
終了できるのに?
同じリソースID割り当てただけではだめなんですか
AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_APP_EXIT);
とでもしてみてください.
ID_APP_EXT 以外の IDC_BUTTON1などのリソース割り当てをしコントロールに
対する関数を作成し「AfxGetMainWnd()->PostMessage(WM_CLOSE);」と言うのはやってます
聞きたいのは「ID_APP_EXT」をボタンコントロールのidにしたときメニューと同じ
動きをなぜしないのかを聞きたい
逆に,なぜメニューと同じ動作をするのかご存じでしょうか?
SDIについて書いておきます(MDIでは下記の記述は参考程度にしかならないかもしれません).
おそらくCViewの派生クラスをオーナーにしてボタンを作成していると思いますが
メニューはCMainFrame作成の::CreateWindowExで作成しています.
ですからボタンもCMainFrameをオーナーとして作成しないと
メニューに連動しないのではないかと思います.
CButton btn;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
RECT rc = {100, 100, 200, 200};
btn.Create(test, WS_CHILD | WS_VISIBLE, rc, this, ID_APP_EXIT);
}
UINT C???View::OnNcHitTest(CPoint point)
{
return HTCAPTION;
}
CMainFrame::OnCreateでCMainFrameをオーナーにしたところ
ボタンは表示されましたがボタンを押すことができません
Viewが上に乗っているのでボタンを押すことができないのでしょう.
ということでじゃまなViewを移動するためだけにOnNcHitTestを実装しました.
このコードをお試しになるのなら
実行後にViewをつかんで移動させてください.
Viewの移動後にCMainFrameをオーナーにしたボタンを押すことができます.
> メニューはCMainFrame作成の::CreateWindowExで作成しています.
正確にはCFrameWnd::CreateExの::CreateWindowExで作成しています.
ですね.
関数のオーナーによる違いのためリソースアクセスできないと言うように解釈いたしましたCreateWindowExについては勉強不足のため理解できませんでした
VC6だと新規作成のプロジェクトでWin32 Applicationを選ぶと
標準的なHello World!アプリケーションが選べます.
VC5でも似たようなものがあると思います.
これだとCreateWindowの中のメニューを指定するところにNULLを指定してますが
この場合はRegisterClassのメニューを採用するって意味だったと思います.
CreateWindowExとCreateWindowは似たようなもんです.
MFCを使ってないシンプルな構成なのでCreateWindowも理解できるのではないかと思います.