Win32API・C言語でダイアログボックスを表示する時の基本 [プログラミングライブ]

2022/08/17 に公開
視聴回数 850
0
0
~音声トラブルについて~
冒頭の音声が出ておらず、また、その後は左側の音声のみとなっており大変失礼しました。設定が変わってしまっていたようです。

ソースコード公開
https://github.com/youtube-programmercpp/Y220816_DlgBoxSample

使用する Win32 API:DialogBoxParamA 関数など
使用する言語:C言語(または、殆ど C 言語)

本来は C++ を使いたいところですが、今回は敢えて C 言語とします。
【理由】C++ の難しさと Win32 API の難しさの両方が揃って大変なことになってしまうため。

~テクニック~
①事前にデータを用意して画面に表示する
②画面終了時にデータを取得する
③画面表示中は状態を覚えて操作に応答する…③は次回以降取り扱うものとさせていただきます

数値データ、文字列データを用意して画面に渡す
画面から数値データ、文字列データを得る
画面表示中の状態を覚える方法

DialogBoxParamA に渡した LPARAM型データ は WM_INITDIALOG メッセージの lParam に現れてくる。EndDialog で終了する際、画面上のデータを取得してどこかに保存する...というか、受取先を予め決めておくと良い

文字列データは文字配列とするか std::string を使うと良い。ただし、std::string を使うには若干の C++ 技術が必要。(C++に進みたい人はとりあえず std::stringの使い方を覚えるのも良い。ある面では C 言語の文字配列より簡単。)

~ご質問とお答え~
【コンストラクタで初期化する時と代入する時の速度の差】
初期化が不利になることは無いものと考えます。これはコンパイラ作成者の側として常識になると思います。よって、初期化が速く、代入が遅いということはあり得て、その逆はあり得ないだろうと見ています。
メンバ変数がクラス型である場合、代入してしまうとそのデフォルトコンストラクタが無駄に(殆ど無意味に)呼び出されてしまうということがあります。初期化であればそうした無駄は発生しません。そのような無駄が処理速度の上で不利になる可能性があります。(僅かですが)
【hDlgをクラス内に入れないほうが良いか】
個人的な考えですが入れないほうが良いです。理由は、入れなくても済むからです。入れないと絶対に困るものだけを入れる、という考え方が良いと思います。ただし、cache については別です。(cache の有用性というものはあります。)

0:00:00 無音(音声トラブル)
0:07:27 開始(左側のみの音声)
1:17:14 C++でのプログラミング(左側のみの音声)