Iwao myds

dev.mish.work へ移行しました.

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

MFC

buf = string ( buf.c_str () )

先日の共通のコードでのバグ.

tstring	ask_cli	(LPCTSTR msg=_T(""))
{
	tstring	cli ;
	while(true)	{
		tstring	buf ;
		buf.resize(1000) ;
		std::terr << msg ;
		std::tin.getline(&buf[0],std::streamsize(buf.size())) ;
	//	buf = ::QuotM_Del_All(buf.c_str()) ;
		if      (buf == _T("q"))	{	break ;		}
		else if (buf == _T("Q"))	{	break ;		}
		if (buf.empty())         	{	continue ;	}
		cli = buf.c_str() ;
		break ;
		}
	return	cli ;
	}

ループを抜けるために “q” や “Q” と比較している部分が機能しない(break しない).
原因は “q\0\0\0…” と “q\0” を比べているため.
そのため,比較する前に次の様にするとうまく機能する.

{
	tstring	tmp = buf.c_str() ;
	buf = tmp ;
	}

MFC であれば CString::ReleaseBuffer(-1) が使えるが…
buf = tstring(buf.c_str()) とすることで対応.
buf = string ( buf.c_str() )


CString , std::string , …

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

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


Win11 に入っている MFC*.DLL

先日手に入った Win11 には,予め幾つかの AP が入っていた.
その中には,MFC140u.dll などが入っていたので,改めて新規インストールした環境で調べてみた.
Win11 Pro
Win11 Pro に入っている MFC*.DLL
Win11 Ent
Win11 Ent に入っている MFC*.DLL
やはり MFC40 と MFC42 みたい.

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

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


MFC 14 以降の CCheckListBox で…

何年か前,幾つかのプロジェクトを VC 14 に対応しようとして CCheckListBox の表示がうまくなかった.
CCheckListBox  VC 2015 スタティックリンク
CCheckListBox を使っているプロジェクトは限られているので,~MFC 12 にしていた.


今回 いろいろとあり VC 2017 ~ 2022 に対応することに.
MFC が更新されているのかわからないが,以前のものより少し動作は良くなっている?
が,相変わらず,表示直後にずれているのと,高さが MFC 12 以前に比べ詰まっている.
CCheckListBox VC 2015 でビルドし直したもの


MFC CCheckListBox ずれる」で検索すると,OnInitDialog() などで 高さを指定 すれば良いとあった.

{
	CRect	rect ;
	m_CtrlSExtDllNow.GetWindowRect(&rect) ;		//	他のコントロールの高さを利用
	m_CtrlListSExt.SetItemHeight(0,rect.Height()) ;
	}

面倒だったのでエディットボックスの高さを利用している.
これで MFC 12 などで作成したものと同じ様な表示になった.
CCheckListBox  SetItemHeight を追加

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

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

  • カテゴリー:

CHttpFile Read String

何年か前に Web 上の html読み取るコード を書いた.
それを 今回書き直し


これらのコードでは「シフトJIS」で書かれたページ以外ではうまく処理できない?
以前利用した時は IIS のサーバで,html 内の一部のコードを読み取るだけなので,特に問題にはならかなった.
今回も,単純に html が更新されたかどうかだったので,それなりに処理できていた.


今度は,html だけでなく画像などバイナリにも対応したくなった.
favicon.ico
CInternetFile::ReadString の部分を

	{
		CString	buf ;
		while	(pFile->ReadString(buf)) {
			tstring	tmp = ::To_tstring(LPCSTR(LPCTSTR(buf))) ;
			r_buf.push_back(tmp) ;
			}
		read_dt = ::String_Join_Line(r_buf) ;
		}

CInternetFile::Read に変更.

	{
		FILE*	ofp = ::Open_File(dt_file.c_str(),_T("wb")) ;
		v_char	readBuf ;	readBuf.resize(1024) ;
		while	(true) {
			UINT	r_size = pFile->Read(&readBuf[0],1024) ;
			::fwrite(&readBuf[0],1,r_size,ofp) ;
		//	if (r_size < 1024)
			if (r_size < 1)
			{
				break ;
				}
			}
		::fclose(ofp) ;
		}
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

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

  • カテゴリー:

GetActiveView

いつも面倒と思う CView の取得.
https://dev.mish.work/wordpress/2022/05/20/drop-lnk-on-mdi-exe/
普通は,CDocument から CView を操作することはあまりないものと思う.
が,今回はテスト用のコードで CView での表示情報を更新したくなった.

