2009年06月30日

第0x05回 Windowsの資源〜リソース〜

ウィンドウも出し、グラフィカルな操作も行い、
やっとWindowsのプログラムらしくなってきました。
今回は、前回に出てきたペンやブラシなど、Windowsに定義されているリソースについて
踏み込んでいきたいと思います。

Windowsは、ユーザからの操作や情報の表示をグラフィカルに行っています。
このようなユーザインターフェースのことをGUI(Graphical User Interface)といいます。
Windowsでは、マウスやウィンドウ、アイコンなどを用いて、それを実現しています。
ユーザに対して、直感的でわかりやすい操作を提供している反面、
プログラマにとっては、実際の機能以外に
これらインターフェース部分の実装まで考えなければならず、頭の痛い問題となります。

しかし今までプログラムしてきたように、
Windowsでは極力意識せずにプログラムできるようになっています。
ウィンドウやメニューなど、ほとんどのアプリケーションが使用するものに関しては、
既に用意されています。
このWindows固有のオブジェクトのことをリソースと呼びます。
リソースはメモリ上に確保され、その他のメモリ領域に確保されているデータとは
別物として管理されています。(※1)

ここでは、今までに作ってきたものに、メニュー・アイコン・カーソルを追加してみます。
これら全てはリソースとして扱われています。
では、早速サンプルを見てみましょう。


(プロジェクトファイル)
sample005.zip


VisualStudioでは、リソースを統合環境上で追加することができます。
リソースを追加するには、作成中のプロジェクトを右クリックし、
メニューより「追加」→「リソース」を選択します。

win_005_001.png

追加するリソースを選択する画面が出てくるので、
メニューを選択し、「新規作成」を選択します。

win_005_002.png

メニューを作成する画面が出てきますので、適宜メニューを追加していきます。
今回は、「ファイル(&F)」と「オプション(&O)」の2つのメニューで、
さらに「ファイル(&F)」が選択された場合に、「終了(&X)」が出てくるようにします。
メニュー名の横についている(&F)とは、メニューに対するショートカットキーで、
Alt+指定のキーでそのメニューが選択されるようになります。
Windowsのアプリケーションのほぼ全てに、そのようなショートカットがついていますので、
ここでもその作法に則っています。

win_005_003.png

各メニューを追加するときに、同時にプロパティも設定します。
いくつか説明します。
ID   :メニューを識別するためのID
Caption:メニューのタイトル
Enabled:メニューの初期有効性
Grayed :メニューの初期選択可能状態
Popup :ポップアップメニューかどうか
     Trueの場合、このメニューの下にさらにメニューがくる

「オプション(&O)」と「終了(&X)」は選択するメニューですので、
PopupをFalseにします。
「ファイル(&F)」は、それ自身を選択することはなく、下に子メニューを持つので
PopupをTrueにします。

これで、メニューの準備ができました。
同様にアイコン、カーソルも追加します。

これら作成したリソースは「sample005.rc」ファイルとして保存されます。
このファイルをテキストエディタで開くと、実際にはどのように定義されているか
大まかにわかると思います。
これらの定義についてはここでは省略します。


では作成したリソースをプログラムに組み込んでいきましょう。
前準備として、先ほどのリソースと同時に作成された「resource.h」を
インクルードします。
#include "resource.h"

このヘッダでは、リソースを識別するためのIDが定義されています。
このIDを元に、プログラムでリソースを指定します。

ウィンドウにリソースを追加するには、
ウィンドウを定義するウィンドウクラスの指定を変えてあげる必要があります。
wcl.hIcon   = LoadIcon( hInstance , (LPCWSTR)IDI_ICON1 );    // ウィンドウのアイコン
wcl.hCursor = LoadCursor( hInstance , (LPCWSTR)IDC_CURSOR1 );// ウィンドウのカーソル

以前のプログラムまで、Windowsに用意されていたアイコンとカーソルを
今回作成したものに差し替えます。
リソースはリンク時に実行ファイルに含められるので、
ここでは、上記関数の第1引数で、リソースの定義されている場所、
すなわち自分自身のインスタンスを指定します。
第2引数で、resource.hに定義されているIDを文字列として渡してあげます。

