WM_CLOSE

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

株式会社エンタップに入社しました。

約1ヶ月間の無職期間を経て、2月1日から株式会社エンタップに入社しました。

www.entap.co.jp

これまでの経緯ですが、2018年の1月から本格的に転職活動をしてきましたが、約40社近く採用に至りませんでした。

そして、次の職場が決まらないまま、フリービット株式会社を退職することになりました。

bg1.hatenablog.com

退職後もいくつかお声をお掛けいただきましたが、1年間落ち続けるとさすがに自信を無くすものです。

なかなか改めて再度転職活動を続けようという前向きな気持ちになれず、しばらく無職を楽しんでいました。

そんな中、松岡さんからお声を掛けていただき、すぐにお話をしました。

その日のうちに採用の連絡を頂いて、これまでの何週間もかかる就職活動は何だったのかと、愕然としました。

このスピード感と、フレックスコアタイムの条件を柔軟に飲んでいただけるとのことで、即決いたしました。

働き方の柔軟性を優先条件にしていたため、年収面については納得しています。

本日、出社して、

  • Slack -> Chatwork
  • AndroidStudio -> Xamarin -> (とおもいきやなぜかOpenCV?)

という環境の変化は、まるで『イースⅡで武器とアイテムとお金を落とした状態のアドル』のようですが、

新たな成長の機会と捉え、新しいことをまた学んで、エンタップに貢献していきたいとおもいます。

これからもよろしくお願いいたします。

あ、就職祝いに欲しいものリスト置いときます・・・。

追伸:

初心者LTは次の機会にでも・・・。

WM_DESTROY

WM_DESTROYは、ウィンドウが破棄された時(DestroyWindowが呼ばれた後)に発生するウィンドウメッセージ。

WM_DESTROY message - Windows applications | Microsoft Docs

DestroyWindowの後に発生しているか確認する。

WM_DESTROYプロジェクト
WM_DESTROYプロジェクト

WM_DESTROYプロジェクトで、

新しい項目
新しい項目

新しい項目で、

WM_DESTROY.cpp
WM_DESTROY.cpp

WM_DESTROY.cppを追加。

リソース
リソース

リソースを追加。

Menu
Menu

Menuリソースを追加。
で、resource.hとWM_DESTROY.rcの中身は、DestroyWindowのトピックのものをそのまま使う。

WM_DESTROY.cppでは、

メニューアイテムが選択された時、ボタンが押された時、それぞれのDestroyWindowの前後にOutputDebugStringでログを出す。

WM_DESTROYが発生した時も、OutputDebugStringでログを出す。

デバッグ開始
デバッグ開始

デバッグ開始で、

メニューアイテム
メニューアイテム

メニューアイテムItem1-1を選択すると、ウィンドウは破棄されて終了する。

ログ
ログ

"ID_ITEM_1_1 before"の後に、DestroyWindowが呼ばれているはずで、その後に"WM_DESTROY"が出力されていて、"ID_ITEM_1_1 after"となっている。

ボタン
ボタン

ボタンButton1も、

ログ
ログ

同じような出力順。

閉じるボタン
閉じるボタン

さて、閉じるボタンはどうだろうか。

閉じた場合
閉じた場合

WM_DESTROYが出ているということは、その前にDestroyWindowによる破棄が行われている可能性がある。
しかし、DestroyWindowの呼び出しは、ここにはない別のメッセージの既定処理で行われている模様。

Sample/winapi/WM_DESTROY/WM_DESTROY/src/WM_DESTROY at master · bg1bgst333/Sample · GitHub

OutputDebugString

Win32プロジェクトでデバッグログを出したい場合、C/C++の標準出力系の関数などは使えない。
APIの標準出力も面倒だし、ファイル出力にしても若干面倒。
VisualStudioなどIDEに出すなら、OutputDebugStringを使うのがいい。

OutputDebugString function (Windows)

Win32プロジェクト
Win32プロジェクト

Win32プロジェクトで、

Windows アプリケーション
Windows アプリケーション

Windows アプリケーションで空のプロジェクト作成。

OutputDebugString.cpp
OutputDebugString.cpp

OutputDebugString.cppを追加。

_tWinMainの中で、OutputDebugStringで、"ABCDE"と改行を出力する。

出力
出力

出力ウィンドウを出す。

デバッグなしで開始
デバッグなしで開始

デバッグなしで開始だと、出力元の表示が[ビルド]になってしまって、何も出力されない。

デバッグ開始
デバッグ開始

デバッグ開始にすると、

デバッグ文字列
デバッグ文字列

出力元の表示が[デバッグ]になって、"ABCDE"が出力されている。

Sample/winapi/OutputDebugString/OutputDebugString/src/OutputDebugString at master · bg1bgst333/Sample · GitHub

Aoiの0.0.5をリリースしました。

Aoi(Aoi32)の0.0.5をリリースしました。