{
	CFrameWnd*	pFrameWnd    = (CFrameWnd*)AfxGetMainWnd() ;
	CFrameWnd*	pActiveFrame = pFrameWnd->GetActiveFrame() ;
	{
		CXxxView*	pView = (CXxxView*)pFrameWnd->GetActiveView() ;
		if (pActiveFrame != NULL) {
				pView = (CXxxView*)pActiveFrame->GetActiveView() ;
			}
		if (pView != NULL) {
			PartsA	sel_pa = *(pView->GetSelectP()) ;
			{
				PartsA	err_pa = ::xx_get_error_xx(...) ;
				sel_pa += err_pa ;
				}
			*(pView->GetSelectP()) = sel_pa ;
			}
		}
	UpdateAllViews(NULL) ;
	}

それを関数に.

CView*	Get_active_view	(void)
{
	CFrameWnd*	pFrameWnd    = (CFrameWnd*)AfxGetMainWnd() ;
	CFrameWnd*	pActiveFrame = pFrameWnd->GetActiveFrame() ;
	{
		CView*	pView = pFrameWnd->GetActiveView() ;
		if (pActiveFrame != NULL) {
				pView = pActiveFrame->GetActiveView() ;
				}
		return	pView ;
		}
	return	NULL ;
	}

Get_active_view

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

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


CWinApp::m_pszAppName

今更の内容ではあるが…
MFC の SDI や MDI で,アプリケーション名は,作成したプロジェクト名?になる.
ダイアログベースで作成した場合は exe 名になってしまう.
困ることがあるのが exe 名を変更した場合のレジストリキー.


CWinApp::m_pszAppName はヘルプにある様に,AFX_IDS_APP_TITLE がなければ exe 名となる.
CWinApp:: m_pszAppName
コードは MFC 6 のものだが,MFC 14.3 でも同様.
CWinApp::SetRegistryKey で m_pszAppName を利用している.
exe 名と異なるものを使用する場合,リソースの AFX_IDS_APP_TITLE を変更するか,なければ追加すれば良い.

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

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


MFC OnUpdate… が来ない?

自前の Doc::UpdateCommand で CCmdUI の処理を実装して,イベントが来なかった.
MFC OnUpdate... が来ない
原因は,範囲の指定が間違っていた.
ON_UPDATE_COMMAND_UI_RANGE (ID_Start, ID_End, OnUpdateCmd)
すぐに気づかなかったのでメモ.

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

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

  • カテゴリー:

ツールバーのコマンドが効かない

ある AP の動作で,ツールバーの一部のコマンドが入らない.
ツールバーのコマンドが効かない
いろいろと確認すると,x64 exe で,リリース版,デバッグ版は関係ない.
x86 exe は問題ない(ちゃんと機能する).
2015/11 の exe でも同様の現象を確認.
メニューの同様のコマンドは問題ない.


ツールバーがちらつくので,UPDATE_COMMAND_UI の実装でうまくない部分があると思われる.
一時的に Disable にしているなど…


調べるのに時間がかかりそうなので,取りあえずメモ.

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

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


Win.ini [Mail] MAPI=1

Win.ini がなくて MAPI が動作しなかった(Disable だった)と報告を受けた.


4 年位前に書き直した MAPI を使用したコードではチェックしない様にしたが,古いコードもまだ存在する.
それらのコードは MFC のコード docmapi.cpp を参考にしたもの.
VC 2022 のコードを見ると,Win.ini の [MAIL] の MAPI をチェックしている.
docmapi.cpp  ::GetProfileInt(_T("MAIL"), _T("MAPI"), 0)
最初のコードを書いた 20 年以上前(VC 98)とそれほど変わっていない.


何もインストールしていない環境で Win.ini は存在する?
Win10 Pro 21H2 では次のものが存在している.
Win10 Pro 21H2  win.ini
何かをアンインストールすると削除されることがあるのか?

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

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


引数が正しくありません。

自分で作成した AP のテストをしていて,「引数が正しくありません。」.
20 年位前から変更していないコードのバグだった.


かなりイレギュラーな操作をしない限り,現象は発生しない.
実際の操作としては,データの挿入場所を指定しないで,強制的に「確定」した場合.
またその操作の前にある手順が存在する.


表示されるメッセージは,MFC のバージョンにより異なる.
また,Windows API 内でこのメッセージが表示されることもある みたい.
AfxThrowInvalidArgException VC 8  無効な引数が発生しました。
AfxThrowInvalidArgException VC 10  引数が正しくありません。


今回のものは,配列に対して,確保されている領域を超えてアクセスしたことが原因.
VC 2017 でデバッグ AfxThrowInvalidArgException


アクセスする前に,要素数が満たしているかのチェックをすることで回避できる.
if ( 2 < ary.GetSize() ) { data = ary[1] ; }

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

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



    top

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