さらにメニューを追加します。
wcl.lpszMenuName = (LPCWSTR)IDR_MENU1;

これで全ての準備が整いました。

メニューが選択された場合、メッセージとして飛んできますので、
メッセージハンドラにメニューに対する処理を追加します。
case WM_COMMAND:
// メニュー処理
switch( LOWORD( wParam ) )
{
case ID_MENU_EXIT: // 「終了(&X)」
// アプリケーションを終了させる
PostQuitMessage( 0 );
break;
case ID_MENU_OPTION: // 「オプション(&O)」
// とりあえずの処理
MessageBox( hWnd , TEXT("メニューのオプションが選択された") , TEXT("メニュー") , MB_OK | MB_ICONINFORMATION );
return 1;
}
break;

メニューが選択されると、WM_COMMANDメッセージが飛んできます。
このメッセージは、wParamの下位16ビットに選択された
メニューのIDが渡されますので、その値を元に条件分岐させます。

次回では、さらに「オプション(&O)」の処理として
設定画面が出せるよう、ダイアログについて触れたいと思います。

(※1)
Windows 95/98/MEなどのWin9x系では、
作成できるリソースは、4MBまでという制限があります。
Windows 2000/XP/VistaなどのWinNT系では
そのような制限がないため、開発でNTを用いてプログラムする上で
この点に注意しないと、9x系で動かなくなってしまいます。

タグ:ふわ猫

2009年06月24日

第0x04回 オセロ製作の第一歩

前回までの内容で、ウィンドウに描画するところまで解説しました。
せっかくのゲームプログラミングの解説なのに、
Win32APIの解説だけでは眠くなってしまいますので、
ここまでのまとめとして、オセロの骨組みを作成してみたいと思います。

まずは、オセロ盤、駒を表示し、盤をクリックすると駒が置かれるという
シンプルなものを作ってみましょう。
それでは、早速サンプルです。


(ソースコードのみ)
WinMain.h
WinMain.cpp
Board.h
Board.cpp

(プロジェクトファイル)
sample004.zip

class Board

オセロの盤はBoardというクラスに処理をまとめました。
これにより、ゲームに関することはこの部分を修正していくという流れに
なります。
クラスの構造を説明します。
// WM_PAINTメッセージハンドラ
void OnPaint( HWND hWnd );
// WM_LBUTTONDOWNメッセージハンドラ
void OnLButtonDown( HWND hWnd , int x , int y );
// WM_RBUTTONDOWNメッセージハンドラ
void OnRButtonDown( HWND hWnd , int x , int y );

これら3つのメンバ関数は、メッセージを処理するための関数です。
これは、メッセージのコールバック関数より呼ばれ、
引数として、そのメッセージに関連することを渡しています。
このように、メッセージ処理を委譲し、処理させる関数を
メッセージハンドラと呼びます。
今後、オセロゲームに関連するメッセージ処理は、
このメッセージハンドラに記述します。
// 置かれている石の状態
STONE_KIND m_nStone[ MASS_NUM_X ][ MASS_NUM_Y ];

これは、置かれている石の状態を示すフラグです。
2次元配列で、各マスに対応しています。
配列の中身は次の値をとります。
// 石の状態
enum STONE_KIND
{
None = 0 , // 置かれていない
Black = 1 , // 黒
White = 2 , // 白(※1)
};

Noneは、石が置かれていない状態、
BlackとWhiteは、それぞれ石が置かれている状態になります。
石を追加する場合や変更する場合、この配列のフラグを
置き換えるだけにし、描画のタイミングで石の表示状態を
一気に更新するようにします。

実際の描画処理はBoard::OnPaint()関数に記述されています。
このように、描画処理を一箇所にまとめておくと、
プログラムの見通しがよくなり、修正が簡易になります。

Board::OnLButtonDown()関数の中に入っている
以下の関数に注目してください。
InvalidateRect( hWnd , NULL , FALSE );

