API-8 ダイアログウィンドウを使ったアプリケーション

API関連の本やwebページを見ていると、一般にWindowsAPIでアプリケーションを作る場合、
メインとなるウィンドウを作り
そのウィンドウの上にコントロールなどのいろいろな部品を置く
という感じになるみたいです。


で、場合によってはメインウィンドウをダイアログにしたいことがあります。
ダイアログならリソースエディタでコントロールを簡単に配置できるからです。
それがダイアログウィンドウで、Windows付属の電卓なんかがそうらしいです。
http://wisdom.sakura.ne.jp/system/winapi/win32/win89.html

WNDCLASS構造体のメンバに値を代入するとき、
cbWndExtraメンバの値をDLGWINDOWEXTRAとし
lpszClassNameメンバで決めたクラス名をダイアログリソースのCLASSで指定します。

ウィンドウを作るとき、CreateWindowのかわりにCreateDialogを使います。
第3引数は0
通常は親ウィンドウを指定するのですが、親がない
第4引数はNULL
通常はダイアログプロシージャを指定するのですが、ダイアログウィンドウではWNDCLASSで指定されたプロシージャが使用される

ダイアログウィンドウはウィンドウと同じ扱いなので、作成時にはWM_INITDIALOGではなくWM_CREATEメッセージが送られてきます。



2009.3.25追記
BCC+BCCForm環境の注意点

BCCFormで作ったリソースファイルをそのまま使うことができません。
作ったリソースファイルをテキストエディタで開き、DIALOGの中にCLASSパラメータを追加します。

 IDD_DLG DIALOG ・・・・・・・
 EXSTYLE WS_EX_DLGMODALFRAME
 STYLE WS_POPUP | ・・・・・・
 CAPTION "ダイアログのキャプション"
 CLASS "DLG" // これを自分で入力
 FONT 10, "MS P明朝"
 ・・・・・・
今度は逆にBCCFormで編集することができなくなります。
編集する場合は、リソースファイルをテキストエディタで開いてCLASSパラメータを消します。

にこ動 VOCALOID-SONG

ビー玉流星
優しい感じの曲です。

ファミリンコンピューター
ファミコン→スーファミくらいの世代なので、けっこうわかる

dance in the red moon with 初音ミク
独特ですが、こうゆうのも好きです。
同じ作者さんの帰郷風想、完成版を待ってます。

にこ動から

ラジカルペイント
元ネタが、わかる私は、ミク廃。

1画面マリオ
こんなすごいのがあったなんて、知らなかったです。

『ブラック会社に勤めてるんだが、もう俺は限界かもしれない』を読んでみた

第1部 前半 後半
第2部
第3部
第4部
第5部
完結

以前からほかのブログなんかで名前だけは聞いていました。
で、先日、地元の友人と遊んだときにこの話題が出てきて、私は読んでないけれど人に勧めたりもしました。
なので、この機会にと思い読み始め、そのまま最後まで読んでしまいました。

以下ぐだぐだ文


LALAWAY ルララ

いつの間にか消えていたLALAWAYが復活!
でも、期間限定らしいです。


ルララfull完成!
暫定版のときから待ってました。

API-7 WinMainをD&Dで起動

WinMain関数の第3引数はコマンドライン引数です。
ただし、main関数のように引数の数(argc)とそれぞれの引数(argv)のように分けられず、渡された引数全てがひとつの文字列として代入されています。
また、実行ファイル自信のパスは含まれていません。

GetCommandLine関数を使えば、渡された引数だけでなく自身のパスも得ることができます。
でも、こっちもひとつの文字列として。
http://www.wisdomsoft.jp/dev/api/windows/005

それぞれの引数はダブルクォーテーションとスペースで分けられているので、自分で分解する必要があります。
[技術者向] コンピューター > プログラミング > C&C++ ">http://oshiete1.goo.ne.jp/qa2889140.html

main関数みたいにできないかと探してみたところ、__argcと__argvを使えば、main関数と同じように引数を使うことができるみたいです。
ただし、コンパイラに依存してしまうみたいです。
http://win32lab.com/tips/tips3.html


WinMainでもmainでも、ファイル名が長いとダブルクォーテーションが追加されないようです。
そのとき、ファイル名に半角スペースが含まれていると、スペースで分けられてそれぞれ別の引数としてargvに代入されてしまうみたいです。

サンプル
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// Borland C++ Compiler 5.5 にてコンパイル

#include <windows.h>

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                        LPSTR lpsCmdLine, int nCmdShow)
{
        TCHAR    ss[256];
        INT        i;
        
        MessageBox(NULL,lpsCmdLine,TEXT("lpsCmdLine"),MB_OK);
        MessageBox(NULL,GetCommandLine(),TEXT("GetCommandLine"),MB_OK);
        wsprintf(ss,"%d",__argc);
        MessageBox(NULL,ss,TEXT("__argc"),MB_OK);
        for(i=0; i<__argc; i++)
        {
        wsprintf(ss,"%d\n%s",i,__argv[i]);
        MessageBox(NULL,ss,TEXT("__argv"),MB_OK);
        }
        return 0;
}

さあ、実験だ、とこれまで何度も言っている

