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

Test

エディットボックスのクラス化(WindowsAPI)

エディットボックスに入力されたテキストを取得、またはエディットボックスにテキストをセット、といった部分をクラス化・・・。基底クラスとなるCEditの定義は、tstringをdefineしてstd::wstringとstd::stringのUNICODE切り替えに対応・・・。そのtstringの…

エディットボックスの表示(WindowsAPI)

あるボタンを押したら、エディットボックスに入力されたテキストを取得してメッセージボックスで表示し、別のボタンを押したら、エディットボックスに別のテキストをセットする・・・。"アップデートの確認"ボタンとは別に、新しいボタンを配置・・・。今回…

ボタンのクラス化(WindowsAPI)

ボタンのクラス化は結構大変・・・。ボタンが押された時、WM_COMMANDは親ダイアログに通知されるので、親ダイアログのハンドラにそれに対する処理を書けばいい・・・。しかし、それだと親ダイアログが肥大化しそうなので、各ボタンクラスオブジェクトにその…

ボタンの表示(WindowsAPI)

ダイアログにOKボタンとは別の新たなボタンを配置してみる・・・。ツールボックスでButtonを選択・・・。このように配置・・・。Captionも"Button1"から、"アップデートの確認"に変更・・・。IDも"IDC_BUTTON1"から、"IDC_BUTTON_UPDATECHECK"に変更・・・。…

ダイアログのクラス化(WindowsAPI)

ダイアログをクラス化する・・・。ウィンドウクラスと統一してもいいが、動作が若干違うので個別にダイアログクラスを作る・・・。と、というように前回同様のメニューを用意・・・。ダイアログも、前回同様・・・。基底クラスとなるCDialogクラスは、m_mapD…

ダイアログの表示(WindowsAPI)

ダイアログを表示する・・・。今回は、モーダルで・・・。リソースを追加する・・・。まずはMenuで、これまで通りの項目を挿入・・・。新たにヘルプ(&H)というメインメニューのアイテムを作って、バージョン情報(&A)というサブアイテム・・・。IDをID_APP_AB…

メニューウィンドウ(WindowsAPI)

メニューを載せたウィンドウCMenuWindowをメインウィンドウCMainWindowのベースとなるようにしてみる・・・。MenuWindow.hのCMenuWindowのメンバに、CMenuオブジェクトポインタm_pMenuを用意・・・。SetMenuは、オリジナルのメニューセット関数・・・。引数…

メニューのクラス化(WindowsAPI)

今度はメニューをクラス化してみる・・・。メニューリソースを追加したら、ここまで項目を決めて、IDなども変える・・・。Menu.hのCMenuは、こんな感じ・・・。 m_hWndはメニューを持つウィンドウのハンドル・・・。 ここでもm_pAppをこれに渡して、ここから…

メニューの表示と選択(WindowsAPI)

メニューを表示し、選択されたら、その項目のリソースIDマクロ名を表示する・・・。リソースを追加・・・。Menuを選択・・・。メインメニューの項目1から入力していく・・・。"ファイル(&F)"とする・・・。"(&F)"は、ショートカットキーがFであることを指す…

ウィンドウの表示(MFC)

MFCでできるだけシンプルなウィンドウのプロジェクトを作成してみる・・・。 シンプルといってもシングルドキュメントでドキュメントビューをオフにするぐらいしか削れないのだが・・・。MFCアプリケーションで、シングルドキュメント、ドキュメント/ビュー…

ウィンドウのクラス化(WindowsAPI)

「ウィンドウをただ表示する」からかなりハードルが上がって、Win32だとクラスを自作しないといけないので、ウィンドウをクラス化してみる・・・。 MFC風な設計をベースに、いろいろ試行錯誤してなんとかクラスに押し込めている・・・。まず、WinMain.cppに_…

ウィンドウの表示(WindowsAPI)

ウィンドウを表示する・・・。Win32プロジェクト・・・。空のプロジェクトで・・・。ソース追加・・・。Window.cppとして、ウィンドウクラス名を"Window"とし、あとは既定のものをウィンドウクラスwcに設定・・・。 メニューはなし・・・。RegisterClassでwc…

Hello, world!(Android)

Android版・・・。Android Studioで・・・。newで・・・。HelloWorldプロジェクト・・・。Phone and Tablet用・・・。Emptyで・・・。そのまま・・・。こんな感じ・・・。activity_main.xmlに、もう"Hello World!"と書いてあるので、いじる必要なし・・・。…

Hello, world!(Java)

Java版・・・。Eclipseで、こんなパスで、起動したらJavaプロジェクトを選択し、"HelloWorld"プロジェクト・・・。そのまま・・・。パースペクティブは"はい"で・・・。プロジェクトができたらクラスを追加・・・。HelloWorldクラス・・・。System.out.print…

Hello, world!(MFC)

MFC版・・・。 ダイアログベースにスタティックコントロールで"Hello, world!"・・・。MFCアプリケーション・・・。ダイアログベース、スタティックライブラリでMFC・・・。システムメニューだけ残して、あとはいらない・・・。全部いらない・・・。Appはい…

