home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 October / VPR9910A.BIN / APUPDATE / VC / TXC2M328 / txc2m328.lzh / MYAPP.C < prev    next >
C/C++ Source or Header  |  1998-06-10  |  7KB  |  246 lines

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