getchar

getcharは、標準入力から入力された文字を取得できる。

Man page of FGETC
C言語関数辞典 - getchar

getchar.cで、

入力フォームを作って、int型で返ってくるので、int型変数icに格納。
その後、char型にもキャストして、char型変数ccにも代入。
icは整数値として出力、ccは文字として出力してみる。

$ vi getchar.c
$ gcc getchar.c -o getchar
$ ./getchar 
ic: A
ic = 65
cc = A
$

icは整数の65、これはASCIIコード表では'A'。
ccは文字として出力してるので、'A'となる。

Sample/c/getchar/getchar/src/getchar at master · bg1bgst333/Sample · GitHub

putchar

putcharは、指定された文字を標準出力に出力する。

Man page of PUTS
C言語関数辞典 - putchar

putchar.cで、

putcharの引数の型はintであることに注意。
文字リテラルの型もintである。
もちろんchar型でも基本的には問題ない。基本的には・・・。
(特殊な例を忘れたので、それは見つけたらで・・・。とりあえず気を付けよう。)

最初は、文字リテラル'A'を出力。
いったん改行文字'\n'を出力。
そのあと数値リテラルで65。
また改行して、
char型の変数cに'A'を代入。
cをputcharで出力。

$ vi putchar.c
$ gcc putchar.c -o putchar
$ ./putchar 
A
A
A
$

3つの'A'が出力されている。

DOSプロンプト

数値の65は、ASCIIコードの'A'なのでこうなる。

Sample/c/putchar/putchar/src/putchar at master · bg1bgst333/Sample · GitHub

