Windows Programは、普通のコンソール型のプログラムしか作ったことの無い者には、中々理解しがたいものがあります。以前『猫でも分かるWindowsプログラミング』を買って読んで理解不能だったときは、「俺は猫以下か!」と、かなりがっかりしました。
以下に、理解を妨げていた概念上の困難点を思いつくままに列挙します。
- PROGRAM文で始まるメインルーチンが無い様に見えますが、WinMainという関数がメインルーチンに相当します。関数がメインルーチンなのは、C言語の影響かもしれません。開始実行ルーチンをPROGRAM文で始めるかWinMainから始めるかは、リンカーのSYSTEM->SUBSYSTEMのオプションで指定します。
- Windowsのプログラムでは、『Windowが主体でその動作は属性として従属的に与えられる』というのがキモとなる概念だと思います。Windowのサイズやタイトルなどと同列に、動作もCallbackルーチンとして属性的に与えることになります。
- WinMainは、無限ループで割り込みを待つ形を取ります。その内容は、基本的に以下のような形を取ります。
- Windowの属性の定義
- Windowの割付
- Windowの表示
- 割り込み待ちの無限ループ
INTEGER (KIND = 4) FUNCTION WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow) !DEC$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain USE winproc IMPLICIT NONE INTEGER (HANDLE), INTENT(IN) :: hInstance, hPrevInstance INTEGER (LPSTR) , INTENT(IN) :: lpszCmdLine INTEGER (SINT) , INTENT(IN) :: nCmdShow TYPE (T_WNDCLASS) :: wc TYPE (T_MSG) :: mesg INTEGER (HANDLE) :: hWndMain INTEGER (BOOL) :: iretb CHARACTER (LEN = 256) :: ClassName = "Fortran"C ! Init Main window WinMain = -1 ! Error code wc%lpszClassName = LOC(ClassName) wc%lpfnWndProc = LOC(MainWndProc) ! CALLBACK procedure name wc%style = IOR(CS_VREDRAW , CS_HREDRAW) wc%hInstance = hInstance wc%hIcon = NULL wc%hCursor = LoadCursor( NULL, IDC_ARROW ) wc%hbrBackground = ( COLOR_WINDOW + 1 ) IF (RegisterClass(wc) == 0) RETURN !Init instance WinMain = -2 ! Error code hWndMain = CreateWindowEx( 0, ClassName, & " FORTRAN Window "C, & INT(WS_OVERLAPPEDWINDOW), & CW_USEDEFAULT, CW_USEDEFAULT, & CW_USEDEFAULT, CW_USEDEFAULT, & 0, & 0, & NULL, & NULL ) IF (hWndMain == 0) RETURN iretb = ShowWindow( hWndMain, nCmdShow ) iretb = UpdateWindow( hWndMain ) ! Message Loop : Main Loop DO WHILE ( GetMessage (mesg, NULL, 0, 0) ) iretb = TranslateMessage( mesg ) iretb = DispatchMessage( mesg ) END DO WinMain = mesg%wParam RETURN END FUNCTION WinMain
- Windowsでは、大量の型や定数、インターフェース等があらかじめ定義されているので、その定義モジュールを使用します。