これは明示的にWM_PAINTメッセージを呼び出す関数です。
第1引数は、メッセージを送るウィンドウハンドルを指定します。
第2引数は、再描画する範囲をRECT型(矩形)で指定します。
NULLを指定する場合には、全体が範囲になります。
第3引数は、背景を再描画するかをTRUEもしくはFALSEで
指定します。
ウィンドウの背景描画には、ウィンドウを作成したときに指定した
次のブラシが使用されます。
wcl.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );

今回は盤を塗りつぶすため、無駄な処理を省くためにFALSEを
指定しています。

以上で、オセロのベースの部分ができました。
今後、このベースを発展させて、ゲームを作成していきたいと
思います。


(※1)
enumの最後の,(カンマ)は本来必要ないのですが、
ここではあえて含めています。
これはC言語の仕様として合法です。
こうすることにより、今後値が追加されたとしても
カンマを忘れずにすみます。

タグ:ふわ猫

2009年06月19日

リポマップ [RepoMap]のデモサイトオープンしました。

リポマップ[RepoMap]のデモサイトをオープンしました。

デモサイト
http://repomap.raxus.jp

携帯サイトはQRコードでアクセス
image10371.jpg

携帯アプリをダウンロードして、写真を地図上に投稿できます。

image1038.jpg  image1036.jpg
タグ:raxus
posted by ラクサス at 15:32| Comment(0) | TrackBack(0) | お知らせ | このブログの読者になる | 更新情報をチェックする

2009年06月18日

第3回 画面に文字を表示してみよう

コンピューターが色々と処理を行ってくれていても最後に結果がわからなければ使いづらいですよね。


環境も整えた所で今回はまず画面に文字を表示する簡単なプログラムを作って行きましょう。


まずはテキストエディタなどを開いて次の様な文書を作りましょう。



class Hello

{

public static void main(String[] args)

{

System.out.println("Helloooooooo");

}

}






" " (ダブルクォーテーション)の中には特殊な記号以外なにを入れてもかまいません。好きな文字列を入れましょう。


public や void など色々と単語が並んでいますがこれらについてはまた後で説明します。とりあえずはこういう形式で文字表示が可能、という事を覚えておきましょう。


あと私のインデントの仕方が変に思われる方もいらっしゃると思いますが、自分は学生時代初めてプログラミングを学んだ時、基本的に対応し合っている括弧の位置を縦に合わせるようにと学んだのですが、周りの方達のやり方を見るとどうもそういう書き方はマイナーなようです。でもJavaの場合余白の付け方はプログラムに影響しませんので自分が綺麗で見やすく感じた風に書くのが良いでしょう。


気をつける点としては、「これはJavaプロフラムです」と認識させる為に、ファイル名はclassの後につけた単語と同じにして、拡張子.javaをファイル名につけましょう。基本この単語、ファイル名の始めは大文字にします。

このエディタで作ったファイルをJavaプログラムとして実行するのですが、簡単なプログラムですのでコマンドプロンプト(Macの場合はターミナル)を開きましょう。




OSやPCによってプロンプトの細かい箇所が異なる事があるためここではCUI(Character User Interface = コマンドプロンプト等のテキストしか無いインターフェース)の詳しい説明はいたしませんが、作ったプログラムが実行できるぐらいの簡単な説明をさせていただきます。




まずは先ほど作ったファイルがある場所へ移動しましょう。





cd 移動先場所





OSやPCによって細かい使用は異なりますが、例えばデスクトップにファイルを保存した場合、cd /home/自ユーザー名/Desktop, または cd /Users/自ユーザー名/Desktopと書きます


これからこのプログラムを実行するのですが、Javaの場合、このソースコードををコンピューターが理解できる「バイトコード」に変換するためまずは「コンパイル」という作業が必要です。





javac Hello.java





Hello.javaの部分には先ほど作ったファイル名が入ります。この javac というコマンドでコンパイルします。

これであたらしくHello.classという新しいファイルが作られるはずです。ここからようやく実行する事ができますまで次のコマンドを打ちましょう。





java Hello





この java というコマンドで Hello というファイルを実行します。





java Hello

Helloooooooo






さきほどのダブルクォーテーションの中に入れた文字が表示されていれば成功です!


あとMacのテキストエディタの場合等、拡張子に.javaとつけられない場合もあります。そんな時は、こちらのターミナルの方から名前を変えましょう。




