home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 March
/
VPR9803B.ISO
/
APUPDATE
/
VC
/
Tx300b
/
TX300B.LZH
/
DIALOGA.C
< prev
next >
Wrap
Text File
|
1997-06-16
|
17KB
|
686 lines
// WZ EDITOR 標準TLL
// dialog.tllを使った応用TLL
// Copyright 1995-96 TY
//{###ダイアログ}
//WZの既製ダイアログです。
//問い合わせやメッセージボックスの表示、文字列選択、
//ファイル名入力、アイコン選択などを行います。
#include <windows.h>
#include "dialog.h"
#ifndef __FLAT__
extern "shell.dll" {
#include <shellapi.h>
}
#endif
//##アイコン選択
#define CXICONBITMAP 32
#define CYICONBITMAP 32
#define IXBITMAP 8 // 隙間
#define IYBITMAP 4 // 隙間
static mchar _sziconfilename[CCHPATHNAME];
static int _iicon;
static void ChangeIconLoad(HWND hDlg)
{
HWND hListBox = GetDlgItem(hDlg,1000);
// SendMessage(hListBox,LB_SETCOLUMNWIDTH,(CXICONBITMAP+IXBITMAP),0);
SendMessage(hListBox,LB_RESETCONTENT,0,0);
int nicon = (int)ExtractIcon(text->hInstance,_sziconfilename,-1);
while(nicon--) {
int nItem = SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)"");
// SendMessage(hListBox,LB_SETITEMDATA,nItem,(LPARAM)0);
}
SendMessage(hListBox,LB_SETCURSEL,0,0);
}
DWORD dlgprocIconSelect(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message) {
case WM_INITDIALOG: {
ChangeIconLoad(hDlg);
SetFocus(GetDlgItem(hDlg,1000));
return TRUE;
}
case WM_MEASUREITEM: {
LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam;
lpmis->itemHeight = CYICONBITMAP+IYBITMAP;
return TRUE;
}
case WM_DRAWITEM: {
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
if (lpdis->itemID == -1) break;
switch (lpdis->itemAction) {
case ODA_SELECT:
case ODA_DRAWENTIRE: {
// int iicon = SendMessage(lpdis->hwndItem,LB_GETITEMDATA,lpdis->itemID,0);
int iicon = lpdis->itemID;
RECT r = lpdis->rcItem;
SaveDC(lpdis->hDC);
FrameRect(lpdis->hDC,&r,GetStockObject(WHITE_BRUSH));
DrawIcon(lpdis->hDC,r.left+IXBITMAP/2,r.top+IYBITMAP/2,ExtractIcon(text->hInstance,_sziconfilename,iicon));
if (lpdis->itemState & ODS_SELECTED) DrawFocusRect(lpdis->hDC,&r);
RestoreDC(lpdis->hDC,-1);
break;
}
case ODA_FOCUS: {
break;
}
}
return TRUE;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case 500: {
if (notify == EN_CHANGE) {
GetDlgItemText(hDlg,id,_sziconfilename,cchof(_sziconfilename));
ChangeIconLoad(hDlg);
}
return FALSE;
}
case IDOK: {
_iicon = SendMessage(GetDlgItem(hDlg,1000),LB_GETCURSEL,0,(LPARAM)0);
EndDialog(hDlg,TRUE);
return TRUE;
}
case IDCANCEL: {
EndDialog(hDlg,FALSE);
return TRUE;
}
}
break;
}
}
return FALSE;
}
BOOL TXAPI dialogaIconSelect(mchar szfilename[CCHPATHNAME],int *iicon)
{
// アイコンの選択
// ダイアログでアイコンを選べます。
// szfilenameに選択されたアイコンを持つファイル名、*iiconに番号を返します
// 選択されたかどうかを返します。
HDIALOG hd = dialog("アイコンの選択");
{
PMACROFUNC pfunc;
if (macroGetFuncAddress("dlgprocIconSelect",&pfunc)) {
dialogSetHook(hd,&pfunc);
}
}
_sziconfilename[0] = 0;
pathSetFileName(_sziconfilename,szfilename);
if (!_sziconfilename[0]) {
GetModuleFileName(text->hInstance,_sziconfilename,sizeof(_sziconfilename));
}
dialogControlRefer(hd,"*.ico;*.exe;*.dll");
dialogControlID(hd,500);
dialogStrC(hd,"ファイル名(&N):",_sziconfilename,18,cchof(_sziconfilename),30);
dialogSetH(hd);
dialogCaption(hd,"アイコンの選択(&C):");
{
DTRECT r;
dialogGetPos(hd,&r);
int cx = LOWORD(GetDialogBaseUnits());
int cy = HIWORD(GetDialogBaseUnits());
r.x = 20 * DTCX;
r.cx = (CXICONBITMAP / cx * 4) * 4; // ()内:1アイコン分
r.cy = (CYICONBITMAP / cy * 8 * 2) * 4; // ()内:1アイコン分
dialogAddItem(hd,DCS_LISTBOX,NULL,1000,&r,LBS_NOTIFY|LBS_OWNERDRAWFIXED);//|LBS_MULTICOLUMN|LBS_DISABLENOSCROLL);
}
dialogSetHelp(hd,"uiIconSelect");
int ret = dialogOpen(hd);
if (ret) {
*iicon = _iicon;
strcpy(szfilename,_sziconfilename);
}
return ret;
}
//##選択ダイアログ
int _strselect(mchar *szcaption,mchar **szstr)
{
#define MAXDATA 30
HDIALOG hd = dialog(szcaption);
BYTE data[MAXDATA];
BOOL ffirst = TRUE;
int id = 0;
int i;
memset(data,0,sizeof(data));
dialogRadioInit(hd);
for (i = 0;szstr[i];i++) {
if (*szstr[i]) {
if (ffirst) {
ffirst = FALSE;
data[id] = TRUE;
}
dialogRadioB(hd,szstr[i],data + id);
id++;
if (id == MAXDATA) {
attention("input.selectstr:項目数が多すぎます");
return 0;
}
} else {
dialogSpaceV(hd);
}
}
if (dialogOpen(hd)) {
for (i = 0;i < id;i++) {
if (data[i]) return i + 1;
}
}
return 0;
}
mchar TXAPIBASE _varyarg *strselect(mchar *szcaption,mchar *szstr,...)
{
// ダイアログをオープンし、szcaptionを表示し、
// szstrをラジオボタンで表示します。
// 選択されたラジオボタンの文字列を返します
// CANCELされれば、""を返します
// 使用例: insert(strselect("選択枝","1","2","3","","4","5"));
// ※""を指定すると、空白を空けます
mchar **p = &szstr;
int idsel = _strselect(szcaption,p);
int id = 1;
for (int i = 0;p[i];i++) {
if (*p[i]) {
if (id == idsel) {
return p[i];
}
id++;
}
}
return "";
}
int TXAPIBASE _varyarg intselect(mchar *szcaption,mchar *szstr,...)
{
// strselectと同じですが、
// 選択された文字列をid(1番目,2番目,...)で返します
// CANCELされれば、0を返します
// 使用例: id = intselect("選択枝","1","2","3","","4","5");
// idに0-5が入ります
// ※""を指定すると、空白を空けます
return _strselect(szcaption,&szstr);
}
#if 0
#include "wintxx.h"
// [ESC]などでクローズされたかどうかが分からない
int _varyarg selectmenu(mchar *szcaption,mchar *szstr,...)
{
HMENU hmenu = CreatePopupMenu();
mchar **p = &szstr;
int id = 1;
int i;
if (szcaption && szcaption[0]) {
menuStr(hmenu,szcaption,0);
menuSepa(hmenu);
}
for (i = 0;p[i];i++) {
if (*p[i]) {
menuStr(hmenu,p[i],id++);
} else {
menuSepa(hmenu);
}
}
{
POINT point;
GetCaretPos(&point);
ClientToScreen(text->hwndbase,&point);
text->fselectmenu = TRUE;
text->idselect = 0;
TrackPopupMenu(hmenu,TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,point.x,point.y,0,text->hwndbase,NULL);
while(text->fselectmenu == 1) {
sleep(0);
}
text->fselectmenu = 0;
}
DestroyMenu(hmenu);
return text->idselect;
}
#endif
//##入力ダイアログ
BOOL TXAPI inputint(mchar *szcaption,int *data)
{
// ダイアログをオープンし、szcaptionを表示し、
// 整数データを入力します。
// {返り値}OKされればTRUE、CANCELされればFALSEを返します
// {例}int data = 0;inputint("整数値",&data);
HDIALOG hd = dialog("WZ");
dialogInt(hd,szcaption,data,strlen(szcaption),7);
return dialogOpen(hd);
}
BOOL TXAPIBASE inputstr(mchar *szcaption,txstr str)
{
// ダイアログをオープンし、szcaptionを表示し、
// 文字列データを入力します。
// {返り値}OKされればTRUE、CANCELされればFALSEを返します
// {例}inputint("文字列",szstr);
HDIALOG hd = dialog("WZ");
dialogStr(hd,szcaption,str,strlen(szcaption),30);
return dialogOpen(hd);
}
BOOL TXAPI inputstrw(mchar *szcaption,txstr str,int wtextbox)
{
// ダイアログをオープンし、szcaptionを表示し、
// 文字列データを入力します。
// テキストボックスの幅をwtextboxで文字数で指定できます。
// {返り値}OKされればTRUE、CANCELされればFALSEを返します
// {例}inputint("文字列",szstr,40);
HDIALOG hd = dialog("WZ");
dialogStr(hd,szcaption,str,strlen(szcaption),wtextbox);
return dialogOpen(hd);
}
//##デバッグダイアログ
#define IDD_PREVIEW 1000
BOOL dlgprocDisptext(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
HDIALOG hd = dialogFromHwnd(hwnd);
HWND hctrl = GetDlgItem(hwnd,IDD_PREVIEW);
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
if (text) {
TX* txsrc = (LPVOID)dialogGetCustdata(hd);
text->fScrollBarV = TRUE;
text->fScrollBarH = TRUE;
text->fDispTag = txsrc->fDispTag;//2.97 970222
text->fSetWidthByWindow = txsrc->fSetWidthByWindow;//2.97 970223
txSetEditmode(text,txsrc->editmode);//2.97 970221 textのeditmodeを反映するようにした
txInsertText(text,txsrc);
txJumpFileTop(text);//2.00C dialogaText:カーソルを先頭にするようにした
txFlush(text);
}
break;
}
}
return FALSE;
}
int TXAPIBASE dialogaText(TX* text,mchar* szcaption)
{
// textの内容を表示します。
// szcaptionにはダイアログのタイトルとして表示する文字列を指定してください。
// 裏テキストを使ったマクロのデバッグに役立ててください。
// szcaptionにはNULLも指定できます。
HDIALOG hd = dialog(szcaption ? szcaption : "Text");//2.97 970221 szcaption=NULL対応
DTRECT r;
r.x = DTCX;
r.y = DTCY;
r.cx = DTCX * 60;
r.cy = DTCY * 20;
dialogSetHookEx(hd,"\m.dlgprocDisptext");
__dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE);
dialogSetCustdata(hd,(DWORD)text);
return dialogOpen(hd);
}
//##コンテキストヘルプ
static HWND _hwndHelp;
static TX* _txhelp;
static int _x;
static int _y;
HOOKRESULT __wndproctext(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
if (_hwndHelp && textf == _txhelp) {
switch(message) {
case WM_KILLFOCUS: {
PostMessage(_hwndHelp,WM_CLOSE,0,0);
break;
}
case WM_KEYDOWN: {
switch(wParam) {
case VK_PRIOR:
case VK_NEXT:
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT: break;
default: {
PostMessage(_hwndHelp,WM_CLOSE,0,0);
return HOOK_CAPTURE;
}
}
break;
}
}
}
return HOOK_CONTINUE;
}
void contexthelpClose(void)
{
if (_hwndHelp) {
dialogFree(_hwndHelp);
_hwndHelp = NULL;
_txhelp = NULL;
macroHookWndTextFree();
txOp(txGetFrame(textf),TXOP_SBDISPEDITMODE,0,0);//3.00B2 970616 コンテキストヘルプを表示するとステータスバーに"体裁"が出たままになった
}
}
permanent int p_lfHeight = 12; //3.00A3 970507
permanent int p_cySpace = 2; //3.00A3 970507 行間を多めに
static mchar _szMsGossick[] = "MS ゴシック";
static void txSetFontstyleText(TX* text,mchar* lfFaceName,int lfHeight)
{
FONTSTYLE* fs = &text->tFontstyle[FONTTX_TEXT];
strcpy(fs->tlfFaceName[IFONT_STD],lfFaceName);
strcpy(fs->tlfFaceName[IFONT_ANK],lfFaceName);
fs->tlfHeight[IFONT_STD] = lfHeight;
fs->tlfHeight[IFONT_ANK] = lfHeight;
}
chc_fontToBig
{
//3.00A3 970507 new
p_lfHeight++;
txSetFontstyleText(text,_szMsGossick,p_lfHeight);
txFlush(text);
txFlushTableAll(text);
}
chc_fontToSmall
{
//3.00A3 970507 new
if (p_lfHeight > 3) {
p_lfHeight--;
}
txSetFontstyleText(text,_szMsGossick,p_lfHeight);
txFlush(text);
txFlushTableAll(text);
}
chc_cySpaceInc
{
//3.00A3 970507 new
p_cySpace++;
text->cySpace = p_cySpace;
txFlush(text);
}
chc_cySpaceDec
{
//3.00A3 970507 new
if (p_cySpace > 0) {
p_cySpace--;
text->cySpace = p_cySpace;
txFlush(text);
}
}
chc
{
//3.00A3 970507 new
HMENU hmenu = menuNew();
menuTx(hmenu,"文字を大きく表示(&B)","\m.chc_fontToBig");
menuTx(hmenu,"文字を小さく表示(&M)","\m.chc_fontToSmall");
menuTx(hmenu,"行間を広く(&S)","\m.chc_cyspaceInc");
menuTx(hmenu,"行間を狭く(&X)","\m.chc_cyspaceDec");
menuOpen(hmenu);
}
BOOL dlgprocContexthelp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
HDIALOG hd = dialogFromHwnd(hwnd);
HWND hctrl = GetDlgItem(hwnd,IDD_PREVIEW);
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
_txhelp = text;
if (text) {
TX* txsrc = (LPVOID)dialogGetCustdata(hd);
#if 1//2.99B 970322 txInitConfigForWindow化
text->nSpaceTop = systemfontGetCy() / 4;
text->fSpaceLeft = TRUE;
text->fSetWidthByWindow = TRUE;
text->fScrollBarV = FALSE;
text->fDispEof = TRUE;
text->fLineD = TRUE;
text->fNoCaret = TRUE;
text->fMouseArrow = TRUE;
text->fJkinsoku = TRUE;
text->fReadMode = TRUE; // カーソル上下ですぐスクロールするように
#if 1//3.00A3 970507 テキストの表示フォントが大きいとコンテキストヘルプのフォントも大きくなった
//3.00A3 970507 コンテキストヘルプで右クリックでコンテキストヘルプのフォントサイズを変えられる様にした
sstrcpy(text->szMenuMouseR,"macro:\m.chc");
text->cySpace = p_cySpace;
txSetFontstyleText(text,_szMsGossick,p_lfHeight);
#else
#if 1
//2.99B 970323 システムフォントだとWin95では文字が小さくて見にくい
// 通常のテキストと同じフォントで表示
text->tFontstyle[FONTTX_TEXT] = txGetFrame(text)->tFontstyle[FONTTX_TEXT];
#else
text->lfProp = TRUE;
#endif
#endif
#else
text->fSetWidthByWindow = TRUE;
text->fScrollBarV = FALSE;
text->fScrollBarH = FALSE;
text->fDispUnder = FALSE;
text->fDispLine = FALSE;
text->fDispLf = FALSE;
text->fDispEof = TRUE;
text->fLineD = TRUE;
text->fNoCaret = TRUE;
text->fMouseArrow = TRUE;
text->fJkinsoku = TRUE;
text->fVertical = FALSE;
text->fPageTurn = FALSE;
text->fDispParse = FALSE;
text->fReadMode = TRUE;//2.96 970209 カーソル上下ですぐスクロールするように
#endif
text->fUndraw++; // ちらつかないように
#if 0
if (_fpsh) {
text->lfProp = TRUE;
FONTSTYLE* fs = &text->tFontstyle[FONTTX_TEXT];
strcpy(fs->tlfFaceName[IFONT_STD],"MS Pゴシック");
fs->tlfHeight[IFONT_STD] = 9;
strcpy(fs->tlfFaceName[IFONT_ANK],"MS Pゴシック");
fs->tlfHeight[IFONT_ANK] = 9;
}
#endif
txInsertText(text,txsrc);
txJumpFileTop(text);
txFlush(text);
#if 1//2.99B 970322
text->fForm = TRUE;
txSetEditmode(text,1);
#endif
PostMessage(hwnd,WM_TXUSER,0,(LPARAM)text);
}
{
RECT rDesk;
GetWorkRect(&rDesk);
//
RECT r;
GetWindowRect(hwnd,&r);
int cx = rectCx(&r);
int cy = rectCy(&r);
if (_x + cx > rDesk.right) {
_x = rDesk.right - cx;
}
if (_y + cy > rDesk.bottom) {
_y = rDesk.bottom - cy;
}
SetWindowPos(hwnd,NULL,_x,_y,0,0,SWP_NOSIZE);
}
break;
}
case WM_TXUSER: {
// 全てのテキストが表示できなければ、スクロールバーを使用可能にする
TX* text = (LPVOID)lParam;
txDispAll(text);
if (!text->fDispEofed) {
text->fScrollBarV = TRUE;
txFlush(text);
}
// ちらつかないように
text->fUndraw--;
txDispAll(text);
break;
}
case WM_CLOSE: {
contexthelpClose();
break;
}
}
return FALSE;
}
int _contexthelp(TX* text,int x,int y)
{
contexthelpClose();
_x = x;
_y = y;
DTRECT r;
HDIALOG hd = dialog("");
r.x = 0;
r.y = 0;
r.cx = DTCX * 60;
r.cy = DTCY * 10;
dialogSetHookEx(hd,"\m.dlgprocContexthelp");
dialogSetNoButton(hd);
{
DWORD style = dialogGetStyle(hd);
style &= ~DS_MODALFRAME;
style &= ~WS_CAPTION;
style &= ~WS_SYSMENU;
style |= WS_DLGFRAME;
dialogSetStyle(hd,style);
}
__dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE);
dialogSetCustdata(hd,(DWORD)text);
dialogSetSize(hd,&r);
macroHookWndText();
_hwndHelp = dialogCreate(hd);
return TRUE;
}
BOOL contexthelp(mchar* szname,int idhelp,int x,int y)
{
mchar szfilename[CCHPATHNAME];
if (szname == NULL || szname[0] == 0) {
strcpy(szfilename,text->szexedir + "wz.chp");
} else {
if (!pathSearch(szfilename,szname,wzGetEnv(WZENV_TXPATH),".chp")) {
attention("WZコンテキストヘルプファイル %s が見つかりません",szname);
return FALSE;
}
}
BOOL ret = FALSE;
TX textBody;
TX* text = &textBody;
txInitText(text);
txSetFileName(text,szfilename);
txOpenText(text);
mchar sz[CCHWORD];
sprintf(sz,"#%d#",idhelp);
if (txSearchEx(text,sz,0)) {
txDown(text);
txSelect(text);
txstr szline;
int npara = 0;
while(1) {
if (!txDown(text)) break;
txGetLine(text,szline);
if (szline[0] == '#' && *strGetLast(szline) == '#') {
// 末尾の空行を含めない
if (npara) {
txJumpPara(text,npara);
}
break;
}
if (szline[0] == 0) {
if (npara == 0) {
npara = text->npara;
}
} else {
npara = 0;
}
}
#if 1//2.99C 970323 コンテキストヘルプを使うとテキストスタックが変換していた
txPrivatePush(text);
txDeleteText(text);
txPrivatePop(text);
#else
txSelectCopy(text);
txDeleteText(text);
txPaste(text);
#endif
_contexthelp(text,x,y);
ret = TRUE;
}
return ret;
}
BOOL TXAPI contexthelpOpenAsHelp(int idhelp,HWND hctrl)
{
// hctrlウィンドウの左上+@の位置に、wz.chpのidhelp番のコンテキストヘルプを表示
//3.00A2 970506 new
RECT r;
if (hctrl) {
GetWindowRect(hctrl,&r);
} else {
//3.00A3 970507 hctrlがNULLなら中央に表示
GetWorkRect(&r);
r.left = r.left + rectCx(&r) / 3;
r.top = r.top + rectCy(&r) / 3;
}
return contexthelp(NULL,idhelp,r.left + systemfontGetCx(),r.top + systemfontGetCy());
}
main
{
dialogaText(text,"aa");
}
#if 0 // TEST
main {
int a = 10;
txstr b;
inputint("a = ",&a);
inputstr("b = ",b);
printf("a = %d,b = %s\n",a,b);
}
main {
printf("select = %d\n",intselect("選択","1","2","3","","4"));
}
#endif