home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2002 January / VPR0201B.ISO / APUPDATE / VC / TXC0601A / TXC0601A.LZH / MYAPP.C < prev    next >
C/C++ Source or Header  |  2000-12-21  |  7KB  |  258 lines

  1. /*
  2.     TX-C4.0によるWindows95/NT/CEアプリケーションのサンプル
  3. */
  4.  
  5. #include <_wz.h>
  6. #include <windows.h>
  7. #if !UNIX
  8. #include <windowsx.h>
  9. extern "commctrl.dll" {
  10.     #pragma multidef+
  11.     #include <commctrl.h>
  12.     #pragma multidef-
  13. }
  14. #endif
  15.  
  16. // アプリケーションのコンテキスト構造体
  17. // この構造体を使ってアプリケーションのコンテキストを管理しておけば、
  18. // アプリケーションを複数起動することができます。
  19. typedef struct {
  20.     HWND hwndbase;
  21.     #if WINDOWSCE
  22.     HWND hwndCB;    // コマンドバーウィンドウ
  23.     #endif
  24.     // 以下、アプリケーションのコンテキストを入れます。
  25.     TX* text;        // for Myエディタ サンプル用
  26. } MYAPPCONTEXT;
  27.  
  28. // アプリケーションのメインウィンドウのクラス名を指定します。
  29. // 他のTXEで使うウィンドウクラス名とバッティングしない様な
  30. // 名前を付けてください。
  31. static wchar g_wszclassMyApp[] = L"myApp";
  32.  
  33. // メインウィンドウのウィンドウプロシジャーのサンク用の変数です
  34. // Windowsから直接、TXEのウィンドウプロシジャーを呼び出すことはできないので、
  35. // サンクを介して呼び出してもらいます。
  36. static FARPROC g_wndproc;
  37.  
  38. #define IDM_FILE_OPEN    100
  39. #define IDM_EXIT        101
  40. #define IDM_ABOUT        102
  41. #define IDM_DIALOG        103
  42. #define IDM_EDITOR        104
  43.  
  44. // permanent and dialog test
  45. permanent int p_integer = 2;
  46. permanent BOOL p_fFlag;
  47. permanent txstr p_sz = "abc";
  48. permanent int p_choice = 1;
  49.  
  50. static void myappCreateMenu(MYAPPCONTEXT* context)
  51. {
  52.     HMENU hmenuRoot = CreateMenu();
  53.     {
  54.         HMENU hmenu = CreateMenu();
  55.         menuStr(hmenu,"開く(&O)...",IDM_FILE_OPEN);
  56.         menuStr(hmenu,"Myダイアログのサンプル(&D)...",IDM_DIALOG);
  57.         menuStr(hmenu,"Myエディタのサンプル(&E)",IDM_EDITOR);
  58.         menuSepa(hmenu);
  59.         menuStr(hmenu,"終了(&X)",IDM_EXIT);
  60.         menuPopup(hmenuRoot,"ファイル(&F)",hmenu);
  61.     }
  62.     {
  63.         HMENU hmenu = CreateMenu();
  64.         menuStr(hmenu,"バージョン情報(&A)",IDM_ABOUT);
  65.         menuPopup(hmenuRoot,"ヘルプ(&H)",hmenu);
  66.     }
  67. #if WINDOWSCE
  68.     if (context->hwndCB) {
  69.         DestroyWindow(context->hwndCB);
  70.         context->hwndCB = NULL;
  71.     }
  72.     HWND hwndCB = context->hwndCB = CommandBar_Create(_hinstance,context->hwndbase,1);
  73.     CommandBar_InsertMenubar(hwndCB,_hinstance,IDM_MAINMENU_TXE,0);
  74.     CommandBar_AddAdornments(hwndCB,0,0);    // Add exit button
  75.     CommandBar_mySetMenu(hwndCB,0,hmenuRoot);
  76.     CommandBar_Show(hwndCB,TRUE);
  77. #else
  78.     SetMenu(context->hwndbase,hmenuRoot);
  79. #endif
  80. }
  81.  
  82. static void myappFlushWindowPos(MYAPPCONTEXT* context)
  83. {
  84.     int h = CommandBar_Height(context->hwndCB);
  85.     RECT r;
  86.     GetClientRect(context->hwndbase,&r);
  87.     r.top += h;
  88.     if (context->text) {
  89.         int cx = rectCx(&r);
  90.         int cy = rectCy(&r);
  91.         wndSetPosSize(context->text->hwndtext,r.left,r.top,cx,cy);
  92. //information("%d %d %d %d",r.left,r.top,cx,cy);
  93.     }
  94.     SetWindowText(context->hwndbase,context->text ? TEXT("My Editor") : TEXT("My App"));
  95. }
  96.  
  97. static void myappFlushMenuCheck(MYAPPCONTEXT* context)
  98. {
  99. #if WINDOWSCE
  100.     HMENU hmenu = CommandBar_GetMenu(context->hwndCB,0);
  101. #else
  102.     HMENU hmenu = GetMenu(context->hwndbase);
  103. #endif
  104.     CheckMenuItem(hmenu,IDM_EDITOR,context->text ? MF_CHECKED : MF_UNCHECKED);
  105. }
  106.  
  107. LRESULT CALLBACK wndprocMyapp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  108. {
  109. // アプリケーションのメインのウィンドウプロシジャーのスケルトン。
  110. // これを元に肉付けを行って使ってください。
  111.     MYAPPCONTEXT* context = hwndGetContext(hwnd);
  112.     wndprocContext(hwnd,context,message,wParam,lParam);
  113.     switch (message) {
  114.         case WM_CREATE: {
  115.             MYAPPCONTEXT* context = zmalloc(sizeof(MYAPPCONTEXT));
  116.             hwndSetContext(hwnd,context);
  117.             context->hwndbase = hwnd;
  118.             sysApAdd(hwnd);
  119.             {
  120.                 // ユーザ記述
  121.                 #if !UNIX
  122.                 myappCreateMenu(context);
  123.                 #endif
  124.             }
  125.             break;
  126.         }
  127.         case WM_DESTROY: {
  128.             hwndSetContext(hwnd,NULL);
  129.             {
  130.                 // ユーザ記述
  131.             }
  132.             free(context);
  133.             sysApDelete(hwnd);
  134.             break;
  135.         }
  136.         case WM_SETFOCUS: {
  137.             sysApSetFocus(hwnd);
  138.             {
  139.                 // ユーザ記述
  140.                 if (context->text) SetFocus(context->text->hwndtext);
  141.             }
  142.             return 0;
  143.         }
  144. // 以下、ユーザ記述
  145.         case WM_PAINT: {
  146.             PAINTSTRUCT ps;
  147.             BeginPaint(hwnd,&ps);
  148.             {
  149.                 RECT r;
  150.                 GetClientRect(hwnd,&r);
  151.                 DrawText(ps.hdc,TEXT("My App  created by TX-C 4.0"),-1,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  152.             }
  153.             EndPaint(hwnd,&ps);
  154.             return 0;
  155.         }
  156.         case WM_COMMAND: {
  157.             int id = GET_WM_COMMAND_ID(wParam,lParam);
  158.             switch(id) {
  159.                 case IDM_ABOUT: {
  160.                     HDIALOG hd = dialog("About My App");
  161.                     dialogCaption(hd,"My App");
  162.                     dialogCaption(hd,"Powered by TX-C4.0");
  163.                     dialogOpen(hd);
  164.                     break;
  165.                 }
  166.                 case IDM_EXIT: {
  167.                     PostMessage(hwnd,WM_CLOSE,0,0);
  168.                     break;
  169.                 }
  170.                 case IDM_FILE_OPEN: {
  171.                     txuiFileOpen(NULL);
  172.                     break;
  173.                 }
  174.                 case IDM_DIALOG: {
  175.                     HDIALOG hd = dialog("ダイアログのサンプル");
  176.                     dialogControlUpdown(hd,0,999);
  177.                     dialogInteger(hd,"数値(&I):",10,&p_integer,6);
  178.                     dialogCheck(hd,"フラグ(&F)",&p_fFlag);
  179.                     dialogTxstr(hd,"文字列(&S):",10,p_sz,20);
  180.                     dialogChoice(hd,"選択枝(&C):",10,&p_choice,20,"選択枝1","選択枝2","選択枝3","選択枝4",NULL);
  181.                     dialogOpen(hd);
  182.                     break;
  183.                 }
  184.                 case IDM_EDITOR: {
  185.                     if (context->text) {
  186.                         // 既に開かれていたら閉じる
  187.                         HWND hwndtext = context->text->hwndtext;
  188.                         context->text = NULL;
  189.                         DestroyWindow(hwndtext);
  190.                         myappFlushWindowPos(context);
  191.                     } else {
  192.                         // 開く
  193.                         HWND hwndtext = CreateWindow_W(
  194.                             TXWS_SZCLASS,NULL,
  195.                             TXWS_TEXT|TXWS_OPENTEXT|WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE,
  196.                             0,0,0,0,
  197.                             context->hwndbase,NULL,_hinstance,NULL
  198.                         );
  199.                         context->text = WzBox_GetTx(hwndtext);
  200.                         myappFlushWindowPos(context);
  201.                         //
  202.                         TX* text = context->text;
  203.                         txKeyLoadFrame(text);    // 通常のキー定義で使えるように
  204.                         #if UNIX
  205.                         ShowWindow(hwnd,SW_SHOWNORMAL);
  206.                         #endif
  207.                         SetFocus(text->hwndtext);
  208.                     }
  209.                     myappFlushMenuCheck(context);
  210.                     break;
  211.                 }
  212.             }
  213.             break;
  214.         }
  215.         case WM_SIZE: {
  216.             myappFlushWindowPos(context);
  217.             break;
  218.         }
  219.     }
  220.     return sysApDefWindowProc(hwnd,message,wParam,lParam);
  221. }
  222.  
  223. HWND TxeMain(wchar* wszCmdline)
  224. {
  225. // TXEアプリケーションのエントリ
  226. // wszCmdlineにはコマンドライン引数が渡されます。
  227.     HWND hwndbase = NULL;
  228. //winformation(wszCmdline);
  229.     // サンクの登録
  230.     if (!g_wndproc) g_wndproc = txpcodeRegisterCallback(wndprocMyapp,4);
  231.     // メインウィンドウの登録
  232.     {
  233.         WNDCLASSW wc;
  234.         structClear(wc);
  235.         wc.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
  236.         wc.lpfnWndProc = (WNDPROC)g_wndproc;
  237.         wc.cbWndExtra = sizeof(MYAPPCONTEXT*);
  238.         wc.hInstance = _hinstance;
  239.         wc.lpszClassName = (LPVOID)g_wszclassMyApp;
  240.         wc.hbrBackground = 1 + COLOR_WINDOW;
  241.         RegisterClass_W(&wc);
  242.     }
  243.     // メインウィンドウの作成
  244.     hwndbase = CreateWindow_W(
  245.         g_wszclassMyApp,L"MY APP",
  246.         WS_TITLEBAR,
  247.         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  248.         NULL,NULL,_hinstance,NULL
  249.     );
  250.     #if UNIX
  251.     myappCreateMenu(hwndGetContext(hwndbase));
  252.     #endif
  253.     // メインウィンドウの表示
  254.     ShowWindow(hwndbase,SW_SHOWNORMAL);
  255.     return hwndbase;
  256. }
  257.  
  258.