CWindow::OnCommand

CWindow::OnCommandを実装して、メニューアイテムが選択された時の処理を書く。
Window.hで、

OnCommandを追加し、Window.cppでは、

こう書き、DynamicWindowProcで、

こう呼び出す。
MainWindow.hでは、

これらを追加し、

こう定義する。

選択すると
選択すると

選択すると、

こう出てくる
こう出てくる

こう出てくる。

Test/winapi/CWindow/OnCommand/src/CWindow at master · bg1bgst333/Test · GitHub

Page.OnInit

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つのハンドラがどちらも呼ばれている
2つのハンドラがどちらも呼ばれている

2つのハンドラがどちらも呼ばれている。
Page_InitやPage_Loadは、AutoEventWireup="true"によって、自動的にイベントハンドラ登録されている。
次にDefault.aspxを、

AutoEventWireup="false"にする。
こうすると、

どちらも呼ばれない
どちらも呼ばれない

どちらも呼ばれない。
Default.aspx.csで、

OnInitをオーバーライドし、base.OnInitの前後にログを入れる。

OnInitだけ呼ばれてる
OnInitだけ呼ばれてる

OnInitだけ呼ばれてる。
ハンドラが登録されていないから、ハンドラは呼ばれてない。
でもOnInitは呼ばれてる。

Sample/aspnet/Page/OnInit/src/Page_ at master · bg1bgst333/Sample · GitHub

CWindow::RegisterClass(hInstance, lpctszClassName, lpctszMenuName)

メニュー名を指定するRegisterClassのオーバーロードメソッドを作成する。

リソースを追加
リソースを追加

リソースを追加。

Menu
Menu

Menu

ここでメニューアイテムを追加してもいいが
ここでメニューアイテムを追加してもいいが

ここでメニューアイテムを追加してもいいが、昔ながらの方法で、ソリューションを一旦閉じて、テキストエディタでresource.hを開いて、

とし、CWindow.rcは、

とする。
再びソリューションを開いて、

リソースビューがこうなってればいい。
リソースビューがこうなってればいい。

リソースビューがこうなってればいい。
Window.hで、

RegisterClass(メニュー名指定バージョン)を追加。
Window.cppで、

元々のバージョンは、中でメニュー名指定バージョンを呼び出して、NULLを渡してる。
MainWindow.hにも、

メニュー名指定バージョン。
MainWindow.cppは、

中でCWindow::RegisterClassのメニュー名指定バージョンを呼び出してる。
MainApplication.cppで、

CMainWindow::RegisterClassでメニューIDR_MAINMENUを指定。

メニューが表示される。
メニューが表示される。

メニューが表示される。

Test/winapi/CWindow/RegisterClass_hInstance_lpctszClassName_lpctszMenuName/src/CWindow at master · bg1bgst333/Test · GitHub

IWbemClassObject

列挙したデータの各要素は、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
続行するには何かキーを押してください . . .

こうなる。

Sample/com/IWbemClassObject/IWbemClassObject/src/IWbemClassObject at master · bg1bgst333/Sample · GitHub

CWindow::DestroyChildren

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を押すと閉じる
OKを押すと閉じる

OKを押すと閉じる。

CWindow::OnCloseの中は
CWindow::OnCloseの中は

CWindow::OnCloseの中は、

DestroyChildrenで、中は、
DestroyChildrenで、中は、

DestroyChildrenで、中は、

CMainWindowのほうになる。
CMainWindowのほうになる。

CMainWindowのほうになる。

いずれデストラクタなどでDestroyが呼ばれるが
いずれデストラクタなどでDestroyが呼ばれるが

いずれデストラクタなどでDestroyが呼ばれるが、

その場合は、DestroyChildrenのあとにCWindow::Destroy
その場合は、DestroyChildrenのあとにCWindow::Destroy

その場合は、DestroyChildrenのあとにCWindow::Destroy。

Test/winapi/CWindow/DestroyChildren/src/CWindow at master · bg1bgst333/Test · GitHub

IEnumWbemClassObject::Next

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

HtmlButton.OnServerClickとonserverclick属性

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の後で、イベントハンドラが呼ばれてるのがわかる。
とはいえ、onserverclick属性とOnServerClickメソッドが、同じものなのか、どういう関係なのかは不明。

Sample/aspnet/HtmlButton/OnServerClick_onserverclick/src/HtmlButton_ at master · bg1bgst333/Sample · GitHub