mv 元のファイル名 変更後ファイル名





これで好きなように名前を変えられるはずです。


次回は、先ほどのようにプログラムを作る上での細かい所を少し説明して行きます。
タグ:G

2009年06月17日

不況に勝つ会社

昨年の10月以降、特に今年に入ってから
IT業界の経営者やIT業界に属する方たちとお会いすると
ほとんどの方から、不況のため仕事がなく厳しいというお話を聞きます。
具体的には、顧客から以下のような話が出ることが多いそうです。

・全体的に案件が減っているので、今は仕事がない
・顧客から単価を下げて欲しいと言われた
・現在請け負っているプロジェクトの要員を減らして欲しいと言われた

会社によっては、全社員の半数以上が仕事がなく、
自社で待機しているような会社もあります。

はたして、不況だけがこのような状況を作る要因なのでしょうか?

逆に、少数ですがこの時期に業績を伸ばしている企業もありました。

一つ目の会社は、技術力だけでなく業務知識が豊富な会社です。
大企業である顧客と太いパイプを持ちながら、技術力と豊富な業務知識で
他社に仕事を取られない状況を作り出している会社です。
正社員の雇用にもそれほど力を入れず、地道に事業を行っている会社です。

二つ目の会社は、非常に営業力が強い会社です。
大手から中小まで、かなりの数の顧客から仕事を依頼され
またその顧客を通して、新しい顧客を獲得しようと頑張っています。
また、ビジネスマッチングサイトの活用をしたり、
営業でもない方でも仕事がなければ、電話にてセールを行うなど
積極的に動いています。

次の会社は、広く事業を展開している会社です。
リスク分散を意識し、受託開発業務、派遣業務、
自社サービス、一般消費者向けのサービスなどを展開している会社です。
実際BtoBの業務は少し落ち込んでいるようでしたが、
BtoCの業務は堅調に伸びているそうです。

上記の3社に共通しているのは、自社の特性を自身で分析し
その特性を生かした事業を展開しているということだと思います。

さもすれば、業績が伸びているので社員をどんどん増やし、
事業を拡大するのも手だと思いますが、様子を見ながら
自分の背丈以上のことはせず、確実一歩づつ進んでいるように見えました。

各社とも、協力会社をうまく利用し、確実に需要が増えると
判断した場合のみ、正社員を雇っているようです。

また、どの会社も技術力や提案力、アイデア、行動力など
基盤は違いますが、広い意味で強い営業力を持っている会社だと感じました。
タグ:社長
posted by ラクサス at 15:23| Comment(0) | TrackBack(0) | 会社設立 | このブログの読者になる | 更新情報をチェックする

2009年06月16日

ゲーム数学5(円と線分の当たり判定)

円と線分との当たり判定

ソースを見ていたら、昔作った円と線分との当たり判定の関数が出てきましたので公開してみます。

内容としましては、半径rの円の中心(x, y)(sx1, sy1)(sx2, sy2)を結ぶ線分との当たり判定です。
考え方としては円の中心から線分へ垂直に交わる直線を想定し、その交点を求めます。
その交点は円と直線との最短距離になりますのでその点から円の中心の距離と半径の長さを比べて当たり判定しています。



  /**
   * 円と線分の当たり判定
   */
  public void judgeHitScopeLine(int sx1, int sy1, int sx2, int sy2) {
      int dx, dy;
      
      // 線分の端と端の距離をx,y軸個別に求めます
      int sx = sx2 - sx1;
      int sy = sy2 - sy1;
      
      // x軸方向に位相差が存在する場合は円の中心から線分へ垂直に交わる直線と線分の交点を求めます。
      if(sx != 0) dx = ((y-sy1)*sx*sy + x*sx*sx - sx1*sy*sy) / (sx*sx + sy*sy);
      // 位相差がない場合はsx1=sx2になっているので線分のx方向の位相差はない
      else dx = sx1;
      
      // y軸方向の位相差が存在する場合は円の中心から線分へ垂直に交わる直線と線分の交点を求めます。
      if(sy != 0) dy = ((x-sx1)*sx*sy + y*sy*sy - sy1*sx*sx) / (sy*sy +sx*sx);
      // 位相差がない場合はsy1=sy2になっているので線分のy方向の位相差はない
      else dy = sy1;
      
      // 当たり判定する必要があるか
      if(isjudgeHitScopeLine(sx1, sy1, sx2, sy2)) {
          // 円の中心から求めた交点の距離と半径を比べて当たり判定する
          if((x-dx)*(x-dx)+(y-dy)*(y-dy) < r*r) return true; 
      }
      return false;
  }
  /**
   * 当たり判定するかどうかの判定
   */
  private boolean isjudgeHitScopeLine(int sx1, int sy1, int sx2, int sy2) {
      // 線分の端から円と接触している可能性があるかどうか判定する
      if(x <= (Math.max(sx1, sx2) + r) && x >= (Math.min(sx1, sx2) - r)) {
          if(y <= (Math.max(sy1, sy2) + r) && y >= (Math.min(sy1, sy2) - r)) return true;
      }
      return false;
  }

