#navi_header|読書メモ| "APIで学ぶWindows徹底理解"のPart1 - Part5までの読書メモです。 この読書メモのスタンス、およびサンプルコードの入手については以下を参照して下さい。 [[652]] #more|| ---- * 【Part 01】Windowsアプリケーションの構造を理解する : Windowsプログラミング入門に位置するMSDN : "MSDN Library" > "Windows Development" > "Getting Started" : Windowを使ったWindowsプログラミングの基本を知りたい : ... > "Learn to Program for Windows in C++" : 良く使うデータ型 : ... > "Learn to Program for Windows in C++" > "Introduction to Windows Programming in C++" > "Windows Coding Conventions" : "Window"という概念について : ... > "Learn to Program for Windows in C++" > "Introduction to Windows Programming in C++" > "What Is a Window?" : "WinMain"エントリポイントについて : ... > "Learn to Program for Windows in C++" > "Introduction to Windows Programming in C++" > "WinMain: The Application Entry Point" : Windowを表示するプログラミングのイロハ : ... > "Learn to Program for Windows in C++" > "Module 1. Your First Windows Program" : ヘッダーファイルで定義されているデータ型を調べたい : ... > "Using the Windows Headers" > "Windows Data Types" : ウインドウプロシージャで、WPARAMやLPARAMの値を取り出すマクロ("HIWORD", "LOWORD", "GET_X_LPARAM", "GET_Y_LPARAM")について調べたい : "MSDN Library" > "Windows Development" > "Windows Application UI Development" > "Windows User Interface" > "Windows and Messages" > "Windows" > "Windows Reference" > "Macros" : C Runtime Library (CRT) 提供の文字列関数(string.h)の代わりに、Win32APIの提供する文字列関数を使ってみたい : "MSDN Library" > "Windows Development" > "Windows Application UI Development" > "Windows User Interface" > "Resources" > "Strings" ** サンプル解説("Part01_Window_A\"フォルダ内) : 01_01.cpp : #block||> 本書42p, リスト3のVC++移植版。44p, リスト6の機能を組み込んでいる。 コンパイル方法: cl 01_01.cpp user32.lib 実行すると簡単なウインドウが表示(リスト3)される。ウインドウのクライアント領域内で左クリックするとメッセージボックスが表示(リスト6)される。 ||< * 【Part 02】ウインドウについて詳しく学ぼう : "Window"の詳細 : "MSDN Library" > "Windows Development" > "Windows Application UI Development" > "Windows User Interface" > "Windows and Messages" > "Windows" : "Window Class"の詳細 : "MSDN Library" > "Windows Development" > "Windows Application UI Development" > "Windows User Interface" > "Windows and Messages" > "Window Classes" ** サンプル解説("Part02_Window_B\"フォルダ) : 02_01.cpp : #block||> 本書51p, リスト2のVC++移植版。 コンパイル方法: cl 02_01.cpp user32.lib 実行すると「メイン・ウインドウ」「子ウインドウ」「被所有(Owned)ウインドウ」の3種類のウインドウが表示される。 ||< * 【Part 03】ウインドウ・メッセージをとことん理解する : ウインドウ・メッセージについて詳しく知りたい : "MSDN Library" > "Windows Development" > "Windows Application UI Development" > "Windows User Interface" > "Windows and Messages" > "Messages and Message Queues" ** サンプル解説("Part03_Window_Message\"フォルダ) : 03_01.cpp : #block||> 本書55p, リスト2のVC++移植版。 コンパイル方法: cl 03_01.cpp user32.lib 実行するとウインドウが一つ表示される。ウインドウ内で左ボタンをクリックすると、1分間Sleep()する。その間はウインドウ・メッセージを処理しない為、ウインドウの移動などが反映されない。Sleep()後に、キューに溜まったメッセージが順次処理されていく。 ||< : 03_02.cpp : #block||> 本書56p, リスト4のVC++移植版+簡略化版。 コンパイル方法: cl 03_02.cpp user32.lib 実行するとウインドウが一つ表示され、カウントアップを行う。SetTimer()とWM_TIMERメッセージを使い、時間のかかる処理(今回は100までのカウントアップ)を小刻みに実行するコードの雛形となっている。 ||< : 03_03.cpp : #block||> 本書59p, リスト6のVC++移植版+簡略化版。 コンパイル方法: cl 03_03.cpp user32.lib 実行するとウインドウが一つ表示され、カウントアップを行う。GetMessage()ではなくPeekMessage()を使うため、メッセージの到着を待たずに高速に処理を回す事ができる。アイドル時間を使うので、CPU負荷は高くなる。 ||< : 03_04.cpp : #block||> 本書61p, リスト9のVC++移植版+簡略化版。 コンパイル方法: cl 03_04.cpp user32.lib 実行するとウインドウが一つ表示され、カウントアップを行う。PeekMessage()を使い、アイドル時の処理としてユーザー定義のメッセージを送り、ウインドウプロシージャ内で実際のカウントアップを行う。冗長で不自然ではあるが、サンプルコードのため仕方ない。SendMessage()/PostMessage()はソースコード内でどちらかをコメントアウトして試せるようにしてある。 ||< * 【Part 04】Windowsのコンソールを使いこなす : コンソールアプリケーションについて詳しく知りたい : "MSDN Library" > "Windows Development" > "System Services" > "DLLs, Processes, and Threads" > "Character-Mode Applications" ** サンプル解説("Part04_Console\"フォルダ) : 04_01.cpp : #block||> 本書65p, リスト2のVC++移植版。 コンパイル方法: cl 04_01.cpp user32.lib 実行するとウインドウとコンソールが表示される。ウインドウ内で左ボタンをクリックすると、その座標位置がコンソール側に表示される。 ||< * 【Part 05】ファイル・アクセスを細かく制御する : ファイル管理について詳しく知りたい : "MSDN Library" > "Windows Development" > "System Services" > "File Services" > "Local File Systems" > "File Management" ** サンプル解説("Part05_File_Access\"フォルダ) : 05_01.cpp : #block||> 本書72p, リスト1のVC++移植版。 コンパイル方法: cl 05_01.cpp C Runtime Library (CRT) のfopen()やfwrite()を使って、バイナリモードとテキストモードのそれぞれでファイルに書き込んでみる。テキストモードだと"\n"が"CR + LF"に変換されて書き込まれるため、メモ帳でも改行されるようになる。バイナリモードだと"\n"がそのまま"LF"として書き込まれる為、メモ帳では改行されない。 ||< : 05_02.cpp, 05_03.cpp : #block||> 本書74p, リスト3・リスト4のVC++移植版。 コンパイル方法: cl 05_02.cpp cl 05_03.cpp まず05_02.cppで次のようにCreateFile()の第3引数を0にしてコンパイルする。 HANDLE hf = CreateFile("test.dat", GENERIC_WRITE, 0, /* オブジェクト共有無し→排他制御有効 */ NULL, OPEN_ALWAYS, 0, NULL); コンソールを二つ立ち上げ、片方でまず05_02.exeを実行する。"ENTER"キー待ちになるので、もう片方で05_03.exeを実行する。 すると、05_02.exeの方で排他制御有りでオープンしている為、05_03.exeがファイルオープンに失敗する。 その後05_02.exeの方でENTERキーを押して終了させる。 続いて05_02.cppで次のようにCreateFile()の第3引数をFILE_SHARE_READにしてコンパイルする。 HANDLE hf = CreateFile("test.dat", GENERIC_WRITE, FILE_SHARE_READ, /* 読み取りアクセスのみオブジェクト共有 */ NULL, OPEN_ALWAYS, 0, NULL); 片方でまず05_02.exeを実行する。"ENTER"キー待ちになるので、もう片方で05_03.exeを実行する。 今度は共有できるようになっているため、05_03.exeの方でもファイルオープンに成功し、内容を表示して終了する。 その後05_02.exeの方でENTERキーを押して終了させる。 ||< : 05_04.cpp : #block||> 本書77p, リスト7のVC++移植版。 コンパイル方法: cl 05_04.cpp SetFilePointer()の使用例。ファイルに書いて、先頭に戻して読み直し。 ||< #navi_footer|読書メモ|