Aoi32(0, 0, 6, 5/Osaki #64) -入力内容が変更されている場合にウィンドウタイトルに変更マークを点ける.

テキストが変更された瞬間から、ウィンドウタイトル左に変更マークが表示されるようにする。

MainWindow.hで、

変更状態のマークを設定または解除するSetModifiedMarkと、m_pEditの内容が変更された直後の時のハンドラOnEnUpdateを追加。

MainWindow.cppでは、

OnCreateで、リソースIDがWM_APP + 1で、通知コードがEN_UPDATEな、ハンドラCMainWindow::OnEnUpdateを登録。

OnDestroyに、OnEnUpdateハンドラの削除処理も。

OnCloseでマークを点ける部分。ただし、よく考えたら、ここはいらないかも。

OnFileSaveAsで保存された時は、変更マークを消す。

文字コード切り替え、改行コード切り替え、では変更マークを点ける。

OnEnUpdateで、変更マークをセット。

引数のbModifiedと既存のファイルか新規のファイルかの場合で、マークの点け方が違う。
新規の場合、bModifiedがFALSEだと"Aoi"、TRUEだと"* Aoi"となる。
既存のファイルを開いている場合、bModifiedがFALSEだと"(ファイル名) - Aoi"、TRUEだと"* (ファイル名) - Aoi"となる。

起動時
起動時

起動時はこうなる。
"Aoi"だけ。

変更中
変更中

変更中だと、タイトルが"* Aoi"となる。

名前を付けて保存
名前を付けて保存

名前を付けて保存。

Test.txt
Test.txt

Test.txtとして保存。

保存済み
保存済み

タイトルが"Test.txt - Aoi"になった。

追加する
追加する

追加すると、"* Test.txt - Aoi"となる。

名前を付けて保存
名前を付けて保存

名前を付けて保存。

Test.txt
Test.txt

Test.txtを指定。

上書き
上書き

上書きで「はい」

Test.txt
Test.txt

Test.txtに保存され、タイトルは"Test.txt - Aoi"に戻る。

文字コード変更
文字コード変更

文字コードUnicodeに変更。

変更状態
変更状態

エディットコントロールは変更状態ではないが、文字コード切り替えも変更扱いなので、"* Test.txt - Aoi"となる。

終了確認
終了確認

閉じると、これが出るので「OK」で、

保存確認
保存確認

今度はこっちが出るので、「はい」を選ぶと閉じて終了。

改めて開く
改めて開く

改めて開くと、"Test.txt - Aoi"で文字コードUnicode

さらに追加
さらに追加

さらに追加すると、"* Test.txt - Aoi"となる。

Test.txt
Test.txt

Test.txt自身に名前を付けて保存すると、

上書き
上書き

これが出るので上書きすると、

Test.txt
Test.txt

"Test.txt - Aoi"になっている。

-入力内容が変更されている場合にウィンドウタイトルに変更マークを点ける. · bg1bgst333/Aoi32@efded31 · GitHub

EN_UPDATE

エディットコントロールの入力内容が変更された直後に、EN_UPDATEが、WM_COMMANDの通知コードとして送られる。

EN_UPDATE notification code - Windows applications | Microsoft Docs

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

Win32プロジェクトで、

空のプロジェクト
空のプロジェクト

空のプロジェクトで、

EN_UPDATE.cpp
EN_UPDATE.cpp

EN_UPDATE.cppを追加。
内容はEM_SETMODIFYベース。

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

Menuリソースを追加。
これもEM_SETMODIFYベース。

で、実はプロジェクト名に"UPDATE"が入っているので、

管理者権限
管理者権限

Windows7ではこのままデバッガ起動できないので、DispatchMessageのプロジェクトから、

app.manifest
app.manifest

app.manifestを持ってくる。

追加のマニフェストファイル
追加のマニフェストファイル

[追加のマニフェストファイル]に追加。

ソースコードの変更点は、

HIWORD(wParam)がEN_UPDATEなら、ウィンドウタイトルを"Modified!"にする。

メニューの"Reset Modify"が選択されたら、元に戻す。

起動時
起動時

起動時、こうなっているが、

"A"と入力
"A"と入力

"A"と入力すると、"Modified!"になってる。

"Reset Modify"
"Reset Modify"

メニューの"Reset Modify"で、

元に戻る。
元に戻る。

元に戻る。

"B"を追加
"B"を追加

"B"を追加すると、"Modified!"になるが、

"Reset Modify"
"Reset Modify"

メニューの"Reset Modify"で、

元に戻る
元に戻る

元に戻る。

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

BN_CLICKED

コントロールの場合、WM_COMMANDが発生した時、リソースIDとは別にどういう操作が行われたかを示す通知コードを返す。
ボタンが押された時には、押されたボタンのリソースIDとともに、BN_CLICKEDという通知コードが返ってくる。

BN_CLICKED notification code - Windows applications | Microsoft Docs

通知コードは、HIWORD(wParam)で取得できるが、メニューは常に0、アクセラレータは常に1になり、コントロールの場合はあらかじめ定められた通知コードになる。

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

Win32プロジェクトで、

空のプロジェクト
空のプロジェクト

空のプロジェクト。

BN_CLICKED.cpp
BN_CLICKED.cpp

BN_CLICKED.cppを追加。
中身は以前WM_CLOSEのトピックで使ったWM_CLOSE.cppをベースにしている。

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

Menuリソースを追加。
これも中身(BN_CLICKED.rcやresource.h)をWM_CLOSEのトピックで使ったものに差し替える。

ソースコードの違いとしては、

メニューアイテムの場合、HIWORD(wParam)は0なので、HIWORD(wParam)の値をOutputDebugStringでデバッグ出力。

ボタンの場合、HIWORD(wParam)はBN_CLICKEDだが、BN_CLICKEDは0なので、前に"BN_CLICKED: "と付けて、HIWORD(wParam)の値をOutputDebugStringでデバッグ出力。

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

[デバッグ開始]で、

起動時
起動時

最初はこうだが、

メニューアイテムを選択
メニューアイテムを選択

メニューアイテムを選択すると、

確認
確認

これが出て、OKを押すと終了する。
この時、デバッグ出力は、

メニューアイテムデバッグ出力
メニューアイテムデバッグ出力

こうなっている。
HIWORD(wParam)は0。

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

もう一度、デバッグ開始。

ボタンを押す
ボタンを押す

今度はボタンを押すと、

確認
確認

これが出るので、OKで終了する。

この時のデバッグ出力は、

ボタンデバッグ出力
ボタンデバッグ出力

こうなる。
"BN_CLICKED: "の後に、HIWORD(wParam)が出ているが0である。

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

Aoi32(0, 0, 6, 4/Osaki #63) -ファイルの内容を変更後に名前を付けて保存した場合はファイル変更フラグを降ろす.

名前を付けて保存した場合は、そのまま閉じれるようにファイル変更フラグを降ろす.

MainWindow.cppで、

ファイルを書き込んだ後に、EM_SETMODIFYでエディットコントロールの変更フラグはFALSEにし、m_bModifiedもFALSEにする。

開く
開く

開くと、

この状態
この状態

この状態で、

変更する
変更する

このように内容を変更する。
これで閉じると、

終了確認
終了確認

この後に、

保存確認
保存確認

これが出る。内容が変更されているので当然だが。
キャンセルしておく。

変更されている状態
変更されている状態

変更されているこの状態で、

名前を付けて保存
名前を付けて保存

「名前を付けて保存」で、

上書き
上書き

上書きする。

あとは閉じる
あとは閉じる

あとはこれを閉じると、

終了確認
終了確認

終了確認は出てくるが、ここで「OK」を押すと、そのまま終了する。
保存は既にされているから、保存確認ダイアログは出てこない。

-ファイルの内容を変更後に名前を付けて保存した場合はファイル変更フラグを降ろす. · bg1bgst333/Aoi32@c2d44c0 · GitHub

Aoi32(0, 0, 6, 3/Osaki #62) -文字コードの切り替えや改行コードの切り替えもファイル内容の変更とみなす.

エディットコントロールの変更だけでなく、文字コードや改行コードの切り替え時も、ファイル内容の変更とみなし、閉じた時に変更内容を保存できるようにする。

MainWindow.cppで、

文字コード切り替え、改行コード切り替え時のハンドラで、変更フラグm_bModifiedを立てる。

EM_GETMODIFYがTRUEの場合も、m_bModifiedを立てるのだが、これまではこれが絶対条件だったが、今後はEM_GETMODIFYがTRUEでなくても、m_bModifiedがTRUEなら保存確認ダイアログを出すようにする。

開く
開く

開く。

開いた状態
開いた状態

この状態で、

Shift_JIS
Shift_JIS

文字コードShift_JIS

Unicode
Unicode

Unicodeに変換。
エディットコントロールは全く編集していない。
これで閉じると、

終了確認
終了確認

これの後に、

保存確認
保存確認

これが出るので、「はい」を押すと、保存されて閉じる。

次に開いた時
次に開いた時

次に開いた時は、

Unicode
Unicode

Unicodeになっている。

CRLF
CRLF

今度はCRLF。

LF
LF

LFに変更。
閉じると、

終了確認
終了確認

これの後に、

保存確認
保存確認

これが出るので、「はい」で保存。

開く
開く

再び開く。

LF
LF

LFになっている。

-文字コードの切り替えや改行コードの切り替えもファイル内容の変更とみなす. · bg1bgst333/Aoi32@9b3ae28 · GitHub