WM_CLOSEは、ウィンドウが閉じられる時(DestroyWindowが呼ばれる前)に発生するウィンドウメッセージ。
WM_CLOSE message - Windows applications | Microsoft Docs
WM_CLOSEの時に、DefWindowProcの既定の処理に通さないことで、DestroyWindowによるウィンドウの破棄をキャンセルすることができる。
閉じるボタンを押すと、WM_CLOSEが発生する。
この時、"Close?"というOKCancelなメッセージボックスを表示して、戻り値がIDOKでない場合は、0を返してしまう。
こうすれば、キャンセルボタンが押された時はDefWindowProcを通らないので、その後の既定の処理によりDestroyWindowによるウィンドウ破棄が発生しない。
つまり閉じられない。
右上の閉じるボタンを押すと、
"Close?"という確認ダイアログが表示される。
"キャンセル"を押すと、
閉じない。
"OK"を押すと、ウィンドウが閉じて破棄され、プログラムが終了する。
これだけだと、メニューアイテムや、ボタンが押された時に、この確認ダイアログでキャンセルができないので、
メニューアイテムや、ボタンが押された時は、WM_DESTROYのトピックの時のようなDestroyWindowではなく、SendMessageでWM_CLOSEを送信するようにする。
そうすると、WM_CLOSEが発生し、確認ダイアログが表示される。
メニューアイテム選択でも、
確認ダイアログが出てくるし、
ボタン押しの時でも、
確認ダイアログが出てくる。
当然、キャンセルの仕組みは同じ。
Sample/winapi/WM_CLOSE/WM_CLOSE/src/WM_CLOSE at master · bg1bgst333/Sample · GitHub