CWindow::OnCommandを実装して、メニューアイテムが選択された時の処理を書く。
Window.hで、
OnCommandを追加し、Window.cppでは、
こう書き、DynamicWindowProcで、
こう呼び出す。
MainWindow.hでは、
これらを追加し、
こう定義する。

選択すると、

こう出てくる。
Test/winapi/CWindow/OnCommand/src/CWindow at master · bg1bgst333/Test · GitHub
CWindow::OnCommandを実装して、メニューアイテムが選択された時の処理を書く。
Window.hで、
OnCommandを追加し、Window.cppでは、
こう書き、DynamicWindowProcで、
こう呼び出す。
MainWindow.hでは、
これらを追加し、
こう定義する。
選択すると、
こう出てくる。
Test/winapi/CWindow/OnCommand/src/CWindow at master · bg1bgst333/Test · GitHub
Page.OnInitは、Initイベントを発生させ、そのイベントハンドラによってページの初期化が行われる。
Page.OnInit(EventArgs) メソッド (System.Web.UI) | Microsoft Docs
第5回 ASP.NETページのフレームワーク(後編)― @Pageディレクティブの活用 ―:連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (1/2 ページ) - @IT
まず、Default.aspxで、
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Page_._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html>
AutoEventWireup="true"としておいて、
Default.aspx.csは、
using System; using System.Data; using System.Diagnostics; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; namespace Page_ { public partial class _Default : System.Web.UI.Page { protected void Page_Init(object sender, EventArgs e) { Debug.WriteLine("Page_Init"); } protected void Page_Load(object sender, EventArgs e) { Debug.WriteLine("Page_Load"); } } }
Page_InitとPage_Loadの2つのイベントハンドラの定義だけ用意しておく。
これで実行すると、
2つのハンドラがどちらも呼ばれている。
Page_InitやPage_Loadは、AutoEventWireup="true"によって、自動的にイベントハンドラ登録されている。
次にDefault.aspxを、
AutoEventWireup="false"にする。
こうすると、
どちらも呼ばれない。
Default.aspx.csで、
OnInitをオーバーライドし、base.OnInitの前後にログを入れる。
OnInitだけ呼ばれてる。
ハンドラが登録されていないから、ハンドラは呼ばれてない。
でもOnInitは呼ばれてる。
Sample/aspnet/Page/OnInit/src/Page_ at master · bg1bgst333/Sample · GitHub
メニュー名を指定するRegisterClassのオーバーロードメソッドを作成する。
リソースを追加。
Menu
ここでメニューアイテムを追加してもいいが、昔ながらの方法で、ソリューションを一旦閉じて、テキストエディタでresource.hを開いて、
とし、CWindow.rcは、
とする。
再びソリューションを開いて、
リソースビューがこうなってればいい。
Window.hで、
RegisterClass(メニュー名指定バージョン)を追加。
Window.cppで、
元々のバージョンは、中でメニュー名指定バージョンを呼び出して、NULLを渡してる。
MainWindow.hにも、
メニュー名指定バージョン。
MainWindow.cppは、
中でCWindow::RegisterClassのメニュー名指定バージョンを呼び出してる。
MainApplication.cppで、
CMainWindow::RegisterClassでメニューIDR_MAINMENUを指定。
メニューが表示される。
列挙したデータの各要素は、IWbemClassObjectインターフェースポインタの形で扱う。
IWbemClassObject (wbemcli.h) - Win32 apps | Microsoft Docs
IWbemClassObject.cppで、
取得したIWbemClassObjectインターフェースポインタを出力。
CoCreateInstance OK! pLocator = 0x02040828 pLocator->ConnectServer OK! pServices = 0x0204cfb4 CoSetProxyBlanket OK! pServices->ExecQuery OK! pEnumerator = 0x0204d054 pEnumerator->Next OK! pClassObject = 0x0204d090 続行するには何かキーを押してください . . .
こうなる。
Destroyだけだと、自身のウィンドウを破棄するのか、子ウィンドウを破棄するのか、わかりにくいので、子ウィンドウを破棄する方は、DestroyChildrenに分けた。
Window.hに、
DestroyChildrenを追加し、
Window.cppでは、
CWindow::DestroyChildren自体は、FALSEを返すだけで、何もしない。
ただ、
OnCloseの中で、DestroyChildrenを呼ぶ。
そして、MainWindow.hにも、
追加。
MainWindow.cppでは、
ユーザコントロールの破棄、そしてCWindow::DestroyChildrenを返す。(これは何もしない。)
Destroyは、
DestroyChildren、そしてCWindow::Destroyを呼び出す。
また、CMainWindow::OnCloseでは、
Destroyは呼ばずに、CWindow::OnCloseを返す。
この中で、DestroyChildrenが呼ばれるが、これはCMainWindow::DestroyChildrenのほうである。
OKを押すと閉じる。
CWindow::OnCloseの中は、
DestroyChildrenで、中は、
CMainWindowのほうになる。
いずれデストラクタなどでDestroyが呼ばれるが、
その場合は、DestroyChildrenのあとにCWindow::Destroy。
Test/winapi/CWindow/DestroyChildren/src/CWindow at master · bg1bgst333/Test · GitHub
IEnumWbemClassObject::Nextで、次の要素をIWbemClassObjectインターフェースポインタとして取り出す。
IEnumWbemClassObject::Next (wbemcli.h) - Win32 apps | Microsoft Docs
IEnumWbemClassObject.cppで、
とりあえずwhileループの中でIEnumWbemClassObject::Nextを繰り返し、SUCCEEDEDマクロで成功したかどうかだけ確認する。
CoCreateInstance OK! pLocator = 0x007d0828 pLocator->ConnectServer OK! pServices = 0x007dcfb4 CoSetProxyBlanket OK! pServices->ExecQuery OK! pEnumerator = 0x007dd054 pEnumerator->Next OK! 続行するには何かキーを押してください . . .
1つだけだが、成功したみたい。
Sample/com/IEnumWbemClassObject/Next/src/IEnumWbemClassObject at master · bg1bgst333/Sample · GitHub
ASP.NETの<button>タグには、onserverclick属性がある。
実は、ここにイベントハンドラ名を直接指定し、<script>タグにイベントハンドラの定義を書くと、ServerClickイベントに登録されて、押されたらOnServerClickを経由して呼ばれるようになっている。
HtmlButton.OnServerClick(EventArgs) メソッド (System.Web.UI.HtmlControls) | Microsoft Docs
Default.aspx.csは、
もはや空でいい。
Default.aspxは、
このようにイベントハンドラの定義とタグを1つのaspxファイルで完結させることができる。
これが、
こうなる。
この時、イベントハンドラにブレークポイントを仕掛けておくと、
呼び出し履歴から、OnServerClickの後で、イベントハンドラが呼ばれてるのがわかる。
とはいえ、onserverclick属性とOnServerClickメソッドが、同じものなのか、どういう関係なのかは不明。