読者です 読者をやめる 読者になる 読者になる

CButton

MFC Sample

CButtonは、ボタンコントロールのクラス・・・。

CButton クラス

今回は、ボタンを2つ配置して、CButtonクラスのオブジェクトポインタを使って、ボタンを操作する・・・。

ここからは、MFCアプリケーションウィザードを使ってプロジェクトを作る・・・。

f:id:BG1:20160115165241p:plain

[VisualC++]-[MFC]の[MFCアプリケーション]でCButtonプロジェクト・・・。

f:id:BG1:20160115165718p:plain

しばらくは[ダイアログベース]で進める・・・。[スタティックライブラリでMFCを使用]にしておく・・・。

f:id:BG1:20160115165920p:plain

ここは[システムメニュー]を外して、何もない状態に・・・。

f:id:BG1:20160115170049p:plain

ここもActiveXなどを外して、無しの状態に・・・。

f:id:BG1:20160115170144p:plain

"CC~"ってクラス名は不自然なので、

f:id:BG1:20160115170349p:plain

CButtonAppの、

f:id:BG1:20160115170441p:plain

CButtonDlgと、クラス名を変更・・・。

f:id:BG1:20160115173720p:plain

このようにCButtonプロジェクトができて、ソースファイルも自動で追加される・・・。

まず、アプリケーションクラスは、CButtonAppでソースはCButton.hとCButton.cppにある・・・。(ちょっとわかりにくかったか・・・。)

CWinAppの派生で、コンストラクタとInitInstanceぐらい・・・。

CButton.cppのInitInstanceは、

"CButton"をレジストリ登録したら、CButtonDlgのインスタンスdlgをm_pMainWndとする・・・。
DoModalでメインウィンドウとなるダイアログが表示され、このダイアログが消えるまでアプリケーションは実行中となる・・・。

ダイアログクラスCButtonDlgのCButtonDlg.hは、

CDialog派生・・・。
CButtonDlg.cppは、

ごちゃごちゃあるけど、この辺はダイアログの体裁を整えるもので、今回はあまり関係ない・・・。

Button1, Button2を配置する・・・。

f:id:BG1:20160115183225p:plain

[リソースビュー]で[ツールボックス]から[Button]を選択・・・。

f:id:BG1:20160115183503p:plain

Button1をこんな感じで貼る・・・。

ハンドラは、

f:id:BG1:20160115183729p:plain

プロパティで雷アイコンを選択し、BN_CLICKEDの右のコンボボックスを押すと、このようになるのでOnBnClickedButton1をクリック・・・。
するとハンドラが生成されて飛ぶ・・・。
(配置したButton上でダブルクリックしてもハンドラが生成されて飛ぶ・・・。そちらのほうが楽・・・。)

void CButtonDlg::OnBnClickedButton1()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。

}

ここにButton1がクリックされた時の処理を書く・・・。

同様にButton2も、

f:id:BG1:20160115184324p:plain

こう貼って、

f:id:BG1:20160115184414p:plain

これでハンドラに飛ぶ・・・。

void CButtonDlg::OnBnClickedButton2()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。

}

このとき、

ちゃんとメッセージマップもある・・・。

そしてできたダイアログのリソースはCButton.rcにある・・・。

こちらもいろいろあるけど、重要なのはダイアログの部分だけ・・・。
DIALOGEXになってるけど、DIALOGの拡張版・・・。

さて、それぞれのハンドラに処理を書いていく・・・。

Button1は、

CWnd::GetDlgItemでButton1(IDC_BUTTON1), Button2(IDC_BUTTON2)のオブジェクトポインタを取得・・・。

CWnd::SetWindowTextでボタン名を変更する・・・。

これだけでもボタンの変化を見られるが、CButtonクラスのメソッドではないので、

CButton::GetButtonStyleでボタンのスタイル(UINTの値)を取得する・・・。

で、これは実際やってみるとわかるが、ボタンというのは最初はBS_PUSHBUTTONスタイルなのだが、押すとそのボタンをデフォルト(BS_DEFPUSHBUTTONスタイル)にしてしまう・・・。
そのため、2つのどちらのスタイルになっていてもメッセージボックスを出すようにしている・・・。

f:id:BG1:20160115192418p:plain

2つのボタンがある・・・。

Button1を押すと、

f:id:BG1:20160115192521p:plain

2つとも、ボタン名が"Clicked!(1)"になった・・・。
そして、まずBS_DEFPUSHBUTTONが出てきた・・・。
Button1は押されたのでスタイルがBS_DEFPUSHBUTTONになったということ・・・。

そのあと、

f:id:BG1:20160115192712p:plain

Button2は、BS_PUSHBUTTONスタイルであるとわかる・・・。

次に、右のButton2(という名前だったもの)を押すと、

f:id:BG1:20160115192909p:plain

2つともClicked!(2)になり、
Button1はBS_PUSHBUTTONスタイルに戻り、

f:id:BG1:20160115193011p:plain

Button2は、押されたのでBS_DEFPUSHBUTTONスタイルに変わったことがわかる・・・。

Sample/CButton.h at master · bg1bgst333/Sample · GitHub
Sample/CButton.cpp at master · bg1bgst333/Sample · GitHub
Sample/CButtonDlg.h at master · bg1bgst333/Sample · GitHub
Sample/CButtonDlg.cpp at master · bg1bgst333/Sample · GitHub
Sample/resource.h at master · bg1bgst333/Sample · GitHub
Sample/CButton.rc at master · bg1bgst333/Sample · GitHub
Sample/stdafx.h at master · bg1bgst333/Sample · GitHub
Sample/stdafx.cpp at master · bg1bgst333/Sample · GitHub