第317章 カスタム・リソース


ホーム・ページ作りにGIF画像やJPEG画像はかかせません。 あらかじめ、exeにこれらの画像をリソースとして蓄えておき 必要に応じてファイルに出力できると便利です。



あらかじめ、画像を挿入したい箇所にカーソルを合わせておいて、 メニューの「挿入」「GIF画像」「What's New」を選択します。

この時、HTMLファイルはすでに名前を付けて保存されている必要があります。 と、いうのも未保存の状態では、gifファイルをどこに出力すれば よいかわからないからです。



左の図のように「What's New」の画像が挿入されれば成功です。 あらかじめカスタム・リソースにしたい画像を作っておきましょう。



では、GIF画像とかJPEG画像をリソースに加えるにはどうしたらよいのでしょうか。

これは、簡単です。VC++では、「挿入」「リソース」「インポート」で リソースにしたい画像ファイルを選択します。この時カスタムリソースのタイプ名を 適当に付けてやります。ここでは"GIF"にしました。また、リソース名を"WHAT"としました。

VC++では、リソース・ビューで確認することができます。

GIF画像が正しくリソースとしてインポートされると、左の図のように "GIF"という新しいリソースのフォルダができて、その中に"WHAT"が格納されているのが わかります。

画像ファイル以外に、どのようなファイルでもリソースにすることができます。 WAVファイルなどはいろいろ使い道がありそうですね。



では、カスタム・リソースから"WHAT"を呼び出して、ファイルとして出力するには どうすればよいでしょうか。

FindResource関数でリソース・ハンドルを取得します。 LoadResource関数でリソースをグローバルメモリにロードします。 LockResource関数でメモリ内の指定されたリソースをロックします。 (戻り値はリソースの最初のバイトへのポインタ) CreateFile, WriteFile関数でファイルに出力。

さて、以前はFindResource関数の第1引数はリソースを含むモジュールの インスタンスハンドルでした。しかし、これは、HMODULEに変更になりました。 (実質的には同じ値です。)これは、LoadLibrary("モジュールファイル名")で求まります。

では、プログラムを見てみましょう。

