第323章 リソースをすべてdllにする その2


前章の続きです。今回はexe側の修正点を見てみます。



リソースはすべてdll側に移動したのでVC++の場合Resorcu Viewがなくなってしまっています。



では、プログラムを見てみましょう。htmledit.h, hedll.hに変更はなく resource.hは、dllを 作ったときのものを使います。

// htmedit16.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> #include "hedll.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); LRESULT CALLBACK MyDirectTextProc(HWND, UINT, WPARAM, 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 *); BOOL MyDirectAniText(HWND, HWND); BOOL MyDirectColor(HWND, HWND); COLORREF MyGetColor(HWND); BOOL MyDirectFont(HWND, HWND, HWND, HWND, HWND, HWND, HWND, HWND, LPMYDIRECTTEXT); char szClassName[] = "htmedit16"; //ウィンドウクラス char szExeName[] = "hedll04.dll"; //dllの名前 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; HINSTANCE hDllInst; //dllのインスタンス 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の基本的枠組みを作ります", "スクリプトを挿入します", "タグを挿入します" };

dllの名前がhedll04.dllに変更になった程度です。

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; HACCEL hAccel; hDllInst = (HINSTANCE)LoadLibrary(szExeName); if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; hAccel = LoadAccelerators(hDllInst, "MYACCEL"); if (hParent == NULL) { MessageBox(NULL, "ハンドルなし", "", MB_OK); return 0; } while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hParent, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; }

さて、WinMain関数が始まったときすぐにhDllInstを取得してグローバル変数に格納しておきます。 このhDllInstはすぐに必要となるので、ともかく最初に取得するようにしておきます。

そして、すぐにLoadAccelerators関数でhDllInstが必要となります。アクセラレーターテーブルも dll側に移動したからです。

//ウィンドウ・クラスの登録 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(hDllInst, "MYICON"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // wc.lpszMenuName = "MYMENU"; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = LoadIcon(hDllInst, "MYICON"); return (RegisterClassEx(&wc)); }

ここでも、さっそくhDllInstが必要な関数が登場してきています。

//ウィンドウの生成 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; hParent = hWnd; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }

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

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, nBtn, i; static HWND hEdit, hEdit_hide, hTool1, hTool2, hTool3, hToolMenuW, hRebar, hStatic, hStatus, hTip[3]; static HINSTANCE hInst; CREATESTRUCT *lpcs; char szWinTitle[64], szMenuName[32]; INITCOMMONCONTROLSEX ic; REBARINFO ri; REBARBANDINFO rbinfo; RECT rc, rc1, rc2; static int nClientX, nClientY, nRebarH, nStatusH; LPNMHDR lpnmhdr; int sb_size[3]; static HMENU hMenu; HMENU hToolMenu, hPopup; LPNMTOOLBAR lpnmTB; TPMPARAMS tpm; static COLORREF crTipText = RGB(255, 0, 0), crTipBk = RGB(255, 255, 255); NMREBARCHEVRON *lpnmchevron; int nHideBtn = 0; HMENU hPopMenu, hSubMenu; char szResourceName[32]; POINT pt; RECT rc1_scr, rc2_scr, rc3_scr; MYINITIALDATA myinit; switch (msg) { case WM_CREATE: ...省略 break; ...省略 } return 0; }

ウィンドウプロシージャでは今までは、hDllInstをWM_CREATEメッセージが来たときに 取得していましたが、もっと早い段階で取得しているので不要になりました。 また、このexe自体のhInstも必要となるので

static HINSTANCE hInst;

は残しておきます。他に変更はありません。

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

int MyBasicInput(HWND hEdit) { int id; id = DialogBox(hDllInst, "MYBASICINPUT", hEdit, (DLGPROC)MyBasicInputProc); return id; }

ダイアログボックスの時もリソースはdll側にあるのでhDllInstを使います。

MyBasicInputProc, MySaveAs, MySave, MyInsertTagの各関数に変更はありません。