-0.0.5(Osaki #58)のリリースパッケージ. · bg1bgst333/Aoi32@2f880da · GitHub

今回の主な修正点は、

  • 改行コード切り替えへの対応.

です。

Aoi32/Aoi.exe at master · bg1bgst333/Aoi32 · GitHub

↑からダウンロードし、

インストール
インストール

インストーラを起動し、インストール。

スタートメニュー
スタートメニュー

スタートメニューから選択。

テキストを入力
テキストを入力

起動したら、テキストを入力。

Unicode
Unicode

Unicodeを選択。

LF
LF

LFを選択。

Test.txt
Test.txt

すでにあるTest.txtに上書き保存。

上書き
上書き

上書き。

開く
開く

いったんAoiを終了してから、再度Aoiを起動し、もう一度開く。

Unicode
Unicode

Unicodeの、

LF
LF

LFにちゃんとなっている。

-0.0.5(Osaki #58)のリリースパッケージ. · bg1bgst333/Aoi32@2f880da · GitHub

Aoi32(0, 0, 5, 5/Osaki #58) -指定した改行コードに変更して保存.

ラジオボタンに指定した改行コードは反映されたが、まだ保存先のファイルには反映されていない。
ちゃんと指定した改行コードで保存するようにする。

TextFile.cppで、

文字コードに加えて、改行コードの状態も一時保存しておいて、その間にいったんCloseとClearしておく。
m_NewLineなどを復元したら、改行コードをチェックして必要ならCRLFを指定した改行コードに変換する。
改行コード変換したtstrTempを文字コード変換にもかけ、それをファイルに書き込む形となる。

CRLFのファイル
CRLFのファイル

CRLFのファイルを開く。

内容
内容

内容はこんな感じ。

Shift_JIS
Shift_JIS

文字コードShift_JIS

CRLF
CRLF

改行コードはCRLF。

Unicodeに変更
Unicodeに変更

ここで文字コードUnicodeに切り替える。

LFに変更
LFに変更

改行コードはLFとする。

UnicodeLFTest.txt
UnicodeLFTest.txt

UnicodeLFTest.txtとして保存。

いったん、アプリを終了してから起動。

開く
開く

UnicodeLFTest.txtを開く。

開いた時の状態
開いた時の状態

メニューを見たら、

Unicode
Unicode

文字コードUnicodeになってるし、

LF
LF

改行コードはLFになっている。

Shift_JIS
Shift_JIS

今度はShift_JISの、

CR
CR

CRを選ぶ。

ShiftJISCRTest.txt
ShiftJISCRTest.txt

ShiftJISCRTest.txtで保存。

開く
開く

いったん終了して、また開く。

開いたら
開いたら

開いたら、

Shift_JIS
Shift_JIS

Shift_JISの、

CR
CR

CRになっている。

-指定した改行コードに変更して保存. · bg1bgst333/Aoi32@4660afd · GitHub

Aoi32(0, 0, 5, 4/Osaki #57) -メニューで違う改行コードを選択した後にラジオボタンに反映されているようにする.

ファイルを開いた後、メニューで改行コードを切り替える場合、元々の改行コードから違う改行コードに選択して切り替えても、もう一度メニューを見るとラジオボタンが元に戻ってしまっている。ちゃんとラジオボタンも反映させたい。

MainWindow.hで、

"CRLF"を選択された時のハンドラOnNLCrLf、"LF"を選択された時のハンドラOnNLLf、"CR"を選択された時のハンドラOnNLCr、を追加。
MainWindow.cppでは、

各ハンドラの定義。
m_pTextFile->m_NewLineに改行コードをセット。
CheckMenuRadioItemでラジオボタンを設定し直す。

OnCreateにおいて、AddCommandHandlerで改行コードのハンドラを追加。

OnDestroyにおいて、DeleteCommandHandlerで改行コードのハンドラを削除。

開く
開く

[開く]から、

CRLF
CRLF

CRLFのファイルを選択。

CRLFのファイル
CRLFのファイル

CRLFのファイルはこんな感じ。

Shift_JIS
Shift_JIS

文字コードShift_JIS

CRLF
CRLF

改行コードはCRLF。

Unicodeを選択
Unicodeを選択

いったんメニューを閉じてから、メニューから文字コードUnicodeを選択する。

LFを選択
LFを選択

改行コードはLFを選択。

Unicodeにセットされている
Unicodeにセットされている

再度確認すると、Unicodeにセットされている。

LFにセットされている
LFにセットされている

これまではCRLFのままだったが、今回の修正で再度確認すると、ちゃんとLFにセットされているようになっている。

CRに切り替える
CRに切り替える

もちろんCRに切り替えても、

CRになっている
CRになっている

再度確認するとCRになっている。

-メニューで違う改行コードを選択した後にラジオボタンに反映されているようにする. · bg1bgst333/Aoi32@64547e8 · GitHub