タグ:六本木店長
posted by ラクサス at 11:53| Comment(0) | TrackBack(0) | 技術情報 | このブログの読者になる | 更新情報をチェックする

2009年06月15日

閑話休題その1 国際対応プログラミング〜UNICODE〜

2009年現在、UNICODEというものが徐々に浸透しつつあります。
WindowsでもWindows2000から完全にUNICODEに対応し、
WindowsVistaやWindows7で、標準的な位置づけになっています。
これからプログラミングを行う上で、UNICODEを考慮することは
必須条件であり、特に日本語というコンピュータで扱いにくい言語を
取り扱うためには、避けられないものです。


それでは、文字列がどのように処理されているのか
見ていくことにしましょう。

C言語では文字列を次のように取り扱います。

char str[256] = "ABC日本語もオッケー";


char型は1バイトの整数です。
これを1文字として、その配列で基本的には表現されています。
ANSI(ASCII)(※1)では、'A'〜'Z'をそれぞれ0x41〜0x5A、
'a'〜'z'を0x61〜0x7Aに割り当てています。(ShiftJISでも同様です)
全角文字や特殊文字などは、2バイトを使用して表現されています。
ShiftJIS(※2)では、1バイト目に0x81〜0x0x9Fと0xE0〜0xEFまで使われ、
2バイト目に0x40〜0xFC(0x7F除く)までが割り当てられています。

はじめ、コンピュータ発祥の英語圏などではアルファベット26文字と
数字やいくつかの記号しかなく、1バイト(256種類)を
1つの文字として割り当てられていたのですが、
のちに日本語などを表現する上で、漢字など膨大にある文字を1バイトで
表現する手段がなく、2バイトに拡張していったという経緯があります。

上記str配列には1バイト文字と2バイト文字の混在状態になっています。
この混在している状態というのが厄介で、例えば

str[4] = 'D'; // 文字化けする


このようにしてしまうと、たちまち文字化けしてしまいます。
アメリカ製のプログラムで、日本語が使用できないのは、
このあたりの考慮がされていないことが、原因のひとつです。

このようなタイプの文字コードの代表は次のとおりです。

ANSI(ASCII)アメリカ圏で古くから使われている
ShiftJIS  日本語圏のWindowsで主に使われている
EUC    日本語圏のUNIX(Linux)で主に使われている
その他、国ごとに文字コードが存在する




脱線しますが、文字化けの原因としてもうひとつに
WindowsとUNIX(Linux)間での改行文字の持ち方の違いがあります。

UNIX(Linux)
"1行目です\n2行目です"

Windows
"1行目です\r\n2行目です"


Windowsでは、\rすなわち、キャリッジリターンが含まれます。
UNIX(Linux)では、キャリッジリターンは不要です。
この違いにより、WindowsのファイルをLinuxなどに転送した場合
文字化けすることがあります。


さて、国ごとに文字コードが違い、取り扱い方も違うので
複数の言語に対応することが困難になったことから
策定されたのがUNICODEという規格です。
基本的な考え方として、全ての文字を2バイト(※3)として扱い、
文字に使用できるコードを多くしたという点です。