// htmledit12.rcの一部 ///////////////////////////////////////////////////////////////////////////// // // Menu // MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "新規作成(&N)...\tCtrl+N", IDM_NEW MENUITEM "開く(&O)...\tCtrl+O", IDM_OPEN MENUITEM SEPARATOR MENUITEM "上書き保存(&S)\tCtrl+S", IDM_SAVE MENUITEM "名前を付けて保存(&A)...", IDM_SAVEAS MENUITEM SEPARATOR MENUITEM "アプリケーションの終了(&X)", IDM_END END POPUP "編集(&E)" BEGIN MENUITEM "元に戻す(&U)\tCtrl+Z", IDM_UNDO MENUITEM "切り取り(&T)\tCtrl+X", IDM_CUT MENUITEM "コピー(&C)\tCtrl+C", IDM_COPY MENUITEM "貼り付け(&P)\tCtrl+V", IDM_PASTE MENUITEM "削除(&D)\tCtrl+D", IDM_DELETE MENUITEM SEPARATOR MENUITEM "すべて選択(&L)\tCtrl+A", IDM_ALL END POPUP "挿入(&I)" BEGIN MENUITEM "基本項目入力(&B)...\tShift+Ctrl+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 POPUP "GIF画像" BEGIN MENUITEM "What's New", IDM_WHAT END END POPUP "ブラウザ(&B)" BEGIN MENUITEM "ブラウザ起動(&E)\tF12", IDM_BROWSER END POPUP "オプション(&O)" BEGIN POPUP "ツールチップ(&T)" BEGIN MENUITEM "文字色(&L)", IDM_TIPTXTCOLOR MENUITEM "背景色(&B)", IDM_TIPBKCOLOR END END END INSERT MENU DISCARDABLE BEGIN 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 END FILE MENU DISCARDABLE BEGIN POPUP "ダミーです" BEGIN MENUITEM "新規作成", IDM_NEW MENUITEM "開く", IDM_OPEN MENUITEM "上書き保存", IDM_SAVE END END EDIT MENU DISCARDABLE BEGIN POPUP "ダミーです" BEGIN MENUITEM "コピー", IDM_COPY MENUITEM "切り取り", IDM_CUT MENUITEM "貼り付け", IDM_PASTE MENUITEM "削除", IDM_DELETE MENUITEM "元に戻す", IDM_UNDO END END INSERT2 MENU DISCARDABLE BEGIN POPUP "ダミーです" BEGIN MENUITEM "基本項目入力", IDM_BASICINPUT MENUITEM "JavaScriptの挿入", IDM_SCRIPT 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 "GIF画像" BEGIN MENUITEM "What's New", IDM_WHAT END END END MYMENU2 MENU DISCARDABLE BEGIN POPUP "ダミーです" BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "新規作成(&N)...\tCtrl+N", IDM_NEW MENUITEM "開く(&O)...\tCtrl+O", IDM_OPEN MENUITEM SEPARATOR MENUITEM "上書き保存(&S)\tCtrl+S", IDM_SAVE MENUITEM "名前を付けて保存(&A)...", IDM_SAVEAS MENUITEM SEPARATOR MENUITEM "アプリケーションの終了(&X)", IDM_END END POPUP "編集" BEGIN MENUITEM "元に戻す(&U)\tCtrl+Z", IDM_UNDO MENUITEM "切り取り(&T)\tCtrl+X", IDM_CUT MENUITEM "コピー(&C)\tCtrl+C", IDM_COPY MENUITEM "貼り付け(&]P)\tCtrl+V", IDM_PASTE MENUITEM "削除(&D)\tCtrl+D", IDM_DELETE MENUITEM SEPARATOR MENUITEM "すべて選択(&L)\tCtrl+A", IDM_ALL END POPUP "挿入(&I)" BEGIN MENUITEM "基本項目(&B)\tShift+Ctrl+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 POPUP "GIF画像" BEGIN MENUITEM "What's New", IDM_WHAT END END POPUP "ブラウザ(&B)" BEGIN MENUITEM "ブラウザの起動(&B)\tF12", IDM_BROWSER END POPUP "オプション(&O)" BEGIN POPUP "ツールチップ(&T)" BEGIN MENUITEM "文字色(&L)", IDM_TIPTXTCOLOR MENUITEM "背景色(&B)", IDM_TIPBKCOLOR END END 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 COMBOBOX IDC_COMBO1,51,7,18,68,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_EDIT1,51,27,129,32,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN DEFPUSHBUTTON "OK",IDOK,40,72,50,14 PUSHBUTTON "キャンセル",IDCANCEL,95,72,50,14 LTEXT "大きさ",IDC_STATIC,7,7,32,11 LTEXT "コンテンツ",IDC_STATIC,7,27,39,10 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" ///////////////////////////////////////////////////////////////////////////// // // Toolbar // IDR_TOOLBAR3X TOOLBAR DISCARDABLE 16, 15 BEGIN BUTTON ID_BUTTON40035 BUTTON ID_BUTTON40036 BUTTON ID_BUTTON40037 END IDR_TOOLBAR3 TOOLBAR DISCARDABLE 16, 15 BEGIN BUTTON ID_BUTTON40041 BUTTON ID_BUTTON40042 BUTTON ID_BUTTON40043 END ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDR_TOOLBAR3X BITMAP DISCARDABLE "toolbar3x.bmp" IDR_TOOLBAR3 BITMAP DISCARDABLE "toolbar3.bmp" ///////////////////////////////////////////////////////////////////////////// // // Accelerator // MYACCEL ACCELERATORS DISCARDABLE BEGIN "A", IDM_ALL, VIRTKEY, CONTROL, NOINVERT "B", IDM_BASICINPUT, VIRTKEY, SHIFT, CONTROL, NOINVERT "D", IDM_DELETE, VIRTKEY, CONTROL, NOINVERT "N", IDM_NEW, VIRTKEY, CONTROL, NOINVERT "O", IDM_OPEN, VIRTKEY, CONTROL, NOINVERT "S", IDM_SAVE, VIRTKEY, CONTROL, NOINVERT "V", IDM_PASTE, VIRTKEY, CONTROL, NOINVERT VK_F12, IDM_BROWSER, VIRTKEY, NOINVERT END ///////////////////////////////////////////////////////////////////////////// // // GIF // WHAT GIF DISCARDABLE "what.gif" ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN IDS_FILE "ファイル(&F)" IDS_EDIT "編集(&E)" IDS_INSERT "挿入(&I)" IDS_BROWSER "ブラウザ(&B)" IDS_OPTION "オプション(&O)" END

メニュー・リソースに"What's New"が加わりました。3カ所あるので 注意してください。

また、カスタム・リソース"GIF"の書き方を見ておいてください。

htmledit.hに変更はありません。

