2009年05月26日

第0x02回 対話をするWindows・メッセージ

前回では、ウィンドウの表示を行いました。
しかし、一部説明していない部分がありました。
それが『メッセージ』です。

Windowsからアプリケーションに対するアクションは、
全てメッセージで行われます。
アプリケーションでは、そのメッセージを受け取り
実際の処理を決定します。
Windowsから通知されるメッセージは膨大で、

「ウィンドウがドラックされた」
「ウィンドウがクリックされた」
「キーが入力された」
「ファイルがドロップされた」
「スクリーンセイバーを起動しようとしている」
「シャットダウンに入る」
など、ウィンドウに関することからシステムに関することまで、
様々な事象がメッセージによって通知されます。
例えば、「スクリーンセイバーを起動しようとしている」という
メッセージを受け取った場合に、アプリケーションでそれを阻止する
といったことも可能になります。

また、アプリケーションからメッセージを発行することも可能です。
これにより、他のウィンドウの動作を制御したり、
直接Windowsに対して処理を促すことができます。


メッセージは、その膨大な量があるため
全てをリアルタイムに処理することが困難です。
そのため、各アプリケーションは、メッセージキューと言われる
メッセージを一時的に保存しておく場所が提供されています。
Windowsは、メッセージキューにメッセージを送ります。
アプリケーション側では、定期的にメッセージキューの中身を参照し、
処理に余裕がある場合に、メッセージを処理していきます。

この処理は、前回のサンプルの中にあった以下の部分がそれにあたります。

MSG stMsg;
while( GetMessage( &stMsg , NULL , 0 , 0 ) != 0 )
{
TranslateMessage( &stMsg );
DispatchMessage( &stMsg );
}


GetMessage()関数で、メッセージキューからメッセージを取り出し、
同時にそのメッセージをキューから削除します。
TranslateMessage()関数で、メッセージを適切に変換し、
DispatchMessage()関数で、メッセージをアプリケーション側で
処理します。

このとき、この中で直接メッセージ処理を書かず、
一度Windowsに処理を渡し、コールバックしてもらうというのが
ミソです。
Windowsでは、1つのアプリケーションで、複数のウィンドウを
持つことが可能です。
DispatchMessage()関数は、メッセージの内容によって
どのウィンドウに送られたものなのか判断し、
適切な場所へコールバックします。
これにより、プログラマは複数のウィンドウを
素直に管理することが可能になります。

コールバック関数は次のフォーマットで定義します。

LRESULT CALLBACK WndProc( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
// 処理を行う
return 0;
}

ここではWndProc()というコールバック関数を定義しています。
ちなみに関数の名前は任意のものです。
引数について説明します。

第1引数
どのウィンドウからメッセージが送られたのかを示す
ウィンドウハンドルです。
例えば、クリックされたときの応答として、
Windowを非表示にする、などといったときにこのHWNDを使用します。

第2引数
メッセージの種類が入ります。
メッセージは実際には4バイトの符号なし整数値で、
switch文などで分岐させ、メッセージ処理を行います。
メッセージの一例として次のものがあります。
WM_LBUTTONDOWN : マウスの左ボタンが押し下げられたWM_LBUTTONUP : マウスの左ボタンが押し上げられたWM_RBUTTONDOWN : マウスの右ボタンが押し下げられたWM_RBUTTONUP : マウスの右ボタンが押し上げられた
WM_KEYDOWN : キーボタンが押し下げられた
WM_KEYUP : キーボタンが押し上げられた
WM_ACTIVATE : ウィンドウのアクティブ状態が変更されたことを通知
WM_PAINT : ウィンドウの内容を再描画するよう通知

第3引数
メッセージの内容を補足するパラメータが渡されます。
この内容はメッセージによって異なります。
例えばWM_KEYDOWNでは、入力されたキーの種類が入ります。

第4引数
メッセージの内容を補足するパラメータが渡されます。
この内容はメッセージによって異なります。
例えばWM_LBUTTONDOWNでは、マウスの座標が入ります。

ここまでが、Windowsのプログラムを行う上での作法になります。
これらはどのプログラムにも何かしらの形ででてきますので、
定型文として覚えてしまってもよいと思います。

試しに、前回のサンプルにマウスをクリックしたときのメッセージ処理を
追加してみましょう。
次のようになります。