このようなタイプの文字コードの代表は次のとおりです。

UTF-8   LinuxやMac OS Xなどの標準文字コード
UTF-16 Windowsなどで多く使われている



C言語で表現すると次のようになります。

wchar_t str[256] = L"ABC日本語もオッケー";


wchar_t型は2バイト整数です。
この2バイト整数の配列として文字列を表現しています。
これにより、さきほどの問題が解決されることになります。

str[4] = L'D'; // 文字化けしない


ちなみにLは2バイト文字列を指定するためのプレフィックスです。

また、C標準関数なども、2バイト文字列に対応するものを
使用しなくてはなりません。
例えば、次のようになります。

(非UNICODE)
char str[256] = "文字列の表示です";
printf( "%s" , str );

(UNICODE)
wchar_t str[256] = L"文字列の表示です";
wprintf( L"%s" , str );



プログラムを行う上で、以上のことを考慮すれば、
国際的に対応したプログラムを作成することが容易となります。
変数の持ち方や、関数の変更など、
既存のプログラムを修正するのは非常に困難なため、
新たに作成するプログラムは、はじめからこれらのことを
考慮したほうが、スムーズに保守することができます。



(※1)
ANSI(American National Standards Institute)
米国規格協会
アメリカにおける工業分野の標準規格

(※2)
JIS(Japanese Industrial Standards)
日本工業規格
日本における工業分野の標準規格

ANSIもJISもその国の標準規格で、
国際的な規格としてはISOなどがある。

(※3)
しかし、それでも足りず、Unicode 2.0以降では
さらなる拡張が行われている。



(参考資料)
C言語による最新アルゴリズム事典(奥村晴彦著)
技術評論社

タグ:ふわ猫

2009年06月09日

tail -f でログファイルを出力するときに、文字コードを変換する方法

linuxなどで、OSの文字コードとログファイルの文字コードが異なるため、「tail -f test.log」 でログを出力すると文字化けする場合は、以下のコマンドで解決します。


tail -f test.log | nkf -u -e (EUCに変換)
※OSがEUCで、ファイルがUTF-8などの場合

tail -f test.log | nkf -u -w
 (UTF-8に変換)
※OSがUTF-8で、ファイルがEUCなどの場合

ポイントはnkfの「-u」オプションです。
-u : 出力時に、バッファリングしない。
タグ:どなん
posted by ラクサス at 19:36| Comment(0) | TrackBack(0) | 技術情報 | このブログの読者になる | 更新情報をチェックする

2009年06月08日

第2回 開発環境を整えよう

前回の終わりに今回は実際のプログラミングの説明を初めて行くと言いましたが、その前に一つ重要な事がありましたね。

Javaを動かしたり開発するための環境作りです。

Javaを使ってのプログラム開発には、Java開発キット(JDK=Java Development Kit)が必要です。Javaでプログラムを開発するために必要なものと開発されたものを実行するものは厳密に言えば別のものなのですが、このツールには、Javaで作られたプログラムを実行するために必要な環境、Java実行環境(JRE = Java Runtime Environment)も含まれています。

2009年6月現在、こちらのページから無料でダウンロードできます

Java SE ダウンロード(日本語ページ)

http://java.sun.com/javase/ja/6/download.html


同じJDKでも様々な種類が見られますが、これは開発したプログラムが実際に使われる用途であったり、開発に必要なオプションや追加機能によって分けられています。Javaで作ったプログラムを別の場所から持って来て自分のマシンで実行したいだけならJREを個別にダウンロードする事も可能ですが、今回は実際にプログラムも書いて行きたいので、JDKをダウンロードしましょう。

一般的には常に公開されている最新のバージョンを使用するのが良いとされていますが、プログラムの用途、設計、周りの開発環境などにもよりますので迷った時には経験者の方に聞くのが良いでしょう。

利用規約に同意したら、使っているOSに応じてダウンロードを開始して、好きな場所に保存しましょう。


先日Javaで作ったプログラムは、どのOSにも左右される事も無く動かせると説明しましたね。

書かれて世に出されたプログラムはどのOSでも実行する事はできますが(run anywhere)、実際にプログラムを書く(write once)開発環境の実装の手順はお使いのOSによって少々異なる点もあるということです。


