CCustomControl

既存のコントロールを改造できるCCustomControlを実装する。
CustomControl.hは、

最初はこう書く。
CustomControl.cppは、

最初はこう書く。
MainWindow.hで、

使えるようにして、
MainWindow.cppで、

こんな感じでウィンドウクラス"BUTTON"なウィンドウとして生成。

確かにボタンになった
確かにボタンになった

確かにボタンになった。

Test/winapi/CCustomControl/CCustomControl/src/CCustomControl at master · bg1bgst333/Test · GitHub

Page.Server

サーバに関する情報はPage.Serverが持っている。

Page.Server プロパティ (System.Web.UI) | Microsoft Docs

Default.aspxで、

こうすると、

Serverプロパティの実体はHttpServerUtilityインスタンス
Serverプロパティの実体はHttpServerUtilityインスタンス

Serverプロパティの実体はHttpServerUtilityインスタンス

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

HttpResponse.Status

HttpResponse.Statusでクライアントに返すHTTPレスポンスステータスの設定や取得ができる。

HttpResponse.Status プロパティ (System.Web) | Microsoft Docs

前回のリダイレクト前後でステータスがどうなってるか見てみる。
Default.aspx.csで、

Response.Redirectの前後に、Response.Statusを出力。
NextPage.aspx.csで、

こちらもResponse.Statusを出力。
今度はデバッガ起動で、

こうなる。
こうなる。

こうなる。
_Defaultは、リダイレクトの前は200で、リダイレクトで302になっていると思うが、その後の出力処理自体にはもう来ない。
で、NextPageは200。

Sample/aspnet/HttpResponse/Status/src/HttpResponse_ at master · bg1bgst333/Sample · GitHub

CWindow::AddCommandHandler

コマンドハンドラの追加処理は、CWindow::AddCommandHandlerにまとめる。
Window.hで、

AddCommandHandlerを追加。
Window.cppで、

このように定義。
MainWindow.cppで、

とする。

動作変わらず
動作変わらず

動作変わらず。

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

HandlerConditions

ソースコード上で、あるメニューアイテムに対するコマンドハンドラを定義するのではなく、動的にメニューアイテムとコマンドハンドラを紐づけたい。
そのために必要なのがHandlerConditions。
HandlerConditions.hで、

このような構造体を定義。
Window.hは、

WORD値をキー、HandlerConditions構造体ポインタを値とするm_mapHandlerMapを追加。
Window.cppは、

OnCommandの動作をこのように変更する。
MainWindow.hでは、

OnItem1_1の戻り値はintになり、OnCommand不要に。
MainWindow.cppは、

メニューアイテムとハンドラの追加と削除の処理。

選択すると
選択すると

選択すると、

ハンドラが反応する
ハンドラが反応する

ハンドラが反応する。

Test/winapi/HandlerConditions/HandlerConditions/src/HandlerConditions at master · bg1bgst333/Test · GitHub

HttpResponse.Redirect

リダイレクトによるページ遷移は、HttpResponse.Redirectで行う。

HttpResponse.Redirect メソッド (System.Web) | Microsoft Docs
第16回 ASP.NETにおけるページの遷移:連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (1/4 ページ) - @IT

Default.aspxは、

<title>が"Default"なぐらいで中身はない。
Default.aspx.csは、

Debug.WriteLineで"_Default.Page_Load"を出力した後、
Response.RedirectでNextPage.aspxにリダイレクトする。
ここで、

項目追加
項目追加

項目追加。

NextPage.aspx
NextPage.aspx

NextPage.aspx

こんな感じになる
こんな感じになる

こんな感じになる。
NextPage.aspxは、

<title>が"NextPage"。
NextPage.aspx.csは、

Debug.WriteLineで"NextPage.Page_Load"を出力。
デバッガで起動したら、そのままNextPage.aspxにリダイレクトしちゃうので、その後に、

URLバーをDefault.aspxにセットしなおして、
URLバーをDefault.aspxにセットしなおして、

URLバーをDefault.aspxにセットしなおして、

開発者ツールを起動して、ネットワークキャプチャ有効に
開発者ツールを起動して、ネットワークキャプチャ有効に

開発者ツールを起動して、ネットワークキャプチャ有効に。

この状態になったら、
この状態になったら、

この状態になったら、URLバーでリターンキー押してアクセス。

Default.aspxでは302、その後にNextPage.aspxで200。
Default.aspxでは302、その後にNextPage.aspxで200。

Default.aspxでは302、その後にNextPage.aspxで200。
302ということはLocationヘッダによってNextPage.aspxにリダイレクトされたってこと。
この時、

_Default.Page_Loadが呼ばれて、リダイレクトされて、NextPage.Page_Loadが呼ばれてるのがわかる。
_Default.Page_Loadが呼ばれて、リダイレクトされて、NextPage.Page_Loadが呼ばれてるのがわかる。

出力から、_Default.Page_Loadが呼ばれて、リダイレクトされて、NextPage.Page_Loadが呼ばれてるのがわかる。

Sample/aspnet/HttpResponse/Redirect/src/HttpResponse_ at master · bg1bgst333/Sample · GitHub