sample002.cpp(ソースコードのみ)
sample002.zip(VS.NET 2008プロジェクト)



MessageBox( hWnd , szMessage , TEXT("確認") , MB_OK | MB_ICONINFORMATION );


これは、メッセージボックスを表示する関数です。
第1引数は、メッセージボックスの親ウィンドウハンドルを指定します。
第2引数は、メッセージボックスの本文を指定します。
第3引数は、メッセージボックスのタイトルを指定します。
第4引数は、メッセージボックスのタイプを指定します。

サンプルでは、WM_LBUTTONDOWNメッセージの処理を追加しています。
これにより、ウィンドウをクリックしたことにより
メッセージボックスを表示するプログラムが記述できました。


次回はウィンドウに線などを描画するプログラムについて
解説したいと思います。
タグ:ふわ猫

2009年05月25日

第1回 Javaの誕生と発展

新人が学んで行くJava 第一回

今世界では多くのプログラミング言語が様々な目的や用途に使われています。

数多くあるプログラミング言語の中で、今回私は世界中で幅広く使われている言語の一つ、Javaについて書いていこうと思います。

時には自分の感想も交えながら、筆者が勉強しながら感じたより重要な、もしくは使われる頻度の高いだろうと感じた箇所をできるだけわかりやすく簡潔に説明して行こうと思います。
そのためより専門的な知識をお求めの方やすでにJavaを熟達されている方には物足りなく感じられると思われますが、筆者も勉強中ということもあり、長い目でお読みいただければと思います。

第1回 Javaの誕生と発展

1991年、米国 Sun Microsystems 社は家電製品等を制御するプログラムを開発していました。後に改良を重ね、1995年、Javaとして世界に発表されました。


ウェブブラウザ上で動くアプリケーション、Appletを始め、そのいくつかの特徴からJavaは幅広く普及し始めました。ここではその代表的な特徴をいくつか説明します。


余談ですが、Javaのロゴにはコーヒーの絵が描かれていますね。
Javaという名前自体は開発者の頭文字から取ったですとかコーヒーのブランドから取った等の説がありますが、ロゴのコーヒーは開発者達が近くのコーヒーショップで命名したという所から取られたそうです。



  • Write Once, Run Anywhere

  • 大概のプログラムは指定された環境のみで動くというのが一般的ですが、Javaで作成したプログラムはJavaが動作する環境さえあれば、WindowsでもMacでもOSに依存することなく動きます。
    まさに一度書いてしまえば(Write Once) どこでも動かせる(Run Anywhere)という親切な設計を兼ね備えています。


  • オブジェクト指向プログラミング

  • Javaは個々の機能や役割を持ったオブジェクトに関係を持たせプログラムを動かして行くオブジェクト指向プログラミングに特化した言語です。
    クラスの継承やカプセル化を始め、ガーベジコレクションによる記憶管理や、パッケージによるクラスの分類などサポートされている技術を駆使して、開発、保守性の効率を高める事ができます。

  • ミッションクリティカル

  • プログラムは実数や文字列など様々なデータを扱いますが、各データ型の処理においてJavaは厳密にチェックしますので、強い型付けを行う事ができます。万が一予期せぬエラー等が起きた時も、例外処理を行う事ができます。そのため頑丈なプログラムを作成することができ、セキュリティなどに強いプログラムを作成することが可能です。

  • ネットワーク

  • Appletが注目された当時は、ネットワーク関連のプログラム用の言語だという認識が広まっていたようですが、Javaはどちらかというと、Appletなども作る事ができる万能の言語だという方が正しいようです。
    ただその特徴からセキュリティに強いプログラムを作成する事ができたり、事実ネットワーク関連の機能が多々搭載されているので、現在多くのウェブサービスでJavaは使われています。

  • 多数のライブラリ

  • Javaには作り手の用途に応じて様々なコマンドが用意されていますが、存在するすべてのコマンドを把握して使用するのはとても大変です。
    そこでJavaに用意されているAPIのライブラリ(便利なコマンドの集まり)を使えば、目的に応じて比較的簡単に開発を進める事ができます。


発表されて間もない当時は、環境によってい動作が異なったり、動作が異様に重いなどという事もありましたが、マシンや技術の向上により、現在はそのような点も大幅に改善されつつあります。


次回は、実際のプログラミングの説明を始めて行こうと思います。
タグ:G