BOOL MyInsertH(HWND hEdit, HWND hEdit_hide) { MYHTAG myh; char szBuf[512]; if (DialogBoxParam(hDllInst, "MYHTAG", hEdit, (DLGPROC)MyHProc, (LPARAM)&myh) == IDCANCEL) return FALSE; strcpy(szBuf, "<H"); strcat(szBuf, myh.szTagNo); strcat(szBuf, ">"); strcat(szBuf, myh.szContents); strcat(szBuf, "</H"); strcat(szBuf, myh.szTagNo); strcat(szBuf, ">"); MyInsertTag(hEdit, hEdit_hide, szBuf); return TRUE; }

ダイアログの時は、hDllInstを使います。他の箇所もほとんどがこの手の変更です。

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

BOOL MyInsertIMG(HWND hEdit, HWND hEdit_hide) { MYIMGTAG myimg; char szBuf[1024]; if (DialogBoxParam(hDllInst, "MYIMGTAG", hEdit, (DLGPROC)MyImgProc, (LPARAM)&myimg) == IDCANCEL) return FALSE; strcpy(szBuf, "<IMG SRC=\""); if (myimg.bPath) strcat(szBuf, myimg.szPath); strcat(szBuf, myimg.szFileName); strcat(szBuf, "\">"); MyInsertTag(hEdit, hEdit_hide, szBuf); return TRUE; }

今までと同様の変更です。

MyImgProc, MyGetFileTitle, MyGetBodyColorの各関数に変更はありません。

BOOL MyGetWallPaper(HWND hDlg) { MYIMGTAG myimg; if (DialogBoxParam(hDllInst, "MYIMGTAG", hDlg, (DLGPROC)MyImgProc, (LPARAM)&myimg) == IDCANCEL) return FALSE; strcpy(szBody2, " BACKGROUND=\""); if (myimg.bPath) strcat(szBody2, myimg.szPath); strcat(szBody2, myimg.szFileName); strcat(szBody2, "\""); return TRUE; }

これも同じ変更です。

BOOL MyInsertA(HWND hEdit, HWND hEdit_hide) { MYIMGTAG myatag; char szBuf[1024]; if (DialogBoxParam(hDllInst, "MYIMGTAG", hEdit, (DLGPROC)MyAProc, (LPARAM)&myatag) == IDCANCEL) return FALSE; strcpy(szBuf, "<A HREF=\""); if (myatag.bPath) strcat(szBuf, myatag.szPath); strcat(szBuf, myatag.szFileName); strcat(szBuf, "\"></A>"); MyInsertTag(hEdit, hEdit_hide, szBuf); return TRUE; }

やはり、DialogBoxParam関数の第1引数の変更です。

MyAProc, MyGetHREFFileの各関数に変更はありません。

BOOL MyInsertTable(HWND hEdit, HWND hEdit_hide) { MYTABLETAG mytable; char szBuf[1024 * 2]; int i, j, nRow, nCol; if (DialogBoxParam(hDllInst, "MYTABLETAG", hEdit, (DLGPROC)MyTableProc, (LPARAM)&mytable) == IDCANCEL) return FALSE; nRow = atoi(mytable.szRow); nCol = atoi(mytable.szColumn); strcpy(szBuf, "<TABLE"); if (mytable.bBorder) { strcat(szBuf, " BORDER=\""); strcat(szBuf, mytable.szBorder); strcat(szBuf, "\""); } strcat(szBuf, ">\r\n"); if (mytable.bTitle) { strcat(szBuf, "<CAPTION ALIGN=\""); strcat(szBuf, mytable.szTitleAlign); strcat(szBuf, "\">"); strcat(szBuf, mytable.szTitle); strcat(szBuf, "</CAPTION>\r\n"); } for (j = 1; j <= nRow; j++) { for (i = 1; i <= nCol; i++) { strcat(szBuf, "<TD></TD>"); } if (j != nRow) strcat(szBuf, "<TR>\r\n"); } strcat(szBuf, "\r\n</TABLE>"); MyInsertTag(hEdit, hEdit_hide, szBuf); return TRUE; }

同じくDialogBoxParam関数の第1引数の変更です。

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

