home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 October
/
VPR9910A.BIN
/
APUPDATE
/
VC
/
TXC2S328
/
txc2s328.lzh
/
MYAPP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-10
|
7KB
|
246 lines
/*
TX-C4.0によるWindows95/NT/CEアプリケーションのサンプル
*/
#include <_wz.h>
#include <windows.h>
#include <windowsx.h>
extern "commctrl.dll" {
#pragma multidef+
#include <commctrl.h>
#pragma multidef-
}
// アプリケーションのコンテキスト構造体
// この構造体を使ってアプリケーションのコンテキストを管理しておけば、
// アプリケーションを複数起動することができます。
typedef struct {
HWND hwndbase;
#if WINDOWSCE
HWND hwndCB; // コマンドバーウィンドウ
#endif
// 以下、アプリケーションのコンテキストを入れます。
TX* text; // for Myエディタ サンプル用
} MYAPPCONTEXT;
// アプリケーションのメインウィンドウのクラス名を指定します。
// 他のTXEで使うウィンドウクラス名とバッティングしない様な
// 名前を付けてください。
static wchar g_wszclassMyApp[] = L"myApp";
// メインウィンドウのウィンドウプロシジャーのサンク用の変数です
// Windowsから直接、TXEのウィンドウプロシジャーを呼び出すことはできないので、
// サンクを介して呼び出してもらいます。
static FARPROC g_wndproc;
#define IDM_FILE_OPEN 100
#define IDM_EXIT 101
#define IDM_ABOUT 102
#define IDM_DIALOG 103
#define IDM_EDITOR 104
// permanent and dialog test
permanent int p_integer = 2;
permanent BOOL p_fFlag;
permanent txstr p_sz = "abc";
permanent int p_choice = 1;
static void myappCreateMenu(MYAPPCONTEXT* context)
{
HMENU hmenuRoot = CreateMenu();
{
HMENU hmenu = CreateMenu();
menuStr(hmenu,"開く(&O)...",IDM_FILE_OPEN);
menuStr(hmenu,"Myダイアログのサンプル(&D)...",IDM_DIALOG);
menuStr(hmenu,"Myエディタのサンプル(&E)",IDM_EDITOR);
menuSepa(hmenu);
menuStr(hmenu,"終了(&X)",IDM_EXIT);
menuPopup(hmenuRoot,"ファイル(&F)",hmenu);
}
{
HMENU hmenu = CreateMenu();
menuStr(hmenu,"バージョン情報(&A)",IDM_ABOUT);
menuPopup(hmenuRoot,"ヘルプ(&H)",hmenu);
}
#if WINDOWSCE
if (context->hwndCB) {
DestroyWindow(context->hwndCB);
context->hwndCB = NULL;
}
HWND hwndCB = context->hwndCB = CommandBar_Create(_hinstance,context->hwndbase,1);
CommandBar_InsertMenubar(hwndCB,_hinstance,IDM_MAINMENU_TXE,0);
CommandBar_AddAdornments(hwndCB,0,0); // Add exit button
CommandBar_mySetMenu(hwndCB,0,hmenuRoot);
CommandBar_Show(hwndCB,TRUE);
#else
SetMenu(context->hwndbase,hmenuRoot);
#endif
}
static void myappFlushWindowPos(MYAPPCONTEXT* context)
{
int h = CommandBar_Height(context->hwndCB);
RECT r;
GetClientRect(context->hwndbase,&r);
r.top += h;
if (context->text) {
int cx = rectCx(&r);
int cy = rectCy(&r);
wndSetPosSize(context->text->hwndtext,r.left,r.top,cx,cy);
}
SetWindowText(context->hwndbase,context->text ? TEXT("My Editor") : TEXT("My App"));
}
static void myappFlushMenuCheck(MYAPPCONTEXT* context)
{
#if WINDOWSCE
HMENU hmenu = CommandBar_GetMenu(context->hwndCB,0);
#else
HMENU hmenu = GetMenu(context->hwndbase);
#endif
CheckMenuItem(hmenu,IDM_EDITOR,context->text ? MF_CHECKED : MF_UNCHECKED);
}
LRESULT CALLBACK wndprocMyapp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
// アプリケーションのメインのウィンドウプロシジャーのスケルトン。
// これを元に肉付けを行って使ってください。
MYAPPCONTEXT* context = hwndGetContext(hwnd);
wndprocContext(hwnd,context,message,wParam,lParam);
switch (message) {
case WM_CREATE: {
MYAPPCONTEXT* context = zmalloc(sizeof(MYAPPCONTEXT));
hwndSetContext(hwnd,context);
context->hwndbase = hwnd;
pwzapAdd(hwnd);
{
// ユーザ記述
myappCreateMenu(context);
}
break;
}
case WM_DESTROY: {
hwndSetContext(hwnd,NULL);
{
// ユーザ記述
}
free(context);
pwzapDelete(hwnd);
break;
}
case WM_SETFOCUS: {
pwzapFocused(hwnd);
{
// ユーザ記述
if (context->text) SetFocus(context->text->hwndtext);
}
return 0;
}
// 以下、ユーザ記述
case WM_PAINT: {
PAINTSTRUCT ps;
BeginPaint(hwnd,&ps);
{
RECT r;
GetClientRect(hwnd,&r);
DrawText(ps.hdc,TEXT("My App created by TX-C 4.0"),-1,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
EndPaint(hwnd,&ps);
return 0;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
switch(id) {
case IDM_ABOUT: {
HDIALOG hd = dialog("About My App");
dialogCaption(hd,"My App");
dialogCaption(hd,"Powered by TX-C4.0");
dialogOpen(hd);
break;
}
case IDM_EXIT: {
PostMessage(hwnd,WM_CLOSE,0,0);
break;
}
case IDM_FILE_OPEN: {
txuiFileOpen(NULL);
break;
}
case IDM_DIALOG: {
HDIALOG hd = dialog("ダイアログのサンプル");
dialogControlUpdown(hd,0,999);
dialogInteger(hd,"数値(&I):",10,&p_integer,6);
dialogCheck(hd,"フラグ(&F)",&p_fFlag);
dialogTxstr(hd,"文字列(&S):",10,p_sz,20);
dialogChoice(hd,"選択枝(&C):",10,&p_choice,20,"選択枝1","選択枝2","選択枝3","選択枝4",NULL);
dialogOpen(hd);
break;
}
case IDM_EDITOR: {
if (context->text) {
// 既に開かれていたら閉じる
DestroyWindow(context->text->hwndtext);
context->text = NULL;
myappFlushWindowPos(context);
} else {
// 開く
HWND hwndtext = CreateWindow_W(
TXWS_SZCLASS,NULL,
TXWS_TEXT|TXWS_OPENTEXT|WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE,
0,0,0,0,
context->hwndbase,NULL,_hinstance,NULL
);
context->text = WzBox_GetTx(hwndtext);
myappFlushWindowPos(context);
//
TX* text = context->text;
txKeyLoadFrame(text); // 通常のキー定義で使えるように
SetFocus(text->hwndtext);
}
myappFlushMenuCheck(context);
break;
}
}
break;
}
case WM_SIZE: {
myappFlushWindowPos(context);
break;
}
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
HWND TxeMain(wchar* wszCmdline)
{
// TXEアプリケーションのエントリ
// wszCmdlineにはコマンドライン引数が渡されます。
HWND hwndbase = NULL;
//winformation(wszCmdline);
// サンクの登録
if (!g_wndproc) g_wndproc = txpcodeRegisterCallback(wndprocMyapp,4);
// メインウィンドウの登録
{
WNDCLASSW wc;
structClear(wc);
wc.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)g_wndproc;
wc.cbWndExtra = sizeof(MYAPPCONTEXT*);
wc.hInstance = _hinstance;
wc.lpszClassName = g_wszclassMyApp;
wc.hbrBackground = 1 + COLOR_WINDOW;
RegisterClass_W(&wc);
}
// メインウィンドウの作成
hwndbase = CreateWindow_W(
g_wszclassMyApp,L"MY APP",
WS_TITLEBAR,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,_hinstance,NULL
);
// メインウィンドウの表示
ShowWindow(hwndbase,SW_SHOWNORMAL);
return hwndbase;
}