2009年05月22日

MacとWindowsの橋渡しコラム

第1回:Excel初心者のための「Excelでウェブページの画面設計書を作ろう」

私は学生時代ずっとMacを使っており、WindowsやOfficeはほとんど初心者でした。
しかし、やはりまだまだWindowsの世の中。
職場ではExcelを使って書類を作らなければならない場面もあり、
避けてばかりもいられなくなってきました。

このコラムではそんな私が『本当はMacを使いたいのに』という心の叫びをこらえつつ
Windowsを使って苦労したことや、周りの人に助けてもらって身に着けた仕事術を紹介しようと思います。

※Excelはバージョン2003を使用しています。


ところで、画面設計書とはなんでしょうか?

m001a.gif

簡単に言えば、上図のようにウェブページの
レイアウトと機能の説明を兼ねた文書のことです。

このような書類はExcelで作ることが多いです。なぜでしょうか?
まずソフトに必要な条件を考えてみると、

1.簡単な図形を組み合わせて図を描けること
2.図形と箇条書きなどの文章を自由にレイアウトできること
3.複数のページを一つの書類で管理できること(タブ機能など)

があります。さらに、仕事用の文書として通用するためには

4.印刷した時のレイアウトをコントロールできること
5.各ページにヘッダが付けられること(プロジェクト名、作成者、作成日、更新日などを書きます。)
6.他の社員が再編集できるようになっていること

が望まれるでしょう。

そう考えてみると、Excelは確かにこれらの条件を全て満たしていると言えます。

ただし、Excelは特有のクセがありますので、それを
知らないまま作業にとりかかると、後で大修正が必要になってしまうかもしれません。

今回は、その注意すべき性質と、Excelの便利な機能を紹介しようと思います。

Excelの注意すべき性質

Excelには、文字列の長さが編集中と印刷プレビューとで変わってしまうという厄介な問題があります。また、この変化の度合いはプリンターのドライバーに依存しており、
ユーザーの環境によって変わるようです。職場のプリンターではかなりの違いが見られました。

特に文字がテキストボックスやセルの端で切れてしまったりするので、
入力する文字に対してセルやボックスの幅に余裕を持たせておくことが望ましいです。
(印刷プレビューでダメならフォントを小さくするという手もありますが・・・)

m001b.gif


とにかく印刷時のトラブルを避けるために、
レイアウトが直しやすいような文書を作ることをお勧めします。

また、改行をセルの端での自動改行にしていると、上記の問題で端が切れてしまうことがあるので、
改行は手動で入れるようにしておいた方が安全です。

印刷範囲を決める

印刷範囲は後でも変更できますが、初めに決めておいた方が後々ラクです。
範囲指定と微調整は、上のツールバーの【印刷プレビュー】でできます。
印刷範囲を設定すると、シートの中に目安の点線が描かれます。

1ページに印刷されるセルの範囲を大きく変えたいときは、
【表示】メニューの【改ページプレビュー】を選んで範囲を設定します。

すると印刷範囲だけが表示されるモードになるので、
シート全体を見たいときには【表示】の【標準】を選びなおしてください。

【改ページプレビュー】では印刷範囲に納める領域を広げられて便利ですが、
当然その分全体が縮小されてしまうので気をつけてください。


セルの形を決める

さて、次にシート全体のセルの形を決めましょう。

レイアウトを自由に作りたいときは、列を短くしてグリッドにしてしまうことをお勧めします。
シート全体を選択してから列の幅を変えると、全部の列幅を一斉に変化させることができます。

セルの中に文字を書くとき、エクセルの仕様で端で切れてしまうことがありますが、
セルの幅を変えると全ての行に影響してしまうので、印刷範囲を直すのが大変です。

セルをグリッドにしておけば、セルの幅を調節せずに文章を好きな位置に動かせる
ので、レイアウトの修正が簡単になります。

m001c.gif


図形を描く

デフォルトでは下にツールバーがあります。
かなり多種多様な図形が用意されているので、バリエーションには困らないでしょう。

図形やテキストボックスは、
新しいオブジェクトが上に被さるレイヤー式になっているので、
図形の順番を変えたいときには右クリックのメニューで変えます。

また、ツールバーの一番左の矢印を使えば、複数の図形をまとめて選択することができます。


・その他のTips

