home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 March / VPR9903A.BIN / APUPDATE / VC / Tx300d / TX300D.LZH / DIALOGA.C < prev    next >
Text File  |  1997-06-16  |  17KB  |  686 lines

  1. // WZ EDITOR 標準TLL
  2. // dialog.tllを使った応用TLL
  3. // Copyright 1995-96 TY
  4.  
  5. //{###ダイアログ}
  6. //WZの既製ダイアログです。
  7. //問い合わせやメッセージボックスの表示、文字列選択、
  8. //ファイル名入力、アイコン選択などを行います。
  9.  
  10. #include <windows.h>
  11. #include "dialog.h"
  12.  
  13. #ifndef __FLAT__
  14. extern "shell.dll" {
  15.     #include <shellapi.h>
  16. }
  17. #endif
  18.  
  19. //##アイコン選択
  20.  
  21. #define CXICONBITMAP    32
  22. #define CYICONBITMAP    32
  23. #define IXBITMAP    8    // 隙間
  24. #define IYBITMAP    4    // 隙間
  25. static mchar _sziconfilename[CCHPATHNAME];
  26. static int _iicon;
  27.  
  28. static void ChangeIconLoad(HWND hDlg)
  29. {
  30.     HWND hListBox = GetDlgItem(hDlg,1000);
  31. //    SendMessage(hListBox,LB_SETCOLUMNWIDTH,(CXICONBITMAP+IXBITMAP),0);
  32.     SendMessage(hListBox,LB_RESETCONTENT,0,0);
  33.     int nicon = (int)ExtractIcon(text->hInstance,_sziconfilename,-1);
  34.     while(nicon--) {
  35.         int nItem = SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)"");
  36. //        SendMessage(hListBox,LB_SETITEMDATA,nItem,(LPARAM)0);
  37.     }
  38.     SendMessage(hListBox,LB_SETCURSEL,0,0);
  39. }
  40.  
  41. DWORD dlgprocIconSelect(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
  42. {
  43.     switch (message) {
  44.         case WM_INITDIALOG: {
  45.             ChangeIconLoad(hDlg);
  46.             SetFocus(GetDlgItem(hDlg,1000));
  47.             return TRUE;
  48.         }
  49.         case WM_MEASUREITEM: {
  50.             LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam;
  51.             lpmis->itemHeight = CYICONBITMAP+IYBITMAP;
  52.             return TRUE;
  53.         }
  54.         case WM_DRAWITEM: {
  55.             LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
  56.             if (lpdis->itemID == -1) break;
  57.             switch (lpdis->itemAction) {
  58.                 case ODA_SELECT:
  59.                 case ODA_DRAWENTIRE: {
  60. //                    int iicon = SendMessage(lpdis->hwndItem,LB_GETITEMDATA,lpdis->itemID,0);
  61.                     int iicon = lpdis->itemID;
  62.                     RECT r = lpdis->rcItem;
  63.                     SaveDC(lpdis->hDC);
  64.                     FrameRect(lpdis->hDC,&r,GetStockObject(WHITE_BRUSH));
  65.                     DrawIcon(lpdis->hDC,r.left+IXBITMAP/2,r.top+IYBITMAP/2,ExtractIcon(text->hInstance,_sziconfilename,iicon));
  66.                     if (lpdis->itemState & ODS_SELECTED) DrawFocusRect(lpdis->hDC,&r);
  67.                     RestoreDC(lpdis->hDC,-1);
  68.                     break;
  69.                 }
  70.                 case ODA_FOCUS: {
  71.                     break;
  72.                 }
  73.             }
  74.             return TRUE;
  75.         }
  76.         case WM_COMMAND: {
  77.             int id = WM_COMMAND_GetId(wParam);
  78.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  79.             
  80.             switch(id) {
  81.                 case 500: {
  82.                     if (notify == EN_CHANGE) {
  83.                         GetDlgItemText(hDlg,id,_sziconfilename,cchof(_sziconfilename));
  84.                         ChangeIconLoad(hDlg);
  85.                     }
  86.                     return FALSE;
  87.                 }
  88.                 case IDOK: {
  89.                     _iicon = SendMessage(GetDlgItem(hDlg,1000),LB_GETCURSEL,0,(LPARAM)0);
  90.                     EndDialog(hDlg,TRUE);
  91.                     return TRUE;
  92.                 }
  93.                 case IDCANCEL: {
  94.                     EndDialog(hDlg,FALSE);
  95.                     return TRUE;
  96.                 }
  97.             }
  98.             break;
  99.         }
  100.     }
  101.     return FALSE;
  102. }
  103.  
  104. BOOL TXAPI dialogaIconSelect(mchar szfilename[CCHPATHNAME],int *iicon)
  105. {
  106. // アイコンの選択
  107. // ダイアログでアイコンを選べます。
  108. // szfilenameに選択されたアイコンを持つファイル名、*iiconに番号を返します
  109. // 選択されたかどうかを返します。
  110.     HDIALOG hd = dialog("アイコンの選択");
  111.     
  112.     {
  113.         PMACROFUNC pfunc;
  114.         if (macroGetFuncAddress("dlgprocIconSelect",&pfunc)) {
  115.             dialogSetHook(hd,&pfunc);
  116.         }
  117.     }
  118.     
  119.     _sziconfilename[0] = 0;
  120.     pathSetFileName(_sziconfilename,szfilename);
  121.     
  122.     if (!_sziconfilename[0]) {
  123.         GetModuleFileName(text->hInstance,_sziconfilename,sizeof(_sziconfilename));
  124.     }
  125.     dialogControlRefer(hd,"*.ico;*.exe;*.dll");
  126.     dialogControlID(hd,500);
  127.     dialogStrC(hd,"ファイル名(&N):",_sziconfilename,18,cchof(_sziconfilename),30);
  128.     
  129.     dialogSetH(hd);
  130.     dialogCaption(hd,"アイコンの選択(&C):");
  131.     {
  132.         DTRECT r;
  133.         dialogGetPos(hd,&r);
  134.         int cx = LOWORD(GetDialogBaseUnits());
  135.         int cy = HIWORD(GetDialogBaseUnits());
  136.         r.x = 20 * DTCX;
  137.         r.cx = (CXICONBITMAP / cx * 4) * 4;    // ()内:1アイコン分
  138.         r.cy = (CYICONBITMAP / cy * 8 * 2) * 4;    // ()内:1アイコン分
  139.         dialogAddItem(hd,DCS_LISTBOX,NULL,1000,&r,LBS_NOTIFY|LBS_OWNERDRAWFIXED);//|LBS_MULTICOLUMN|LBS_DISABLENOSCROLL);
  140.     }
  141.     
  142.     dialogSetHelp(hd,"uiIconSelect");
  143.     
  144.     int ret = dialogOpen(hd);
  145.     if (ret) {
  146.         *iicon = _iicon;
  147.         strcpy(szfilename,_sziconfilename);
  148.     }
  149.     return ret;
  150. }
  151.  
  152. //##選択ダイアログ
  153.  
  154. int _strselect(mchar *szcaption,mchar **szstr)
  155. {
  156.     #define MAXDATA    30
  157.     HDIALOG hd = dialog(szcaption);
  158.     BYTE data[MAXDATA];
  159.     BOOL ffirst = TRUE;
  160.     int id = 0;
  161.     int i;
  162.     
  163.     memset(data,0,sizeof(data));
  164.     dialogRadioInit(hd);
  165.     for (i = 0;szstr[i];i++) {
  166.         if (*szstr[i]) {
  167.             if (ffirst) {
  168.                 ffirst = FALSE;
  169.                 data[id] = TRUE;
  170.             }
  171.             dialogRadioB(hd,szstr[i],data + id);
  172.             id++;
  173.             if (id == MAXDATA) {
  174.                 attention("input.selectstr:項目数が多すぎます");
  175.                 return 0;
  176.             }
  177.         } else {
  178.             dialogSpaceV(hd);
  179.         }
  180.     }
  181.     if (dialogOpen(hd)) {
  182.         for (i = 0;i < id;i++) {
  183.             if (data[i]) return i + 1;
  184.         }
  185.     }
  186.     return 0;
  187. }
  188.  
  189. mchar TXAPIBASE _varyarg *strselect(mchar *szcaption,mchar *szstr,...)
  190. {
  191. // ダイアログをオープンし、szcaptionを表示し、
  192. // szstrをラジオボタンで表示します。
  193. // 選択されたラジオボタンの文字列を返します
  194. // CANCELされれば、""を返します
  195. // 使用例: insert(strselect("選択枝","1","2","3","","4","5"));
  196. // ※""を指定すると、空白を空けます
  197.     mchar **p = &szstr;
  198.     int idsel = _strselect(szcaption,p);
  199.     int id = 1;
  200.     
  201.     for (int i = 0;p[i];i++) {
  202.         if (*p[i]) {
  203.             if (id == idsel) {
  204.                 return p[i];
  205.             }
  206.             id++;
  207.         }
  208.     }
  209.     return "";
  210. }
  211.  
  212. int TXAPIBASE _varyarg intselect(mchar *szcaption,mchar *szstr,...)
  213. {
  214. // strselectと同じですが、
  215. // 選択された文字列をid(1番目,2番目,...)で返します
  216. // CANCELされれば、0を返します
  217. // 使用例: id = intselect("選択枝","1","2","3","","4","5");
  218. // idに0-5が入ります
  219. // ※""を指定すると、空白を空けます
  220.     return _strselect(szcaption,&szstr);
  221. }
  222.  
  223. #if 0
  224. #include "wintxx.h"
  225. // [ESC]などでクローズされたかどうかが分からない
  226. int _varyarg selectmenu(mchar *szcaption,mchar *szstr,...)
  227. {
  228.     HMENU hmenu = CreatePopupMenu();
  229.     mchar **p = &szstr;
  230.     int id = 1;
  231.     int i;
  232.     
  233.     if (szcaption && szcaption[0]) {
  234.         menuStr(hmenu,szcaption,0);
  235.         menuSepa(hmenu);
  236.     }
  237.     for (i = 0;p[i];i++) {
  238.         if (*p[i]) {
  239.             menuStr(hmenu,p[i],id++);
  240.         } else {
  241.             menuSepa(hmenu);
  242.         }
  243.     }
  244.     {
  245.         POINT point;
  246.         
  247.         GetCaretPos(&point);
  248.         ClientToScreen(text->hwndbase,&point);
  249.         text->fselectmenu = TRUE;
  250.         text->idselect = 0;
  251.         TrackPopupMenu(hmenu,TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,point.x,point.y,0,text->hwndbase,NULL);
  252.         while(text->fselectmenu == 1) {
  253.             sleep(0);
  254.         }
  255.         text->fselectmenu = 0;
  256.     }
  257.     DestroyMenu(hmenu);
  258.     return text->idselect;
  259. }
  260. #endif
  261.  
  262. //##入力ダイアログ
  263.  
  264. BOOL TXAPI inputint(mchar *szcaption,int *data)
  265. {
  266. // ダイアログをオープンし、szcaptionを表示し、
  267. // 整数データを入力します。
  268. // {返り値}OKされればTRUE、CANCELされればFALSEを返します
  269. // {例}int data = 0;inputint("整数値",&data);
  270.     HDIALOG hd = dialog("WZ");
  271.     dialogInt(hd,szcaption,data,strlen(szcaption),7);
  272.     return dialogOpen(hd);
  273. }
  274.  
  275. BOOL TXAPIBASE inputstr(mchar *szcaption,txstr str)
  276. {
  277. // ダイアログをオープンし、szcaptionを表示し、
  278. // 文字列データを入力します。
  279. // {返り値}OKされればTRUE、CANCELされればFALSEを返します
  280. // {例}inputint("文字列",szstr);
  281.     HDIALOG hd = dialog("WZ");
  282.     dialogStr(hd,szcaption,str,strlen(szcaption),30);
  283.     return dialogOpen(hd);
  284. }
  285.  
  286. BOOL TXAPI inputstrw(mchar *szcaption,txstr str,int wtextbox)
  287. {
  288. // ダイアログをオープンし、szcaptionを表示し、
  289. // 文字列データを入力します。
  290. // テキストボックスの幅をwtextboxで文字数で指定できます。
  291. // {返り値}OKされればTRUE、CANCELされればFALSEを返します
  292. // {例}inputint("文字列",szstr,40);
  293.     HDIALOG hd = dialog("WZ");
  294.     dialogStr(hd,szcaption,str,strlen(szcaption),wtextbox);
  295.     return dialogOpen(hd);
  296. }
  297.  
  298. //##デバッグダイアログ
  299.  
  300. #define IDD_PREVIEW    1000
  301.  
  302. BOOL dlgprocDisptext(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  303. {
  304.     switch(message) {
  305.         case WM_INITDIALOG: {
  306.             HDIALOG hd = dialogFromHwnd(hwnd);
  307.             HWND hctrl = GetDlgItem(hwnd,IDD_PREVIEW);
  308.             TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  309.             if (text) {
  310.                 TX* txsrc = (LPVOID)dialogGetCustdata(hd);
  311.                 text->fScrollBarV = TRUE;
  312.                 text->fScrollBarH = TRUE;
  313.                 text->fDispTag = txsrc->fDispTag;//2.97 970222 
  314.                 text->fSetWidthByWindow = txsrc->fSetWidthByWindow;//2.97 970223 
  315.                 txSetEditmode(text,txsrc->editmode);//2.97 970221 textのeditmodeを反映するようにした
  316.                 txInsertText(text,txsrc);
  317.                 txJumpFileTop(text);//2.00C dialogaText:カーソルを先頭にするようにした
  318.                 txFlush(text);
  319.             }
  320.             break;
  321.         }
  322.     }
  323.     return FALSE;
  324. }
  325.  
  326. int TXAPIBASE dialogaText(TX* text,mchar* szcaption)
  327. {
  328. // textの内容を表示します。
  329. // szcaptionにはダイアログのタイトルとして表示する文字列を指定してください。
  330. // 裏テキストを使ったマクロのデバッグに役立ててください。
  331. // szcaptionにはNULLも指定できます。
  332.     HDIALOG hd = dialog(szcaption ? szcaption : "Text");//2.97 970221 szcaption=NULL対応
  333.     
  334.     DTRECT r;
  335.     r.x = DTCX;
  336.     r.y = DTCY;
  337.     r.cx = DTCX * 60;
  338.     r.cy = DTCY * 20;
  339.     dialogSetHookEx(hd,"\m.dlgprocDisptext");
  340.     __dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE);
  341.     dialogSetCustdata(hd,(DWORD)text);
  342.     return dialogOpen(hd);
  343. }
  344.  
  345. //##コンテキストヘルプ
  346.  
  347. static HWND _hwndHelp;
  348. static TX* _txhelp;
  349. static int _x;
  350. static int _y;
  351.  
  352. HOOKRESULT __wndproctext(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  353. {
  354.     if (_hwndHelp && textf == _txhelp) {
  355.         switch(message) {
  356.             case WM_KILLFOCUS: {
  357.                 PostMessage(_hwndHelp,WM_CLOSE,0,0);
  358.                 break;
  359.             }
  360.             case WM_KEYDOWN: {
  361.                 switch(wParam) {
  362.                     case VK_PRIOR:
  363.                     case VK_NEXT:
  364.                     case VK_UP:
  365.                     case VK_DOWN:
  366.                     case VK_LEFT:
  367.                     case VK_RIGHT: break;
  368.                     default: {
  369.                         PostMessage(_hwndHelp,WM_CLOSE,0,0);
  370.                         return HOOK_CAPTURE;
  371.                     }
  372.                 }
  373.                 break;
  374.             }
  375.         }
  376.     }
  377.     return HOOK_CONTINUE;
  378. }
  379.  
  380. void contexthelpClose(void)
  381. {
  382.     if (_hwndHelp) {
  383.         dialogFree(_hwndHelp);
  384.         _hwndHelp = NULL;
  385.         _txhelp = NULL;
  386.         macroHookWndTextFree();
  387.         txOp(txGetFrame(textf),TXOP_SBDISPEDITMODE,0,0);//3.00B2 970616 コンテキストヘルプを表示するとステータスバーに"体裁"が出たままになった
  388.     }
  389. }
  390.  
  391. permanent int p_lfHeight = 12;    //3.00A3 970507 
  392. permanent int p_cySpace = 2;    //3.00A3 970507 行間を多めに
  393. static mchar _szMsGossick[] = "MS ゴシック";
  394.  
  395. static void txSetFontstyleText(TX* text,mchar* lfFaceName,int lfHeight)
  396. {
  397.     FONTSTYLE* fs = &text->tFontstyle[FONTTX_TEXT];
  398.     strcpy(fs->tlfFaceName[IFONT_STD],lfFaceName);
  399.     strcpy(fs->tlfFaceName[IFONT_ANK],lfFaceName);
  400.     fs->tlfHeight[IFONT_STD] = lfHeight;
  401.     fs->tlfHeight[IFONT_ANK] = lfHeight;
  402. }
  403.  
  404. chc_fontToBig
  405. {
  406. //3.00A3 970507 new
  407.     p_lfHeight++;
  408.     txSetFontstyleText(text,_szMsGossick,p_lfHeight);
  409.     txFlush(text);
  410.     txFlushTableAll(text);
  411. }
  412.  
  413. chc_fontToSmall
  414. {
  415. //3.00A3 970507 new
  416.     if (p_lfHeight > 3) {
  417.         p_lfHeight--;
  418.     }
  419.     txSetFontstyleText(text,_szMsGossick,p_lfHeight);
  420.     txFlush(text);
  421.     txFlushTableAll(text);
  422. }
  423.  
  424. chc_cySpaceInc
  425. {
  426. //3.00A3 970507 new
  427.     p_cySpace++;
  428.     text->cySpace = p_cySpace;
  429.     txFlush(text);
  430. }
  431.  
  432. chc_cySpaceDec
  433. {
  434. //3.00A3 970507 new
  435.     if (p_cySpace > 0) {
  436.         p_cySpace--;
  437.         text->cySpace = p_cySpace;
  438.         txFlush(text);
  439.     }
  440. }
  441.  
  442. chc
  443. {
  444. //3.00A3 970507 new
  445.     HMENU hmenu = menuNew();
  446.     menuTx(hmenu,"文字を大きく表示(&B)","\m.chc_fontToBig");
  447.     menuTx(hmenu,"文字を小さく表示(&M)","\m.chc_fontToSmall");
  448.     menuTx(hmenu,"行間を広く(&S)","\m.chc_cyspaceInc");
  449.     menuTx(hmenu,"行間を狭く(&X)","\m.chc_cyspaceDec");
  450.     menuOpen(hmenu);
  451. }
  452.  
  453. BOOL dlgprocContexthelp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  454. {
  455.     switch(message) {
  456.         case WM_INITDIALOG: {
  457.             HDIALOG hd = dialogFromHwnd(hwnd);
  458.             HWND hctrl = GetDlgItem(hwnd,IDD_PREVIEW);
  459.             TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  460.             _txhelp = text;
  461.             if (text) {
  462.                 TX* txsrc = (LPVOID)dialogGetCustdata(hd);
  463. #if 1//2.99B 970322 txInitConfigForWindow化
  464.                 text->nSpaceTop = systemfontGetCy() / 4;
  465.                 text->fSpaceLeft = TRUE;
  466.                 text->fSetWidthByWindow = TRUE;
  467.                 text->fScrollBarV = FALSE;
  468.                 text->fDispEof = TRUE;
  469.                 text->fLineD = TRUE;
  470.                 text->fNoCaret = TRUE;
  471.                 text->fMouseArrow = TRUE;
  472.                 text->fJkinsoku = TRUE;
  473.                 text->fReadMode = TRUE;    // カーソル上下ですぐスクロールするように
  474.     #if 1//3.00A3 970507 テキストの表示フォントが大きいとコンテキストヘルプのフォントも大きくなった
  475.                 //3.00A3 970507 コンテキストヘルプで右クリックでコンテキストヘルプのフォントサイズを変えられる様にした
  476.                 sstrcpy(text->szMenuMouseR,"macro:\m.chc");
  477.                 text->cySpace = p_cySpace;
  478.                 txSetFontstyleText(text,_szMsGossick,p_lfHeight);
  479.     #else
  480.         #if 1
  481.                 //2.99B 970323 システムフォントだとWin95では文字が小さくて見にくい
  482.                 // 通常のテキストと同じフォントで表示
  483.                 text->tFontstyle[FONTTX_TEXT] = txGetFrame(text)->tFontstyle[FONTTX_TEXT];
  484.         #else
  485.                 text->lfProp = TRUE;
  486.         #endif
  487.     #endif
  488. #else
  489.                 text->fSetWidthByWindow = TRUE;
  490.                 text->fScrollBarV = FALSE;
  491.                 text->fScrollBarH = FALSE;
  492.                 text->fDispUnder = FALSE;
  493.                 text->fDispLine = FALSE;
  494.                 text->fDispLf = FALSE;
  495.                 text->fDispEof = TRUE;
  496.                 text->fLineD = TRUE;
  497.                 text->fNoCaret = TRUE;
  498.                 text->fMouseArrow = TRUE;
  499.                 text->fJkinsoku = TRUE;
  500.                 text->fVertical = FALSE;
  501.                 text->fPageTurn = FALSE;
  502.                 text->fDispParse = FALSE;
  503.                 text->fReadMode = TRUE;//2.96 970209 カーソル上下ですぐスクロールするように
  504. #endif
  505.                 text->fUndraw++;    // ちらつかないように
  506. #if 0
  507.                 if (_fpsh) {
  508.                     text->lfProp = TRUE;
  509.                     FONTSTYLE* fs = &text->tFontstyle[FONTTX_TEXT];
  510.                     strcpy(fs->tlfFaceName[IFONT_STD],"MS Pゴシック");
  511.                     fs->tlfHeight[IFONT_STD] = 9;
  512.                     strcpy(fs->tlfFaceName[IFONT_ANK],"MS Pゴシック");
  513.                     fs->tlfHeight[IFONT_ANK] = 9;
  514.                 }
  515. #endif
  516.                 txInsertText(text,txsrc);
  517.                 txJumpFileTop(text);
  518.                 txFlush(text);
  519. #if 1//2.99B 970322 
  520.                 text->fForm = TRUE;
  521.                 txSetEditmode(text,1);
  522. #endif
  523.                 PostMessage(hwnd,WM_TXUSER,0,(LPARAM)text);
  524.             }
  525.             {
  526.                 RECT rDesk;
  527.                 GetWorkRect(&rDesk);
  528.                 //
  529.                 RECT r;
  530.                 GetWindowRect(hwnd,&r);
  531.                 int cx = rectCx(&r);
  532.                 int cy = rectCy(&r);
  533.                 if (_x + cx > rDesk.right) {
  534.                     _x = rDesk.right - cx;
  535.                 }
  536.                 if (_y + cy > rDesk.bottom) {
  537.                     _y = rDesk.bottom - cy;
  538.                 }
  539.                 SetWindowPos(hwnd,NULL,_x,_y,0,0,SWP_NOSIZE);
  540.             }
  541.             break;
  542.         }
  543.         case WM_TXUSER: {
  544.             // 全てのテキストが表示できなければ、スクロールバーを使用可能にする
  545.             TX* text = (LPVOID)lParam;
  546.             txDispAll(text);
  547.             if (!text->fDispEofed) {
  548.                 text->fScrollBarV = TRUE;
  549.                 txFlush(text);
  550.             }
  551.             // ちらつかないように
  552.             text->fUndraw--;
  553.             txDispAll(text);
  554.             break;
  555.         }
  556.         case WM_CLOSE: {
  557.             contexthelpClose();
  558.             break;
  559.         }
  560.     }
  561.     return FALSE;
  562. }
  563.  
  564. int _contexthelp(TX* text,int x,int y)
  565. {
  566.     contexthelpClose();
  567.     _x = x;
  568.     _y = y;
  569.     
  570.     DTRECT r;
  571.     HDIALOG hd = dialog("");
  572.     
  573.     r.x = 0;
  574.     r.y = 0;
  575.     r.cx = DTCX * 60;
  576.     r.cy = DTCY * 10;
  577.     dialogSetHookEx(hd,"\m.dlgprocContexthelp");
  578.     dialogSetNoButton(hd);
  579.     {
  580.         DWORD style = dialogGetStyle(hd);
  581.         style &= ~DS_MODALFRAME;
  582.         style &= ~WS_CAPTION;
  583.         style &= ~WS_SYSMENU;
  584.         style |= WS_DLGFRAME;
  585.         dialogSetStyle(hd,style);
  586.     }
  587.     __dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE);
  588.     dialogSetCustdata(hd,(DWORD)text);
  589.     dialogSetSize(hd,&r);
  590.     macroHookWndText();
  591.     _hwndHelp = dialogCreate(hd);
  592.     return TRUE;
  593. }
  594.  
  595. BOOL contexthelp(mchar* szname,int idhelp,int x,int y)
  596. {
  597.     mchar szfilename[CCHPATHNAME];
  598.     if (szname == NULL || szname[0] == 0) {
  599.         strcpy(szfilename,text->szexedir + "wz.chp");
  600.     } else {
  601.         if (!pathSearch(szfilename,szname,wzGetEnv(WZENV_TXPATH),".chp")) {
  602.             attention("WZコンテキストヘルプファイル %s が見つかりません",szname);
  603.             return FALSE;
  604.         }
  605.     }
  606.     BOOL ret = FALSE;
  607.     TX textBody;
  608.     TX* text = &textBody;
  609.     txInitText(text);
  610.     txSetFileName(text,szfilename);
  611.     txOpenText(text);
  612.     mchar sz[CCHWORD];
  613.     sprintf(sz,"#%d#",idhelp);
  614.     if (txSearchEx(text,sz,0)) {
  615.         txDown(text);
  616.         txSelect(text);
  617.         txstr szline;
  618.         int npara = 0;
  619.         while(1) {
  620.             if (!txDown(text)) break;
  621.             txGetLine(text,szline);
  622.             if (szline[0] == '#' && *strGetLast(szline) == '#') {
  623.                 // 末尾の空行を含めない
  624.                 if (npara) {
  625.                     txJumpPara(text,npara);
  626.                 }
  627.                 break;
  628.             }
  629.             if (szline[0] == 0) {
  630.                 if (npara == 0) {
  631.                     npara = text->npara;
  632.                 }
  633.             } else {
  634.                 npara = 0;
  635.             }
  636.         }
  637. #if 1//2.99C 970323 コンテキストヘルプを使うとテキストスタックが変換していた
  638.         txPrivatePush(text);
  639.         txDeleteText(text);
  640.         txPrivatePop(text);
  641. #else
  642.         txSelectCopy(text);
  643.         txDeleteText(text);
  644.         txPaste(text);
  645. #endif
  646.         _contexthelp(text,x,y);
  647.         ret = TRUE;
  648.     }
  649.     return ret;
  650. }
  651.  
  652. BOOL TXAPI contexthelpOpenAsHelp(int idhelp,HWND hctrl)
  653. {
  654. // hctrlウィンドウの左上+@の位置に、wz.chpのidhelp番のコンテキストヘルプを表示
  655. //3.00A2 970506 new
  656.     RECT r;
  657.     if (hctrl) {
  658.         GetWindowRect(hctrl,&r);
  659.     } else {
  660.         //3.00A3 970507 hctrlがNULLなら中央に表示
  661.         GetWorkRect(&r);
  662.         r.left = r.left + rectCx(&r) / 3;
  663.         r.top = r.top + rectCy(&r) / 3;
  664.     }
  665.     return contexthelp(NULL,idhelp,r.left + systemfontGetCx(),r.top + systemfontGetCy());
  666. }
  667.  
  668. main
  669. {
  670.     dialogaText(text,"aa");
  671. }
  672.  
  673. #if 0    // TEST
  674. main {
  675.     int a = 10;
  676.     txstr b;
  677.     
  678.     inputint("a = ",&a);
  679.     inputstr("b = ",b);
  680.     printf("a = %d,b = %s\n",a,b);
  681. }
  682. main {
  683.     printf("select = %d\n",intselect("選択","1","2","3","","4"));
  684. }
  685. #endif
  686.