// htmedit12.cpp #ifndef STRICT #define STRICT #endif #define ID_EDIT 100 #define ID_EDIT2 101 #define ID_TOOL1 102 #define ID_TOOL2 103 #define ID_TOOL3 104 #define ID_REBAR 105 #define ID_STATIC 106 #define ID_STATUS 107 #define ID_TOOLMENU 108 #define ID_TIP1 111 #define ID_TIP2 112 #define ID_TIP3 113 #define MY_BUF_SIZE 1024 * 64 - 1 #define MY_MSG WM_USER #include <windows.h> #include <windowsx.h> #include "resource.h" #include "htmledit.h" #include <commctrl.h> 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); LRESULT CALLBACK NewEditProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK KbdHook(int, WPARAM, LPARAM lParam); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); BOOL MySetHTML(HWND, 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); HWND MakeMyToolbar(HWND, int, TBBUTTON *, int); HWND MakeMyToolbar2(HWND, int, TBBUTTON *, int, int, int); HWND MakeMyToolbarMenu(HWND); BOOL MyOpen(HWND, HWND); BOOL CheckMyMenu(HMENU, HWND, HWND); BOOL CanPaste(HWND); BOOL MySetStatusText(HWND, int, char *); HWND MakeMyToolTip(HWND, HWND, int, int, TBBUTTON *, char [][256]); void SetTipColor(HWND, HWND *, COLORREF *, int); void SetTipBkColor(HWND, HWND *, COLORREF *, int); BOOL GetInitialSetting(LPMYINITIALDATA); BOOL SetInitialSetting(LPMYINITIALDATA); BOOL ShowMyPopMenu(HWND, HWND, char *, int, HWND, HWND); BOOL MyCreateFileFromResource(HWND, HWND, char *, char *, char *); char szClassName[] = "htmedit12"; //ウィンドウクラス char szExeName[] = "htmledit12.exe"; //このプログラムの名前 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 szAuthor[64] = "Yasutaka Kumei"; char *lpszCloseA = "</A>"; char *lpszEnd = "</ADDRESS>\r\n</BODY>\r\n</HTML>"; char szFileName[MAX_PATH]; char szFileTitle[64]; WNDPROC OrgEditProc; HIMAGELIST hImage; HWND hParent; HHOOK hHook; HWND hMytoolMenu; HWND hTool2_g, hEdit_g; TBBUTTON tbButton1[] = { {STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, }; TBBUTTON tbButton2[] = { {STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_UNDO, IDM_UNDO, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, }; TBBUTTON tbButton3[] = { {0, IDM_BASICINPUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {1, IDM_SCRIPT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {2, IDM_TAG, TBSTATE_ENABLED, TBSTYLE_DROPDOWN, 0, 0, 0}, }; TBBUTTON tbButtonMenu[] = { {I_IMAGENONE, IDM_FILE, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0}, {I_IMAGENONE, IDM_EDIT, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0}, {I_IMAGENONE, IDM_INSERT, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0}, {I_IMAGENONE, IDM_BRVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0}, {I_IMAGENONE, IDM_OPTION, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0} }; char szTipText1[][256] = { "新規にHTMLファイルを作成します", "HTMLファイルを開きます", "上書き保存をします\nすでに名前を付けて保存してある必要があります" }; char szTipText2[][256] = { "選択された文字列をコピーします", "選択された文字列を切り取って\nクリップボードに格納します", "クリップボードから貼り付けます", "選択された文字列を削除します\n削除してしまってもUNDOで取り消すこともできます", "元に戻します" }; char szTipText3[][256] = { "HTMLの基本的枠組みを作ります", "スクリプトを挿入します", "タグを挿入します" };

グローバル変数にszExeNameを新たに作ってこれにexe名を格納するようにしました。

WinMain, InitApp, InitInstanceの各関数に変更はありません。

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { ...省略 switch (msg) { ...省略 case WM_COMMAND: switch (LOWORD(wp)) { ...省略 //画像ファイルGIFの呼び出し・出力 case IDM_WHAT: MyCreateFileFromResource(hEdit, hEdit_hide, "WHAT", "GIF", "what.gif"); break; } ...省略

メインウィンドウのプロシージャです。

IDM_WHATが来たらMyCreateFileFromResource関数を呼び出します。

他の関数に変更はありません。

BOOL MyCreateFileFromResource(HWND hEdit, HWND hE_hide, char *szResourceName, char *szResourceType, char *szResFileName) { HMODULE hExe; HRSRC hRs; HGLOBAL hMem; HANDLE hFile; LPBYTE lpByte; DWORD dwWritten, dwResSize; hExe = LoadLibrary(szExeName); hRs = FindResource(hExe, szResourceName, szResourceType); if (hRs == NULL) { MessageBox(hEdit, "FindResource Error", "Error", MB_OK); return FALSE; } dwResSize = SizeofResource(hExe, hRs); hMem = LoadResource(hExe, hRs); lpByte = (BYTE *)LockResource(hMem); hFile = CreateFile(szResFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { MessageBox(NULL, "CreateFile Error", "OK", MB_OK); return FALSE; } WriteFile(hFile, lpByte, dwResSize, &dwWritten, NULL); CloseHandle(hFile); if (dwResSize != dwWritten) { MessageBox(hEdit, "WriteFile Error", "Error", MB_OK); return FALSE; } MyInsertTag(hEdit, hE_hide, "<IMG SRC=\""); MyInsertTag(hEdit, hE_hide, szResFileName); MyInsertTag(hEdit, hE_hide, "\">"); if (!MySave(hEdit)) return FALSE; return TRUE; }

今回追加となった関数です。

試してみればわかりますがインスタンスハンドルとhExeは同じ値です。

なおFindResource,LoadResource関数については第175章を参照してみてください。

DWORD SizeofResource( HMODULE hModule, HRSRC hResInfo );

リソースのサイズを返します。失敗したときは0が返ります。

hModuleには、リソースが入ったモジュールのハンドルを指定します。

hResInfoには、リソース・ハンドルを指定します。

いろいろなファイルをリソースにして、出力してみましょう。 Flashのファイルを出力してみるのもおもしろいでしょう。


[SDK第4部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 13/Aug/2001 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。