ちなみにMacの場合はすでにPC内に開発キット(JDK)や実行環境(JRE)が実装されている場合が多いので、バージョンを確認したい場合や最新のバージョンにアップデートしたい場合などはアップルメニューからのソフトウェア・アップデートから確認すると良いでしょう。定期的に自動で行われるアップデートで最新のバージョンが内蔵されている場合が多いですが、PC内に既にインストールされている環境やほかのアプリケーションによってはうまくいかない場合もあります。Macの場合はApple社が無料で配布していますので例えばMac OS X 10.5 をお使いの方でしたらこちらのページから別にダウンロードすると良いでしょう。

Java for Mac OS X 10.5 Update 2(日本語ページ)

http://www.apple.com/jp/ftp-info/reference/javaformacosx105update2.html


JDKをインストールして開発環境を整えるのはそれほど時間もかからず複雑な作業ではありませんが、区切りが良いので実際のプログラミングは次回からにしましょう。

次回は、画面に文字を表示させたり基本的な文法について説明していきます。
タグ:G

2009年06月04日

第0x03回 初めてのグラフィックプログラム

前回までで、ウィンドウを表示することができました。
実際にウィンドウを表示したら次の段階として、
ウィンドウの中に画像やテキストなどを描画するという
要求が発生します。
今回は、それらの基本的な描画について
説明していきたいと思います。

Windowsでは、テキストや画像をする際に、
ウィンドウに直接要求を出さず、一段階クッションをおき、
抽象化を行っています。
この抽象化の部分を『デバイスコンテキスト』と呼んでいます。
デバイスコンテキストを用いることで、
ウィンドウへの表示はもちろんのこと、
印刷などの作業もデバイステキストを用いて行うので、
共通化させることができるなどのメリットがあります。

描画処理 → デバイスコンテキスト →ウィンドウ
→印刷



それでは早速サンプルプログラムを見ていくことにしましょう。

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


順を追って重要なポイント見ていきましょう。

case WM_PAINT:


WM_PAINTメッセージとは、ウィンドウが再描画されるべきタイミングで
呼ばれるものです。
具体的には、次のような状況でWM_PAINTメッセージが発生します。

・ウィンドウのサイズが変更された
・ウィンドウが最小化から最大化など状態が変化した
・ウィンドウで隠されていた部分が表示された

一般的にはこのWM_PAINTメッセージ処理に
ウィンドウの描画処理を記述します。

ウィンドウに描画するためには、まずウィンドウの
デバイスコンテキストを取得する必要があります。
取得する方法として、次の2種類があります。

hdc = BeginPaint( hWnd , &ps );
// ... 描画処理 ...
EndPaint( hWnd , &ps );



hdc = GetDC( hWnd );
// ... 描画処理 ...
ReleaseDC( hWnd , hdc );


上と下は共にウィンドウのデバイスコンテキストを取得する関数です。
BeginPaint()もしくはGetDC()の戻り値としてHDCが返されます。
HDCは、デバイスコンテキストのハンドルになります。
WM_PAINT内では、GetDC()関数を使うことはできないので、
BeginPaint()関数でデバイスコンテキストを取得します。
取得したデバイスコンテキストは、使用後、解放する必要があります。

デバイスコンテキストが取得できたら、それを使い実際に
描画をしていきます。
線を描画する関数は次のとおりです。

MoveToEx( hdc , 150 , 200 , NULL );
LineTo( hdc , 400 , 450 );


描画を行う関数は、基本的にデバイスコンテキストを引数として
渡します。
まず、MoveToEx()関数で現在のカレントポジションを変更します。
第2引数、第3引数で、移動するカレントポジションを指定します。
続くLineTo()関数で、実際に線を描画します。
LineTo()関数は、現在のカレントポジションから
第2引数、第3引数で指定した座標まで線を引きます。
その後、カレントポジションは指定の場所まで移動します。

四角形や、円なども同様にデバイスコンテキストを用いて
描画することができます。
これらの図形を描画する関数を
『GDI(Graphics Device Interface)』と呼びます。
また、WindowsXPで新しく登場したGDI+というものもあり、
それを使うことにより高度な表現もできるようになりました。

