今更だけど、脱Windows APIしようと思う(;´・ω・)
最近、Macに関する記事ばかりで飽きてしまっている読者の方々、朗報ですw
久しぶりにプログラミングのネタに関する記事を書きますよ(*’▽’)
今日はWindowsプログラミングに関する話を書きたいと思います。
目次
スポンサーリンク
Windows API(Win32API)とは
私は今でもWindowsのアプリケーションを作るときは、Windows API(Win32API)使用しています。
Windows APIとは、マイクロソフトがWindows自身が持つ機能群をプログラマのために公開したAPIのことです。
これを直接操作すればアプリケーションを作ることが可能です。
Windows APIを用いてアプリケーションを開発する方法は、Windows 95の時代からある方法です。
C言語とC++で開発可能です。
ところで、このWindows APIを用いてアプリケーションを作るというやり方は、今では古典的でめんどくさいやり方です(;´∀`)
ちょっとしたウィンドウを表示するだけでも何十行とコードを書かなければならないのです(;´・ω・)
なので、今どきこんな方法で開発している会社は、ほとんど存在しないです。
Windows APIを用いないで開発する方法
Windows APIを用いないでアプリケーションを開発するには以下のような方法があります。
- MFC
- Windowsフォームアプリケーション(.NET)
(他にもQtを使ってクロスプラットフォームで開発とかいう方法もありますが、純粋なWindowsプログラミングの意味から外れるので、ここでは紹介しません。)
MFCとは
上で言った通り、Windows APIだと、ちょっとしたウィンドウを表示するのにも何十行もコードを書かなければならないのです。
そこで、Windows APIをラップして(覆い隠して)、もっと簡単にアプリケーションを開発できるようにしたのがMFCというフレームワークです。
言語はC言語とC++で開発可能です。
今でもMFCは少なからず使われています。
しかし、主流なやり方ではありません。
なぜならば、他にもっと良い方法があるからです。
因みに、以前、私がバイトしていたベンチャー起業では、MFCを使ってアプリケーションを開発していました。
Windowsフォームアプリケーション(.NET)とは
マイクロソフトはインターネットの技術を取り込むのが遅れたので、率先して開発環境にその技術を取り込むことにしました。
その技術の総称を.NETと呼びます。
アプリケーションの開発方法も根本から作り直しました。
そして生まれたのが、Windowsフォームアプリケーションです。
開発は、C++/CLIとC#で可能です。
これが今、もっともメジャーな開発方法です。
私が今バイトしている会社では、C++/CLIで開発しています。
Windowsフォームアプリケーションを使うと、どれくらい楽になるのか
Windows APIとWindowsフォームアプリケーションのコードを比較してみます。
手っ取り早く、ウィンドウを各手法でウィンドウを表示するコードを比較してみます。
Windows API でウィンドウを表示するためのコード
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // ウィンドウプロシージャ ATOM InitApp(HINSTANCE); // ウィンドウクラスの登録 BOOL InitInstance(HINSTANCE, int); // ウィンドウの生成 // Windows プログラムのエントリーポイント int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; // ウィンドウクラスの登録 if (!InitApp(hCurInst)) return FALSE; // ウィンドウの生成 if (!InitInstance(hCurInst, nCmdShow)) return FALSE; // メッセージを取得 while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; }else{ TranslateMessage(&msg); // メッセージを変換 DispatchMessage(&msg); // メッセージを送出 } } return (int)msg.wParam; } // ウィンドウクラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); // 構造体のサイズ wc.style = CS_HREDRAW | CS_VREDRAW; // クラスのスタイル wc.lpfnWndProc = WndProc; // プロシージャ名 wc.cbClsExtra = 0; // 補助メモリ wc.cbWndExtra = 0; // 補助メモリ wc.hInstance = hInst; // インスタンス wc.hIcon = (HICON)LoadImage( // アイコン NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( // カーソル NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = // 背景ブラシ (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; // メニュー名 wc.lpszClassName = TEXT("Class Name"); // クラス名 wc.hIconSm = (HICON)LoadImage( // 小さいアイコン NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return(RegisterClassEx(&wc)); } // ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow( TEXT("Class Name"), // クラス名 TEXT("ウィンドウ名"), // ウィンドウ名 WS_OVERLAPPEDWINDOW, // ウィンドウスタイル CW_USEDEFAULT, // x位置 CW_USEDEFAULT, // y位置 CW_USEDEFAULT, // ウィンドウ幅 CW_USEDEFAULT, // ウィンドウ高さ NULL, // 親ウィンドウのハンドル、親を作るときは NULL NULL, // メニューハンドル、クラスメニューを使うときは NULL hInst, // インスタンスハンドル NULL // ウィンドウ作成データ ); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); // ウィンドウの表示状態を設定 UpdateWindow(hWnd); // ウィンドウを更新 return TRUE; } // ウィンドウプロシージャ(コールバック関数) LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wp, lp)); } return 0; }
100行前後という長いコードです(;´・ω・)
WinMain関数がエントリーポイントとなっています。
Windows APIだと、メッセージをプロシージャで処理することによって、アプリケーション動いています。
Windowsフォームアプリケーション(C++/CLI)
#include "MyForm.h" using namespace FirstProject; [STAThreadAttribute] int main() { Application::Run(gcnew MyForm()); return 0; }
Visual C++です。
これだけです。少なっ!!たった10行程度でウィンドウの表示ができてしまいます。
語弊がないように言っておきますが、正確にはこれだけでは動きません。フォームのヘッダーファイルがないと動きません。
しかし、そのファイルはVisual Studioが自動的に書いてくれて、必要な部分だけ付け加えるだけで良いので、かなり楽です。
Windowsフォームアプリケーション(C#)
using System; using System.Drawing; using System.Windows.Forms; class Form01 { public static void Main() { Form f = new Form(); Application.Run(f); } }
Visual C#です。
こちらもとても簡単に書けてしまいます。
Windows APIのときに書いたコードが嘘みたいです(*’▽’)
Windowsフォームアプリケーションを勉強しようと思います
今からMFCを勉強するのは論外でしょう。
今ではあまり使われない技術です(;´・ω・)
やはり、Windowsフォームアプリケーションを勉強するのが良いと思われます。
なので、勉強します。
というか、実はもう既に勉強のために2冊本を購入して読み始めていますw
一応、C++/CLIとC#の両方で開発するやり方を勉強しようと思います。
C++/CLIとC#のどちらが良いのか
私の感覚だと、ベテランはC++/CLIで開発、ビギナーはC#で開発というようなイメージです。
C#だとメモリ管理などコンパイラがやってくれて便利な反面、自由な書き方ができなくなってしまいます。
バイト先の上司はベテランプログラマが多いので、ほぼ全員がC++/CLIで開発していますね。
まぁ、両方できるに越したことはないのだと思いますw
スポンサーリンク
関連記事