言ってるのですが、そのうち、実際にすぐ実験に入ったのはどれほどでしょうか?
大抵、言ってから数日後に実験が始まっているような気がするのですが、気のせいでしょうか?

金曜に試料作りを終え、今日から実験に入る予定だったのですが、機械のメンテや、装置やら何やらのセッティングで、1日が過ぎてゆきました。
こんなことばかりな気がします。


今日の心に残った一言
「フレキシブル平行四辺形変形」

フレキシブルという単語から感じる、なんだかすごそうな響き。
その次にいきなり平行四辺形。
フレキシブル平行四辺形、合わさると、なんだか怪しそうな感じ。
そして変形が続くことで、繰り返される、へんけい。

すごそうで、なぜかチープな感じの響き。
なんだか、印象に残ったのです。

API 6- 5日かかってツールバー

 メニュー、アイコン、カーソルと来て、次はツールバーです。
 このツールバー、問題だらけでした。

 ツールバーを使うためには、"commctrl.h" をincludeし、"ComCtl32.lib" をlinkする必要があります。
 ComCtl32.libはコンパイラが自動的にlinkしてくれるので、ソースでは、commctrl.hをincludeするだけです。
 いつものように本を見ながらソース入力。

 まず、「未解決の外部シンボル」エラー。

 ツールバー関連の関数本体が行方不明らしいです。ちゃんとincludeしてlinkできているはずなのに。
 ComCtl32.libをプロジェクトに入れて、コンパイルしてみたら解決。力ずく
 linkの設定、間違ってたんでしょうか?


 次、「"○○"の命令が"△△"のメモリを参照しました。メモリが"read"になることはできませんでした。」エラー。

 ここの解決に時間がかかりました。
 CreateToolbarEx関数を実行するところでエラーが出て停止してしまうのです。
 引数がまずいのか、リソースがまずいのか、bmpがまずいのか、原因がまったく不明。
 本を見てもよくわからない引数があります。ひとまず、無視。
 リソースはほぼ手書き状態。本についてきたリソースファイルはエディタ製で比較できない。
 とりあえず、本についてきたお手本のbmpを使ってみる。
 すると、動いた!
 どうやら、ここに原因があるようです。

 ならば、自作bmpとお手本bmpとの違いは何か?
  • 絵柄(違って当然といえば当然)
  • 画像のサイズ(幅と高さ)
  • ファイルのサイズ(○○バイト)
  • ビットの深さ(プロパティにて発見)
・・・・・・、ん?ビットの深さ?何でしょう?
 それに、幅・高さはそんなに違わないのにファイルサイズがけっこう違う。
 どうやら、これは色数の違いみたいです。
 ペイントで開いて名前を付けて保存を選ぶと、bmpでも24bit、256色、16色、モノクロの4種があります。ここで気付きました。
 いつも使っているペイントソフトのbmp形式保存は単にbmpのみ。
 自作bmpは24bit、お手本bmpは16色。
 カーソルのときと同じような原因でしたね。

 いろいろ試してみると、24bitのときにエラーが出ます。

API 5- オリジナルなアイコン・カーソル

 リソースつながりで、今回はアイコンとカーソル。
 どちらも、リソースに画像を登録して、LoadImage関数で読み込んで、WNDCLASSC構造体に渡すだけ。
 やることは簡単です。

 が、いつものごとく、問題が出てくるのですな。


 LoadImage関数の引数に少々迷ったものの、アイコンは無事実装。

 問題はカーソル。
「resource file ○○ is not in 3.00 format」
てなエラーが出ます。
 用意したカーソル画像が3.00formatじゃないということです。

 アイコン画像(ico)とカーソル画像(cur)は、それぞれ専用のファイル形式なのです。
 ただbmpの拡張子を変えただけのものではありません。
 私が使っているペイントソフトは、ico保存はできるのですが、cur保存はできません。できませんが、無理やり拡張子をcurにして保存。完全にこれが原因です!

 Windows付属のペイントでもcur保存できないようなので、カーソルファイル作成ソフトを探してみるものの、いいソフトは見つからず。
 とりあえず、適当なソフトでcurファイルを作りました。

API-4 メニューを作ろう

 本を飛ばし飛ばしで進めて、今回はメニューを作ってみることに。
 さあ、ここでいきなり問題です。

 リソースの作り方がわかりません。

 リソースというのは、そのプログラムに使うメニューやアイコン、画像ファイルなんかをひとまとめにしたファイルで、開発環境があればリソースエディタというリソース作成ソフトで作れるものです。
 が、Expressにはないんです、リソースエディタ。

 本には、エディタに任せましょう、と書いてあり、エディタでの作り方しか書いてありません。
 自分で書こうにも、書式が不明なので無理

 探しましたよ。リソースエディタ。

 フリーのリソースエディタを探して、いくつか見つかったのですが、ソフト開発用というよりはリソース改造用といった感じで私の望むものではなかったです。

 そして、ようやく見つけたのが"BCCForm"。
 リソースエディタはこれしか知らないので比較できませんが、なかなかに使いやすいです。
 ただ、Borland C++ 用のリソースエディターなので、作ったリソースをそのまま Visual C++ 系で使うことができません。
 まあ、簡単なものならそのまま使えるし、そうでなくても少し手を加えるだけでいいんですが。