Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

2021 / 9月

コンソール AP での色

以前に NAS に SSH 接続した環境で,文字色などの変更 をやった.
確か DOS 時代に少し使った記憶があるが,コンソール AP で使ってみたいと思い調べてのメモ.


先ず,コマンドプロンプトでの動作から.
echo ^G
echo Ctrl+G   BEL
‘^G’ の入力は,「Ctrl」+「G」.
「Enter」すると,ブザー(BEL)が鳴る.
今度は,次の様なバイナリデータのファイルを用意しての表示.
ESC シーケンス バイナリデータ
それを type で表示する(Linux 環境などでは cat ).
type esc.txt
type esc.txt の結果
echo を使っての ‘ESC [‘ 入力がわからなかったが,いろいろ試すと「Ctrl」+「[」で入った.
echo ^[[103m
echo ^[[30m
echo ^[[103m    echo ^[[30m
最初わからなかったが,Linux 環境などでは
echo -e “\x1b[103m”
BEL の所に書いてあった.


以前試した時もそうだったと思うが,コマンドプロンプトでそのまま実行してもうまく機能しない.
またその頃はまだメインの開発機は Win7 だったこともありそれ以上は試していなかった.
以前の T_esc 2018 05 exe
一度ファイルにリダイレクトして type すると意図した動作になる.
Windows ESC CSI」で検索すると次の所が見つかる.
コンソールの仮想ターミナル シーケンス
ここを見ると ::SetConsoleModeENABLE_VIRTUAL_TERMINAL_PROCESSING を指定するとある.
それで次の様なコードで試すとうまくいった.

#ifdef		_WIN32
	#ifdef	ENABLE_PROCESSED_OUTPUT
		#ifndef	ENABLE_VIRTUAL_TERMINAL_PROCESSING
		#define	ENABLE_VIRTUAL_TERMINAL_PROCESSING	0x0004
		#endif
	#endif
#endif
//	...
{
//	...
	can_CSI = true ;
	#ifdef		_WIN32
		BOOL	can_ESC = FALSE ;
		#ifdef	ENABLE_PROCESSED_OUTPUT
			HANDLE	hout =	::GetStdHandle(STD_OUTPUT_HANDLE) ;
			DWORD	mode = 0 ;
					::GetConsoleMode(hout,&mode) ;
				mode|= ENABLE_VIRTUAL_TERMINAL_PROCESSING ;
			can_ESC =	::SetConsoleMode(hout, mode) ;
		#endif
		can_CSI = (can_ESC == TRUE) ;
	#endif
	if (change_bg) {
		if (can_CSI) {
			std::terr << _T("\x1b[107m") ;
			std::terr << _T("\x1b[30m") ;
			std::terr << _T("\x1b[0J") ;
		//	std::terr << _T("\x1b[;H") ;
			}
		}
//	...
	}

CSI.hxx
CSI クラスを使用したもの
ちょっとうまくない部分もある?が,何とか.


python だと

from ctypes import windll , wintypes , byref
kernel = windll.kernel32
hout = kernel.GetStdHandle(-11)
mode = wintypes.DWORD()
kernel.GetConsoleMode(hout,byref(mode))
mode.value |= 4
kernel.SetConsoleMode(hout,mode)
print ('\033[96m')

参考にさせてもらったところ.
第3章5 エスケープシーケンスで文字の色、背景の色を変更

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ


CCmdUI::SetText

以前,VC 11 以降で メニューのテキストがうまく更新できない 現象があった.
この時,オーナードローを使っている所は解決した(個人的なコードのバグだった).
が,普通のサブメニューの方はうまくないままとなっていて,それを今回改めて調べてみた.


デバッガで追いかけると,CcmdUI::SetText は呼ばれている.
MFC のコードを見ると,ModifyMenu と SetMenuItemInfo の違いがある.
MFC 10 と 11 の CCmdUI::SetText


サブメニューの場合にうまくないのかと思い,単体テスト用のコードを書いてみたが,再現できない.

void CM_textView::OnUpdateMenuItem(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CString	now = CTime::GetCurrentTime().Format(_T("%H:%M:%S")) ;
	pCmdUI->SetText(now) ;
	}

void CM_textView::OnMenuItem(UINT nID) 
{
	// TODO: Add your command handler code here
	}

何か他の条件があるみたい.


CMenu::TrackPopupMenu で表示するメニューではうまく更新されている.
メニューバーの項目としてコマンドを割り当て,そこから TrackPopupMenu を呼出すことで対応.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

DSM 7 と WordPress , Joomla!

2021/07 に Synology NAS の DSM を更新
WordPress は動作しているが Joomla! はうまくないまま.


今日 Maria DB と WordPress ,Joomla! の更新版があったので更新した.
DSM 7  WordPress
前回と同様 でうまく開かない.
WordPress のインストールされたところをみると .htaccess が存在しない.
以前バックアップしたものをコピー.
これで WordPress はうまく動作する様になった.
Joomla! の方は相変わらず.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。