a. Excelはメニューの階層が深いので、なるべくツールバーの中から機能を使う方が早いです。
b. 罫線のツールは上にあります。また、オプションで自由に罫線を引けるツールバーがあります。
c. f2ボタンでセルの中身を編集できます。
d. 1つのセルの中で改行するにはAltキー + Enterを押します。
e. 【書式】メニューの【行】からセルの幅を文字の大きさに合わせる自動調整ができます。
f. 【セルの結合】は上のツールバーにあります。
g. 下のタブで複数のシートを切り替えることができます。


以上、Excelを使って自由なレイアウトの文書を作る方法を紹介させていただきました。
普段から使っている方には常識だったかもしれませんが、何かの役に立てば幸いです。

ところで、以上の性質を理解すればExcelでなくても同じような文書を作ることができます。

たとえばOpenOfficeやApple iWorkのNumbersなどでは、ほぼ完璧に図形入りのExcel文書
の読み書きを行うことができます。
(googleDocsのスプレッドシートは今のところ、表を作る機能しかないので無理そうです。)

特にNumbersでは、一枚のシートに複数の表をオブジェクトのように自由に配置できるので、
簡単に美しい文書を作ることができてしまいます。

残念ながら表のフリーレイアウトはExcelでサポートされていない機能なので、
最後にxls形式に戻す場合は、そのようなレイアウトは再現できません。
しかしMacを持っていたらぜひ使ってみてほしいツールの一つです。
タグ:leopard
posted by ラクサス at 14:55| Comment(0) | TrackBack(0) | システム開発 | このブログの読者になる | 更新情報をチェックする

2009年05月16日

中途採用募集のお知らせ

ラクサスでは中途採用の募集を行っております。

転職サイトgreenにて、企業紹介や求人案内を行っていますので是非ご応募ください。

応募は↓こちら↓から

企業詳細
http://www.green-japan.com/company/1443.html
求人詳細
http://www.green-japan.com/jobs/1443.html



お問い合わせ
----------------------------------
株式会社ラクサス/採用担当 長倉
電話  048-851-5620
E-Mail info@raxus.co.jp
http://www.raxus.co.jp/
----------------------------------
タグ:raxus
posted by ラクサス at 11:25| Comment(0) | TrackBack(0) | お知らせ | このブログの読者になる | 更新情報をチェックする

2009年05月15日

第0x01回 "Window"sの基本はWindowから

Windowsでは、たくさんのウィンドウを表示し様々な処理を行います。
どのアプリケーションでも例外なく(※1)、ウィンドウを表示します。

そこで、まずはウィンドウを表示するところから、始めていく事にしましょう。

Windowsでは、ウィンドウの表示を行うために、『Win32API』と呼ばれる
ライブラリを用います。

Win32APIとは、プログラムからWindowsに対する要求を一手に担ってくれる
橋渡し的な存在で、これによりプログラマはWindowsの中身を知ることなく
プログラミングを行うことができます。

Win32APIでは、ウィンドウ表示の他に、メニューや画像などの描画、印刷、
マルチスレッドやプロセス生成といったことまで行うことができます。

(※1)
例外はあります。タスクに常駐するアプリケーションや、
そもそもウィンドウを持たないアプリケーションです。
実装にもよりますが、大抵はウィンドウをHide(隠す)ことにより、
ウィンドウがないアプリケーションを実現しています。

では、早速ウィンドウを表示するサンプルプログラムです。

sample001.cpp(ソースコードのみ)
sample001.zip(VS.NET 2008プロジェクト)


重要となる部分を説明していきます。


#include <windows.h>


Windowsのプログラムを作成するにあたり、windows.hは必須となるヘッダファイルです。
このヘッダの中に、Windowsプログラムに必要な定義が行われています。


int WINAPI WinMain( HINSTANCE   hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpCmdLine ,
int nCmdShow )


これは、C言語のコンソールプログラムにおけるmain()にあたる、プログラムのエントリーポイントになります。

第1引数でアプリケーションのインスタンスが渡されます。
これはアプリケーションをユニークに指定するために必要で、時折Win32API側でアプリケーションを特定するために必要とされます。

第4引数でウィンドウの表示設定が渡されます。
この表示設定とは、Windowsの実行ファイルのプロパティに設定されている、実行するときに「最大化で起動する」「最小化で起動する」などの設定が渡されます。
この値を用いて、要求どおりにShowWindow()するのが、Windowsでの行儀よいプログラムと言えます。