BOOL MyInsertForm(HWND hEdit, HWND hEdit_hide) { MYFORMTAG fm; char szBuf[256]; if (DialogBoxParam(hDllInst, "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; }

同じ変更です。

MyFormProc, MyInputProcの各関数に変更はありません。

BOOL MyInsertInput(HWND hEdit, HWND hEdit_hide) { MYINPUTTAG in; char szBuf[256]; if (DialogBoxParam(hDllInst, "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; }

これまた、DialogBoxParam関数の第1引数の変更です。

MyInsertScript, MakeMyToolbar, MyOpen, CheckMyMenu, CanPaste, NewEditProc, MySetStatusTextこれらの関数に変更はありません。

HWND MakeMyToolbar2(HWND hWnd, int n, TBBUTTON *tb, int nID, int nRID, int nRIDX) { HWND hTool; hTool = CreateToolbarEx(hWnd, //親ウィンドウ WS_CHILD | WS_VISIBLE | CCS_NODIVIDER | CCS_NORESIZE | TBSTYLE_FLAT, //ウィンドウスタイル nID, //コントロールID n, //ボタンイメージの数 hDllInst, //インスタンスハンドル nRID, //リソースID tb, //TBBUTTON構造体のアドレス n, //ボタンの数 0, 0, //ボタンの幅、高さ 0, 0, //ボタンイメージの幅、高さ sizeof(TBBUTTON)); //TBBUTTON構造体の大きさ if (hTool == NULL) { MessageBox(hWnd, "エラー", "Error", MB_OK); return NULL; } hImage = ImageList_LoadBitmap(hDllInst, MAKEINTRESOURCE(nRIDX), 16, 0, RGB(0, 0, 255)); SendMessage(hTool, TB_SETHOTIMAGELIST, 0, (LPARAM)hImage); SendMessage(hTool, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_DRAWDDARROWS); return hTool; }

CreateToolbarExやImageList_LoadBitmapでhDllInstを使います。

MakeMyToolTip, SetTipColor, SetTipBkColor, GetInitialSetting, SetInitialSetting の各関数に変更はありません。

HWND MakeMyToolbarMenu(HWND hRebar) { HWND hTool; int iFile, iEdit, iInsert, iBrowser, iOption; char szBuf[32]; hTool = CreateToolbarEx(hRebar, //親ウィンドウ WS_CHILD | WS_VISIBLE | CCS_NODIVIDER | CCS_NORESIZE | TBSTYLE_LIST | TBSTYLE_FLAT, //ウィンドウスタイル ID_TOOLMENU, //ID 0, //ボタンイメージの数 NULL, //ビットマップリソースの入っているモジュール NULL, //ビットマップリソースのID tbButtonMenu, //TBBUTTON構造体のアドレス 0, //ツールバーに加えるボタンの数 0, 0, 0, 0, //ボタンの幅、高さ、イメージの幅、高さ sizeof(TBBUTTON)); //TBBUTTON構造体の大きさ LoadString(hDllInst, IDS_FILE, szBuf, sizeof(szBuf) - 1); iFile = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbButtonMenu[0].iString = iFile; LoadString(hDllInst, IDS_EDIT, szBuf, sizeof(szBuf) - 1); iEdit = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbButtonMenu[1].iString = iEdit; LoadString(hDllInst, IDS_INSERT, szBuf, sizeof(szBuf) - 1); iInsert = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbButtonMenu[2].iString = iInsert; LoadString(hDllInst, IDS_BROWSER, szBuf, sizeof(szBuf) - 1); iBrowser = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbButtonMenu[3].iString = iBrowser; LoadString(hDllInst, IDS_OPTION, szBuf, sizeof(szBuf) - 1); iOption = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbButtonMenu[4].iString = iOption; SendMessage(hTool, TB_ADDBUTTONS, 5, (LPARAM)tbButtonMenu); return hTool; }

LoadString関数の第1引数がhDllInstに変更となっています。

ShowMyPopMenu, KbdHook, MyCreateFileFromResourceの各関数に変更はありません。

BOOL MyDirectAniText(HWND hEdit, HWND hEdit_hide) { MYDIRECTTEXT mydirect; char szBuf[64]; if (DialogBoxParam(hDllInst, "MYDIRECTTEXT", hEdit, (DLGPROC)MyDirectTextProc, (LPARAM)&mydirect) != IDOK) return FALSE; MyInsertTag(hEdit, hEdit_hide, "<OBJECT CLASSID=\"clsid:369303c2-d7ac-11d0-89d5-00a0c90833e6\"\r\n"); MyInsertTag(hEdit, hEdit_hide, " ID=\""); MyInsertTag(hEdit, hEdit_hide, mydirect.szObjectName); MyInsertTag(hEdit, hEdit_hide, "\" STYLE=\"width:"); _itoa(mydirect.nObjectWidth, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ";height:"); _itoa(mydirect.nObjectHeight, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ";"); if (mydirect.bBorder) { MyInsertTag(hEdit, hEdit_hide, "border:"); _itoa(mydirect.nObjectBorderWidth, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, " "); MyInsertTag(hEdit, hEdit_hide, mydirect.szObjectBorderStyle); MyInsertTag(hEdit, hEdit_hide, " rgb("); MyInsertTag(hEdit, hEdit_hide, mydirect.szObjectBorderColor); MyInsertTag(hEdit, hEdit_hide, "); background:rgb("); MyInsertTag(hEdit, hEdit_hide, mydirect.szBackColor); MyInsertTag(hEdit, hEdit_hide, ");"); } MyInsertTag(hEdit, hEdit_hide, "\">\r\n"); MyInsertTag(hEdit, hEdit_hide, "<PARAM NAME=\"Line0001\" VALUE=\"SetLineColor("); MyInsertTag(hEdit, hEdit_hide, mydirect.szLineColor); MyInsertTag(hEdit, hEdit_hide, ")\">\r\n"); MyInsertTag(hEdit, hEdit_hide, "<PARAM NAME=\"Line0002\" VALUE=\"SetFillColor("); MyInsertTag(hEdit, hEdit_hide, mydirect.szFillColor); MyInsertTag(hEdit, hEdit_hide, ")\">\r\n"); MyInsertTag(hEdit, hEdit_hide, "<PARAM NAME=\"Line0003\" VALUE=\"SetLineStyle("); _itoa(mydirect.nLineStyle, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ", "); _itoa(mydirect.nLineWidth, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ")\">\r\n"); MyInsertTag(hEdit, hEdit_hide, "<PARAM NAME=\"Line0004\" VALUE=\"SetFont('"); MyInsertTag(hEdit, hEdit_hide, mydirect.szFontName); MyInsertTag(hEdit, hEdit_hide, "', "); _itoa(mydirect.nFontWidth, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ", "); _itoa(mydirect.nFontWeight, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ", "); if (mydirect.bItalic) strcpy(szBuf, "-1"); else strcpy(szBuf, "0"); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ", "); if (mydirect.bUnderLine) strcpy(szBuf, "-1"); else strcpy(szBuf, "0"); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ", "); if (mydirect.bStrikeOut) strcpy(szBuf, "-1"); else strcpy(szBuf, "0"); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ")\">\r\n"); MyInsertTag(hEdit, hEdit_hide, "<PARAM NAME=\"Line0005\" VALUE=\"Text('"); MyInsertTag(hEdit, hEdit_hide, mydirect.szText); MyInsertTag(hEdit, hEdit_hide, "', "); _itoa(mydirect.nX, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ", "); _itoa(mydirect.nY, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ", "); _itoDialogBoxParama(mydirect.nRotate, szBuf, 10); MyInsertTag(hEdit, hEdit_hide, szBuf); MyInsertTag(hEdit, hEdit_hide, ")\">\r\n</OBJECT>"); return TRUE; }

これもDialogBoxParamの第1引数の変更です。

MyDirectTextProc, MyDirectColor, MyGetColor, MyDirectFontの各関数に変更はありません。

どれも、これも似たような変更でしたね。

さて、リソースを全部移動したことでちょっとした問題もあります。 アイコンのリソースも移動したため、このexe自体を見たときにデフォルトのアイコン が表示されてしまいます。これがいやな人はアイコンは移動しないでおきましょう。


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

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