テキストの描画を行う関数は次のとおりです。

TextOut( hdc , 100 , 400 , szBuffer , lstrlen( szBuffer ) );


第2引数、第3引数で表示する座標を指定し、
第4引数で文字列、第5引数で文字列のサイズを指定します。
この関数は、改行することができませんので、
改行が必要な場合、適切に配置する必要があります。


これらの図形描画を行う際に、色や種類を指定することも
できます。
線の形状を指定するものを『ペン』、
塗りつぶしの形状を指定するものを『ブラシ』と呼びます。
これらは、『リソース』と呼ばれているもので、
リソースは不要になった時に必ず解放を行わなければなりません。

ペンの作成は次のとおりです。

hPen = CreatePen( PS_SOLID , 2 , RGB(0,0,255) );
// ... ペンの使用 ...
DeleteObject( hPen );


CreatePen()関数で、ペンの作成を行います。
第1引数でペンのタイプ、第2引数で太さ、第3引数で色を指定します。
戻り値で、作成されたペンのハンドルが返ってきます。
不要になった場合、DeleteObject()関数で解放を行います。

作成されたペンを実際に使用するためには、
デバイスコンテキストに関連付けを行わなければなりません。

hOldPen	= (HPEN)SelectObject( hdc , hPen );


SelectObject()関数で、デバイスコンテキストに関連付けを行います。
この関数は少し特殊で、ペンやブラシなどのリソース全てを
この関数で行います。関数は、引数で渡された変数のタイプにより
判別することになります。
戻り値としてHGDIOBJが返されますが、これは入力された引数に
応じてキャストして使用することになります。
なお、戻り値として以前に関連付けられていたペンが返されます。
元に戻す場合には、このハンドルを使いSelectObject()で
戻すことになります。
関連付けられた状態で、DeleteObject()などで解放してしまうと
予想できない状態になってしまいますので、
DeleteObject()をする前に古いリソースに戻してから
解放するのが行儀のよいプログラムと言えます。
ペンを関連付けられたことにより、
これ以降、線描画などで新たなペンを使用して
描画するようになります。


以上で、基本的な描画ができるようになりました。
次回は、メニューやアイコン、カーソルなどについて
解説したいと思います。
タグ:ふわ猫

就職状況

弊社は2008年2月1日に会社を設立しましたが
当初、社員を募集するにあたりハローワークを利用しました。
3ヶ月間、掲載しましたが未経験の方が1名のみという応募状況でした。
その後、人材紹介会社のサービスを半年間利用し、
中途採用で1名の方に入社いただけました。
またその後、別の人材紹介会社のサービスを2ヶ月利用し、
中途採用合同フェアーにも参加し、
ようやくもう1名の方に入社いただけました。
そして初心に返り、またハローワークを利用したところ
1日に3名程度の応募があります。(2009年5月末時点)
この現象には、非常に驚きました。
人材紹介サービス以上の反響があり、正直驚きました。
ラクサスでは、若く優秀な人材を引き続き募集しております。
我こそはという方を、お待ちしております。
タグ:社長
posted by ラクサス at 14:10| Comment(0) | TrackBack(0) | お知らせ | このブログの読者になる | 更新情報をチェックする

2009年06月01日

バーコードスキャンアプリの製品を発表しました

バーコードスキャンアプリの製品を発表しました。

携帯アプリで複数商品のバーコードを読み取り、一括購入をサポートします。
従来の携帯アプリでは、ひとつの商品しか読み取ることが出来ないので、複数の商品を購入するには手間がかかりました。

バーコードスキャンアプリでは、複数商品のバーコードを連続で読み取り、商品情報をまとめて表示することができます。


デモサイトオープン!

アプリをダウンロードして、ECサイトでの購入と買取を体験できます。

携帯からアクセス↓↓
barcode.gifbarcodeqr.gif

barcode1.gif  barcode2.gif
タグ:raxus
posted by ラクサス at 12:16| Comment(0) | TrackBack(0) | お知らせ | このブログの読者になる | 更新情報をチェックする
×

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