今回からメニューもちょっと変更して「挿入」「タグの挿入」「<FORM></FORM>」
で左のようなダイアログが出ます。必要なアトリビュートにチェックを入れると
その項目のエディットコントロールが出現します。
FORMタグの中にINPUTタグを挿入します。
これも必要なアトリビュートにチェックを入れるとエディットコントロールなどが 出現します。
イベントハンドラにチェックを付けた場合、動作を関数名で指定するか 直接JavaScriptなどを記述します。
では、プログラムを見てみましょう。
メニューが一部変更になっています。// htmledit04.rcの一部 ///////////////////////////////////////////////////////////////////////////// // // Menu // MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "新規作成(&N)...", IDM_NEW MENUITEM "上書き保存(&S)", IDM_SAVE MENUITEM "名前を付けて保存(&A)...", IDM_SAVEAS MENUITEM SEPARATOR MENUITEM "アプリケーションの終了(&X)", IDM_END END POPUP "挿入(&I)" BEGIN MENUITEM "基本項目入力(&B)...", IDM_BASICINPUT MENUITEM SEPARATOR POPUP "タグの挿入" BEGIN MENUITEM "<P>", IDM_P MENUITEM "<BR>", IDM_BR MENUITEM "<H*></H*>...", IDM_H MENUITEM "<IMG>...", IDM_IMAGE MENUITEM "<A HREF></A>...", IDM_A MENUITEM "<TABLE></TABLE>...", IDM_TABLE MENUITEM "<FORM></FORM>...", IDM_FORM MENUITEM "<INPUT>...", IDM_INPUT END POPUP "JavaScriptの挿入" BEGIN MENUITEM "<SCRIPT>", IDM_SCRIPT END END POPUP "ブラウザ(&B)" BEGIN MENUITEM "ブラウザ起動(&E)", IDM_BROWSER END END ///////////////////////////////////////////////////////////////////////////// // // Dialog // MYBASICINPUT DIALOG DISCARDABLE 0, 0, 187, 121 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "基本項目入力" FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT1,39,7,141,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,39,27,141,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,39,47,141,14,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,39,100,50,14 PUSHBUTTON "キャンセル",IDCANCEL,96,100,50,14 LTEXT "タイトル",IDC_STATIC,7,7,23,8 LTEXT "作者",IDC_STATIC,7,30,15,8 LTEXT "E-Mail",IDC_STATIC,7,47,20,8 CONTROL "色",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,35,76,23,10 CONTROL "壁紙",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,67,76,32, 10 GROUPBOX "背景",IDC_STATIC,26,67,133,26 CONTROL "指定しない",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,108, 76,46,10 END MYHTAG DIALOG DISCARDABLE 0, 0, 187, 93 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "見出しタグの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,40,72,50,14 PUSHBUTTON "キャンセル",IDCANCEL,95,72,50,14 COMBOBOX IDC_COMBO1,51,7,18,68,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "大きさ",IDC_STATIC,7,7,32,11 LTEXT "コンテンツ",IDC_STATIC,7,27,39,10 EDITTEXT IDC_EDIT1,51,27,129,32,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN END MYIMGTAG DIALOG DISCARDABLE 0, 0, 187, 91 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "イメージの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,43,70,41,14 PUSHBUTTON "キャンセル",IDCANCEL,101,70,41,14 CONTROL "パス付き",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,42,15 EDITTEXT IDC_EDIT1,50,7,107,16,ES_AUTOHSCROLL LTEXT "ファイル名",IDC_STATIC,7,33,38,11 EDITTEXT IDC_EDIT2,50,29,107,16,ES_AUTOHSCROLL PUSHBUTTON "参照",IDC_BUTTON1,160,31,20,15 CONTROL "画像を確認する",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,52,61,15 END MYTABLETAG DIALOG DISCARDABLE 0, 0, 95, 133 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "テーブルの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,7,112,33,14 PUSHBUTTON "キャンセル",IDCANCEL,46,112,33,14 LTEXT "行",IDC_STATIC,7,7,11,10 COMBOBOX IDC_COMBO1,29,7,23,58,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP LTEXT "列",IDC_STATIC,7,27,11,10 COMBOBOX IDC_COMBO2,29,25,23,55,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP CONTROL "BORDER",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49,41,12 EDITTEXT IDC_EDIT1,51,48,34,14,ES_AUTOHSCROLL CONTROL "CAPTION",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,67,44,12 COMBOBOX IDC_COMBO3,51,67,34,45,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_EDIT2,17,89,71,14,ES_AUTOHSCROLL END MYFORMTAG DIALOG DISCARDABLE 0, 0, 187, 103 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "フォームの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,38,82,50,14 PUSHBUTTON "キャンセル",IDCANCEL,97,82,50,14 CONTROL "METHOD",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,47,12 COMBOBOX IDC_COMBO1,65,7,52,41,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "ACTION",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,25,43,12 EDITTEXT IDC_EDIT1,65,25,114,12,ES_AUTOHSCROLL CONTROL "NAME",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 7,43,34,12 EDITTEXT IDC_EDIT2,65,43,114,12,ES_AUTOHSCROLL CONTROL "ID",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, 61,32,12 EDITTEXT IDC_EDIT3,65,61,114,12,ES_AUTOHSCROLL END MYINPUTTAG DIALOG DISCARDABLE 0, 0, 135, 203 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "INPUTの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,17,182,50,14 PUSHBUTTON "キャンセル",IDCANCEL,71,182,50,14 LTEXT "TYPE",IDC_STATIC,7,7,24,9 COMBOBOX IDC_COMBO1,49,7,45,92,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "NAME",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 7,48,35,14 CONTROL "ID",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, 67,25,14 CONTROL "onClick",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,86,35,14 EDITTEXT IDC_EDIT4,49,87,75,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,49,49,75,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,49,67,75,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT1,49,29,75,13,ES_AUTOHSCROLL CONTROL "VALUE",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 7,29,37,14 CONTROL "onBlur",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,105,36,14 EDITTEXT IDC_EDIT5,49,105,75,13,ES_AUTOHSCROLL CONTROL "onChange",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,124,40,14 EDITTEXT IDC_EDIT6,49,125,75,13,ES_AUTOHSCROLL CONTROL "onFocus",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,143,37,14 EDITTEXT IDC_EDIT7,49,143,75,13,ES_AUTOHSCROLL CONTROL "onSubmit",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,162,40,14 EDITTEXT IDC_EDIT8,49,163,75,13,ES_AUTOHSCROLL END ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. MYICON ICON DISCARDABLE "htmledit.ico"
「FORMの挿入」「INPUTの挿入」ダイアログが追加になっています。
新たにMYFORMTAG, MYINPUTTAG構造体をtypedefしました。// htmedit04.cpp #ifndef STRICT #define STRICT #endif #define ID_EDIT 100 #define ID_EDIT2 101 #define MY_BUF_SIZE 1024 * 64 - 1 #include <windows.h> #include <windowsx.h> #include "resource.h" typedef struct _tagHData { char szTagNo[4]; char szContents[256]; } MYHTAG, *LPMYHTAG; typedef struct _tagImgData { char szFileName[MAX_PATH]; char szPath[MAX_PATH]; BOOL bPath; } MYIMGTAG, *LPMYIMGTAG; typedef struct _tagTableData { char szRow[8]; char szColumn[8]; char szTitle[64]; char szTitleAlign[16]; char szBorder[8]; BOOL bTitle; BOOL bBorder; } MYTABLETAG, *LPMYTABLETAG; typedef struct _tagFormData { char szMethod[8]; char szAction[64]; char szName[16]; char szID[16]; BOOL bMethod; BOOL bAction; BOOL bName; BOOL bID; } MYFORMTAG, *LPMYFORMTAG; typedef struct _tagInputData { char szType[16]; char szValue[64]; char szName[16]; char szID[16]; char szOnClick[64]; char szOnBlur[64]; char szOnChange[64]; char szOnFocus[64]; char szOnSubmit[64]; BOOL bValue; BOOL bName; BOOL bID; BOOL bClick; BOOL bBlur; BOOL bChange; BOOL bFocus; BOOL bSubmit; } MYINPUTTAG, *LPMYINPUTTAG; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyBasicInputProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyHProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyImgProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyAProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyTableProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyFormProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyInputProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); BOOL MySetHTML(HWND); int MyBasicInput(HWND); BOOL MySaveAs(HWND); BOOL MySave(HWND); BOOL MyInsertTag(HWND, HWND, char *); BOOL MyInsertH(HWND, HWND); BOOL MyInsertIMG(HWND, HWND); BOOL MyGetFileTitle(HWND, HWND, BOOL); BOOL MyGetBodyColor(HWND); BOOL MyGetWallPaper(HWND); BOOL MyInsertA(HWND, HWND); BOOL MyGetHREFFile(HWND, HWND, BOOL); BOOL MyInsertTable(HWND, HWND); BOOL MyInsertForm(HWND, HWND); BOOL MyInsertInput(HWND, HWND); BOOL MyInsertScript(HWND, HWND); char szClassName[] = "htmedit04"; //ウィンドウクラス char *lpszWinTitleOrg = "猫でもわかるHTMLエディタ[%s]"; char *lpszHead = "<HTML>\r\n<HEAD>\r\n" "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\r\n<TITLE>"; char szTitle[64] = "タイトル"; char *lpszBody1 = "</TITLE>\r\n</HEAD>\r\n<BODY"; char szBody2[256]; char *lpszBody3 =">\r\n"; char *lpszAddress = "<ADDRESS>"; char *lpszMailto = "<A HREF=\"mailto:"; char szEMail[256] = "webmaster@kumei.ne.jp"; char *lpszMailEnd = "\">"; char szName[64] = "Yasutaka Kumei"; char *lpszCloseA = "</A>"; char *lpszEnd = "</ADDRESS>\r\n</BODY>\r\n</HTML>"; char szFileName[MAX_PATH]; char szFileTitle[64];
「基本項目入力」を行うとMETAタグで書かれている文字セットがシフトJISで あることを明示しました。こうしておくと、CGIを見たあとでの文字化けが 防げます。(CGIのパールは通常EUCで書かれているので、このあと続けて シフトJISのHTMLファイルを見ると文字化けすることがあります。)
これは、いつも通りです。int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
いつもと同じですが、アイコンがないと寂しいので付けてみました。 適当なアイコンを作ってみてください。//ウィンドウ・クラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;//インスタンス wc.hIcon = LoadIcon(hInst, "MYICON"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "MYMENU"; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = LoadIcon(hInst, "MYICON"); return (RegisterClassEx(&wc)); }
いつもと同じです。//ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, "猫でもわかるHTMLエディタ", //タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
メニューからIDM_FORM, IDM_INPUT, IDM_SCRIPTが選択されたら それぞれを担当している関数を呼びだしています。//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static HWND hEdit, hEdit_hide; HINSTANCE hInst; CREATESTRUCT *lpcs; char szWinTitle[64]; switch (msg) { case WM_CREATE: wsprintf(szWinTitle, lpszWinTitleOrg, "無題"); SetWindowText(hWnd, szWinTitle); lpcs = (CREATESTRUCT *)lp; hInst = lpcs->hInstance; hEdit = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_HSCROLL | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInst, NULL); hEdit_hide = CreateWindow("EDIT", "", WS_CHILD, 0, 0, 0, 0, hEdit, (HMENU)ID_EDIT2, hInst, NULL); SetFocus(hEdit); break; case WM_SIZE: MoveWindow(hEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE); break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_BASICINPUT: if (MyBasicInput(hEdit) == IDCANCEL) break; id = MessageBox(hWnd, "現在のソースファイルが置き換わりますがよろしいですか", "注意", MB_YESNO | MB_ICONQUESTION); if (id == IDNO) break; MySetHTML(hEdit); SetFocus(hEdit); break; case IDM_SAVEAS: MySaveAs(hEdit); wsprintf(szWinTitle, lpszWinTitleOrg, szFileTitle); SetWindowText(hWnd, szWinTitle); break; case IDM_NEW: if (SendMessage(hEdit, EM_GETMODIFY, 0, 0)) { id = MessageBox(hWnd, "変更を保存しますか", "注意", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) MySave(hEdit); } SetWindowText(hEdit, ""); strcpy(szFileName, ""); strcpy(szFileTitle, ""); wsprintf(szWinTitle, lpszWinTitleOrg, "無題"); SetWindowText(hWnd, szWinTitle); break; case IDM_SAVE: id = MessageBox(hWnd, "上書きしてもよろしいですか", "上書き保存", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { MySave(hEdit); wsprintf(szWinTitle, lpszWinTitleOrg, szFileTitle); SetWindowText(hWnd, szWinTitle); } break; case IDM_P: MyInsertTag(hEdit, hEdit_hide, "<P>"); break; case IDM_BR: MyInsertTag(hEdit, hEdit_hide, "<BR>"); break; case IDM_H: MyInsertH(hEdit, hEdit_hide); break; case IDM_IMAGE: MyInsertIMG(hEdit, hEdit_hide); break; case IDM_BROWSER: if (strcmp(szFileName, "") == 0) { MessageBox(hWnd, "まだHTMLファイルが保存されていません", "Error", MB_OK); break; } ShellExecute(hWnd, "open", szFileName, NULL, NULL, SW_SHOWNORMAL); break; case IDM_A: MyInsertA(hEdit, hEdit_hide); break; case IDM_TABLE: MyInsertTable(hEdit, hEdit_hide); break; case IDM_FORM: MyInsertForm(hEdit, hEdit_hide); break; case IDM_INPUT: MyInsertInput(hEdit, hEdit_hide); break; case IDM_SCRIPT: MyInsertScript(hEdit, hEdit_hide); break; } break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよいですか", "終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { if (SendMessage(hEdit, EM_GETMODIFY, 0, 0)) { id = MessageBox(hWnd, "変更を保存しますか", "保存", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) MySave(hEdit); } DestroyWindow(hEdit_hide); DestroyWindow(hEdit); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }
MySetHTML, MyBasicInput, MyBasicInputProc, MySaveAs, MySave, MyInsertTag, MyInsertH, MyHProc, MyInsertIMG, MyImgProc, MyGetFileTitle, MyGetBodyColor, MyGetWallPaper, MyInsertA, MyAProc, MyGetHREFFile, MyInsertTable, MyTableProc の各関数に変更はありません。
FORMタグを挿入する関数です。BOOL MyInsertForm(HWND hEdit, HWND hEdit_hide) { MYFORMTAG fm; HINSTANCE hInst; char szBuf[256]; hInst = (HINSTANCE)GetWindowLong(hEdit, GWL_HINSTANCE); if (DialogBoxParam(hInst, "MYFORMTAG", hEdit, (DLGPROC)MyFormProc, (LPARAM)&fm) == IDCANCEL) return FALSE; strcpy(szBuf, ">FORM"); if (fm.bMethod) { strcat(szBuf, " METHOD=\""); strcat(szBuf, fm.szMethod); strcat(szBuf, "\""); } if (fm.bAction) { strcat(szBuf, " ACTION=\""); strcat(szBuf, fm.szAction); strcat(szBuf, "\""); } if (fm.bName) { strcat(szBuf, " NAME=\""); strcat(szBuf, fm.szName); strcat(szBuf, "\""); } if (fm.bID) { strcat(szBuf, " ID=\""); strcat(szBuf, fm.szID); strcat(szBuf, "\""); } strcat(szBuf, ">\r\n>/FORM>"); MyInsertTag(hEdit, hEdit_hide, szBuf); return TRUE; }
ダイアログボックスでユーザーがキャンセルボタンを押すとこの関数は FALSEを返して終了します。
OKボタンが押されたときは、szBufferにタグとアトリビュートを必要に応じて 追加して、挿入します。
FORM挿入ダイアログのプロシージャです。LRESULT CALLBACK MyFormProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { static LPMYFORMTAG lpfm; static HWND hMethodCheck, hActionCheck, hMethodCombo, hActionEdit, hNameCheck, hNameEdit, hIDCheck, hIDEdit; static BOOL bMethod, bAction, bName, bID; static char szMethod[8], szAction[64], szName[16], szID[16]; switch (msg) { case WM_INITDIALOG: lpfm = (LPMYFORMTAG)lp; hMethodCheck = GetDlgItem(hDlg, IDC_CHECK1); hActionCheck = GetDlgItem(hDlg, IDC_CHECK2); hMethodCombo = GetDlgItem(hDlg, IDC_COMBO1); hActionEdit = GetDlgItem(hDlg, IDC_EDIT1); hNameCheck = GetDlgItem(hDlg, IDC_CHECK3); hNameEdit = GetDlgItem(hDlg, IDC_EDIT2); hIDCheck = GetDlgItem(hDlg, IDC_CHECK4); hIDEdit = GetDlgItem(hDlg, IDC_EDIT3); ComboBox_AddString(hMethodCombo, "POST"); ComboBox_AddString(hMethodCombo, "GET"); if (bMethod) { Button_SetCheck(hMethodCheck, BST_CHECKED); EnableWindow(hMethodCombo, TRUE); } else { Button_SetCheck(hMethodCheck, BST_UNCHECKED); EnableWindow(hMethodCombo, FALSE); } if (bAction) { Button_SetCheck(hActionCheck, BST_CHECKED); EnableWindow(hActionEdit, TRUE); } else { Button_SetCheck(hActionCheck, BST_UNCHECKED); EnableWindow(hActionEdit, FALSE); } if (bName) { Button_SetCheck(hNameCheck, BST_CHECKED); EnableWindow(hNameEdit, TRUE); } else { Button_SetCheck(hNameCheck, BST_UNCHECKED); EnableWindow(hNameEdit, FALSE); } if (bID) { Button_SetCheck(hIDCheck, BST_CHECKED); EnableWindow(hIDEdit, TRUE); } else { Button_SetCheck(hIDCheck, BST_UNCHECKED); EnableWindow(hIDEdit, FALSE); } ComboBox_SetText(hMethodCombo, szMethod); Edit_SetText(hActionEdit, szAction); Edit_SetText(hNameEdit, szName); Edit_SetText(hIDEdit, szID); return TRUE; case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: if (Button_GetCheck(hMethodCheck) == BST_CHECKED) { ComboBox_GetText(hMethodCombo, lpfm->szMethod, sizeof(lpfm->szMethod)); lpfm->bMethod = TRUE; bMethod = TRUE; } else { strcpy(lpfm->szMethod, ""); lpfm->bMethod = FALSE; bMethod = FALSE; } if (Button_GetCheck(hActionCheck) == BST_CHECKED) { Edit_GetText(hActionEdit, lpfm->szAction, sizeof(lpfm->szAction)); lpfm->bAction = TRUE; bAction = TRUE; } else { strcpy(lpfm->szAction, ""); lpfm->bAction = FALSE; bAction = FALSE; } if (Button_GetCheck(hNameCheck) == BST_CHECKED) { Edit_GetText(hNameEdit, lpfm->szName, sizeof(lpfm->szName)); lpfm->bName = TRUE; bName = TRUE; } else { strcpy(lpfm->szName, ""); lpfm->bName = FALSE; bName = FALSE; } if (Button_GetCheck(hIDCheck) == BST_CHECKED) { Edit_GetText(hIDEdit, lpfm->szID, sizeof(lpfm->szID)); lpfm->bID = TRUE; bID = TRUE; } else { strcpy(lpfm->szID, ""); lpfm->bID = FALSE; bID = FALSE; } strcpy(szMethod, lpfm->szMethod); strcpy(szAction, lpfm->szAction); strcpy(szName, lpfm->szName); strcpy(szID, lpfm->szID); EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_CHECK1: if (Button_GetCheck(hMethodCheck) == BST_CHECKED) { EnableWindow(hMethodCombo, TRUE); bMethod = TRUE; } else { EnableWindow(hMethodCombo, FALSE); bMethod = FALSE; } return TRUE; case IDC_CHECK2: if (Button_GetCheck(hActionCheck) == BST_CHECKED) { EnableWindow(hActionEdit, TRUE); bAction = TRUE; } else { EnableWindow(hActionEdit, FALSE); bAction = FALSE; } return TRUE; case IDC_CHECK3: if (Button_GetCheck(hNameCheck) == BST_CHECKED) { EnableWindow(hNameEdit, TRUE); bName = TRUE; } else { EnableWindow(hNameEdit, FALSE); bName = FALSE; } return TRUE; case IDC_CHECK4: if (Button_GetCheck(hIDCheck) == BST_CHECKED) { EnableWindow(hIDEdit, TRUE); bID = TRUE; } else { EnableWindow(hIDEdit, FALSE); bID = FALSE; } return TRUE; } return FALSE; } return FALSE; }
WM_INITDIALOGメッセージが来たら、コントロール類のハンドルをスタティックな 変数に取得しておきます。
コンボボックスに文字列を追加しておきます。
BOOLの値によって各項目のチェックボックスにチェックを付けたり、 前回入力した文字列をエディットコントロールに表示します。
OKボタンが押されたら、チェックの付いている項目のエディットコントロールの 内容をMYFORMTAG構造体の該当するメンバに取得します。また、次回このダイアログが 開かれたときのために取得した文字列をスタティックな変数に格納しておきます。
各チェックボックスがクリックされたら、関連のエディットコントロールを 表示したり、非表示にしたりします。
INPUTタグ挿入ダイアログのプロシージャです。LRESULT CALLBACK MyInputProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { static LPMYINPUTTAG lpin; static HWND hValueCheck, hValueEdit, hTypeCombo, hNameCheck, hIDCheck, hOnClickCheck, hNameEdit, hIDEdit, hOnClickEdit, hOnBlurCheck, hOnBlurEdit, hOnChangeCheck, hOnChangeEdit, hOnFocusCheck, hOnFocusEdit, hOnSubmitCheck, hOnSubmitEdit; static BOOL bValue, bName, bID, bOnClick, bOnBlur, bOnChange, bOnFocus, bOnSubmit; static char szType[16], szValue[64], szName[16], szID[16], szOnClick[64], szOnBlur[64], szOnChange[64], szOnFocus[64], szOnSubmit[64]; switch (msg) { case WM_INITDIALOG: lpin = (LPMYINPUTTAG)lp; hValueCheck = GetDlgItem(hDlg, IDC_CHECK1); hValueEdit = GetDlgItem(hDlg, IDC_EDIT1); hTypeCombo = GetDlgItem(hDlg, IDC_COMBO1); hNameCheck = GetDlgItem(hDlg, IDC_CHECK2); hIDCheck = GetDlgItem(hDlg, IDC_CHECK3); hOnClickCheck = GetDlgItem(hDlg, IDC_CHECK4); hNameEdit = GetDlgItem(hDlg, IDC_EDIT2); hIDEdit = GetDlgItem(hDlg, IDC_EDIT3); hOnClickEdit = GetDlgItem(hDlg, IDC_EDIT4); hOnBlurCheck = GetDlgItem(hDlg, IDC_CHECK5); hOnBlurEdit = GetDlgItem(hDlg, IDC_EDIT5); hOnChangeCheck = GetDlgItem(hDlg, IDC_CHECK6); hOnChangeEdit = GetDlgItem(hDlg, IDC_EDIT6); hOnFocusCheck = GetDlgItem(hDlg, IDC_CHECK7); hOnFocusEdit = GetDlgItem(hDlg, IDC_EDIT7); hOnSubmitCheck = GetDlgItem(hDlg, IDC_CHECK8); hOnSubmitEdit = GetDlgItem(hDlg, IDC_EDIT8); ComboBox_AddString(hTypeCombo, "button"); ComboBox_AddString(hTypeCombo, "text"); ComboBox_AddString(hTypeCombo, "radio"); ComboBox_AddString(hTypeCombo, "checkbox"); ComboBox_AddString(hTypeCombo, "submit"); ComboBox_AddString(hTypeCombo, "reset"); if (bValue) { ShowWindow(hValueEdit, SW_SHOW); Button_SetCheck(hValueCheck, BST_CHECKED); } else { ShowWindow(hValueEdit, SW_HIDE); Button_SetCheck(hValueCheck, BST_UNCHECKED); } if (bName) { ShowWindow(hNameEdit, SW_SHOW); Button_SetCheck(hNameCheck, BST_CHECKED); } else { ShowWindow(hNameEdit, SW_HIDE); Button_SetCheck(hNameCheck, BST_UNCHECKED); } if (bID) { ShowWindow(hIDEdit, SW_SHOW); Button_SetCheck(hIDCheck, BST_CHECKED); } else { ShowWindow(hIDEdit, SW_HIDE); Button_SetCheck(hIDCheck, BST_UNCHECKED); } if (bOnClick) { ShowWindow(hOnClickEdit, SW_SHOW); Button_SetCheck(hOnClickCheck, BST_CHECKED); } else { ShowWindow(hOnClickEdit, SW_HIDE); Button_SetCheck(hOnClickCheck, BST_UNCHECKED); } if (bOnBlur) { ShowWindow(hOnBlurEdit, SW_SHOW); Button_SetCheck(hOnBlurCheck, BST_CHECKED); } else { ShowWindow(hOnBlurEdit, SW_HIDE); Button_SetCheck(hOnBlurCheck, BST_UNCHECKED); } if (bOnChange) { ShowWindow(hOnChangeEdit, SW_SHOW); Button_SetCheck(hOnChangeCheck, BST_CHECKED); } else { ShowWindow(hOnChangeEdit, SW_HIDE); Button_SetCheck(hOnChangeCheck, BST_UNCHECKED); } if (bOnFocus) { ShowWindow(hOnFocusEdit, SW_SHOW); Button_SetCheck(hOnFocusCheck, BST_CHECKED); } else { ShowWindow(hOnFocusEdit, SW_HIDE); Button_SetCheck(hOnFocusCheck, BST_UNCHECKED); } if (bOnSubmit) { ShowWindow(hOnSubmitEdit, SW_SHOW); Button_SetCheck(hOnSubmitCheck, BST_CHECKED); } else { ShowWindow(hOnSubmitEdit, SW_HIDE); Button_SetCheck(hOnSubmitCheck, BST_UNCHECKED); } ComboBox_SetText(hTypeCombo, szType); Edit_SetText(hValueEdit, szValue); Edit_SetText(hNameEdit, szName); Edit_SetText(hIDEdit, szID); Edit_SetText(hOnClickEdit, szOnClick); Edit_SetText(hOnBlurEdit, szOnBlur); Edit_SetText(hOnChangeEdit, szOnChange); Edit_SetText(hOnFocusEdit, szOnFocus); Edit_SetText(hOnSubmitEdit, szOnSubmit); return TRUE; case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: ComboBox_GetText(hTypeCombo, lpin->szType, sizeof(lpin->szType)); if (Button_GetCheck(hValueCheck) == BST_CHECKED) { Edit_GetText(hValueEdit, lpin->szValue, sizeof(lpin->szValue)); strcpy(szValue, lpin->szValue); lpin->bValue = TRUE; bValue = TRUE; } else { strcpy(lpin->szValue, ""); lpin->bValue = FALSE; bValue = FALSE; } if (Button_GetCheck(hNameCheck) == BST_CHECKED) { Edit_GetText(hNameEdit, lpin->szName, sizeof(lpin->szName)); lpin->bName = TRUE; bName = TRUE; } else { strcpy(lpin->szName, ""); lpin->bName = FALSE; bName = FALSE; } if (Button_GetCheck(hIDCheck) == BST_CHECKED) { Edit_GetText(hIDEdit, lpin->szID, sizeof(lpin->szID)); lpin->bID = TRUE; bID = TRUE; } else { strcpy(lpin->szID, ""); lpin->bID = FALSE; bID = FALSE; } if (Button_GetCheck(hOnClickCheck) == BST_CHECKED) { Edit_GetText(hOnClickEdit, lpin->szOnClick, sizeof(lpin->szOnClick)); lpin->bClick = TRUE; bOnClick = TRUE; } else { strcpy(lpin->szOnClick, ""); lpin->bClick = FALSE; bOnClick = FALSE; } if (Button_GetCheck(hOnBlurCheck) == BST_CHECKED) { Edit_GetText(hOnBlurEdit, lpin->szOnBlur, sizeof(lpin->szOnBlur)); lpin->bBlur = TRUE; bOnBlur = TRUE; } else { strcpy(lpin->szOnBlur, ""); lpin->bBlur = FALSE; bOnBlur = FALSE; } if (Button_GetCheck(hOnChangeCheck) == BST_CHECKED) { Edit_GetText(hOnChangeEdit, lpin->szOnChange, sizeof(lpin->szOnChange)); lpin->bChange = TRUE; bOnChange = TRUE; } else { strcpy(lpin->szOnChange, ""); lpin->bChange = FALSE; bOnChange = FALSE; } if (Button_GetCheck(hOnFocusCheck) == BST_CHECKED) { Edit_GetText(hOnFocusEdit, lpin->szOnFocus, sizeof(lpin->szOnFocus)); lpin->bFocus = TRUE; bOnFocus = TRUE; } else { strcpy(lpin->szOnFocus, ""); lpin->bFocus = FALSE; bOnFocus = FALSE; } if (Button_GetCheck(hOnSubmitCheck) == BST_CHECKED) { Edit_GetText(hOnSubmitEdit, lpin->szOnSubmit, sizeof(lpin->szOnSubmit)); lpin->bSubmit = TRUE; bOnSubmit = TRUE; } else { strcpy(lpin->szOnSubmit, ""); lpin->bSubmit = FALSE; bOnSubmit = FALSE; } strcpy(szType, lpin->szType); strcpy(szName, lpin->szName); strcpy(szID, lpin->szID); strcpy(szOnClick, lpin->szOnClick); strcpy(szOnBlur, lpin->szOnBlur); strcpy(szOnChange, lpin->szOnChange); strcpy(szOnFocus, lpin->szOnFocus); strcpy(szOnSubmit, lpin->szOnSubmit); EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_CHECK1: if (Button_GetCheck(hValueCheck) == BST_CHECKED) { ShowWindow(hValueEdit, SW_SHOW); bValue = TRUE; } else { ShowWindow(hValueEdit, SW_HIDE); bValue = FALSE; } case IDC_CHECK2: if (Button_GetCheck(hNameCheck) == BST_CHECKED) { ShowWindow(hNameEdit, SW_SHOW); bName = TRUE; } else { ShowWindow(hNameEdit, SW_HIDE); bName = FALSE; } return TRUE; case IDC_CHECK3: if (Button_GetCheck(hIDCheck) == BST_CHECKED) { ShowWindow(hIDEdit, SW_SHOW); bID = TRUE; } else { ShowWindow(hIDEdit, SW_HIDE); bID = FALSE; } return TRUE; case IDC_CHECK4: if (Button_GetCheck(hOnClickCheck) == BST_CHECKED) { ShowWindow(hOnClickEdit, SW_SHOW); bOnClick = TRUE; } else { ShowWindow(hOnClickEdit, SW_HIDE); bOnClick = FALSE; } return TRUE; case IDC_CHECK5: if (Button_GetCheck(hOnBlurCheck) == BST_CHECKED) { ShowWindow(hOnBlurEdit, SW_SHOW); bOnBlur = TRUE; } else { ShowWindow(hOnBlurEdit, SW_HIDE); bOnBlur = FALSE; } return TRUE; case IDC_CHECK6: if (Button_GetCheck(hOnChangeCheck) == BST_CHECKED) { ShowWindow(hOnChangeEdit, SW_SHOW); bOnChange = TRUE; } else { ShowWindow(hOnChangeEdit, SW_HIDE); bOnChange = FALSE; } return TRUE; case IDC_CHECK7: if (Button_GetCheck(hOnFocusCheck) == BST_CHECKED) { ShowWindow(hOnFocusEdit, SW_SHOW); bOnFocus = TRUE; } else { ShowWindow(hOnFocusEdit, SW_HIDE); bOnFocus = FALSE; } return TRUE; case IDC_CHECK8: if (Button_GetCheck(hOnSubmitCheck) == BST_CHECKED) { ShowWindow(hOnSubmitEdit, SW_SHOW); bOnSubmit = TRUE; } else { ShowWindow(hOnSubmitEdit, SW_HIDE); bOnSubmit = FALSE; } return TRUE; } return FALSE; } return FALSE; }
長いですが構造はFORMタグ挿入ダイアログのそれと全く同じです。
INPUTタグを挿入する関数です。BOOL MyInsertInput(HWND hEdit, HWND hEdit_hide) { HINSTANCE hInst; MYINPUTTAG in; char szBuf[256]; hInst = (HINSTANCE)GetWindowLong(hEdit, GWL_HINSTANCE); if (DialogBoxParam(hInst, "MYINPUTTAG", hEdit, (DLGPROC)MyInputProc, (LPARAM)&in) == IDCANCEL) return FALSE; strcpy(szBuf, "<INPUT TYPE=\""); strcat(szBuf, in.szType); strcat(szBuf, "\""); if (in.bValue) { strcat(szBuf, " VALUE=\""); strcat(szBuf, in.szValue); strcat(szBuf, "\""); } if (in.bName) { strcat(szBuf, " NAME=\""); strcat(szBuf, in.szName); strcat(szBuf, "\""); } if (in.bID) { strcat(szBuf, " ID=\""); strcat(szBuf, in.szID); strcat(szBuf, "\""); } if (in.bClick) { strcat(szBuf, " onClick=\""); strcat(szBuf, in.szOnClick); strcat(szBuf, "\""); } if (in.bBlur) { strcat(szBuf, " onBlur=\""); strcat(szBuf, in.szOnBlur); strcat(szBuf, "\""); } if (in.bChange) { strcat(szBuf, " onChange=\""); strcat(szBuf, in.szOnChange); strcat(szBuf, "\""); } if (in.bFocus) { strcat(szBuf, " onFocus=\""); strcat(szBuf, in.szOnFocus); strcat(szBuf, "\""); } if (in.bSubmit) { strcat(szBuf, " onSubmit=\""); strcat(szBuf, in.szOnSubmit); strcat(szBuf, "\""); } strcat(szBuf, ">"); MyInsertTag(hEdit, hEdit_hide, szBuf); return TRUE; }
ダイアログボックスでキャンセルボタンが押されたらFALSEを返して終了します。
MYINPUTTAG構造体のBOOL値に従いszBufferにアトリビュートを追加していきます。
最後にエディットコントロールにMyInsertTag関数を使ってszBufを挿入します。
SCRIPTタグを挿入する関数です。HEADに関数類をまとめて記述するとき便利です。BOOL MyInsertScript(HWND hEdit, HWND hEdit_hide) { char szBuf[256]; strcpy(szBuf, ""); MyInsertTag(hEdit, hEdit_hide, szBuf); return TRUE; }
今回は簡単でした。ツールバーやら、ステータスバーを付けてアプリケーションらしく してみてください。
Update 02/Mar/2001 By Y.Kumei