HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0516
あかさたなHTMLのコードの色分けがしたい。4解決


あかさたな

リンク

2018/5/16(Wed) 21:18:27|NO.84430

現在HSPでHTMLエディターを作成中です。HTMLエディターではコードの色分けがされているものが多いです。
mesbox命令でも色分けがしたいです。やり方が分からないので教えてください。よろしくお願いします。



この記事に返信する


あらや

リンク

2018/5/16(Wed) 21:28:31|NO.84431

mesboxでは恐らく無理です。
リッチテキストコントロールを使いましょう。

最近のスレで参考になる物
http://hsp.tv/play/pforum.php?mode=all&num=84206



あかさたな

リンク

2018/5/22(Tue) 17:56:32|NO.84474

>あらや様
ありがとうございました。

自分はリッチテキストコントロールをいじったことがないので、
色分けのサンプルコードがあればよろしくお願いします。



あらや

リンク

2018/5/24(Thu) 07:09:47|NO.84483

簡単な例を挙げると、
・色を変えたい文字列を検索する( instr を使う )
・検索にヒットした場合はそれを一旦選択する( sendmsg で EM_SETSEL を指定 )
・選択してある場所の色を設定する( sendmsg で EM_SETCHARFORMAT を指定 )
という感じで色分けができます。

色分けするためには全てのキーワード(HTMLタグ)をリスト化して
確認する必要があります。

