2007年6月10日日曜日

ウィンドウを生成するのに必要な構造体(WNDCLASSEX)

ウィンドウを作る手順。
1、WNDCLASSEX構造体にデータを設定する
2、RegisterClassEx関数でクラスを登録する
3、CreateWindowEx関数でウィンドウを生成
こんだけw

今回は「1、WNDCLASSEX構造体にデータを設定する」の構造体について知る
MSDNを参照(http://msdn2.microsoft.com/en-us/library/ms633577.aspx)

英語で書いてあるのを訳せば終わりなんやけどね~。
ちょこっと記述してみた。
typedef struct {
UINT cbSize; //クラスのサイズを設定WNDCLASSとを識別するために必要
UINT style; // ウィンドウのスタイルを設定
WNDPROC lpfnWndProc; //メッセージを処理する関数を登録する
int cbClsExtra; // この構造体に付加する領域のbyteサイズ
int cbWndExtra; // ウィンドウのインスタンスに付加する領域のbyteサイズ
HINSTANCE hInstance; // 実行ファイルのインスタンスハンドル
HICON hIcon; // ウィンドウのアイコンのハンドル
HCURSOR hCursor; // ウィンドウ内のマウスカーソルのハンドル
HBRUSH hbrBackground; // ウィンドウ領域の背景色を塗りつぶすブラシのハンドル
LPCTSTR lpszMenuName; // ウィンドウに表示するメニューの名前
LPCTSTR lpszClassName; // ウィンドクラスの名前、生成する時に使う
HICON hIconSm; // 小さいアイコン
} WNDCLASSEX

ん~ハンドルが沢山あるな…
おいおい詳しくわかってくるやろ

2007年6月8日金曜日

WinMainのWINAPIというおまじないについて

前回の投稿(http://mzs184.blogspot.com/2007/06/mainwinmain.html)で

int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow);

のWINAPIってなんなんやろ~って疑問として残ってましたが、
windef.h内で以下のように定義されていました。

#define WINAPI __stdcall

__stdcallってなんやねん!って調べてたら。
関数の呼び出し規約とかいうものらしい

ここがすごいわかりやすかったので紹介
http://arton.no-ip.info/collabo/backyard/?StdDeclCDecl
-----紹介したサイトの抜粋です
__stdcallは、WIN32 APIの呼び出し規約で、スタックの解放を呼ばれた側が行い(したがって、varargは使用不可)、__cdeclは、スタックの解放を呼ぶ側が行う(したがって、varargを使用可能)。
----
実際にアセンブリコードとの混合モードで解説してあるので
すんごいわかりやすかった!

WINAPIというおまじないはこれで解決っと

2007年6月5日火曜日

mainじゃなくてWinMainなんやね!

仕事で.NET2.0を使ってるんですが、
もうちょと詳しくウィンドウアプリケーションを知っておこうと
C言語にてwindowを作ってみる。
もちろんコンパイラはMinGWのgccコンパイラです。
過去の日記でインストールした時にwinapi関連のライブラリも
インストールできているのでそのまま使います。

で…ネットを検索しまくって
こんなヘッダーをインクルードして。
#include <windows.h>

こんな関数がエントリーポイントになっていると知る。
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow);

そして、意味不明な大文字の型が…
WINAPI 良くわかりません。とりあえずおまじないと思って書いておく
HINSTANCE:void*をtypedefしたやつやった。
     「インスタンスハンドル」やねんて
PSTR:strっていうぐらいやから文字列の型「wchar*」or「char*」をtypedefしたもの
   UNICODEを使えるか使えないかで場合分けしてある

んで各引数の説明
HINSTANCE hInstance
:実行したプログラムを識別するためのもの

HINSTANCE hPrevInstance
:すんごい昔に多重起動を確認するために使われていた今はNULLしか入ってこない

PSTR szCmdLine
:コマンドラインで実行した時の引数、今までも同じものあったからこれは大丈夫かな

int iCmdShow
:ウィンドウの初期表示方法です ウィンドウを生成する時に使うそうな…


以下のコードを書いて簡単に呼び出してみた
メッセージボックスが表示されておしまい。
-------
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
MessageBox (NULL, TEXT("text"), TEXT("caption"), MB_OK);
return 0;
}

-------

TEXT()はマクロでUNICODE対応の場合は文字列の先頭に「L」を付ける

例TEXT("text")
 ⇒UNICODE対応 ⇒ L"text"
 ⇒UNICODE非対応 ⇒ "text"

まだウィンドウは作成できず…

2007年6月4日月曜日

ゴミ箱のパス

ゴミ箱のファイルパスを探してこられるかたが多いようなので
調べてみた。

ごみ箱は以下フォルダ内にありました
C:\RECYCLER

但しシステムファイルを表示するように設定していないと目視で確認できません。

WindowsXP Homeの環境です
システムファイルの表示方法は
「ツール」「フォルダオプション」の表示タブで
「保護されたオペレーティングシステムファイルを表示しない(推奨)」と
「すべてのファイルとフォルダを表示する」の二つにチェックを入れる
これでシステムのファイルかつ隠しフォルダであるC:\RECYCLER
を目で確認できると思います。

2007年6月1日金曜日

フォルダをダブルクリックすると検索ウィンドウが開くように…

フォルダオプションを弄ってたら
フォルダをダブルクリックすると検索ウィンドウが開くように…
右クリックから「開く」ではちゃんとフォルダを開いてくれるのに!!

ってことで調べてみた。
レジストリを弄らないと直らないみたいorz
レジストリを触ると何が起こるかわからないので自己責任のもとで触ってください。

「ファイル名を指定して実行」 から regedit を起動
・HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell
・(既定) を右クリック「修正」でデータに none と記入して「OK」をクリックします

同じようにドライバをダブルクリックで検索ウィンドウが開く場合は
フォルダの場合と同じように
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shellの(既定)のデータを none に修正します

2007年5月30日水曜日

ハンガリアン記法

自分用の記法を作っとこうと
調べてたらこんなの発見
■間違ったコードは間違って見えるようにする
http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

ハンガリアン記法 = 型がわかるだけ
型がわかったからどないやねん!
コンパイル時に型が違ったらErrorかWarningを出してくれるから意味ないやん
って思ってたのにこの考え方が覆されましたよ
引数にin や out を付けるぐらいでしたが、
使われている意味を付けるってのはええ考え方やわ
参考にしよっと。

ちょーっと長い記事ですが読む価値あり!

2007年5月28日月曜日

void型のサイズは?

久々の投稿!

新人教育の際に調べたことを残しておきます。

新人さんがvoidポインタに加算…
VCやと見事にコンパイルエラーw
んで何で?って聞かれたから以下のようなコードを記述して
「void型はサイズが不定やからエラーが出るんやで…」といいながら
gccでコンパイルしてみてん。
----
void* a = 0;
a++;
----
そしたら、コンパイル通るやん!!!
新人さんもビックリやけど、僕はもっとビックリやわ!

何でや何でや?ってとりあえず
printf("%d",sizeof(void));
と打ち込んでgccでコンパイルして実行。
表示された値は「1」 いち?
gccやとvoid型のサイズは 1 とし認識されているようですわ。

※ちなみにVC6.0やとサイズ不定ってエラーが出ます。

C++では型が厳しくなってるからg++でもコンパイルエラーでます。

ラベル