UIView のサイズ
MFC の CWnd::GetClientRect にあたるもの?
drawRect の引数の rect
self.bounds , self.frame
画面の向きに対して自動的に反映させるには
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ;
MoveTo , LineTo
CGContextMoveToPoint , CGContextAddLineToPoint
CGPathMoveToPoint , CGPathAddLineToPoint
Polyline
CGContextAddLines
CGPathAddLines
MetaFile と MemoryDC
ODMMeta.cxx , ODrawDcM.hxx
pDC->IntersectClipRect(imgRect) ;
MetaFile mf ;
mf.SetFileName(imgN) ;
// mf.Draw(pDC,imgRect) ;
{
MemoryDC memDC ;
CRect mRect(CPoint(0,0),imgRect.Size()) ;
memDC.Init(CRect(mRect).Size()) ;
{
int colIndex = COLOR_3DFACE ;
COLORREF clrC = ::GetSysColor(colIndex) ;
CDC* mdc = memDC.GetMemoryDC() ;
CRect clrR = mRect ;
mdc->FillSolidRect(clrR,clrC) ;
mf.Draw(mdc,mRect) ;
}
memDC.Draw(pDC,imgRect) ;
memDC.Term() ;
}
ZipFold と WinXP での zip
zae などの様に,zip 内のファイル名に 5c などの文字を含まない様にしている場合は OK .
つまり,zip のファイル名として 5c が含まれていても問題ない?
→ ZipFold が MBCS のためか? 単なるバグか?
→ CharFile.hxx GetFileAttribute の “\” 削除部分のバグ.
上は GetFileAttribute のバグが原因.
Shell を使用した zip クラスの動作では,5c が含まれていてもそれなりに動作する.
UNICODE 文字はうまくなさそう.
あるフォルダ以下の圧縮で,フォルダ名が 5c 文字で終わっている場合,
MFC 6 MBCS では,CFileFind::GetFilePath の影響を受ける.
::FolderF_EnumFiles 以下の部分で,新しく定義した iFileFind を使用する様に変更.
VC 7 で error C2664 std::vector
VC 6 では通っていたが,VC 7 でエラーとなってそのままだったコード.
std::vector <void*> voidPtrs(1024,NULL) ;
c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(124) : error C2664:
‘std::vector >::_Construct_n’ : 2 番目の引数を ‘int’ から ‘void *const & ‘ に変換できません。
理由: ‘int’ から ‘void *const ‘ へは変換できません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(109) :
コンパイルされたクラスのテンプレートのインスタンス化 ‘void std::vector<_Ty,_Ax>::_Construct(_Iter,int,std::_Int_iterator_tag)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]
c:\~\~.cpp(206) : コンパイルされたクラスのテンプレートのインスタンス化
‘std::vector<_Ty,_Ax>::vector(_Iter,int)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]
(void*) とすることで通るみたい.
std::vector <void*> voidPtrs(1024,(void*)NULL) ;
3D ビューア
対応形式は,3DS , OBJ , STL , DXF (3D FACE) , VRML 1 .
テスクチャは,BMP , TGA , 一部の JPG .
i3DV.2013.04.26.zip
2013/05/08
i3DV.2013.05.08.zip
2013/05/10
i3DV.2013.05.10.zip
MDI のステータスバー
以下の情報と,The MFC Answer Book とで.
すべての MDI 子ウィンドウのステータス バーを作成する方法
How to Create a Status Bar in Every MDI Child Window
https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/121946
static UINT indicators[] = { ID_INDICATOR_MDI } ; として,ID をシンボルブラウザで追加.
ビルド,実行すると,CChildFrame::OnCreate のステータスバーの Create で失敗.
String Table で定義されてないとダメな様で適当な文字列を追加.
ビューで,OnUpdateIndicatorMDI を追加(表示されないメニューに ID を追加して ClassWizard で).
pCmdUI->SetText(_T(“ステータスバーに表示する情報”)) ;
これで実行すると,追加した文字列の幅で表示された.
CChildFrame::OnCreate の,
ステータスバーを生成した後,SetPaneInfo(0,ID,SBPS_STRETCH,0)
これにより,ウィンドウ幅いっぱいに.
幅は広がったが表示される文字列は,128 文字まで?
MFC と STL – 2
Xml_E で,MFC を使用しない様に変更中.
XML のデータを用意して,以下の様に単純に 100 個の配列にコピーする時間を計測しようとした.
ElapseTick et ;
CArray xmlAry ; // std::vector xmlAry ;
for (int index=0 ; index<100 ; index++) {
xmlAry.Add(Xml_Data) ; // xmlAry.push_back(Xml_Data) ;
}
CString etStr = ::ToString(et.GetElapse()/1000.0) ;
m_CtrlResult.SetWindowText(etStr) ;
データによっては期待した結果(MFC 版と同等またはそれより高速)が出たが,
この SVG を使用してメモリが少ない環境では極端に遅くなってしまった.
そこで,それぞれのサイズを調べてみた.
VC 6 | VC 7 | VC 8 | VC 9 | VC 10 | VC 8 Debug | VC 9 Debug | VC 10 Debug | VC 8 x64 | VC 9 x64 | VC 10 x64 | VC 9 x64 Debug | VC10 x64 Debug | Xcode 64 Debug | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CString | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 8 | 8 | 8 | 8 | |
CArray | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 40 | 40 | 40 | 40 | 40 | |
tstring | 16 | 28 | 28 | 28 | 28 | 32 | 32 | 32 | 40 | 40 | 40 | 48 | 48 | 8 |
vector | 16 | 16 | 16 | 24 | 16 | 20 | 20 | 20 | 32 | 48 | 32 | 40 | 40 | 24 |
Xml_E | 68 | 92 | 92 | 108 | 92 | 108 | 108 | 108 | 152 | 184 | 152 | 184 | 184 | 72 |
tstring は,std::string または std::wstring .
vector は, <int> のサイズ.sizeof (std::vector<bool>) は vector<int> などより大きくなることがあるみたい.
Xml_E の MFC 版のデータメンバは,
CString Name , CString Text , CArray<Xml_Attribute,Xml_Attribute> Attribute , CArray<Xml_E,Xml_E> Child .
STL 版は tstring と std::vector に置換えた.
MFC Xml_Attribute | 12 | 4 + 4*2 |
MFC Xml_E | 52 | 4 + 4*2 + 20*2 |
STL Xml_Attribute | 36 | 4 + 16*2 |
STL Xml_E | 68 | 4 + 16*2 + 16*2 |
2013/04/22
SVG の全要素数は 5,557 ,属性は 19,103 .MFC 版では 518,200 ,STL 版では 1,065,584 となる.
つまり 50 M ~ 100 M 位が一時的に必要となってしまっていた(200 個にした時もあり).
ループ部分を 2 重ループとして,内側を 10 で 10 個の配列が必要となる様に改良.
時間を計測すると環境にもよるがほぼ同等の結果が得られた,
T5400 では MFC 6 秒と STL 3 秒.
DImage の利用
Shell Extension を利用した画像表示.ダイアログにファイルをドロップすると表示する様に.
1. CStatic を用意.ピクチャコントロールを配置して ClassWizard で変数を追加.
2. DImageS の領域を確保.通常はヘッダに.
3. OnDropFiles で
// CString dropFile = …. ;
ImageS.SetFileName(dropFile) ;
ImageS.Draw(&m_Image) ;
{
m_Image.ShowWindow(SW_HIDE) ;
m_Image.ShowWindow(SW_SHOW) ;
}
// …
4. OnPaint で
ImageS.Draw(&m_Image) ;
DImage では,ImageDMF が追加される.
DImage.zip
::SetCursor
使い方がわからなかったので,
最初,こんな感じにしたら,SetCursor 直後は変更されるが保持されない.
void CVEyeCSView::OnVEyeDrag()
{
VEyeChgView::OnVEye() ;
if (GetEyeChg().CanMouseEyeChange()) {
::SetCursor(m_DragEye) ;
}
else {
::SetCursor(NULL) ;
}
}
SetCursor 直後と言ってもデバッガでブレイクしている状態でないと確認はできない.
CWaitCursor と似た様な動作となる.
やりたかったのは,
BOOL CVEyeCSView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (nHitTest == HTCLIENT) {
if (GetEyeChg().CanMouseEyeChange()) {
::SetCursor(m_DragEye) ;
return TRUE ;
}
}
return VEyeChgView::OnSetCursor(pWnd, nHitTest, message);
}
The MFC Anser Book より
vcompd.dll が見つからなかったため …
MFC と STL
MFC | STL |
---|---|
CString::Right など | string::substr |
LPCTSTR | string::c_str |
LPTSTR CString::GetBuffer() | - |
CString::ReverseFind() | string::rfind |
- | string::find_last_not_of |
Xcode で,#include “..\Test\Test.h” は通らない?
バックスラッシュではなく通常のスラッシュ ‘/’ とすれば OK (VC 6 でも通る).
2013/03/04
CString::GetBuffer() にあたる部分を,string::begin() とすると VC 6 では通る(たまたま通っているだけ).
#ifdef _MBCS
{
// tstring tmpStr = str + _T(“”) ;
// _tcsrev(tmpStr.begin()) ;
std::vector tmpStr ;
tmpStr.resize(str.length()+1) ;
_tcscpy(&tmpStr[0],str.c_str()) ;
_tcsrev(&tmpStr[0]) ;
// ….
}
#endif
昨日立ち読みした方法に改良.確かこんなんだったと思う.
2013/03/07
VC 7 でコンパイルすると,
c:\…\Test.cpp(45) : error C2664: ‘_tcsrev’ :
1 番目の引数を ‘std::basic_string::iterator’ から ‘char *’ に変換できません。
SMT-i9100 で 3D データ表示
HD Model Viewer や Pro 版 を使用すれば,スクリーンショットにある様に 3D データが表示できる.
対応している形式のモデルとテクスチャを USB 経由などでコピーすると同様に表示できる事も確認した.
このアプリを使用して,PC から Dropbox 経由でデバイスにダウンロードして表示する手順.
1. 対象のモデルとテクスチャを同じフォルダにまとめる.
2. zip など 1 つのファイルとなる様な形式に変換.
これはデバイス上にダウンロードする手順を容易にするため.
3. Dropbox のフォルダに登録(コピー).
4. デバイスで,Dropbox のファイルをダウンロード.
5. zip を解凍.この時ダウンロードした所か,展開先フォルダを指定できるアプリが便利.
6. HD Model View を起動して,対象のファイルを開く.
Android 仮想マシン
「触れば分かる!Androidアプリ開発超入門」を購入.
本にある通り VMware Player を利用した方がトラブルは少ないのかもしれないが,…
利用したのは android-x86-2.2-r2-sparta.iso
Virtual PC にインストール
「Instrallation – Install … to harddisk」を選択すると,その直後に停止している様で断念.
今度は Virtual Box に
「タイプ」と「バージョン」はどうすべきかよくわからないが,「Other」と「Other/Unknown」に.
「メモリ」サイズは 512 MB に.
途中の「パーティションの作成」の画面が,老眼でよく見えないので.
後は本の通りで.
2013/02/03 追記
その後何度か利用して,時々(かなりの確率で?)ホストの Win 7 がブルースクリーンに.
ブルースクリーンになったことが影響していると思われるが,「イベントビューア」-「Windows ログ」-「システム」に
ログの名前: System
ソース: Ntfs
日付: 2013/02/03 19:24:12
イベント ID: 55
タスクのカテゴリ: (2)
レベル: エラー
キーワード: クラシック
ユーザー: N/A
コンピューター: T54W7U64
説明:ディスクのファイル システム構造は壊れていて使えません。
chkdsk ユーティリティをボリューム \Device\HarddiskVolume2 で実行してください。
説明の通り,起動時の chkdsk で修復.
他にも,Virtual PC で起動しなくなったものがあり.
vsv を削除して対応.
SMT-i9100 入手
SMT-i9100 が手に入った.
使用目的にもよるが,大きさはちょうどいい感じ.
2013/01/24 追記
幾つかの 3D データのビューアをインストールした.
PC から Google Play にアクセスして,探してインストールするのが簡単と思われる.
時間が経ったのでちょっと覚えてないが,Google アカウントの紐付けをデバイスと行う必要があった?
Google ドライブ上の 3D ファイルを表示する方法がわからない.
メール添付の 3D データも,開こうとするとアプリケーションエラーに.
AP を起動して,AP 付属のファイルや一部 AP で /sdcard/Download/ 以下のファイルは開ける.
RegSvr32 で ocx などの登録
ocx や dll の登録は,「管理者として実行」した「コマンド プロンプト」で次の様にを入力する.
RegSvr32 c:\~\AcListFF.ocx
Vista 以降では管理者として実行していないと,
[Window Title]
RegSvr32
[Content]
モジュール “C:\Users\Iwao\Desktop\Temp\AcListFF.ocx” は読み込まれましたが、DllRegisterServer への呼び出しはエラー コード 0x80040200 により失敗しました。
この問題の詳細については、エラー コードを検索語として入力してオンラインで検索してください。
[OK]
次の様に,「コマンド プロンプト」を「管理者として実行」する.
そして,
2024/05/21
RegSvr32 と入力すると
---------------------------
RegSvr32
---------------------------
モジュールを登録するには、バイナリ名を指定する必要があります。
使用法: regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname
既定- DllRegisterServer を呼び出してサーバーを登録する。
/u - DllUnregisterServer を呼び出してサーバーを登録解除する。
/s - サイレント; メッセージ ボックスを表示しない。
/i - /u と併用しない場合は、DllRegisterServer の呼び出しが成功した後で、
DllInstall(TRUE, [cmdline]) を呼び出して dll をインストールする。
/u と併用する場合は、DllInstall(FALSE, [cmdline]) を呼び出して dll を
アンインストールし、DllInstall が成功したら DllUnregisterServer を呼び出す。
/n - DllRegisterServer または DllUnregisterServer を呼び出さない。
このオプションは /i と併用する必要がある。
dllname - エントリ ポイントを呼び出す DLL への (絶対または相対) パス。この DLL は、選択したオプション (DllRegisterServer、DllUnregisterServer、DllInstall) に応じて呼び出されるエントリ ポイントをエクスポートするために必要です。
---------------------------
OK
---------------------------
Regsvr32には32ビット版と64ビット版がある
Windows7などでDLL/OCXのレジストリ登録を自動化する
Windows 10 / 11(64bit)で32bitのOCXを登録