// 参考URL // https://wiki.hsp.moe/RichEdit%EF%BC%8FRuler.html // http://hsp.tv/play/pforum.php?mode=all&num=84206 #include "user32.as" #include "kernel32.as" onexit goto *hsp_exit; ////////////////////////////////////////////////////////////////////// ; とりあえずのHTMLタグ文字列 sdim tag, 65536; tag = {" <HTML> \t<HEAD> \t\t<TITLE>タイトルの文字列</TITLE> \t</HEAD> \t<BODY> \t\t本文などなど \t</BODY> </HTML> "} ////////////////////////////////////////////////////////////////////// ; 定数 // ウィンドウスタイル #define WS_CHILD 0x40000000 #define WS_VISIBLE 0x10000000 #define WS_CLIPSIBLINGS 0x04000000 #define WS_CLIPCHILDREN 0x02000000 #define WS_VSCROLL 0x00200000 #define WS_HSCROLL 0x00100000 #define ES_AUTOVSCROLL 0x0040 #define ES_AUTOHSCROLL 0x0080 #define ES_MULTILINE 0x0004 #define ES_DISABLENOSCROLL 0x00002000 // 拡張ウィンドウスタイル #define WS_EX_CLIENTEDGE 0x00000200 // 書式情報等の取得・設定定数 #define WM_USER 0x0400 #define EM_SETBKGNDCOLOR (WM_USER + 67) #define EM_GETCHARFORMAT (WM_USER + 58); #define EM_SETCHARFORMAT (WM_USER + 68); #define EM_SETTABSTOPS 0x00CB #define EM_GETSEL 0x00B0 #define EM_SETSEL 0x00B1 // 書式設定 #define CFM_SIZE 0x80000000 #define CFM_COLOR 0x40000000 #define CFM_FACE 0x20000000 #define CFM_CHARSET 0x08000000 #define CFE_AUTOCOLOR 0x40000000 #define ANSI_CHARSET 0 #define FIXED_PITCH 1 // 書式変更用 #define SCF_SELECTION 0x0001 #define SCF_ALL 0x0004 ////////////////////////////////////////////////////////////////////// ; 構造体変数 // CHARFORMAT構造体 dim CHARFORMAT, 15 dup cfmt_cbSize, CHARFORMAT.0; dup cfmt_dwMask, CHARFORMAT.1; dup cfmt_dwEffects, CHARFORMAT.2; dup cfmt_yHeight, CHARFORMAT.3; dup cfmt_yOffset, CHARFORMAT.4; dup cfmt_crTextColor, CHARFORMAT.5; dupptr cfmt_bCharSet, varptr( CHARFORMAT.6 )+0, 1; dupptr cfmt_bPitchAndFamily, varptr( CHARFORMAT.6 )+1, 1; dupptr cfmt_szFaceName, varptr( CHARFORMAT.6 )+2, 32, 2; ////////////////////////////////////////////////////////////////////// ; メインウィンドウ作成( リッチエディットの下地 ) LoadLibrary "riched32.dll": hLib = stat; ; リッチエディットコントロールのウィンドウスタイル dwStyle = WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|ES_MULTILINE|ES_DISABLENOSCROLL|ES_AUTOVSCROLL|ES_AUTOHSCROLL|WS_HSCROLL|WS_VSCROLL; winobj "RICHEDIT", "", WS_EX_CLIENTEDGE, dwStyle, ginfo_sx, ginfo_sy, 0, 0; // リッチエディットオブジェクト作成 iRich = stat; // リッチエディットのオブジェクトID取得 hRich = objinfo( iRich, 2 ); // リッチエディットのウィンドウハンドル取得 objskip iRich, 2; // タブ入力のため、フォーカス移動の禁止 ////////////////////////////////////////////////////////////////////// ; リッチエディットの各種設定 // 背景色設定 sendmsg hRich, EM_SETBKGNDCOLOR, 0, 0x00000000; // 背景色(0x00BBGGRRの順)を黒に設定 // 書式設定 cfmt_cbSize = 4 * 15; sendmsg hRich, EM_GETCHARFORMAT, 0, varptr( CHARFORMAT ); // 現在の書式を取得 cfmt_dwMask = CFM_SIZE | CFM_FACE | CFM_CHARSET | CFM_COLOR; // 有効メンバ cfmt_dwEffects = cfmt_dwEffects & (0xFFFFFFFF ^ CFE_AUTOCOLOR ); // 文字の効果 cfmt_yHeight = 11 * 20; // フォントサイズ(ポイント値 * 20); cfmt_crTextColor = 0x00FFFFFF; // 文字色(0x00BBGGRRの順)を白に設定 cfmt_bCharSet = ANSI_CHARSET; // ANSI文字セット cfmt_bPitchAndFamily = FIXED_PITCH; // フォントのピッチとファミリを固定幅に設定 cfmt_szFaceName = "MS ゴシック"; // フォント名 sendmsg hRich, EM_SETCHARFORMAT, SCF_ALL, varptr( CHARFORMAT ); // 変更した書式に設定 SetWindowText hRich, varptr( tag ); // 文字列をリッチエディットに設定 RichTabStops = 4 * 4; // タブ幅(バイト数 * 4) sendmsg hRich, EM_SETTABSTOPS, 1, varptr( RichTabStops ); // タブ幅を設定 gosub *color_set; gsel 0, 1; objsel iRich; stop; ////////////////////////////////////////////////////////////////////// ; タグの色分け処理 *color_set sendmsg hRich, EM_GETSEL, pStart, pEnd; // 現在のカーソル位置取得 idx = 0; taglen = strlen( tag ); repeat tagidx1 = instr( tag, idx, "<" ); if( (tagidx1 == -1) || (idx >= taglen) ) { break; } else { // カッコを含めたタグの色を変える tagidx2 = instr( tag, tagidx1+idx, ">" ) + 1; tag_start = tagidx1 + idx; tag_end = tagidx2 + tagidx1 + idx; sendmsg hRich, EM_SETSEL, tag_start, tag_end; // カーソル位置を変更し文字列の箇所を選択 cfmt_crTextColor = 0x00FFFF00; // 文字色(0x00BBGGRRの順)を水色に設定 sendmsg hRich, EM_SETCHARFORMAT, SCF_SELECTION, varptr( CHARFORMAT ); // 選択文字列の色を変更 // カッコ内の文字色を変える code = strmid( tag, tag_start+1, tagidx2-2); // カッコ内の文字列を抜き出す sendmsg hRich, EM_SETSEL, tag_start+1, tag_end-1; // カッコ内だけ選択 if( (code == "HTML") || (code == "/HTML") ) { cfmt_crTextColor = 0x00FF0000; // 青 sendmsg hRich, EM_SETCHARFORMAT, SCF_SELECTION, varptr( CHARFORMAT ); } else:if( (code == "HEAD") || (code == "/HEAD") ) { cfmt_crTextColor = 0x0000FF00; // 緑 sendmsg hRich, EM_SETCHARFORMAT, SCF_SELECTION, varptr( CHARFORMAT ); } else:if( (code == "TITLE") || (code == "/TITLE") ) { cfmt_crTextColor = 0x000000FF; // 赤 sendmsg hRich, EM_SETCHARFORMAT, SCF_SELECTION, varptr( CHARFORMAT ); else:if( (code == "BODY") || (code == "/BODY") ) { cfmt_crTextColor = 0x0000FFFF; // 黄 sendmsg hRich, EM_SETCHARFORMAT, SCF_SELECTION, varptr( CHARFORMAT ); } } idx += tagidx1 + tagidx2 + 1; loop cfmt_crTextColor = 0x00FFFFFF; // 文字色(0x00BBGGRRの順)を白に戻す sendmsg hRich, EM_SETSEL, pStart, pEnd; // カーソル位置を元に戻す return; ////////////////////////////////////////////////////////////////////// ; HSPの終了処理 *hsp_exit if( iparam == 0 ) { gsel 0; clrobj iRich; FreeLibrary hLib; } end;

ソースは参考URLのwikiの方を必要箇所のみ抜き出して
所々付け足したり書き換えたりしたものです。



あかさたな

リンク

2018/5/24(Thu) 18:13:45|NO.84493

長いソースコードをありがとうございました。
時間がかかりそうですががんばります。



ONION software Copyright 1997-2023(c) All rights reserved.