if( !RegisterClassEx( &wcl ) )
return -1; // 失敗


この部分でウィンドウクラスを登録します。
ウィンドウクラスとは、ウィンドウの概観を決めたテンプレートのようなもので、
後のウィンドウ作成時に、このテンプレートを指定することにより、ウィンドウを作成することができます。
ウィンドウクラスは使いまわしすることができるので、同じ概観のウィンドウを複数表示したい場合、
同じウィンドウクラスを指定することで同様のウィンドウを作成することもできます。



hWnd = CreateWindow(APP_NAME ,
APP_NAME ,
WS_OVERLAPPEDWINDOW ,
0 , 0 ,
200 , 150 ,
NULL ,
NULL ,
hInstance ,
0 );


この関数は、実際にウィンドウの作成を行います。
第3引数のスタイルには次のようなものがあります。

WS_CAPTION  	タイトルバーを持つウィンドウを作成します。
WS_MAXIMIZEBOX 最大化ボタンを持つウィンドウを作成します。
WS_MINIMIZEBOX 最小化ボタンを持つウィンドウを作成します。
WS_SYSMENU タイトルバーの中にコントロールメニューを持つウィンドウを作成します。必ずWS_CAPTIONスタイルを付けて指定します。
WS_HSCROLL 水平スクロールバーを持つウィンドウを作成します。
WS_VSCROLL 垂直スクロールバーを持つウィンドウを作成します。


複数指定するには、 WS_MINIMIZEBOX | WS_SYSMENU などと、or演算子を使ってつなげます。

CreateWindow()の戻り値として、HWNDが返ってきます。
これはウィンドウハンドルで、HWNDの実体は4バイトの整数値です。
Win32APIでは、時折ハンドルを返し、Windows内部をいじることなく操作させることがあります。
ハンドルとは、車などのハンドル、操作するものという意味合いです。
ポインタと似たようなイメージです。


ShowWindow( hWnd , nCmdShow );


ウィンドウは、作成しただけでは表示されません。
実際に表示を行うためには、上記の関数を呼び出し、ウィンドウの表示状態を変更しなければなりません。
ウィンドウを最大化、最小化などの状態にするのも、このShowWindow()を使用します。


この一連の操作を行うことに晴れてウィンドウを表示できるようになりました。
後半のメッセージ処理については、次回に説明したいと思います。

ちなみに、これらのWin32APIの関数仕様については、マイクロソフト社の公開しているMSDNで確認することができます。
細かい仕様などについて、調べたい場合に利用することをお勧めします。

MSDNホーム
http://msdn.microsoft.com/ja-jp/default.aspx
タグ:ふわ猫

第0x00回 ゲームプログラミングへの誘い

プログラムに興味があり、少しゲームに興味がある方なら
一度はゲームプログラミングに興味を持ったことがあると思います。
テトリスやオセロなどや、テレビで遊ぶようなアクションやシューティングなど、
ゲームには、様々なジャンルがあり、そのどれもが魅力的です。

今回は、そのゲームを身近な環境であるWindowsを使って作成し、
解説していこうと思います。
ゲームプログラミングは、見た目では想像できないくらい
様々なロジックを使って実装されています。

Windowsに関する内部的なことを知りたくて、
その取っ掛かりとしてゲームプログラミングから入ってみたい、
そんな方に読んで頂ければ幸いです。


さて、ゲームをプログラミングする上で必要な要素がいくつかあります。
色々ありますが、一般的には次のようなものがあります。

・画像を表示する
・サウンドを再生する
・キー入力を判定する
・ネットワークで通信を行う

ネットワークに関しては必要のないゲームもありますが、
大抵のゲームはこれらの処理を行い、それを作り上げていきます。

ここでは、オセロを題材として作成しながら、
これらの要素について説明していきたいと思います。


まず、プログラムを作成する前準備として、
プログラムを記述するための統合環境が必要になります。

マイクロソフト社で、学習用の統合環境がフリーで
ダウンロードできるようになっていますので、
Windows向けC++の統合環境がない場合には、
以下のものを準備してください。

Visual Studio Express Editions
http://www.microsoft.com/japan/msdn/vstudio/Express/

準備ができましたら、さっそくプログラミングを始めていきましょう。
タグ:ふわ猫
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。