Hello, world!(.NET Framework)

WinForms版・・・。 今回はメッセージボックスではなく、フォームForm1に"Hello, world!"のラベルを貼る・・・。こんなフォーム・・・。ちょっと小さいので大きくする・・・。これぐらいで・・・。これを、こんな感じで貼る・・・。フォントが小さいので、大…

Hello, world!(C#)

C#のコンソールで・・・。今回は空のプロジェクトで・・・。ソースを追加・・・。コードファイルでHelloWorld.cs・・・。[参照の追加]でSystemを追加・・・。あとは、Console.WriteLineで"Hello, world!"・・・。こんな感じ・・・。Test/HelloWorld.cs at ma…

Hello, world!(WindowsAPI)

そして、Win32版・・・。 レガシー環境でやるか、最新環境でやるか迷ったけど、思い切って最新で・・・。 メッセージボックスで"Hello, world!"・・・。HelloWorldプロジェクト・・・。空のプロジェクトで・・・。ソースを追加・・・。HelloWorld.cpp・・・…

Hello, world!(C++)

次はC++版・・・。出力演算子" $ vi helloworld.cpp $ g++ helloworld.cpp -o helloworld $ ./helloworld Hello, world! $ こんな感じ・・・。Test/helloworld.cpp at master · bg1bgst333/Test · GitHub

Hello, world!(C言語)

新生Test・・・。 逆引きのような形でやっていこうと思う・・・。 順番もSampleよりは自由にやってこうと思う・・・。まずは、"Hello, world!"のC言語版・・・。printfで・・・。 $ vi helloworld.c $ gcc helloworld.c -o helloworld $ ./helloworld Hello,…

CDialog::DoModal

ダイアログクラスCDialogに、ダイアログを表示するメンバ関数DoModalを実装する・・・。Dialog.hに、を追加・・・。Dialog.cppには、と定義・・・。 DialogBoxを呼んでいるだけ・・・。 戻り値はそのままEndDialogで指定したものが返ってくる感じ・・・。Men…

CDialog

ダイアログクラスCDialogを実装する・・・。まず、resource.hに、ダイアログのリソースID、IDD_DIALOGの番号を割り振る・・・。 CDialog.rcのダイアログリソース定義は、こんな感じ・・・。 Dialog.hで、CDialogはと定義・・・。 リソースID、アプリケーショ…

CMenu::OnCommandMenuItem

これまで、メニュー項目を選択した時のハンドラ処理は、CWindowのOnCommand、 そして、その下でメニュー項目ごとに定義したハンドラを呼ぶという構成にしていた・・・。これだと、CWindowクラスが肥大化しそうなので、CMenuクラスにハンドラ処理を移設する・…

CMenu::SetMenu

SetMenuを実装する・・・。 本来MFCだとCWndに実装してあるので、CWindowに実装するのが普通だが、今回はCMenuに実装して、hwndを指定するようなタイプにしてみる・・・。Menu.hは、Menu.cppは、Window.cppのOnCreateで、こんな感じで呼び出す・・・。で、ht…

CMenu::LoadMenu

CMenuクラスにメンバ関数LoadMenuを実装する・・・。Menu.hに、LoadMenuを追加・・・。 戻り値はBOOL、引数はリソースID・・・。 オーバーライドできるようにvirtualにしておく・・・。で、Menu.cppでは、WindowsAPIのLoadMenuでメニューをロードしてるだけ…

CMenu

メニュークラスCMenuを実装する・・・。Menu.hに、アプリケーションインスタンスハンドルm_hInstanceとメニューハンドルm_hMenuを用意・・・。 また、コンストラクタはインスタンスハンドルを引数として渡すものを用意・・・。Menu.cppで、hInstanceを渡すコ…

CWindow::OnCommand

CWindowにメニューを実装する・・・。 ただ、メニューの表示自体はリソースファイルに定義するだけでできるので、加えてOnCommandハンドラと、それぞれのメニュー項目のコマンドハンドラを実装する・・・。resource.hに、リソースID番号・・・。 OnCommand.r…

CWindow::OnCreate

DynamicWindowProcの中のWM_CREATE時の処理を、OnCreateを作ってそちらに移す・・・。 そうすることで、OnCreateなどのハンドラごとにオーバーライドできる・・・。Window.hに、OnCreateを宣言・・・。 引数は、MFCのCWnd::Createと同じCreateStruct構造体ポ…

CWindow::DynamicWindowProc

前回、StaticWindowProcを追加したことで、CWindowクラスにウィンドウプロシージャをメンバとして組み込むことができた・・・。ただ、スタティックなメンバであるため、複数のウィンドウオブジェクトが同時に処理をすると、それぞれ競合してしまう可能性があ…

CWindow::StaticWindowProc

これまで、ウィンドウプロシージャWindowProcは、グローバルなコールバック関数として定義してきた・・・。ただ、CWindowのウィンドウプロシージャとして定義するなら、メンバにしたいところ・・・。しかし、コールバック関数は普通のメンバ関数にすることは…

CWindow::ShowWindow

CWindowにウィンドウを表示するShowWindowを実装する・・・。といっても、Windows.hに、と宣言し、Window.cppに、と定義・・・。WindowsAPIのShowWindow呼んでるだけ・・・。 引数同じなので、::をつけてWindowsAPIであることを明確化・・・。InitInstanceで…

CWindow::Create

MFCのCFrameWnd::Createにあたるウィンドウ作成メンバ関数Createを実装する・・・。Windows.hに、とCreateを宣言・・・。 デフォルト引数やオーバーロードを使って、別の引数パターンも定義するつもりだが、まずはウィンドウ名、RECT、インスタンスハンドル…

CWindow::RegisterClass

MFCでウィンドウクラスを登録するには、AfxRegisterClassを使うが、ウィンドウに関することだし、設定項目の煩わしさを解消するために、CWindowクラスのスタティックメンバ関数としてRegisterClassを定義する・・・。Window.hに、とRegisterClassを追加・・…

CWindow

MFCのCFrameWndに相当する基本的なウィンドウクラスCWindowを作成する・・・。まず、Window.hのCWindowの定義では、ウィンドウハンドルm_hWndとコンストラクタ、デストラクタを用意・・・。といってもWindow.cppでは、コンストラクタでm_hWndをNULLにしてる…

CApplication::OnIdle

CApplicationに、アイドル処理関数OnIdleを実装する・・・。Application.hに、とOnIdleを宣言・・・。今回は、OnIdleで描画処理をするので、ウィンドウハンドルをグローバル変数g_hWndとしている・・・。定義は、として、ここに来るたびにlCountの値をTextOu…

CApplication::Run

CApplicationにメッセージループ関数Runを実装する・・・。Application.hに、とRunを宣言・・・。Application.cppには、とRunを定義・・・。 メッセージループ処理を実装・・・。 msg.wParamをintにキャストして返す・・・。このメンバ関数RunをWinMain.cpp…

CApplication::InitInstance

CApplicationに初期化関数InitInstanceをメンバ関数として実装する・・・。 また今回は、ちゃんとウィンドウを表示するようにする・・・。Application.hに、継承したときオーバーライドできるように、virtualでInitInstanceを追加・・・。一応ウィンドウを表…

CApplication

さて、ここまでウィンドウを表示するプログラムをいくつかの関数にまとめてきたが、そろそろクラス化していこうとおもう・・・。 MFCのCWinAppに相当するクラスCApplicationを実装する・・・。 といっても今回は雛形だけ・・・。Application.hを用意し、クラ…

Create

前回のTestでは、OnCreate/OnDestroyを実装したので、今回はウィンドウ作成関数Createを実装する・・・。作成時のウィンドウハンドルは、g_hWndに格納するので、戻り値は成功/失敗のBOOLでいい・・・。 今回は実装しないが、ウィンドウオブジェクトの雛形と…

OnCreate

ウィンドウが作成された時の処理を書くハンドラOnCreateを実装する・・・。オリジナルと同じで、CREATESTRUCT構造体のポインタを引数に持つ・・・。 OnCreateの定義は、0を返すだけ・・・。 これを、WindowProcのWM_CREATEが来たときに呼んで、戻り値をWindo…

OnIdle

アイドル処理OnIdleを実装する・・・。オリジナルと同じ・・・。ウィンドウハンドルは、InitInstance内で取得し、OnIdleで使うので、グローバル変数g_hWndに格納する・・・。InitInstance内のCreateWindowで作成したウィンドウのハンドルをg_hWndに格納・・…

ExitInstance

終了処理ExitInstanceを実装する・・・。オリジナルと同じ、引数なしの戻り値int・・・。Runの前にInitInstance、Runの後にExitInstanceという実装方法もあるけど、オリジナルがRunの中からExitInstanceを呼んでいるので、今回はそのように実装する・・・。…

Run

前回、初期化処理をInitInstanceにまとめたので、今度は、メッセージループ処理をRunにまとめる・・・。引数なし、戻り値int、はオリジナルと同じ・・・。Runの定義は、MSG構造体、GetMessageによるwhileループ、その中でDispatchMessageを繰り返し呼び続け…

InitInstance

ここからは、MFCを使わずにC/C++とWindowsAPIだけでアプリケーションを作る時に、どういう風に自作関数や自作クラスでプログラムをまとめていくかを書いていく・・・。とりあえずMFCベースの軽量なウィンドウクラスやアプリケーションクラスを考えているが、…

input_str_form

trim_left_lfでfgetsの末尾の改行問題が解決したので、これで入力フォーム関数input_str_formが作れる・・・。 #include <stdio.h> #include <string.h> int trim_left_lf(char *str); void input_str_form(char *caption, char *buf, int size); captionは入力フォームのタイト</string.h></stdio.h>…

trim_left_lf

プログラムの中で、標準入力から入力されたコマンドや文字列を取得する場合、C言語ではscanf、gets、fgetsなどを使って取得するのが、一般的だ・・・。しかし、scanfは文字列中に空白などがあると、文字列が切れてしまう・・・。スペース区切りで複数のパラ…