NI-Lab. - blotted-000008 ~ 書き散らかしたメモ ~ 

/*****************************************************************************/
http://program.station.ez-net.jp/special/vc/atl-com/variant.asp
EZ-NET 研究室: VARIANT 型を受け取る際の注意
/*****************************************************************************/
[Windows]文字の種類を判別する

文字分類
>これらのルーチンはどれも、指定されたシングルバイト文字、ワイド文字、またはマルチバイト文字がある条件を満たしているかどうかをテストします (定義により、ASCII 文字セットはすべてのマルチバイト文字セットにサブセットとして含まれています。たとえば、日本語のカタカナには、ASCII 文字と非 ASCII 文字が含まれています)。通常、これらのルーチンは、自分で作成したテストより高速です。たとえば、次のコードは isalpha(c) を呼び出した場合より遅くなります。

__isascii、iswascii
>これらのルーチンは c が ASCII 文字であると、真を返します。

_ismbc 系ルーチン(MSDN)
>_ismbc 系の各ルーチンは指定されたマルチバイト文字について特定の条件を満たしているか調べます。
/*****************************************************************************/
[WindowsAPI]半角全角の変換にLCMapStringを使う

http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_lcmapstring.htm
LCMapString

http://home.a03.itscom.net/tsuzu/programing/tips05.htm
ぴよぴよ実験室
Windows ソフトウェアの開発記録及びプログラミングTIPS
#05 文字列の全角、半角、かな、カナ、大文字、小文字の変換 (2002-5-22)

http://home.a03.itscom.net/tsuzu/programing/tips08.htm
ぴよぴよ実験室
Windows ソフトウェアの開発記録及びプログラミングTIPS
#08 で、実際の文字変換の実装はどうするか? (2002-5-25)

http://www.geocities.co.jp/SiliconValley/4805/bcbtips/bcbtips085.htm
C++Builder Tips - 文字列の変換(半角⇔全角)
/*****************************************************************************/
	OLEMISC_INVISIBLEATRUNTIME |
	OLEMISC_ACTIVATEWHENVISIBLE: 可視状態の時にアクティブにする
	OLEMISC_SETCLIENTSITEFIRST |
	OLEMISC_INSIDEOUT |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_RECOMPOSEONRESIZE;

	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST |
	OLEMISC_INSIDEOUT |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_RECOMPOSEONRESIZE;

OLEMISC(MSDN)

The OLEMISC enumeration is a set of bitwise constants that can be combined to describe miscellaneous characteristics of an object or class of objects. A container can call the IOleObject::GetMiscStatus method to determine the OLEMISC bits set for an object. The values specified in an object server's CLSID\MiscStatus entry in the registration database are based on the OLEMISC enumeration. These constants are also used in the dwStatus member of the OBJECTDESCRIPTOR structure. 

OLEMISC列挙はオブジェクトの様々な特性あるいはオブジェクトのクラスについて記述するために組み合わせることができる1セットのbitwise定数です。コンテナーはIOleObject::をオブジェクトの準備ができていたOLEMISCビットを決定するGetMiscStatus方法と呼ぶことができます。登録データ・ベースの中で、オブジェクト・サーバーのCLSID¥MiscStatusエントリーで指定された値は、OLEMISC列挙に基づきます。これらの定数も、OBJECTDESCRIPTOR構造のdwStatusメンバーの中で使用されます。

OLEMISC_INVISIBLEATRUNTIME 
This value is used with controls. It indicates that the control has no run-time user interface, but that it should be visible at design time. For example, a timer control that fires a specific event periodically would not show itself at run time, but it needs a design-time user interface so a form designer can set the event period and other properties. 

OLEMISC_INVISIBLEATRUNTIME
この値はコントロールと共に使用されます。それは、コントロールがランタイムユーザ・インターフェースを持っていないが、それが設計時に目に見えるべきであることを示します。例えば、特定の出来事を発射するタイマー・コントロールは、周期的にランタイムで姿を現しませんでした。しかし、形式デザイナーが出来事期間および他のプロパティをセットすることができるように、それは設計時間ユーザ・インターフェースを必要とします。

OLEMISC_ACTIVATEWHENVISIBLE
This bit is set only when OLEMISC_INSIDEOUT is set, and indicates that this object prefers to be activated whenever it is visible. Some containers may always ignore this hint. 

OLEMISC_ACTIVATEWHENVISIBLE
OLEMISC_INSIDEOUTがセットされ、このオブジェクトが、それが目に見える場合は常に、活性化されるのを好むことを示す場合に限り、このビットがセットされます。いくつかのコンテナーは常にこのヒントを無視するかもしれません。

OLEMISC_SETCLIENTSITEFIRST
This value is used with controls. It indicates that the control wants to use IOleObject::SetClientSite as its initialization function, even before a call such as IPersistStreamInit::InitNew or IPersistStorage::InitNew. This allows the control to access a container's ambient properties before loading information from persistent storage. Note that the current implementations of OleCreate, OleCreateFromData, OleCreateFromFile, OleLoad, and the default handler do not understand this value. Control containers that wish to honor this value must currently implement their own versions of these functions in order to establish the correct initialization sequence for the control. 

OLEMISC_SETCLIENTSITEFIRST
この値はコントロールと共に使用されます。それは、IPersistStreamInit::InitNewあるいはIPersistStorage::InitNewのような呼び出しの前にさえ、その初期化機能としてコントロールがIOleObject::SetClientSiteを使用したいことを示します。これは、執拗な記憶装置からの情報をロードする前に、コントロールがコンテナーの周囲の特性にアクセスすることを可能にします。OleCreate、OleCreateFromData、OleCreateFromFile、OleLoadおよびデフォルト取扱い人の現在のインプリメンテーションがこの値を理解しないことに注意してください。この値を尊敬したいコントロール・コン?eナーは、現在コントロールのための正確な初期化シーケンスを確立するためにこれらの機能の自分のバージョンを実行するに違いありません。

OLEMISC_INSIDEOUT
This object is capable of activating in-place, without requiring installation of menus and toolbars to run. Several such objects can be active concurrently. Some containers, such as forms, may choose to activate such objects automatically. 
OLEMISC_INSIDEOUT
このオブジェクトは実行するべきメニューおよびツールバーの設置を要求せずに、イン場所を活性化することができます。いくつかのそのようなオブジェクトは同時に活発になりえます。形式のようないくつかのコンテナーは、そのようなオブジェクトを自動的に活性化することに決めるかもしれません。

OLEMISC_CANTLINKINSIDE
This object cannot be the link source that when bound to activates (runs) the object. If the object is selected and copied to the clipboard, the object's container can offer a link in a clipboard data transfer that, when bound, must connect to the outside of the object. The user would see the object selected in its container, not open for editing. Rather than doing this, the container can simply refuse to offer a link source when transferring objects with this bit set. Examples of objects that have this bit set include OLE1 objects, static objects, and links. 

OLEMISC_CANTLINKINSIDE
このオブジェクトはリンク出所でありえません、それ、いつ、境界、に、オブジェクトを活性化する(実行)。オブジェクトが選択されており、クリップボードにコピーされる場合、オブジェクトのコンテナーは、拘束された時、オブジェクトの外部へ接続するに違いないクリップボード・データ・トランスファーでのリンクを提示することができます。ユーザは、編集のために開くではなくよくオブジェクトがそのコンテナーの中で選択されたのを見ました。これをするのではなく、コンテナーはこのビット・セットを備えたオブ?Wェクトを転送する場合リンク出所を提示することを単に拒絶することができます。このビット・セットを持っているオブジェクトの例はOLE1オブジェクト、静止のオブジェクトおよびリンクを含んでいます。

OLEMISC_RECOMPOSEONRESIZE
When the container resizes the space allocated to displaying one of the object's presentations, the object wants to recompose the presentation. This means that on resize, the object wants to do more than scale its picture. If this bit is set, the container should force the object to the running state and call IOleObject::SetExtent with the new size. 

OLEMISC_RECOMPOSEONRESIZE
コンテナーがオブジェクトのプレゼンテーションのうちの1つの表示に分配されたスペースをサイズ変更する場合、オブジェクトはプレゼンテーションを再構成したい。これは次のことを意味します、の上で、サイズ変更する、オブジェクトは、その絵を計る以上のことをすることを望みます。このビットがセットされる場合、コンテナーは走る状態へのオブジェクトを強要するべきであり、IOleObject::を新しいサイズを備えたSetExtentと呼ぶべきです。

OLEMISC_SIMPLEFRAME 
This value is used with controls. It indicates that the control is a simple grouping of other controls and does little more than pass Windows messages to the control container managing the form. Controls of this sort require the implementation of ISimpleFrameSite on the container's site. 

OLEMISC_SIMPLEFRAME
この値はコントロールと共に使用されます。それは、コントロールが他のコントロールの単純な配合で形式を管理するコントロール・コンテナーにわずかにパス・ウインドウズ・メッセージ以上に行わないことを示します。この種のコントロールは、コンテナーのサイト上のISimpleFrameSiteのインプリメンテーションを要求します。
/*****************************************************************************/
メモリ管理とデバッグ ヒープ(MSDN)

>NoMansLand (0xFD)
>アプリケーションが使用するメモリ領域の前後に確保されている "NoMansLand" バッファは 0xFD で埋められます。

>解放済みのブロック (0xDD)
>_CRTDBG_DELAY_FREE_MEM_DF フラグを設定すると、解放済みのブロックは使われずにデバッグ ヒープのリンク リスト中に保持されて、0xDD で埋められます。

>新規オブジェクト (0xCD)
>新規オブジェクトは割り当て時に 0xCD で埋められます。

http://search.acty-net.ne.jp/mfc_search/archive/2001-2/msg02827.html
mfc 35363] Re:newとdeleteの問題[お礼]

OxCCCCCCCC : 未初期化ローカルポインタ変数の値
0xCDCDCDCD : 未初期化クラスメンバポインタ変数の値
0xDDDDDDDD : delete済みポインタ変数の値



http://www.mtakahashi.com/old/09000.html
2003 07/23 10:30
take
お世話になっております。
たけと申します。

一つ質問させて下さい。
現在プロジェクト内共通関数をdll化する作業をしています。
そこでCStringを戻り値とする関数をdllにしたところ、その関数をDebugモードで使用すると
RtlValidateHeapとなり落ちてしまいます。
CStringのデストラクタで失敗??

何かおわかりになる方ご教授お願いします。

Windows2000
VC++6.0 MFC

2003 07/23 11:51
dairygoods
EXEとDLLでビルドの種類(Debug/Relese)を合わせてください。


2003 07/23 13:15
take
ありがとうございました。


http://www.mtakahashi.com/old/04975.html

04958

終了時にメモリ関連のエラー


2002 04/03 03:38
いの
始めまして。いのと言います。

自分でDLLを作成したのですが、別のEXEプログラムから、そのDLL中に作成したある値をベクトル
で取得する関数GetXXX(vector<double>& vec)を呼ぶと、プログラム終了時vector<double>
& vecのデストラクタが呼ばれている時に下記のようなメモリ関連のエラーが出てきてしまいます。
Invalid Address specified to RtlValidateHeap( 550000, 4562c0 )

いったいこれが発生する原因は何でしょう?

ご存知のかた、お教え下さい。

よろしくお願いします。

2002 04/12 21:49
YuO
newで使うヒープはEXEやDLLごとに管理しているためです。
・EXEとDLLで/MD(または/MDd)コンパイラオプションを付けてコンパイルする
・自分でアロケータを作る
といったことをするか,コンテナをDLLに渡さないかのどちらかです。
/*****************************************************************************/
>---------------------------
>Microsoft Visual C++ Debug Library
>---------------------------
>Debug Assertion Failed!
>
>File: afxwin1.inl
>Line: 22
>
>For information on how your program can cause an assertion
>failure, see the Visual C++ documentation on asserts.

>_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
>	{ ASSERT(afxCurrentResourceHandle != NULL);
>		return afxCurrentResourceHandle; }

http://search.acty-net.ne.jp/mfc_search/archive/2001-2/msg02730.html
[mfc 35266] Re: デバッグモードが動きません

>とりあえずMSDNで
>
>        リンカ ツールの警告 LNK4098
>
>は読んでおくと参考になると思います。
>
>で、このような症状が起こるケースですが、プロジェクトの[設定]
>→[リンク]で[一般]カテゴリの中の[オブジェクト/ライブラリモジュー
>ル]に列挙してあるモジュール中に、MFCをリンクしてなおかつRelease
>なオプションでビルドされているモジュールがあり、それを利用し
>ているプロジェクトをDebugなオプションでビルドしようとした場
>合にも起こります。
>
>MFCに依存したモジュールをリンクする場合はDebugバージョンと
>Releaseバージョンの二つを提供してもらわないと問題は解決でき
>ないのではないかな、と思います。

/*****************************************************************************/
http://www.cc.tsukuba.ac.jp/WinSCP/
WinSCP3の利用について

> WinSCP3はMartin Prikryl氏によって作成されたSCP(Secure CoPy)クライアントです。
/*****************************************************************************/
(from WINCORE.CPP)

>ASSERT((CWnd*)p == this);   // must be us
>
>// Note: if either of the above asserts fire and you are
>// writing a multithreaded application, it is likely that
>// you have passed a C++ object from one thread to another
>// and have used that object in a way that was not intended.
>// (only simple inline wrapper functions should be used)
>//
>// In general, CWnd objects should be passed by HWND from
>// one thread to another.  The receiving thread can wrap
>// the HWND with a CWnd object by using CWnd::FromHandle.
>//
>// It is dangerous to pass C++ objects from one thread to
>// another, unless the objects are designed to be used in
>// such a manner.

注:
上記のもののどちらかが火を主張し、
あなたがマルチスレッドのアプリケーションを書いている場合、
あなたがC++オブジェクトをあるスレッドから別のスレッドへ渡し、
それを使用したことはありそうです、
それが意図されなかったことにある意味では反対します。(
単純なインラインの包み紙機能だけが使用されるべきです。)
一般に、CWndオブジェクトはあるスレッドから別のスレッドまでHWNDによって渡されるべきです。
受信スレッドは、CWnd::FromHandleの使用によりCWndオブジェクトでHWNDを包むことができます。
もしオブジェクトがそのようなやり方の中で使用されることは目指していなければ、
C++オブジェクトをあるスレッドから別のスレッドへ渡すことは危険です。

テクニカル ノート 3: Windows ハンドルとオブジェクト間のマッピング(from MSDN)

>ラップ オブジェクトとマルチスレッド
>テンポラリ オブジェクトとパーマネント オブジェクトはスレッド単位で保持されるので、別のスレッドの C++ ラップ オブジェクトにはアクセスできません。オブジェクトがテンポラリかパーマネントかは関係ありません。前に述べたように、テンポラリ オブジェクトは、所属先スレッドが OnIdle になると削除されます。
>テンポラリ オブジェクトを別のスレッドに渡すときは、必ずネイティブな HANDLE 型として渡します。C++ のラップ オブジェクトを別のスレッドに渡すと、予想外の結果になることが少なくありません。

/*****************************************************************************/
ATLによるActiveXにイベントを追加する

	[ATLオブジェクトの新規作成] -> [ATLオブジェクトウィザード] -> [ATLオブジェクトウィザードのプロパティ]
	[コネクションポイントのサポート]にチェックを入れる。

	たとえば、
	ISample インターフェイスに対しては、
	_ISampleEvent インターフェイスが作成される。

	参考:
		MSDN [ATL チュートリアル] -> [イベントの追加]

Visual Basic(VB) にて、ActiveXのイベントを受信するサンプルコード。

	Option Explicit

	'COMのイベントを受信するオブジェクト
	Dim WithEvents sss As SampleLib.Sample

	'フォームのロード時にSampleオブジェクトを初期化
	Private Sub Form_Load()
		Set sss = New SampleLib.Sample
	End Sub

	' イベントを受信するメソッド
	Private Sub sss_ClickIn(ByVal x As Long, ByVal y As Long)
		MsgBox "x=" & x & ", y=" & y
	End Sub

	'Sampleオブジェクトの後始末
	Private Sub Form_Unload(Cancel As Integer)
		Set sss = Nothing
	End Sub

	参考:
		http://www.angel.ne.jp/~shibu/dk_addin/vb6.html
		VB6で作るdkアドイン


http://www.s34.co.jp/cpptechdoc/reference/misc/comevent/index.html
COMからのイベントを捕まえる方法

>"見てくれ"を持たないCOMからのイベントの受理

>ようするにFire_changed()は接続されたハンドラそれぞれに対し、関数Invoke()を呼んでいます。
>したがってClient側に用意するインスタンスには関数Invoke()をこさえておけば、イベント発生時には そいつが呼ばれてくれることでしょう。

>Client側に用意した関数Invoke()の中ではイベントのIDを識別し、 さらにイベントに応じて第5引数(VARIANT型の集合)を解釈しなければならないのです。
>ここでATLが提供するIDispEventImplを使えば、イベントの解釈がぐっと楽になるわけです。 

>イベント受理クラスCounterEventsはCComObjectRootExとIDispEventImplから導出します:

>class ATL_NO_VTABLE CounterEvents :
>
>  public CComObjectRootEx<CComSingleThreadModel>,
>
>  public IDispEventImpl<SINKID_COUNTEREVENTS, CounterEvents, 
>
>                              &DIID__ICounterEvents, &LIBID_COUNTERSERVERLib, 1, 0>


/*****************************************************************************/
::AfxBeginThreadによるスレッド生成

スレッドを生成する関数
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

pfnThreadProc には UINT MyControllingFunction( LPVOID pParam ); という形式の関数(関数名はお好きに)へのポインタを渡す。
関数がクラスのメンバ関数であるなら、static でなければならない。

関数がクラスのstaticでないメンバ関数の場合、VC++6が以下のようなコンパイルエラーメッセージを出力する。
>error C2665: 'AfxBeginThread' : 2 のオーバーロードは 1 番目の引数を 'unsigned int (void *)' から要求の型に変換できません。(新しい機能 ; ヘルプを参照)

// サンプルコード
CWinThread* pThread =
	::AfxBeginThread(
		MyControllingFunction,
		this,
		THREAD_PRIORITY_NORMAL,
		0,
		CREATE_SUSPENDED,
		NULL);

http://forums.belution.com/ja/vc/000/106/24s.shtml
[00010624](SET)] スレッドでコンパイルできない

/*****************************************************************************/
コールバック関数の使用例
CALLBACK

// コールバック関数
void callback(){
	return;
}

// コールバック関数を引数にとる関数
void doit(void (*callback_function)()){

	// 宣言
	void (*m_callback_function)();

	// 代入
	m_callback_function = callback_function;

	// コールバック関数呼び出し
	(*m_callback_function)()
}

void main(){
	doit(callback);
}

/*****************************************************************************/
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20030720/1/
なぜ「IT産業のトヨタ」は出ないのか(上)

http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20030720/2/
なぜ「IT産業のトヨタ」は出ないのか(下)
/*****************************************************************************/
コントロールの背景透過について

WM_CTLCOLORSTATIC

http://homepage2.nifty.com/DSS/VCPP/MFC/Dialog/dlgstaticclr.htm
スタティックコントロール色の変更

http://forums.belution.com/ja/vc/000/147/85s.shtml
[00014785](SET)] ラジオボタンで背景を透過させる方法は?

>で、フォーカスがちゃんと表示されないことにも対応すると
>
>case WM_COMMAND:
>{
> WORD wNotifyCode = HIWORD( wParam );
> WORD wID = LOWORD( wParam );
> HWND hwndCtl = HWND( lParam );
> switch( wID )
> {
>   case IDC_RADIO1:
>   {
>     switch( wNotifyCode )
>     {
>       case BN_SETFOCUS:
>       case BN_KILLFOCUS:
>       {
>         RECT rc;
>         GetWindowRect( hwndCtl, &rc );
>         ScreenToClient( hwnd, LPPOINT( &rc ) );
>         ScreenToClient( hwnd, LPPOINT( &rc ) + 1 );
>         InvalidateRect( hwnd, &rc, TRUE );
>         break;
>       }
>     }
>     break;
>   }
> }
> break;
>}
>case WM_CTLCOLORSTATIC:
>{
> HDC hdcButton = ( HDC )wParam;
> HWND hwndButton = ( HWND )lParam;
> if( GetDlgItem( hwnd, IDC_RADIO1 ) == hwndButton )
> {
>   SetBkMode( hdcButton, TRANSPARENT );
>   return ( BOOL )GetStockObject( NULL_BRUSH );
> }
> break;
>}
>
>こんな感じです
>コードをそのまま解答に使うのは嫌いなのですが
>今回、ためしに作ってしまったので特別です
>
>対象のラジオボタンのスタイルの「通知」をチェックしてください
>
>一応説明しますと
>フォーカス枠を描いているのは XOR で描いているため
>背景を描画していないところにXORしてしまい
>アクティブ、非アクティブを切り替えるとフォーカスがあるのに
>フォーカス枠が表示されない現象が起きてしまいます
>
>そこで対処療法的に、フォーカスの切り替え時に
>ダイアログ側のそのコントロールが乗っかっている部分を再描画して
>背景を強制的に(ダイアログ側に)描かせてしまうということで対処しました
/*****************************************************************************/
http://www.codeproject.com/shell/YaTrayMin.asp
Minimize your app to systray in 8 easy steps

Shell_NotifyIcon
NOTIFYICONDATA
/*****************************************************************************/
http://www.users.gr.jp/ml/archive/viewer.aspx?name=com&no=1760
[COM:01760] Re: ATL で _tcsncpy() 関数はダメなの?

>>この後メニューの「ビルド」→「アクティブな構成の設定」から
>>「Win32 Release MinSize」を選択し、ビルドを行うと、
>>
>>LIBCMT.lib(crt0.obj) : error LNK2001: 外部シンボル "_main"は
>>未解決です
>>ReleaseMinSize/Test03.dll : fatal error LNK1120: 外部参照 1 が未解決です。
>>link.exe の実行エラー
>>
>>といった内容のエラーが発生します。
>>但し「アクティブな構成の設定」で「Win32 Debug」を選択した
>>場合、この様な現象は発生しません。
>
> MSDNライブラリで、「_tcsncpy」を調べてみてください。結局strncpy()などに
>置換されて、Cランタイムライブラリを使用していることが分かります。
>
> このエラーは、Cランタイムライブラリを使用している場合に出るものです。
>
> 解決方法は2つあります。
>
>1. Cラインタイムライブラリを一切使わないように、関数を厳選する。
>2. プロジェクトの設定で、Releaseの「C/C++」タブから_ATL_MIN_CRTを削除する。
/*****************************************************************************/
http://home.a03.itscom.net/tsuzu/programing/tips18.htm
#018 ユーザー定義メッセージWM_USERとWM_APPの使用例

>0~(WM_USER-1)
>システムが使用するために予約されているメッセージ。
>この範囲にはユーザー定義メッセージは置かない。
>
>WM_USER(0x4000)~0x7FFF
>プライベートウィンドウクラスが使用するのに使うことのできる整数メッセージ。
>この範囲にはユーザー定義メッセージを置ける。
>但しシステム定義済みのメッセージと衝突しない注意が必要。
>
>WM_APP(0x8000)~0xBFFF
>アプリケーションが使用するのに使うことのできるメッセージ。
>この範囲にはユーザー定義メッセージを置ける。
>システム定義と衝突する心配がないので安心。
>
>0xC000~0xFFFF
>アプリケーションで使う文字列メッセージ用。
>この範囲にはユーザー定義メッセージは置かない。
>
>0x10000~
>予約。
>この範囲にはユーザー定義メッセージは置かない。
/*****************************************************************************/
/* 0 == FALSE, -1 == TRUE */
typedef short VARIANT_BOOL;
/*****************************************************************************/
メモリリークの原因

原因: BSTRの所有している文字列のメモリ領域を解放していない。
対策: ::SysFreeString関数にてメモリを解放する。または、CComBSTRを使用する。
サンプルコード:
	BSTR bstr;
	bstr = ::SysAllocString("");
	CString str(bstr);
	::SysFreeString(bstr); // 使わなくなったら解放する

原因: VARIANTの所有しているメモリ領域を解放していない。
対策: ::VariantClear関数にてメモリを解放する。または、CComVariant, COleVariant, COleSafeArrayを使用する。
サンプルコード:

	VARIANT v;
	::VariantInit(&v); // VARIANTを初期化する
	::VariantClear(&v); // 終了処理
	//コピーには::VariantCopy関数を使用する。
	//VARIANTの属性を変換するには::VariantChange関数を使用する。


VARIANT型の使い方

VARIANT型を使う際には、
VariantInit関数で初期化する必要がある。
VariantClear関数で終了処理を行う必要がある。
VariantClear関数は、VARIANTのメンバ変数pdispValの指しているIDispatchのReleaseを呼び出す。

	VARIANT v;
	::VariantInit(&v); // VARIANTを初期化する
	::VariantClear(&v); // 終了処理
	//コピーには::VariantCopy関数を使用する。
	//VARIANTの属性を変換するには::VariantChange関数を使用する。

VARIANTをラップしたCComVariantクラスでは、
コンストラクタではVariantInitを、デストラクタではVariantClearを実行する。

http://www.softimage.jp/softimage/xsi_sdk/sdk_file/about_xsi_sdk.htm
XSI|SDK と COM について

http://www.hi-ho.ne.jp/babaq/bstr.html
BSTR VARIANT SAFEARRAY

>VBScript ではIDispatchインタフェースを使ってCOMサーバを呼出します。受け渡すパラメータは、VARIANT互換のタイプを使います。
>ここではわかりにくいBSTR VARIANT SAFEARRAYを親切に説明。 

http://sysneitf.hp.infoseek.co.jp/mfc/auto_variant.html
VARIANT、VARIANTARG

http://www.orin.jp/dev/tutorial_rao.html
ORiN協議会◇技術解説 - RAOプロバイダ開発 RAOプロバイダ作成チュートリアル

/*****************************************************************************/
http://member.nifty.ne.jp/LILILIN/HOWTO/navigate_post.htm
CWebBrowser2 ControlでNavigate要求するときにボディデータを付加する

>COleSafeArray pvPostData;  // 最終的なPOSTデータ
>pvPostData.CreateOneDim(VT_UI1, strlen(pszPostData), pszPostData);
/*****************************************************************************/
http://sharkysoft.com/software/java/lava/docs/javadocs/lava/riff/wave/doc-files/riffwave-content.htm
RIFF WAVE (.WAV) file format
/*****************************************************************************/
リンク中...
nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 はすでに Hoge.obj で定義されています
nafxcwd.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 は Hoge.obj で定義されています; 2 つ目以降の定義は無視されます
   ライブラリ Debug/Hoge.lib とオブジェクト Debug/Hoge.exp を作成中
Debug/Hoge.dll : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました

http://support.microsoft.com/default.aspx?scid=kb;ja;148652
マイクロソフト サポート技術情報 - 148652
[PRB] C ランタイム ライブラリを MFC ライブラリより先にリンクしたときの LNK2005 エラー

>CRT ライブラリでは、new、delete、および DllMain の各関数で弱い外部リンケージを使用します。MFC ライブラリにも new、delete、および DllMain の各関数が含まれており、このために MFC ライブラリを CRT ライブラリより先にリンクする必要があります。 


http://bbs.wince.ne.jp/ch1/mqbbs.cgi?&FILE=bbs.log.65&MODE=MSG&NUM=6535
WindowsCE開発者向け談話室(中・上級者向け)
リンクエラー(RE:VC++6.0/WinCE Toolkit/Win2.12からemVC++3.0/WinCE3.0への開発移行手順)

>ビルドのエラーはつぎの通りです.
>つまり,MFCを共有DLLで使うDLLに必ず組み込まれる
>DllMainが,mfcs42d.libとcorelibc.libの両方に
>あって重複しているということはわかるのですが,
>これを,どう一方だけに制限するのかの具体的な方法が
>わかっていません.プラットフォームSDKの生成まで
>戻らなければならないのか,それとも,Linkのオプションの
>付け方で解決できるのか.
>
>リンク中...
>mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain already defined in corelibc.lib(dllmain.obj)
>mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain already defined in corelibc.lib(dllmain.obj); second definition ignored
>Creating library WCEX86Dbg/InProcess.lib and object WCEX86Dbg/InProcess.exp
>WCEX86Dbg/InProcess.dll : fatal error LNK1169: one or more multiply defined symbols found
>link.exe の実行エラー


/*****************************************************************************/
COM - Microsoftのコンポーネント技術

COM

IDispatchインターフェイス
	関数の名前を受け取って、その関数を実行するインターフェイス

ディスパッチインターフェイス(略してディスプインターフェイス)
	IDispatch::Invokeの実装で定義される関数の集まり

オートメーション(以前はOLEオートメーションと呼ばれていた)
	COMを基盤とする技術

オートメーションサーバー
	IDispatchインターフェイスを実装するCOMコンポーネント

オートメーションコントローラ
	IDispatchインターフェイスを介してオートメーションサーバーと通信するCOMクライアント

/*****************************************************************************/
http://program.station.ez-net.jp/special/vc/atl-com/variant.asp
EZ-NET 研究室: VARIANT 型を受け取る際の注意

http://program.station.ez-net.jp/mini/atl-com/collection.asp
EZ-NET: COM でコレクションを作成する

http://support.microsoft.com/default.aspx?scid=kb;ja;253501
[HOWTO] VARIANT を期待するメソッドの引数に COleDispatchDriver を渡す

>一部のメソッドでは、Automation オブジェクトを表す VARIANT を引数に渡す必要があります。MFC の場合、これらのオブジェクトは一般的に COleDispatchDriver の派生クラスで処理されます。VARIANT を期待するメソッドに COleDispatchDriver の派生クラスを渡すには、新しい VARIANT を作成し、vt メンバを VT_DISPATCH にセットし、pdispVal メンバを COleDispatchDriver クラスの m_lpDispatch にセットします。
/*****************************************************************************/
http://www.wakhok.ac.jp/~sumi/stl/manual/man_algorithm.html
STL Algorithm 詳解 Index
/*****************************************************************************/
http://www.nitoyon.com/vc/tutorial/debug/win32.htm
Win32アプリケーションのデバッグ方法 [VC++の使い方]

テクニカル ノート 7: トレース オプションのデバッグ(MSDN)
>TRACE 出力をオンにする方法
/*****************************************************************************/
<link href="favicon.ico" rel="icon" type="image/x-icon"/>
/*****************************************************************************/
Document/View
	SDI: CDocumentのコンストラクタは1回しか呼ばれない
	MDI: ドキュメントがオープンされる度にCDocumentのコンストラクタが呼ばれる
/*****************************************************************************/
ビットマップ背景ダイアログと透明背景ダイアログ

// Declares member parameter in advance.

	CBrush m_brushBitmap;
	CBrush m_brushNull;
	CBitmap m_bitmap;
	bool m_bIsCurrentBrushNull;

// add code on function OnInitDialog

	// Create Bitmap Brush
	m_bitmap.LoadBitmap(IDB_BITMAP);
	m_brushBitmap.CreatePatternBrush(&m_bitmap);

	// Create Null Brush
	m_brushNull.CreateStockObject(NULL_BRUSH);

	 // flag
	m_bIsCurrentBrushNull = false;

// add code on function OnCtlColor

	if(m_bIsCurrentBrushNull){
		pDC->SetBkMode(TRANSPARENT);
		return (HBRUSH)m_brushNull;
	}else{
		//pDC->SetBkMode(OPAQUE);
		return (HBRUSH)m_brushBitmap;
	}

/*****************************************************************************/
http://www.mtakahashi.com/old/09825.html
09807 LNK1104:LINK エラー解除方法

>2003 10/26 22:28
>RAPT
>σ(^^)の場合、ビルドがあやしくなってきたら、ビルド>クリーンで、中間コードを削除し、
>プロジェクトを一度閉じて、xxx.ncb, xxx.aps ファイルと xxx.bscファイルを削除し、
># クラスウィザード使っているときは、xxx.clw も。
>再度プロジェクトを開いて、リビルド、とかしています。
>
>Windows2000sp4/VC++6sp5std/ATL3.0/WTL7.0
/*****************************************************************************/
a=123, b=456 のとき "00123000456" を返す関数/メソッド。

// MFC
CString ToString(int a, int b)
{
	CString buf;
	buf.Format("%05d%06d", a, b);
	return buf;
}

// Java
String toString(int a, int b){
	StringBuffer buf = new StringBuffer();
	buf.append(new DecimalFormat("00000").format(a));
	buf.append(new DecimalFormat("000000").format(b));
	return buf.toString();
}
/*****************************************************************************/
抽象クラスのオブジェクトは作成できないが、ポインタはOK.

VC++でのエラーメッセージ
>error C2259: 'CFoo' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。
>'CFoo' の宣言を確認してください。
>CFoo::Bar(void)' : 純粋仮想関数は定義されていません。
>'Bar' の宣言を確認してください。

http://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/1003.html
10.3 仮想関数の詳細

>関数のプロトタイプのみを基本クラスに書き、定義は派生クラスで行う仮想関数。
>純粋仮想関数を含むクラスを抽象クラスと言う。

>抽象クラスのオブジェクトは作成禁止
>純粋仮想関数の定義が書かれていないので、クラスとして不完全なので、抽象クラスはオブジェクトを作成不可能。 

>抽象クラスのポインタは作成可能
>ポインタ(例えば、「c0 * pc0;」)はオブジェクトを作らないのでOK。
>指し示すものが必要である。
>指せるものは派生クラスのみである。
/*****************************************************************************/
http://www.inte.co.jp/tenshoku/MSNNews/contents/12240.html
開発職がインド・中国に流出、技術者の移転急増中

http://www.inte.co.jp/tenshoku/MSNNews/contents/12241.html
「東京一極集中」は変わるか?

>2006年、東京から名古屋へ民族大移動?
>先日、トヨタ自動車は2006年JR名古屋駅前に超高層ビルが完成するのに伴い、海外営業部門を中心に1千人以上の社員を東京本社から名古屋へ異動させると発表した。東京からそれ以外の地域へこれだけの規模で社員を移動させる例は珍しい。社員が1千人ということは、その家族の移転も考えると数千人が東京から名古屋へ移動するわけで、人口の少ない街であったら地域社会に大きな影響を与えることだろう。
/*****************************************************************************/
http://www.gsi.go.jp/
国土交通省国土地理院

http://vldb.gsi.go.jp/sokuchi/
国土地理院 測地部

http://vldb.gsi.go.jp/sokuchi/software/itrf2000/mokuji.htm#2
飛田幹男 (2002):世界測地系と座標変換,日本測量協会,東京,174ページ,(2002年4月18日刊行).
/*****************************************************************************/
タスクバーにタスクバーボタンを表示しない

http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/00016079.shtml
タスクバーに表示しないようにする方法

> ShowWindow(SW_HIDE);
> ModifyStyleEx(0, WS_EX_TOOLWINDOW, SWP_NOSIZE | SWP_NOMOVE | SWP_DRAWFRAME);
> ShowWindow(SW_SHOW);
/*****************************************************************************/
// アクティブウィンドウの位置を取得する
CWnd* pWnd = CWnd::GetForegroundWindow();
if(pWnd->IsWindowVisible()){
	CRect rectForegroundWindow;
	pWnd->GetWindowRect(&rectForegroundWindow);
}

参考:
	http://www.asahi-net.or.jp/~uv8m-hgsd/doc/deskmascot.html
	デスクトップマスコットを作って見やう
/*****************************************************************************/
http://www.codeproject.com/docking/prod_profuis.asp
Professional User Interface Suite

http://www.prof-uis.com/
Prof-UIS

いくつかの拡張コントロール。

サンプルで使われているコントロール
	CExtLabel
	CExtStatusControlBar

ダウンロードしたアーカイヴ内にあったソースファイル一覧
	exdlgbase.cpp
	ExtBtnOnFlat.cpp
	ExtButton.cpp
	ExtCmdIcon.cpp
	ExtCmdManager.cpp
	ExtColorCtrl.cpp
	ExtColorDlg.cpp
	ExtComboBox.cpp
	extcontrolbar.cpp
	ExtControlBarTabbedFeatures.h
	ExtDockBar.cpp
	ExtDockBar.h
	ExtEdit.cpp
	ExtHook.cpp
	ExtHook.h
	ExtIntegrityCheckSum.h
	ExtLocalization.h
	ExtMemoryDC.h
	ExtMenuControlBar.cpp
	ExtMiniDockFrameWnd.cpp
	ExtMiniDockFrameWnd.h
	ExtMouseCaptureSink.cpp
	ExtMouseCaptureSink.h
	ExtOleDispatchDriver.h
	ExtPaintManager.cpp
	ExtPopupMenuWnd.cpp
	ExtResizableDialog.cpp
	ExtScrollWnd.cpp
	ExtStatusControlBar.cpp
	ExtToolControlBar.cpp
/*****************************************************************************/
http://www.codeproject.com/dialog/xmessagebox.asp
XMessageBox - A reverse-engineered MessageBox()
/*****************************************************************************/
http://www.codeproject.com/useritems/StarControl.asp
StarControl

★を表示するコントロール
/*****************************************************************************/
http://www.codeproject.com/statusbar/ExtStatusControlBar.asp
CExtStatusControlBar - Managing status bar's panes is getting easier
/*****************************************************************************/
・Jアドレス電話帳(標準住所録データ形式)
  日本事務機械工業会が策定した住所録のデータ形式。

参考:
  http://www.ktlink.jp/hlp/TechInfoTelbook.htm
  電話帳ファイルの形式
/*****************************************************************************/
http://www.dljdirect-sfg.co.jp/DLJJapan/toubo_school/V_VIL_toubo_20031105.html
東保 裕之「株式徒然草」 第40回「実行しなければただの物知り」
■1000年かけて探しても正しい勉強法などみつからない
■簡単なことをすぐに実行することが大切
/*****************************************************************************/
cidaemon.exe は、インデックスサービス。
/*****************************************************************************/
http://202.33.57.92/inferno/inferno_body.html
Infernoとは

>Infernoは、UNIXやC/C++を開発したデニス・リッチー、ブライアン・カーニハンらのチームが、AT&Tベル研究所を母体とする米国ルーセント・テクノロジー社で開発したOSです。
/*****************************************************************************/
http://member.nifty.ne.jp/maebashi/programmer/pointer.html
配列とポインタの完全制覇
/*****************************************************************************/
日本語: intのポインタのポインタ(intへのポインタへのポインタ)
英語: pointer to pointer to int
/*****************************************************************************/
ActiveXコントロール(OCX)をレジストリに登録する

登録コマンド: REGSVR32.EXE OCXファイルの絶対パス
コマンド実行例: REGSVR32.EXE C:\foo\bar.ocx

OCXファイルをダブルクリックするだけでレジストリに登録できるようにする(Windows2000の場合)
1. エクスプローラにて、[ツール] -> [フォルダオプション] -> [ファイルタイプ] を選択。
2. OCXのファイルタイプを編集する。
   アクションを実行するアプリケーション: REGSVR32.EXE "%1"
/*****************************************************************************/
http://homepage2.nifty.com/~kawano/program/program.html
日曜プログラムの墓場

http://homepage2.nifty.com/~kawano/program/sec1/sec1.html
共通モジュールとちょっとした話

>Macro について
>#define Number(arr)            (sizeof(arr) / sizeof(arr[0]))
>#define CheckFlag(val, flag)   ((val) & (flag))
>#define SetFlag(val, flag)     ((val) |= (flag))
>#define ClearFlag(val, flag)   ((val) &= ~(flag))

>"Number" は配列の要素数を求める、よく知られたマクロです。

http://homepage2.nifty.com/~kawano/program/sec2/sec2.html
フォルダーツリー

>フォルダーツリーを表示する CTreeCtrl / CTreeView の派生クラスです。 "フォルダーツリーってなんだろう" と思う方は、エクスプローラを見てください。左側にフォルダーをツリー上に表示している部分がありますが、それのことです。 "Shell Function の中に同じようなのがあるぞ" とおっしゃる方、全くもってその通りでございます。しかも作ってみて分かる恐ろしさで、苦労して作ったのにめちゃくちゃ動作が遅いのです。そんな訳で、もはや IShellFolder と Tree View Control の学習以外での存在意義はありません。 (これこそ墓場に置いておくのがふさわしい?)

http://homepage2.nifty.com/~kawano/program/sec4/sec4.html
いまさら Image Viewer

>基本 JPEG ファイルの読み込み
>プログレッシブ JPEG の読み込み
>複数フォーマットのサポートと CFileDialog の拡張
/*****************************************************************************/
http://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip11.htm
配列の要素数を計算する
/*****************************************************************************/
http://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip19.htm
ファイルのバージョン情報を取得する

http://www.athomejp.com/goldfish/api/versioninfo.asp
ファイルのバージョン情報を取得

::GetFileVersionInfo
::GetFileVersionInfoSize
::VerQueryValue
/*****************************************************************************/
ClassWizard ファイル (.clw) のリビルド(MSDN)

>コードの内容を大幅に変更した場合や、別のプロジェクトから既存のユーザー インターフェイス クラスを多数追加した場合は、クラスを 1 つずつ更新するよりも、該当する ClassWizard ファイル全体をリビルドした方が簡単です。つまり、プロジェクトから現在の ClassWizard ファイル (.clw) を削除し、新しい .clw ファイルを ClassWizard で生成します。新しく生成された .clw ファイルには、ClassWizard の専用コメントが付いているクラスに関する情報が格納されます。
/*****************************************************************************/
http://www.kmonos.net/alang/boost/classes/filesystem.html
boost::filesystem
/*****************************************************************************/
SHGetSpecialFolderLocation
SHGetSpecialFolderPath
SHGetPathFromIDList
SHGetDataFromIDList
SHELLFOLDER
SHFILEINFO
SHGetFileInfo
IShellFolder

MSDNのSHGetSpecialFolderLocationに、CSIDLのリストがある。

http://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip08.htm
特殊フォルダのパスを取得する

http://www001.upp.so-net.ne.jp/yamashita/doc/shellfolder.htm
特別なシェルフォルダのディレクトリパスを取得する

>Windows 95やWindows NT 4.0など古いWindowsにはSHFolder.dllは含まれないので、自分のアプリケーションでSHGetFolderPath関数を使用した場合は、SHFolder.dllを一緒に頒布する必要があります。
>最新のシェルにおいては、SHGetFolderPath関数はSHFolder.dllだけではなく、Shell32.dllにも実装されています。例えば、Windows 2000(IE/Shell 5.0以上)上では、通常のShell32.libをリンクするだけで、Shell32.dll版のSHGetFolderPath関数を呼び出せます。しかし、プロダクトが明示的にSHFolder.libをリンクしている場合は、Windows 2000上であってもSHFolder.dll版が呼び出されます。

http://www001.upp.so-net.ne.jp/yamashita/product/csidlviewer.htm
CSIDLViewer

>プログラムから、スタートメニューやデスクトップなど、Windowsが特別に定義したフォルダの位置を取得するために、 SHGetSpecialFolderLocation, SHGetSpecialFolderPath, SHGetFolderLocation, SHGetFolderPath といったシェルAPI関数を使用します。
>これらの関数を呼び出す際、取得するフォルダの種類を識別する為にCSIDL値という定数を渡します。このプログラムは、関数にCSIDL値を渡したとき、実際にどのようなフォルダパスが返されるかを一覧表示するプログラムです。

http://yokohama.cool.ne.jp/chokuto/urawaza/prm/CSIDL.html
CSIDL 値

http://support.microsoft.com/default.aspx?scid=kb;ja;416254
[WinMe] SHGetSpecialFolderLocation() API の仕様変更

http://support.microsoft.com/default.aspx?scid=kb;ja;194702
[HOWTO] Windows の特殊フォルダの位置を知る方法

http://plaza5.mbn.or.jp/~heropa/vb32.htm
ディスクの空き容量を得る

http://forum.nifty.com/fdelphi/samples/01290.html
シェルのツリーを表示

http://hp.vector.co.jp/authors/VA007799/tips/tips1.htm
有効なドライブの情報取得

http://hp.vector.co.jp/authors/VA020994/Tips/sub3-2-025.htm
ファイルの表示名を取得する

http://www.kab-studio.biz/Programing/Codian/ShellExtension/01.html
シェルエクステンションって?

C:\Documents and Settings\All Users\Application Data\ベンダー名\アプリケーション名\バージョン...

CSIDL_COMMON_APPDATA	0023	アプリケーションデータ(共通)	C:\Documents and Settings\All Users\Application Data
CSIDL_APPDATA	001A	アプリケーションデータ	C:\Documents and Settings\username\Application Data
CSIDL_LOCAL_APPDATA	001C	ローカルアプリケーションデータ	C:\Documents and Settings\username\Local Settings\Application Data
CSIDL_PERSONAL	0005	マイ ドキュメント	C:\Documents and Settings\username\My Documents

カレントディレクトリは、関数GetCurrentDirectory() によって取得することができる。
 Windowsディレクトリは、関数GetWindowsDirectory() によって取得することができる。
 WindowsのSystemディレクトリは、関数GetSystemDirectory() によって取得することができる。

CreateDirectory, GetSystemDirectory, GetWindowsDirectory, RemoveDirectory, SetCurrentDirectory 

/*****************************************************************************/
CMenuによる右クリック時のポップアップメニューサンプルソースコード

//WM_CONTEXYMENU(OnContextMenu)を追加
void CMenuTestDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	CMenu* pMenu = new CMenu();
	pMenu->LoadMenu(IDR_MENU); // リソースエディタで IDR_MENU を作成しておく
	pMenu->GetSubMenu(0)->TrackPopupMenu(
		TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
		point.x, point.y,
		this);
	delete pMenu;
}

「テクニカル ノート 20: ID 名および番号に関する規約(MSDN)」では、
メニュー項目にて、ID番号の有効範囲は 0x8000 -> 0xDFFF となっている。
しかし、"Programming Windows 95 with MFC" には、オーナー描画メニュー項目にて問題が発生するため、
0x8000未満の数値を利用すべきと書かれている。

TrackPopupMenu関数にて指定したウィンドウが、WM_COMMANDメッセージを受け取る。
そのため、メニュー項目選択時の処理は、TrackPopupMenuにて指定したウィンドウに実装する。

// 宣言
afx_msg void OnA();

// メッセージマップの定義
BEGIN_MESSAGE_MAP(CMenuTestDlg, CDialog)
	//{{AFX_MSG_MAP(CMenuTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CONTEXTMENU()
	ON_COMMAND(IDM_A, OnA) // たとえば、IDM_Aというメニュー項目を選択したとき
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CMenuTestDlg::OnA() 
{
	MessageBox("A");
}

参考:
  http://hp.vector.co.jp/authors/VA007799/tips/tips9.htm
  Tips9 右ボタンメニュー

/*****************************************************************************/
CStringTokenizer

http://www.codeproject.com/cpp/strtok.asp
String Tokenizer class

http://www.codeguru.com/cpp_mfc/tokenizer.shtml
String Tokenizer
/*****************************************************************************/
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q243298
243298 - BUG: Error Message: C2668: InlineIsEqualGUID: Ambiguous Call to Overloaded Function:

http://www.excite.co.jp/world/url/body/?wb_url=http%3A%2F%2Fsupport.microsoft.com%2Fdefault.aspx%3Fscid%3Dkb%3BEN-US%3Bq243298&submit=%83E%83F%83u%83y%81%5B%83W%96%7C%96%F3&wb_lp=ENJA&wb_dis=3&wb_co=excitejapan
Excite翻訳による日本語訳

エラー内容: error C2668: 'InlineIsEqualGUID' : オーバーロード関数の呼び出しを解決することができません。
対処法: InlineIsEqualGUID() を ::ATL::InlineIsEqualGUID() と書き換える。
/*****************************************************************************/
xmldom.idl が必要ならば Internet Development SDK をインストールする。
/*****************************************************************************/
http://homepage1.nifty.com/MADIA/vc/vc_bbs/200306_03060012.html
ClassViewタブのツリーにクラスが表示されない??

VC++が自動生成するファイルを削除すれば、再度、自動生成してくれて、なおるかも。
自動生成されていて、削除しても問題ないと思われるファイルの拡張子。
.aps .clw .plg .ncb .opt
/*****************************************************************************/
Visual C++ の自動生成するActiveXコントロール(ocx)のラッパクラス

・dispinterface に対して、ひとつのラッパクラスが生成される。
・「最初のディスパッチ インターフェイス」以外のインターフェイスに対して、
  ラッパクラスが自動生成されない場合がある。
  対処方法: IHoge の宣言を 「最初のディスパッチ インターフェイス」 より前に
  移動させて、「最初のディスパッチ インターフェイス」内の該当する
  IDispatch* を IHoge* に書き換える。

/*****************************************************************************/
http://yokohama.cool.ne.jp/chokuto/urawaza/api/CoCreateInstance.html
CoCreateInstance
/*****************************************************************************/
USES_CONVERSION や A2W を利用するには、AFXPRIV.Hをインクルードする。
AtlBase.hでも良さそう。

#include <AFXPRIV.H> // for using USES_CONVERSION, A2W

http://www.microsoft.com/japan/developer/library/vcmfc/_mfcnotes_tn059.htm
テクニカル ノート 59: MFC の MBCS/Unicode 変換マクロの使用

http://www.microsoft.com/japan/developer/library/vccore/_core_activex_controls.3a_.converting_a_cdk_project_to_a_visual_c.2b2b_.project.htm

>USES_CONVERSION マクロと T2OLE マクロについては、「テクニカル ノート 59」を参照してください。これらのマクロを使用すると、Unicode と MBCS 間の変換時の関数呼び出しが簡単になります。特に、SysAllocString などの OLE API 関数に有効です。
/*****************************************************************************/
Java: instanceof
MFC: CObject::IsKindOf
/*****************************************************************************/
//MFCのソースコードより
void CDockContext::ToggleDocking()
{
	if (m_pBar->IsFloating())
	{
		// Dock it only if is allowed to be docked
		if (m_pBar->m_dwDockStyle & CBRS_ALIGN_ANY)
		{
			ASSERT((m_uMRUDockID >= AFX_IDW_DOCKBAR_TOP &&
				m_uMRUDockID <= AFX_IDW_DOCKBAR_BOTTOM) ||
				m_uMRUDockID == 0);

			CRect rect = m_rectMRUDockPos;
			CDockBar* pDockBar = NULL;
			if (m_uMRUDockID != 0)
			{
				pDockBar = (CDockBar*)m_pDockSite->GetControlBar(m_uMRUDockID);
				pDockBar->ClientToScreen(&rect);
			}

			// dock it at the specified position, RecalcLayout will snap
			m_pDockSite->ReDockControlBar(m_pBar, pDockBar, &rect);
			m_pDockSite->RecalcLayout();
		}
	}
	else
	{
		CPoint ptFloat = m_ptMRUFloatPos;
		if (ptFloat.x < 0 || ptFloat.y < 0)
		{
			ptFloat = m_rectMRUDockPos.TopLeft();
			m_pBar->GetParent()->ClientToScreen(&ptFloat);
		}
		m_pDockSite->FloatControlBar(m_pBar, ptFloat, m_dwMRUFloatStyle);
	}
}
/*****************************************************************************/

GetLocalTime
現在のローカル日時を取得します。

VOID GetLocalTime(

  LPSYSTEMTIME lpSystemTime // address of system time structure

);

SYSTEMTIME 構造体 
SYSTEMTIME 構造体は、次の形式です。

typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME;

SYSTEMTIME 構造体は、月、日、年、曜日、時、分、秒、ミリ秒の各メンバを使用し日付と時間を表します。
/*****************************************************************************/
Windows98/2000以降(Windows95以前は駄目)では、
8×8ピクセルより大きいビットマップのパターンでブラシを初期化できる。
ブラシの原点も8より大きい数を指定できる。
Win2000SP4では、MFCのCBrush::CreatePatternBrushとCDC::SetBrushOrgで問題なく動作した。

CBrush::CreatePatternBrush
	http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_mfc_cbrush.3a3a.createpatternbrush.asp

CDC::SetBrushOrg
	http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_mfc_cdc.3a3a.setbrushorg.asp

::CreatePatternBrush
	http://www.microsoft.com/japan/developer/library/jpgdipf/_win32_createpatternbrush.htm
	>Windows 95:8×8 ピクセルより大きいビットマップまたは DIB からブラシを作成する機能はサポートされていません。8×8 より大きいビットマップを指定すると、そのビットマップの一部だけが使われます。
	>Windows NT/2000 と Windows 98:8×8 ピクセルより大きいビットマップまたは DIB からもブラシを作成できます。 

::SetBrushOrgEx
	http://www.microsoft.com/JAPAN/developer/library/jpgdipf/_win32_setbrushorgex.htm
	>nXOrg
	>新しいブラシの原点の x 座標をデバイス単位で指定します。ブラシの幅より大きい値が指定された場合は、その値をブラシの幅で割った整数剰余が使われます(nXOrg mod ブラシの幅)。
	>nYOrg
	>新しいブラシの原点の y 座標をデバイス単位で指定します。ブラシの高さより大きい値が指定された場合は、その値をブラシの高さで割った整数剰余が使われます(nYOrg mod ブラシの幅)。


//サンプルソースコード
void CBrushOrgTestDlg::DrawBackground()
{
	static int p = 0;
	p++;

	CBitmap bitmap;
	CString strFileName("C:\\aaa\\test.bmp");
	HBITMAP hBitmap =
		(HBITMAP)LoadImage(
			NULL,
			strFileName,
			IMAGE_BITMAP,
			0,
			0,
			LR_LOADFROMFILE | LR_CREATEDIBSECTION);
	if(!bitmap.Attach(hBitmap)){
		MessageBox("ビットマップ構築失敗");
	}

	CBrush brush;
	if(!brush.CreatePatternBrush(&bitmap)){
		MessageBox("ブラシ構築失敗");
	}

	CDC* pDC = this->GetWindowDC(); // CDC* pDC = this->GetDC();

	brush.UnrealizeObject();
	pDC->SetBrushOrg(p,p);
	CBrush* pOldBrush = pDC->SelectObject(&brush);
	pDC->SetBkMode(TRANSPARENT);
	pDC->Rectangle(0, 0, 300, 300);

	CRect rectWindow;
	this->GetWindowRect(&rectWindow);
	rectWindow.SetRect(0,0,rectWindow.Width(), rectWindow.Height());

	//pDC->Rectangle(0, 0, 300, 300);
	pDC->FillRect(&rectWindow, &brush);

	pDC->SelectObject(pOldBrush);
	ReleaseDC(pDC);
}

/*****************************************************************************/

http://homepage2.nifty.com/DSS/VCPP/MFC/ToolBar/ToolBarLine.htm
2つのツールバーを横に表示

http://www.codeproject.com/docking/toolbar_docking.asp
Docking Toolbars Side-By-Side

http://www.codeguru.com/toolbar/demo_toolbar_d.shtml
Docking Toolbars Side-By-Side

ドッキング位置について。


テクニカル ノート 24: MFC で定義されているメッセージおよびリソース(MSDNより)
>WM_SIZEPARENT
>このメッセージは、サイズ変更時にコントロール バーをフレームの隣接位置に表示するために、フレーム ウィンドウからその直接の子ウィンドウに送られます。つまり、CFrameWnd::OnSize が CFrameWnd::RecalcLayout を呼び出し、次に RecalcLayout が CWnd::RepositionBars を呼び出します。AFX_SIZEPARENTPARAMS 構造体には、現在の親のクライアント領域を表す四角形と HDWP (NULL 値を取る場合もあります) が含まれています。HDWP を DeferWindowPos に渡すと再描画しなければならない最小の領域が得られます。

(MFCのソースコードより)
// special struct for WM_SIZEPARENT
struct AFX_SIZEPARENTPARAMS
{
	HDWP hDWP;       // handle for DeferWindowPos
	RECT rect;       // parent client rectangle (trim as appropriate)
	SIZE sizeTotal;  // total size on each side as layout proceeds
	BOOL bStretch;   // should stretch to fill all space
};

(MFCのソースコードより)
// Layout Modes for CalcDynamicLayout
#define LM_STRETCH  0x01    // same meaning as bStretch in CalcFixedLayout.  If set, ignores nLength
							// and returns dimensions based on LM_HORZ state, otherwise LM_HORZ is used
							// to determine if nLength is the desired horizontal or vertical length
							// and dimensions are returned based on nLength
#define LM_HORZ     0x02    // same as bHorz in CalcFixedLayout
#define LM_MRUWIDTH 0x04    // Most Recently Used Dynamic Width
#define LM_HORZDOCK 0x08    // Horizontal Docked Dimensions
#define LM_VERTDOCK 0x10    // Vertical Docked Dimensions
#define LM_LENGTHY  0x20    // Set if nLength is a Height instead of a Width
#define LM_COMMIT   0x40    // Remember MRUWidth

CWnd::RepositionBars(MSDNより)
>void RepositionBars( UINT nIDFirst, UINT nIDLast, UINT nIDLeftOver, UINT nFlag = CWnd::reposDefault, LPRECT lpRectParam = NULL, LPCRECT lpRectClient = NULL, BOOL bStretch = TRUE );
>ウィンドウのクライアント領域でコントロール バーの再配置およびサイズ変更のために呼び出されます。引数 nIDFirst と nIDLast は、クライアント領域で再配置されるコントロール バーの ID の範囲を定義します。nIDLeftOver には、クライアント領域のコントロール バーで埋められない残りの部分を埋めるために、再配置およびサイズ変更される子ウィンドウ (通常はビュー) の ID を指定します。



CControlBarの資料
C MAGZINE 1998年10月号

CControlBar::CalcDynamicLayout

動的ツール バーの寸法を計算するために、フレームワークが呼び出します。

virtual CSize CalcDynamicLayout(
   int nLength,
   DWORD nMode 
);

 virtual CSize 	CalcFixedLayout( BOOL bStretch, BOOL bHorz ) 
 afx_msg LRESULT 	OnSizeParent( WPARAM wParam, LPARAM lParam ) 
 virtual DWORD 	RecalcDelayShow( AFX_SIZEPARENTPARAMS* lpLayout ) 

/*****************************************************************************/
Windows 95 ロゴ要件のまとめ(MSDNより)

>アプリケーションを Windows 95 のロゴ基準に準拠させるには、アプリケーション タイプに関係なく、次の 5 つの基本要件を満たす必要があります。 
>・Win32 実行可能 
>・UPI と シェルのサポート
>・Windows NT 互換
>・長いファイル名のサポート
>・プラグ アンド プレイのサポート

>ファイル ベースのアプリケーション (主にファイルの作成、編集、保存用のアプリケーション) の場合は、さらに次の 3 つの要件を満たす必要があります。 
>・UNC パスのサポート
>・OLE のサポート
>・MAPI のサポート

DRAWCLI: Windows 95 ロゴ取得条件(MSDNより)

>DRAWCLI は、Windows 95 ロゴの取得条件を満たした例でもあります。どの MFC アプリケーションも、Windows 95 ロゴの取得条件を部分的に満たしています。つまり、Win32 実行形式、長いファイル名のサポート、UNC パス名のサポート、システム カラーとシステム メトリックスの使用、Windows NT との互換性を満たしています。DRAWCLI は、以下の機能によってこのほかの Windows 95 ロゴ取得条件を満たしています。 
>
>・ActiveX のサポート。DRAWCLI は Active コンテナであり、ファイルを複合ファイル形式で格納します。また、埋め込み先編集をサポートし、ドラッグ アンド ドロップ操作のドロップ先にできます。
>・MAPI のサポート。DRAWCLI では、[File] メニューに "Send as Mail" (メールとして送信) メッセージがあるので、ユーザーはドキュメントをメールに添付して送信できます。
>・シェル ガイドラインへの準拠。つまり、大小アイコンの登録、.ini ファイルではなくシステム レジストリの使用、セットアップ プログラムおよびアンインストール プログラムの使用を満たしています。この両プログラムに関しては、DRAWCLI には InstallSHIELD 対応のスクリプトがあります。InstallSHIELD は、セットアップ プログラムおよびアンインストール プログラムを作成するための Stirling Software 社のツールキットです。 
>
>DRAWCLI は、Windows 95 アプリケーションの以下の要求も満足しています。 
>・タブ付きプロパティ ページを使用する。
>・Windows 95 のコモン コントロールを使用する。
>・マウスの右ボタン クリックに対応してショートカット メニューを表示する。
>・ドキュメントとともに文書情報を格納する。 

COMMON.RES サンプル リソース(MSDNより)

>Visual C++ には、以下のリソースのサンプルがあります。これらのリソースは、アプリケーションに組み込むことができます。 
>・一般的なビジネスやデータ処理で使用される多数のアイコン
>・定義済み Windows リソースにはない、共通仕様のカーソル
>・ツールバー ボタンのビットマップ 
>これらのリソースは、MFC の汎用サンプルであるCLIPART の中の COMMON.RES ファイルに収められています。このほかにも、追加のサンプル リソース (.rc ファイル) が MSDN コンパクト ディスク内の Visual C++ サンプルと同じディレクトリに収められています。

/*****************************************************************************/
http://homepage.mac.com/gingertea20g/hhw/ss_viewer/ss_viewer_0.html
Screen Saver Viewer
/*****************************************************************************/
http://www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/index.html
C++ クラス設計に関するノート
/*****************************************************************************/
http://homepage1.nifty.com/CavalierLab/lab/cpp/header.html
ヘッダファイルについて

#pragma once を使えば、ヘッダファイルの多重includeを防ぐことができる。
ただし、コンパイラ依存っぽいから、#ifdef, #endif を使いましょう。
というお話。
/*****************************************************************************/
http://www.cppdoc.com/
CppDoc

>CppDoc generates HTML documentation for your C++ classes, based on your source code and special comments embedded within it.  It can produce output that is very similar to the output of Javadoc, and it supports Javadoc tags such as @see, @return , etc.  The documentation comments are optional; if you leave them out, CppDoc will still generate a full set of documentation based on class relationships and hierarchy.

http://www.cppdoc.com/example/mfc/mfc.html
generated MFC docs  
/*****************************************************************************/
http://www.sm.rim.or.jp/~shishido/wsclass.html
ウインドウのサブクラス化とタブキー

>ウインドウプロシージャ-を書き換えるには、SetWindowLong()にGWL_WNDPROCを指定してウインドウのハンドルと新しいウインドウプロシージャ-のアドレスを渡します。例えば、ウインドウhwndのウインドウプロシージャ-をfnProcで書き換えるなら
>SetWindowLong(hwnd,GWL_WNDPROC,(DWORD)fnProc);
>とするわけです。ただし、実際には新しいウインドウプロシージャ-で処理しないメッセージなどを元のウインドウプロシージャ-で処理するために元のウインドウプロシージャ-のアドレスも必要になります。SetWindowLong()でウインドウプロシージャ-を書き換えると元のウインドウプロシージャ-のアドレスが返されるので、そのアドレスをWNDPROC型にキャストして保存しておくと良いでしょう。以下のような感じになります。
>lpfnProc=(WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(DWORD)fnProc);
/*****************************************************************************/
コンポーネントの自動リサイズ

http://www.codeproject.com/dialog/resizectrl.asp?target=CResizeCtrl
CResizeCtrl

http://www.excite.co.jp/world/url/body/?wb_url=http%3A%2F%2Fwww.codeproject.com%2Fdialog%2Fresizectrl.asp%3Ftarget%3DCResizeCtrl&submit=%83E%83F%83u%83y%81%5B%83W%96%7C%96%F3&wb_lp=ENJA&wb_dis=3&wb_co=excitejapan
CResizeCtrl(Excite翻訳)

>The CResizeCtrl implements the ResizePercentage method of the WCL (the framework of Optima++ alias Power++, which was dropped by Sybase).
>For each control left, top, width and height is specified, to determine how the position and size of the control windows will change when the size of the parent window changes.

サンプルソースコード

	CResizeCtrl m_resize;

	m_resize.Create( this, FALSE );

	CResizeInfo rInfo[] =
	{
	  //  id         l    t    w    h
	  { IDC_EDIT1,   0,   0, 100,  50 },
	  { IDC_LIST1,   0,  50, 100,  50 },
	  { IDOK,       50, 100,   0,   0 },
	  { 0 },
	};
	m_resize.Add( rInfo );
	m_resize.SetMinimumTrackingSize();

/*****************************************************************************/
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/OPENFILENAME.html
OPENFILENAME
/*****************************************************************************/
[VitualC++]VC付属のDLLの再配布について

C:\Program Files\Microsoft Visual Studio\REDIST.TXT には、
再頒布可能なファイルのリストがあるので参考になる。

MFC42.DLL
MFC42JPN.DLL
MFC42U.DLL
MFC42LOC.DLL
MFC42JPN.DLL

http://www.microsoft.com/japan/developer/library/vccore/_core_mfc.2f.other_dll_files.htm
MFC DLL とその他の DLL のファイル(MSDN)
>MFC ライブラリとアプリケーションを動的にリンクする場合、少なくとも MFCx0[U].DLL と MSVCRT.DLL を再頒布する必要があります。x はバージョン番号を表します。MFCx0[U].DLL には、フレームワークの基本クラスのすべてが含まれています。どの MFC DLL でも、共有バージョンの C ランタイム ライブラリを使用します。このため、MSVCRT.DLL が必要です。アプリケーション側で CRecordset や CRecordView などの MFC データベース クラスを使用する場合は、必要な ODBC および ODBC ドライバを再頒布します。
>MFC DLL を再頒布する場合は、デバッグ版ではなく、必ずリテール版を頒布します。DLL のデバッグ版は、再頒布しないでください。デバッグ版の MFC DLL は、MFCx0D.DLL のように、ファイル名の最後に "D" が付いています。

MFC DLL の名前付け規約(MSDN)
>MFC に含まれる DLL やライブラリの名前は、一定の規則に従って命名されます。この規則に従うと、目的に応じて DLL やライブラリを簡単に使い分けることができます。

http://www.microsoft.com/japan/developer/library/vccore/_core_categories_of_redistributable_files.htm
再頒布可能なファイルの種類(MSDN)
>MFC ファイルおよびその他のファイル
>\ANSI\CTL3D32.DLL ANSI 用 DLL をサポートする 3D コントロール (Win32 と共に使用) 
>CTL3D32.DLL DLL をサポートする 3D コントロール 
>MFCx0.DLL MFC コア コード (MBCS 対応) 
>MFCx0U.DLL MFC コア コード (Unicode 対応) 
>MSVCRT.DLL C ランタイム ライブラリの共有 DLL バージョン 

再頒布可能なファイル(MSDN)
>Visual C++ の再頒布可能なファイルは、Visual C++ CD-ROM の複数のディレクトリに収められています。再頒布可能なファイルの収められているディレクトリについては、Visual C++ CD-ROM の \OS\System ディレクトリの REDISTRB.WRI を参照してください。Visual C++ のセットアップ プログラムでは、これらのファイルをハード ディスクの独立したディレクトリにインストールしません。ただし、セットアップ時のオプション設定によっては、一部のファイルが Windows システム ディレクトリにインストールされます。これらのファイルを再頒布する場合は、ハード ディスクからではなく CD から頒布ディスク イメージにコピーする必要があります。これは、正しいバージョンのファイルを確実に頒布するためです。

http://www.microsoft.com/japan/developer/library/vcedit/VCEditns.HTM
Visual C++ の各 Edition

>Standard Edition
>上級者向け Visual C++ ツール セットを使いながら、C++ 言語を学習します。Standard Edition には、Professional Edition の機能がほとんど揃っています。コードの最適化、プロファイラ、MFC ライブラリの静的リンクの 3 機能だけがありません。

>Professional Edition
>Windows 95 や Windows NT など、Win32 プラットフォーム向けのアプリケーション、サービス、およびコントロールを開発します。オペレーティング システムのグラフィカル ユーザーインターフェイスまたはコンソール API を使用できます。

>Enterprise Edition
>インターネットまたはイントラネット向けのクライアント/サーバー アプリケーションを開発し、デバッグします。Enterprise Edition には、Professional Edition の全機能のほか、SQL データベースの操作用ツール、SQL ストアドプロシージャのデバッグ用ツールが揃っています。Visual SourceSafe のソースコード管理システムを使用すると、チームでの開発が容易になります。

http://www.microsoft.com/japan/developer/library/vccore/_core_which_kind_of_dll_to_use.htm
DLL の使い分け

http://www.cisnet.or.jp/home/tsuneoka/win32tech/15.html
共有DLLの使い方

http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/00001300.shtml
「mfc42jpn.dll」がインストールされない

>mfc42***.dllというファイルは沢山あると思いますが、ファイル名か
>ら連想できる通り、言語に依存したものになっています。
>しかし、これらはmfc42loc.dllというファイル名に変更されて使用さ
>れているのです。

/*****************************************************************************/
[Windows]DLLファイルの検索順序

http://www.microsoft.com/japan/developer/library/vccore/_core_the_search_path_used_by_windows_to_locate_a_dll.htm
Windows が使用する DLL 検索パス

>暗黙リンクおよび明示的リンクのどちらの場合も、まずパフォーマンス ライブラリ (KERNEL32.DLL) やセキュリティ ライブラリ (USER32.DLL) などのプリインストール DLL が検索されます。次に、以下に示す順序で DLL が検索されます。

>1. 実行中のプロセスの実行形式モジュールがあるディレクトリ。
>2. カレント ディレクトリ。
>3. Windows システム ディレクトリ。このディレクトリへのパスは、GetSystemDirectory 関数が取得します。
>4. Windows ディレクトリ。このディレクトリへのパスは、GetSystemDirectory 関数が取得します。
>5. 環境変数 PATH 内に記述されたディレクトリ。
>   環境変数 LIBPATH は使用しません。

http://www.borland.co.jp/qanda/dbase/b0003065.html
Borland - dBASE Q&A プログラムを実行すると SCALPRN.DLL が見つからないのエラー

>DLLファイルの検索順序は,以下の通りになります。
>
>   1. 現在のディフォルトディレクトリ
>   2. Windows のディレクトリ(WIN.COM が含まれているディレクトリ)
>   3. Windows のシステムディレクトリ(GDI.EXEが含まれているディレクトリ)
>   4. DBASEWIN.EXE が含まれているディレクトリ
>   5. DOSの環境変数 PATH に設定されているディレクトリ
>   6. ネットワークにマップされているディレクトリ

/*****************************************************************************/
COleSafeArrayの使用例

	// COleSafeArrayの構築
	COleSafeArray arrayItems;
	long nItemCount = 1;
	VARTYPE vtSrc = VT_BSTR;
	const DWORD dwDims = 1;
	DWORD rgElements[dwDims] = {nItemCount};
	arrayItems.Create(vtSrc, dwDims, rgElements);

	// 文字列をひとつ挿入
	CString dummy("Hello");
	rgElements[0] = 0;
	arrayItems.PutElement((long *)rgElements, dummy.AllocSysString());

	// 文字列をひとつ取り出す
	CComBSTR result;
	arrayItems.GetElement((long *)rgElements, &result);
	MessageBox(CString(result));

	// AllocSysStringした文字列を解放
	::SysFreeString(

COleSafeArray
(MSDNより引用)
>COleSafeArray クラスは、任意の型と次元の配列を処理するクラスで、OLE VARIANT 構造体から派生しています。OLE SAFEARRAY メンバ関数は、バイトを要素とする 1 次元配列専用の一連のメンバ関数のほか、このクラスを介して COleSafeArray メンバ関数を使用できます。
/*****************************************************************************/
JavaDocによるAPIリファレンス作成の例

javadoc -overview src\overview.html -use -splitIndex -windowtitle "うぃんどうたいとる" -doctitle "どっくたいとる" -header "へっだ" -d docs\api -classpath .\classes @srclist.txt

srclist.txtの中身の例
-------------------------------------------------------------
src/a/b/c/Data.java
src/a/b/c/Info.java
src/a/b/c/d/GenericSearch.java
-------------------------------------------------------------

(JavaDocのリファレンスより引用)
>引数ファイルを 1 つ指定する例
>argfile という名前の引数ファイルにすべての Javadoc 引数を格納し、次のように使用>することができます。
>
>  C:> javadoc @argfile

/*****************************************************************************/
http://www.cam.hi-ho.ne.jp/strong_warriors/teacher/chapter05.html
3年D組モチヲ先生 -  五時限目 点と直線
/*****************************************************************************/
平方根(√)の計算をする関数

#include <math.h>
double sqrt( double x );
/*****************************************************************************/
http://www.codeproject.com/menu/menuxp.asp
A Powerfull Ownerdraw Menu

http://www.codeproject.com/menu/trans_menu.asp
Transparent Menu

http://www.codeproject.com/menu/bmpmenu.asp
Menu Bitmaps from Minimal Source Code
/*****************************************************************************/
http://www.codeproject.com/miscctrl/csliderctrlex.asp
CSliderCtrlEx - A slider with background colors to indicate ranges

http://www.codeproject.com/miscctrl/roundsliderctrl.asp
Round Slider Control

http://www.codeproject.com/miscctrl/transparentslider.asp
Transparent CSliderCtrl Class

/*****************************************************************************/
http://www.hidecnet.ne.jp/~sinzan/tips/vc/vc_tip05.htm
インターフェイスを使用したコードでコンパイルエラーがでる

> C言語では、メソッドの呼び出しを、メンバ lpVtbl を介して行います。
> C言語では、メソッドの第一引数に、自分自身へのポインタを渡します。
> C言語での使用例:
> psl->lpVtbl->SetArguments( psl, Arguments );
> psl->lpVtbl->QueryInterface( psl, &IID_IPersistFile, (void **)&ppf );
> ppf->lpVtbl->Release( ppf );
> pshf->lpVtbl->Release( pshf );
/*****************************************************************************/
[MFC]実行ファイルと同じディレクトリにあるINIファイルを使用する

EXEファイル名と同じファイル名のINIファイルを作り、使用する。
MFC App Wizard によって作成されたCWinApp派生クラスのInitInstance関数にて、
レジストリ/INIファイルの設定部分を以下のように書き換える。

------------------------------------------------------------------------------
// 設定が保存される下のレジストリ キーを変更します。
// TODO: この文字列を、会社名または所属など適切なものに
// 変更してください。

// レジストリを使わないのでコメントアウト
//SetRegistryKey(_T("Local AppWizard-Generated Applications"));

// 実行ファイルと同じディレクトリのINIファイルを使う
TCHAR path[MAX_PATH];
TCHAR drive[_MAX_DRIVE];
TCHAR dir[_MAX_DIR];
::GetModuleFileName(m_hInstance, path, sizeof(path));
_tsplitpath(path, drive, dir, NULL, NULL);
_tmakepath(path, drive, dir, m_pszExeName, "ini");
free((void*)m_pszProfileName);
m_pszProfileName = _tcsdup(path);

LoadStdProfileSettings(16);  // 標準の INI ファイルのオプションをロードします (MRU を含む)
------------------------------------------------------------------------------

http://www.ne.jp/asahi/hishidama/home/tech/vcpp/ini.html
iniファイルをexeと同じパスで使用する方法

http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_INI.html
INIファイルを使った情報の保存

http://www.yks.ne.jp/~masato/room/diary/dev200003.html
MASATOの開発日記 2000年3月
MFCで、レジストリの代わりにiniファイルを使用する方法。

>1. CxxxApp::InitInstance()中の、SetRegistryKey()呼び出しを削除(あるいはコメントアウト)します。これにより、レジストリではなくiniファイルに保存するようになります。
>2. しかし、このままでは、ウィンドウズディレクトリの中にiniファイルを作ってしまいます。
>
>   そこで、iniファイルの場所をフルパスで指定します。SetRegistryKey()があった所に以下のソースを挿入します。
>   -----
>   // ●iniファイルに保存するようにする。●
>   TCHAR path[MAX_PATH];
>   TCHAR drive[_MAX_DRIVE];
>   TCHAR dir[_MAX_DIR];
>   ::GetModuleFileName(AfxGetInstanceHandle(), path, sizeof(path));
>   _tsplitpath(path, drive, dir, NULL, NULL);
>   _tmakepath(path, drive, dir, m_pszAppName, "ini");
>
>   free((void*)m_pszProfileName);
>   m_pszProfileName = _tcsdup(path);
>   -----
>   これで、ばっちり実行ファイルと同じ所にiniファイルを作ってくれます。MRUファイルリスト(最近開いたファイル)も、このiniファイルに保存してくれます。これでシステムに迷惑をかけずに済みますね!
/*****************************************************************************/
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vctutor98/HTML/_gs_the_tutorial_example.3a_.circle.asp
The Tutorial Example: Circle
/*****************************************************************************/
MFCソースコード

MFC : MFC ソース ファイルの利用(MSDN)

WINOCC.CPP
	CWnd

WINGDI.CPP
	CWnd
	CDC
	CBitmap
	CFont
/*****************************************************************************/
http://jp1.freemy.homeip.net/noire/sjis.html
MinGW(gcc)の日本語対応化

http://homepage1.nifty.com/kuuku/gcc-sjis/index.html
gcc-3.2.3(Mingw-3.0.0-rc3)と日本語(Shift JIS)
/*****************************************************************************/
GDI+について

http://user.ecc.u-tokyo.ac.jp/~rr26303/develop/gdiplus/gdiplus.html
GDI+の導入

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
Platform SDK Update

GDI+のインクルードファイルの設定

	[ツール] -> [オプション] -> [ディレクトリ]タブ
	表示するディレクトリ: インクルードファイル
	ディレクトリのリストに、GDI+のインクルードファイルのあるディレクトリを設定する。
	ディレクトリの例: C:\Program Files\Microsoft SDK\include
	このとき、設定したディレクトリを、リストの一番上に持っていく必要がある。
	リストの一番上(かどうかはよくわからないが)にない場合は、コンパイル時に以下のエラーが出る。

	c:\program files\microsoft sdk\include\gdiplusinit.h(32) : error C2065: 'ULONG_PTR' : 定義されていない識別子です。
	c:\program files\microsoft sdk\include\gdiplusinit.h(32) : error C2065: 'token' : 定義されていない識別子です。
	c:\program files\microsoft sdk\include\gdiplusinit.h(32) : error C2165: 'left-side modifier' : データへのポインタは変更できません。
	c:\program files\microsoft sdk\include\gdiplusinit.h(32) : error C2071: 'NotificationHookProc' : 記憶クラスは不正です。
	c:\program files\microsoft sdk\include\gdiplusinit.h(33) : error C2146: 構文エラー : ')' が、識別子 'token' の前に必要です。
	c:\program files\microsoft sdk\include\gdiplusinit.h(33) : error C2165: 'left-side modifier' : データへのポインタは変更できません。
	c:\program files\microsoft sdk\include\gdiplusinit.h(33) : error C2071: 'NotificationUnhookProc' : 記憶クラスは不正です。
	c:\program files\microsoft sdk\include\gdiplusinit.h(33) : error C2059: 構文エラー : ')'
	c:\program files\microsoft sdk\include\gdiplusinit.h(86) : error C2059: 構文エラー : 'const'
	c:\program files\microsoft sdk\include\gdiplusinit.h(95) : error C2146: 構文エラー : ')' が、識別子 'token' の前に必要です。
	c:\program files\microsoft sdk\include\gdiplusinit.h(95) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
	c:\program files\microsoft sdk\include\gdiplusinit.h(95) : error C2182: 'GdiplusShutdown' : 'void' 型を使って宣言されました。
	c:\program files\microsoft sdk\include\gdiplusinit.h(95) : error C2059: 構文エラー : ')'
	c:\program files\microsoft sdk\include\gdiplusflat.h(2639) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
	c:\program files\microsoft sdk\include\gdiplusflat.h(2639) : error C2440: 'initializing' : 'int' から 'enum Gdiplus::Status' に変換することはできません。(新しい動作 ; ヘルプを参照)
	        列挙型への変換には static_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
	c:\program files\microsoft sdk\include\gdiplusflat.h(2644) : error C2146: 構文エラー : ')' が、識別子 'token' の前に必要です。
	c:\program files\microsoft sdk\include\gdiplusflat.h(2644) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
	c:\program files\microsoft sdk\include\gdiplusflat.h(2644) : error C2182: 'GdiplusNotificationUnhook' : 'void' 型を使って宣言されました。
	c:\program files\microsoft sdk\include\gdiplusflat.h(2644) : error C2059: 構文エラー : ')'

/*****************************************************************************/
文字列クラス

http://www.codeproject.com/string/VmXstring.asp
The XString Class

>XString or the "Extended String Class" is a generic C++ class that can handle both ASCII and UNICODE strings. It combines features of the Java String and StringBuffer classes. Like the Java "String" class, the XString class has the functions indexOf(), lastIndexOf(), startsWith(), endsWith() and equals(). Like the Java "StringBuffer" class, you can insert, replace or remove characters in an XString.
/*****************************************************************************/
「error C2061: 構文エラー : 識別子 'THIS_FILE' がシンタックスエラーを起こしました。」の対処法。

VC++によって自動挿入される以下のコードが問題。
-------------------------------------
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
-------------------------------------

原因: new を DEBUG_NEW に置き換えているから。
対処法1: 自動挿入されたコードを削除する(不要な#defineをさせない)。
対処法2: 自動挿入されたコードの前に #undef _DEBUG の記述を加える(_DEBUGの定義を解除)。

参考:

http://www.mtakahashi.com/old/08200.html
08188 ヘッダーファイルにSTLをインクルードできない。

http://search.acty-net.ne.jp/mfc_search/archive/2000-1/msg02738.html
[mfc 24204] #include<vector>と記述するだけでエラーになる

http://forums.belution.com/ja/vc/000/103/42s.shtml
[00010342](SET)] MFCでSTL

>VC++標準添付のSTLがDEBUGビルドに対応していない事が原因だと思います。
>STLのOEMであるdinkumwareはVC++専門にSTLを作っている訳ではない為、
>"VC++専用の方言"をSTLに組み込む事が不都合だったのではないでしょうか。

/*****************************************************************************/
Visual C++ プロジェクトに対して作成されるファイルの種類(MSDN)
/*****************************************************************************/
http://www.codeproject.com/dialog/SimpleIrregular.asp
Simple way to create non-rectangular shaped dialogs

http://techtips.belution.com/ja/vc/0010/
ビットマップの形をしたリージョンを作成するには?
/*****************************************************************************/
http://www.codeproject.com/docking/pinnabledock.asp
Pinnable ControlBar

ピンで留めたようなControlBar.

http://www.codeproject.com/useritems/Clock.asp
A transparent clock and CHECK ON WORK ATTENDANCE

透明なアナログ時計

http://www.codeproject.com/menu/newmenuxpstyle.asp
Owner Drawn Menu with Icons, Titles and Shading
/*****************************************************************************/
http://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip01.htm
デスクトップ領域、デスクトップ作業領域のサイズを取得する

>GetSystemMetrics( SM_CXSCREEN ) // デスクトップ領域の幅を返す。
>GetSystemMetrics( SM_CYSCREEN ) // デスクトップ領域の高さを返す。

http://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip03.htm
スクリーン座標、ウィンドウ座標、クライエント座標を相互に変換する

http://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip1c.htm
タスクバー領域を取得する

//*********************************************************
//  タスクバー領域の矩形を返す。
//*********************************************************
RECT GetTaskbarRect( void )
{
	APPBARDATA abd;

	memset( &abd, 0, sizeof(APPBARDATA) );
	abd.cbSize = sizeof(APPBARDATA);

	SHAppBarMessage( ABM_GETTASKBARPOS, &abd );
	return abd.rc;
}//GetTaskbarRect
/*****************************************************************************/
http://www.page.sannet.ne.jp/mtoga/lang/cv/bih-m_61.htm
mfc_ウィンドウ(更新領域)
/*****************************************************************************/
http://techtips.belution.com/ja/vc/0066/
CControlBar の派生クラスでコンパイルエラーが発生します。

>MFC の CControlBar から新たに独自のクラスを派生させた場合に、コンパイルエラー (error C2259) が発生して、コンパイルできない場合があります。これは CControlBar の純粋仮想関数である OnUpdateCmdUI() がオーバライドされていないためです。
/*****************************************************************************/
連続して通知されるメッセージに対処する

CHoge::OnHogeHoge()
{
	if(m_flag) return; // フラグがセットされていれば、関数を抜ける

	m_flag = true; // フラグをセット

	[処理、とくに時間のかかる処理の場合はこういう手法が良いのかもしれない]

	m_flag = false; // フラグを戻す
}

/*****************************************************************************/
VC++での例外の握り潰し方

// 上に投げる場合
try{
	hoge.hoge();
}catch(...){
	TRACE("Error");
	throw;
}

// 握り潰す場合
// CExceptionがメモリリークするのを防ぐ
try{
	hoge.hoge();
}catch(CException *e){
	TRACE("Error");
	e->Delete();
}

/*****************************************************************************/
JavaScriptからActiveXコントロールを操作する例

<html>
	<script>
		function hoge() {
			document.Hoge1.HogeMethod();
		}
	</script>

	<body>
		<object
			id="Hoge1"
			width="100" height="100"
			classid="CLSID:00000000-0000-0000-0000-000000000000">
		</object>

		<form>
			<input type="button" value="Hogeを実行する" onClick="hoge();">
		</form>

	</body>

</html>

/*****************************************************************************/
http://www.codeproject.com/miscctrl/kcsidebannerwnd.asp
CKCSideBannerWnd: An MFC Banner control that can add a professional looking feel to most windows...
/*****************************************************************************/
http://home.a03.itscom.net/tsuzu/programing/tips28.htm
#028 タブコントロールの実装方法
/*****************************************************************************/
MFC を利用した(MFC ActiveX ControlWizard) ActiveXコントロール(OCX)にて、
インターフェイスメソッドシグニチャを変更する場合に、修正する箇所のサンプル。
(全部で5箇所)

// Hoge.odl(1箇所)

	[ uuid(00000000-0000-0000-0000-000000000000),
	  helpstring("Hoge Control 用ディスパッチ インターフェイス"), hidden ]
	dispinterface _DHoge
	{
		properties:
			// メモ - ClassWizard はこの位置にプロパティ情報を追加します。
			//    このセクションの編集は慎重に行ってください。
			//{{AFX_ODL_PROP(CHogeCtrlCtrl)
			//}}AFX_ODL_PROP

		methods:
			// メモ - ClassWizard はこの位置にメソッド情報を追加します。
			//    このセクションの編集は慎重に行ってください。
			//{{AFX_ODL_METHOD(CHogeCtrlCtrl)
			[id(1)] IDispatch* HogeMethod();
			//}}AFX_ODL_METHOD
	};

// Hoge.h(2箇所)

	// ディスパッチ マップ
	//{{AFX_DISPATCH(CHogeCtrl)
	afx_msg LPDISPATCH HogeMethod();
	//}}AFX_DISPATCH
	DECLARE_DISPATCH_MAP()

	// ディスパッチ と イベント ID
	enum {
	//{{AFX_DISP_ID(CHogeCtrl)
	dispidHogeMethod = 1L,
	eventidHogeEvent = 1L,
	//}}AFX_DISP_ID
	};

// HogeCtrl.cpp(2箇所)

	// ディスパッチ マップ
	BEGIN_DISPATCH_MAP(CHogeCtrl, COleControl)
		//{{AFX_DISPATCH_MAP(CHogeCtrl)
		DISP_FUNCTION(CHogeCtrl, "HogeMethod", HogeMethod, VT_DISPATCH, VTS_NONE)
		//}}AFX_DISPATCH_MAP
	END_DISPATCH_MAP()

	//実装
	LPDISPATCH CHogeCtrl::HogeMethod()
	{
		return NULL;
	}

/*****************************************************************************/
warning C4786
識別子が '255' 文字に切り捨てられました

#pragma warning (disable: 4786) で対応する。

http://www2.kct.ac.jp/~srd/warning.html
無視すべきコンパイラの警告たち

http://www.fides.dti.ne.jp/~oka-t/vc-mfc.html#quirks
VC++ の困った癖
/*****************************************************************************/
http://www.google.co.jp/search?q=cache:khrqqSQ_mCoJ:n76cd-01p05.ppp11.odn.ad.jp/old/06725.html+virtual+CDialog+Invalidate&hl=ja&lr=lang_ja&ie=UTF-8

#include <windows.h>
#include <typeinfo>
#include <iostream>

int main() {
  // WPARAM,LPARAM の'本当の'型を調べる
  std::cout << typeid(WPARAM).name() << std::endl;
  std::cout << typeid(LPARAM).name() << std::endl;
  return 0;
}
/*****************************************************************************/
http://www.google.co.jp/search?q=cache:khrqqSQ_mCoJ:n76cd-01p05.ppp11.odn.ad.jp/old/06725.html+virtual+CDialog+Invalidate&hl=ja&lr=lang_ja&ie=UTF-8

>constについて
>
>2002 10/24 19:15
>hisako
>クラスのメンバ関数で
>const 型名 関数名 () const
>となっている、constの違いがわからず、
>過去ログを調べて、型名の前につくconstは戻り値が変更できないこと。
>後ろの方のconstは、関数を呼び出すオブジェクトの値を変更しないこと。
>ということは、わかりましたが、
>それぞれ、どういう場合に用いるものなのかがわかりません(汗)
>
>後者の方は、オブジェクトをconst型修飾子をつけて宣言した場合に、
>それに併せて使用するという理解でよろしいんでしょうか?
>前者の方は、本を調べても探すことができませんでした。
>
>基本的な質問で申し訳ないんですが、よろしくお願いいたします。
>
>2002 10/24 19:55
>ひまわり
>例えば、
>class CHoge {
>private :
>  CString   m_cstrName ;
>public :
>  const CString& GetName( void ) const {
>    return m_cstrName ;
>  }
>} ;
>というものが存在したとして、
>
>GetName()の内部では、そのクラスのメンバ変数に関して
>変更しちゃ駄目っていう意味なのが、関数の後についてい
>るconst。
>で、GetName()の呼出側は戻り値をconst CString&の形で
>受け取るので、その受け取った変数に関して変更しちゃ駄目
>って意味が、関数の前のconst。
>これが、
>CString& GetName( void )
>の形だったらGetName()の呼出側で、CHogeクラスの中の
>m_cstrNameに関して勝手にいじくられてしまう。
>そんな時の防止にも使いますかねぇ?
>
>
>2002 10/25 14:12
>Harry
>const メンバ関数はある種、意思の表明ですね。プログラマはこの関数内で一切のメンバ変数
>の変更をしない、という意思表示をすることで、勘違いやタイプミスを減らそうという試みで
>す。安全なプログラムを作るための仕掛けだと思ってます。

/*****************************************************************************/
DECLARE_MESSAGE_MAP( )

>メ モ   DECLARE_MESSAGE_MAP の後にメンバを宣言するときは、そのメンバの新しいアクセス型 (public、private、または protected) を指定する必要があります。

ということなので、クラス宣言の末尾に置いたほうが安全。
DECLARE_MESSAGE_MAPマクロは、メンバのスコープを指定するアクセス指定子を使っているから。
/*****************************************************************************/
MFCにて、WinMain関数の記述してあるソースコード: WINMAIN.CPP
/*****************************************************************************/
CWinAppの主要なオーバーライド可能関数
CWinApp::InitInstance
CWinApp::OnIdle
バックグラウンド処理を実行したいときに使う。
CWinApp::Run
CWinApp::PreTranslateMessage
CWinApp::ExitInstance
>この関数のデフォルトのインプリメントでは、アプリケーションの .INI ファイルにフレームワークのオプションを書き込みます。アプリケーション終了時の後処理をするときは、この関数をオーバーライドします。
/*****************************************************************************/
MFCが提供する関数
AfxXxx関数
Application Framework (xは未来的な響き(Afx)を作るために付加されたらしい)
/*****************************************************************************/
CWnd::Invalidateは仮想関数(virtual function)ではない。
そのため、Invalidateをオーバーライドしても、
基本クラスとして扱っている場合は、
Invalidate関数を呼び出した際に、基本クラスのInvalidate関数(CWnd::Invalidate)が呼ばれる。
/*****************************************************************************/
//タイトルバーの高さ
int nTitleBarHeight = ::GetSystemMetrics(SM_CYCAPTION);
// ウィンドウ枠の幅
int nFrameCx = ::GetSystemMetrics(SM_CXSIZEFRAME);
/*****************************************************************************/
http://techtips.belution.com/ja/vc/0016/
フローティングウィンドウの閉じるボタンを無効化するには?

>クラスウィザードで CMainFrame に RecalcLayout() を追加します。
>RecalcLayout() は標準のコントロール バーの表示、非表示が切り替えられたとき、またはフレームウィンドウのサイズが変更されたときにフレームワークが呼び出します。ですから、ツールバーがフローティングされた瞬間などに処理を行うには、非常によい場所です。さらに CMainFrame クラスで、処理を行ってしまえば、非常に簡単に済ませることが出来ます。
>もう一つ afxpriv.h ファイルをインクルードするのを忘れないようにしてください。
/*****************************************************************************/
ダイアログ(CDialog)が表示されなくなる現象

モードレスダイアログの場合、
OnOKやOnCloseを呼ぶと、非表示になってしまう。
この2つの関数をオーバーライドして、対処する。
/*****************************************************************************/
http://www2d.biglobe.ne.jp/~oga/pc/win/wtool.html
Oga's Windows Tools

>WinTail
>刻々と出力されるログの出力状況の監視などを行なうためのツールです。
>指定ファイルの末尾を表示します。SendToなどに入れると便利でしょう。
>UNIXのtail -fのようなものが欲しかったのでとりあえず作成してみました。

>MBMon
>ABIT KT7などに付属しているVIA Hardware Monitorの値 (CPU温度、ファンの回転数など)を定期的に取得してグラフで表示します。 ログも取得できます。
>一日の温度変化を見てみたい~とか思う人にしか意味のないツールです。
/*****************************************************************************/
http://plaza.harmonix.ne.jp/~fakira/cppdoc/tips.htm

>Q: 2点を結ぶ直線と、ある点から降ろした垂線との交点は?
>A: 以下の通り
>
>// 2点(p,q)-(r,s) を結ぶ直線上に点(i,j)から降ろした垂線との交点(x,y)
>pair<double,double> GetPerp(double p,double q,double r,double s,double i,double j)
>{
>    double    a = p-r, b = q-s, l = a*a+b*b, d = q*r-p*s, e = i*a+j*b;
>    if (l == 0.) l = 1;
>    return make_pair((b*d+a*e)/l,(b*e-a*d)/l);
>}
/*****************************************************************************/
http://plaza.harmonix.ne.jp/~fakira/cppdoc/custum.htm
[MFC] カスタムコントロールの作成
/*****************************************************************************/
http://techtips.belution.com/ja/vc/0004/
Visual Studio のようなドッキングするウィンドウをつくるには?

http://www.codeguru.com/docking/mrcext.shtml
MRCEXT
/*****************************************************************************/
http://techtips.belution.com/ja/vc/0037/
デスクトップに描画するには?

>普段見ているデスクトップのアイコンなどが並んでいるウィンドウは SysListView32 というクラス名のウィンドウです。
>そこで、そのウィンドウハンドルを取得して、そのウィンドウに対して描画してやります。

ウィンドウに描画する(枠とかメニューとかの部分に)
CDC* pDC = GetWindowDC();
pDC->TextOut(0, 0, "Hello");
ReleaseDC(pDC);
/*****************************************************************************/
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q143/2/55.asp&NoWebContent=1
143255 - HOWTO: Make a Resizable Dialog Bar
/*****************************************************************************/
http://search.acty-net.ne.jp/mfc_search/archive/1999-2/msg02560.html
[mfc 19765] Re: ToolBar の Button を EditBox に切り替える時の不具合

>> よろしければ、CDialogBar(基本的にWindowだと思ってるんです)の形がDynamicly
>> チェンジできるかどうか、教えてほしいです.
>
>これはあることに気づくと、それほど問題ではないのですが・・・。
>CDialogBar派生クラス(実際にはCDialog派生した後、ソース&ヘッダの
>親クラスを書き換える)にCalcDynamicLayoutをVirtualオーバーライドして。
>
>CSize CDlgAbout::CalcDynamicLayout( int nLength, DWORD dwMode )
>{
>static CSize  oldSize(100,100) ;  // 前回値サイズを覚えておく
>
>  CSize  Ret ;
>  Ret = oldSize ;
>
>  if ( dwMode & LM_LENGTHY ) {
>    // 縦方向
>  } else {
>    // 横方向
>    if ( 0 < nLength ) {           // なぜか-1や0の来ることが多いので!(ぉ)
>      Ret.cx = ((nLength + 32) / 64) * 64 ;
>      oldSize = Ret ;
>    }
>  }
>  return  Ret ;
>}
>
>と書くと初期状態100x100、横伸縮自在(floating時)のダイアログバーの
>出来上がりです。
>Ret.cxの代入文は奇妙ですが、動かしてみれば判ります(^^; ツールバーと
>同じような動作するでしょ。

/*****************************************************************************/
http://search.acty-net.ne.jp/mfc_search/archive/2001-2/msg02889.html
[mfc 35425] Re: CToolTiponDialogbar

>一応、私がCDialogBar派生クラスを作成する手順を説明しておくと…
>
>・ダイアログエディタで、ダイアログバーテンプレートを作成
>・ClassWizardで、基底クラスをCDialogとしてクラスを作成
>                             ~~~~~~~(ここがミソ)
>・テキストエディタでCDialogをCDialogBarに置き換え
>・ウィンドウ作成用メンバ関数を追加し、その中でUpdateData(FALSE)
>
>こうすると、以後の作業でClassWizardによるコントロールとメンバ
>変数 or メッセージの結びつけが利用可能になりますので、結構便
>利です。
>
>最後のUpdateData(FALSE)は、ryojiさんのWM_INITIDIALOGハンドリ
>ングでもいいかもしれませんね。
>CDialogBar::HandleInitDialogを呼び出すような、自分用CDialogBar
>拡張クラスを作成しておくと楽かも。
/*****************************************************************************/
CComboBoxEx(ImageCombo コントロール)

CControlBar + CDialog + CComboBoxEx だと、表示がおかしくなる。
対処方法は?


拡張コンボ ボックス コントロールの作成(from MSDN)

>ダイアログ ボックスで CComboBoxEx を直接使用するには 
>1. ダイアログ エディタで、拡張コンボ ボックス コントロールをダイアログ テンプレート リソースに追加し、コントロール ID を指定します。
>2. 拡張コンボ ボックス コントロールの [プロパティ] ダイアログ ボックスで、必要なスタイルをすべて指定します。
>3. ClassWizard で、コントロールのプロパティとしてCComboBoxEx 型のメンバ変数を追加します。CComboBoxEx メンバ関数を呼び出すときに、このメンバを使用します。
>4. ClassWizard で、処理する拡張コンボ ボックス コントロールの通知メッセージにダイアログ クラスのハンドラ関数を対応付けます。
>5. OnInitDialog で、CComboBoxEx オブジェクトに追加するスタイルを設定します。 

http://www.microsoft.com/japan/developer/library/vccore/_core_setting_the_images_for_an_individual_item.htm
項目のイメージの設定

http://ml.acty-net.ne.jp/ml/mfc/00043209.shtml
VC++ML No43209: Re: コンボボックスにアイコンの追加

http://www.kumei.ne.jp/c_lang/sdk2/sdk_194.htm
猫でもわかるプログラミング - Windows SDK編 第2部 - 第194章 拡張コンボボックス

http://homepage2.nifty.com/DSS/VCPP/MFC/Other/ComboBackColor.htm
コンボボックスの背景色変更

サンプルソースコード

	CComboBoxEx m_combobox;

	// CComboBoxEx(ImageCombo)の構築
	{
		// 拡張コンボボックスを
		// リソースエディタでダイアログに貼り付けている場合は、
		// Create関数を呼び出してはいけない。
		DWORD dwStyle =
			WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | CBS_DROPDOWN;
		CRect rect(0,0,200,200);
		CWnd* pParentWnd = this;
		UINT nID = ID_COMBOBOX;
		m_combobox.Create(dwStyle, rect, pParentWnd, nID);
	}

	// イメージリストを関連付ける
	m_combobox.SetImageList(&m_imagelist);

	// CComboBoxExへItemを追加
	{
		COMBOBOXEXITEM item;
		item.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_TEXT;
		item.iItem = 0;
		item.pszText = "abcxyz";
		item.cchTextMax = 0;
		item.iImage = 0;
		item.iSelectedImage = 0;
		item.iOverlay = 0;
		item.iIndent = 0;

		m_combobox.InsertItem(&item);
	}

	// CComboBoxExへItemを追加
	{
		COMBOBOXEXITEM item;
		item.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_TEXT;
		item.iItem = 1;
		item.pszText = "abcxyz";
		item.cchTextMax = 0;
		item.iImage = 1;
		item.iSelectedImage = 1;
		item.iOverlay = 0;
		item.iIndent = 0;

		m_combobox.InsertItem(&item);
	}

/*****************************************************************************/
CControlBar, CDialogBar, CToolBar の位置について

http://msdn.microsoft.com/library/en-us/vcsample98/html/_sample_mfc_ctrlbars.asp
CTRLBARS: Illustrates Custom Control Bars

サンプルがダウンロードできる。

CFrameWnd::RecalcLayout 
>標準のコントロール バーの表示、非表示が切り替えられたとき、またはフレーム ウィンドウのサイズが変更されたときにフレームワークが呼び出します。

		m_wndDlgBar.SetWindowPos(&m_wndStatusBar, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);

/*****************************************************************************/
CWnd::GetDlgItem 

>指定されたコントロールまたは子ウィンドウへのポインタ。引数 nID で指定される整数の ID を持つコントロールが存在しない場合は、NULL を返します。

/*****************************************************************************/
http://www.hi-ho.ne.jp/hawk/mfc0401.html#bar_dialog
MFC 実践プログラミング ヒント集 - ダイアログバー

>しかし、コントロールにボタンを配置した場合、このままではそのボタンは常にディセーブルのままとなります。 これを回避するには手動でメッセージマップとイベントハンドラ関数を追加します。

サンプルソースコード

----- MainFrm.h -------------------------------------------------------------------------

	//{{AFX_MSG(CMainFrame)
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
		// メモ - ClassWizard はこの位置にメンバ関数を追加または削除します。
		//        この位置に生成されるコードを編集しないでください。
	//}}AFX_MSG
	afx_msg void OnMyButton(); // <--- この行を追加

----- MainFrm.cpp -----------------------------------------------------------------------

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
		// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
		//        この位置に生成されるコードを編集しないでください。
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	ON_COMMAND(IDC_MYBUTTON, OnMyButton) // <--- この行を追加
END_MESSAGE_MAP()

// 関数を追加
void CMainFrame::OnMyButton()
{
	MessageBox("CMainFrame::OnMyButton()");
}

-----------------------------------------------------------------------------------------

/*****************************************************************************/
CWnd::OnNcLButtonDblClk  

>afx_msg void OnNcLButtonDblClk( UINT nHitTest, CPoint point );

>nHitTest
>ヒット テスト コードを指定します。ヒット テストとは、カーソルの位置を調べるテストのことです。

/*****************************************************************************/
GetSysColor
画面のデザインに使われている色(システムカラー)を取得します。

DWORD GetSysColor(int nIndex);

/*****************************************************************************/
http://niigata.cool.ne.jp/minamix/samplecode.htm
MFCサンプルコード

>MicrosoftFoundationClass(MFC)を使用したサンプルコードです。
>このサンプルコード群は、CodeGuruからの日本語訳で占められています。
>CodeGuruは英語のため、僕が日本語に訳したものをご紹介します。
/*****************************************************************************/
http://homepage2.nifty.com/DSS/VCPP/MFC/Dialog/barwidth.htm
ダイアログバーの幅

CDlgTemplate
LPCDLGTEMPLATE

// ダイアログリソースの情報
typedef struct { // dltt 
    DWORD style; 
    DWORD dwExtendedStyle; 
    WORD  cdit; 
    short x; // X位置
    short y; // Y位置
    short cx; // 幅
    short cy; // 高さ
} DLGTEMPLATE; 

http://www.topposystem.co.jp/DL/Win32API/GUI/%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E6%A6%82%E8%A6%81.html
ダイアログ ボックスの概要

MFCのソース(DLGCORE.CPP)を引用

	// load resource as necessary
	LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
	HGLOBAL hDialogTemplate = m_hDialogTemplate;
	HINSTANCE hInst = AfxGetResourceHandle();
	if (m_lpszTemplateName != NULL)
	{
		hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
		HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
		hDialogTemplate = LoadResource(hInst, hResource);
	}
	if (hDialogTemplate != NULL)
		lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);

	// return -1 in case of failure to load the dialog template resource
	if (lpDialogTemplate == NULL)
		return -1;

/*****************************************************************************/
//StretchBlt と BitBlt のサンプルソースコード

void CViewerView::OnDraw(CDC* pDC)
{
	CViewerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: この場所にネイティブ データ用の描画コードを追加します。
    CBitmap* pBitmap = pDoc->GetBitmap();

    if (pBitmap != NULL) {

        DIBSECTION ds;
        pBitmap->GetObject(sizeof(DIBSECTION), &ds);

        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        CBitmap* pOldBitmap = memDC.SelectObject(pBitmap);

		if(pDoc->isStretch()){
			CRect rect;
			GetClientRect(&rect);
			pDC->StretchBlt(
				0, 0, rect.Width(), rect.Height(),
				&memDC,
				0, 0, ds.dsBm.bmWidth, ds.dsBm.bmHeight,
				SRCCOPY);
		}else{
			pDC->BitBlt(
				0, 0, ds.dsBm.bmWidth, ds.dsBm.bmHeight,
				&memDC,
				0, 0,
				SRCCOPY);
		}

        memDC.SelectObject(pOldBitmap);
    }
}

/*****************************************************************************/
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/dib.html
ビットマップ(DIB)の使い方

http://www.ne.jp/asahi/hishidama/home/tech/vcpp/cdib.html
ひしだまオリジナル CDibクラス

>デバイスに依存しないビットマップであるDIBを、MFCっぽく使えるようなCDibクラス

かなり便利。

http://www.vector.co.jp/soft/dl/win95/prog/se175257.html
DIBLIB

http://hp.vector.co.jp/authors/VA023539/
Palex
/*****************************************************************************/
http://www.mtakahashi.com/old/07025.html

>#どうもソフトウェア業界では、タクシーの運転手に
>#「明日からショベルカーを動かしてくれ」というようなことが
>#平然と行われているような…。
/*****************************************************************************/
OutputDebugString
>The OutputDebugString function sends a string to the debugger for the current application.
/*****************************************************************************/
http://homepage3.nifty.com/metis/mfc/gdi.html
ウィンドウ表示にビットマップを使用する

http://www02.so-net.ne.jp/~handa/deadend/bitmapButton.html
プッシュボタンにビットマップを割り付ける(MFC)

>プッシュボタンのスタイル・プロパティに「ビットマップ」という項目があるので、これをチェックしておく。
/*****************************************************************************/
http://www2.wbs.ne.jp/~shingo/programming/vc/vc08.htm
S.N's Laboratory - Visual C++ 学習日誌 No.8 - セルフ描画コントロール

http://www.codeproject.com/combobox/imagelb.asp
Image List Box
/*****************************************************************************/
オーナードロー(Owner Draw)

http://www.athomejp.com/goldfish/mfc/window/ownermenu.html
メニューのオーナードローの手順
/*****************************************************************************/
カスタムドロー(Custom Draw)

http://www5a.biglobe.ne.jp/~crab/winsdk/NM_CUSTOMDRAW.html
NM_CUSTOMDRAW (tree/list view)

http://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm
猫でもわかるプログラミング - Windows SDK編 第3部 - 第261章 カスタムドロー(リストビュー)

>カスタムドローは、オーナードローと似ていますが、自分でやりたいところだけ(?)をやればよいので少し楽です。

http://www.kumei.ne.jp/c_lang/sdk3/sdk_262.htm
猫でもわかるプログラミング - Windows SDK編 第3部 - 第262章 カスタムドロー(ツリービュー)

http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html
カスタムドロー(NM_CUSTOMDRAW)を使用する

http://www.codeproject.com/useritems/listview.asp
using ListView control under Win32 API

http://www.mtakahashi.com/old/03200.html

>SetWindowLong(hWnd, DWL_MSGRESULT , (long)CDRF_NOTIFYITEMDRAW);

>ウィンドウプロシージャの場合は、戻り値を好きな値をそのまま
>返すことができるけど、ダイアログプロシージャは
>SetWindowLongで設定しないといけない、という解釈でいいのですね。

http://yokohama.cool.ne.jp/chokuto/urawaza/struct/NMHDR.html
NMHDR

// NMLVCUSTOMDRAW構造体
typedef struct tagNMLVCUSTOMDRAW {
    NMCUSTOMDRAW nmcd; // NMCUSTOMDRAW構造体
    COLORREF clrText; // テキスト色
    COLORREF clrTextBk; // 背景色
#if (_WIN32_IE >= 0x0400)
    int iSubItem;
#endif
} NMLVCUSTOMDRAW, *LPNMLVCUSTOMDRAW;

// NMCUSTOMDRAW構造体
typedef struct tagNMCUSTOMDRAWINFO {
    NMHDR  hdr; // NMHDR構造体
    DWORD  dwDrawStage; // 現在の描画段階
    HDC    hdc; // コントロールのデバイスコンテキストのハンドル
    RECT   rc; // 描画される領域
    DWORD  dwItemSpec; // アイテムのインデックス
    UINT   uItemState; // 現在のアイテムの状態
    LPARAM lItemlParam; // アプリケーションで定義された情報
} NMCUSTOMDRAW, FAR * LPNMCUSTOMDRAW;

//NMHDR構造体
typedef struct tagNMHDR { 
    HWND hwndFrom; // コントロールのウィンドウハンドル
    UINT idFrom; // コントロールのID
    UINT code; // 通知コード
} NMHDR; 

----- ListCtrlの派生クラスを作成してカスタムドローを行うサンプルコード -----

ListCtrlEx.h

	//{{AFX_MSG(CListCtrlEx)
		// メモ - ClassWizard はこの位置にメンバ関数を追加または削除します。
	//}}AFX_MSG
	afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); // 追加した関数

ListCtrlEx.cpp

	BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
		//{{AFX_MSG_MAP(CListCtrlEx)
			// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
		//}}AFX_MSG_MAP
		ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) // 追加したマクロ
	END_MESSAGE_MAP()

	// 追加した関数
	void CListCtrlEx::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
	{
		LRESULT result;

		LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

		switch(lplvcd->nmcd.dwDrawStage){

			//消去サイクルが完了後
			case CDDS_POSTERASE:
				break;

			//描画サイクル完了後
			case CDDS_POSTPAINT:
				break;

			//消去サイクルが始まる前
			case CDDS_PREERASE:
				break;

			//描画サイクルが始まる前
			case CDDS_PREPAINT:
				MessageBox("CDDS_PREPAINT");
				::MessageBox(lplvcd->nmcd.rc);
				{
					RECT rect = lplvcd->nmcd.rc;
					HDC hDC = lplvcd->nmcd.hdc;
					CDC dc;
					dc.Attach(hDC);
					dc.MoveTo(rect.left, rect.top);
					dc.LineTo(rect.right, rect.bottom);
					dc.Detach();
				}

				//コントロール自身で描画します。
				//描画サイクルのために新たな NM_CUSTOMDRAW メッセージを転送しません。
				//result = CDRF_DODEFAULT;

				//コントロールは、アイテムに関するすべての描画オペレーション実行時に親へ通知します。
				//アイテム描画の前後で NM_CUSTOMDRAW 通知メッセージを転送します。
				//result = CDRF_NOTIFYITEMDRAW;

				//コントロールは、アイテムが消去されようとしている時に親へ通知します。
				//アイテム消去の前後で NM_CUSTOMDRAW 通知メッセージを転送します。
				//result = CDRF_NOTIFYITEMERASE;

				//コントロールは、アイテム消去後に親へ通知します。
				//result = CDRF_NOTIFYPOSTERASE;

				//コントロールは、アイテム描画後に親へ通知します。
				//result = CDRF_NOTIFYPOSTPAINT;

				//Version 4.71。
				//コントロールは、リストビューサブアイテムが描画を開始する時に親へ通知します。
				result = CDRF_NOTIFYSUBITEMDRAW;
				break;

			//dwItemSpec, uItemState, lItemlParamメンバが有効であることを指し示す
			case CDDS_ITEM:
				break;

			//アイテムが消去された後
			case CDDS_ITEMPOSTERASE:
				break;

			//アイテムが描画された後
			case CDDS_ITEMPOSTPAINT:
				break;

			//アイテムが消去される前
			case CDDS_ITEMPREERASE:
				break;

			//アイテムが描画される前
			case CDDS_ITEMPREPAINT:

				{
					// 行単位だけの処理をしたいならばここに書いても良い
					// CDRF_NOTIFYSUBITEMDRAWを返す処理はいらない

					//lplvcd->clrTextBk = RGB(0,0,0);
					//lplvcd->clrText = RGB(255,255,255);

					// RECT rect = ;

					HDC hDC = lplvcd->nmcd.hdc;
					CDC dc;
					dc.Attach(hDC);

					CString msg("abcxyz");
					msg.Format("%d %d %d %d", lplvcd->nmcd.rc.left, lplvcd->nmcd.rc.top, lplvcd->nmcd.rc.right, lplvcd->nmcd.rc.bottom);
					MessageBox(msg);

					//msg = "Hello";
					CRect rectDraw(150,150,1000,1000);
					dc.DrawText(msg, &rectDraw, DT_LEFT | DT_TOP);
					dc.MoveTo(0,0);
					dc.LineTo(1000,1000);

					dc.Detach();
					//dc.TextOut(100,100,msg);

					//CString msg2;
					//msg2.Format("%d", rect.right);
					//MessageBox(msg2);

				}

				//アプリケーションは、アイテムへ新しいフォントを指定しました。
				//コントロールは、新しいフォントを使用して描画します。
				result = CDRF_NEWFONT;

				//アプリケーションは、アイテムをマニュアルで描画します。
				//コントロールは、描画しません。
				//result = CDRF_SKIPDEFAULT;

				//Version 4.71。
				//コントロールは、アイテムのイメージを描画しません。
				//※リストビューでは存在しません。
				//result = TVCDRF_NOIMAGES;

				break;


			//Ver.4.71以降で有効。
			//サブアイテムが描画されようとしているときCDDS_ITEMPREPAINTまたはCDDS_ITEMPOSTPAINTに結合したフラグ。
			//CDDS_PREPAINTからCDRF_NOTIFYSUBITEMDRAWが返されたときのみセットされます。
			//case CDDS_SUBITEM:
			case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
				break;

			case CDDS_ITEMPOSTPAINT|CDDS_SUBITEM:
				break;

			default:
				result = CDRF_DODEFAULT;
				break;
		}

		// 通常はこっちで。
		//*pResult = result;

		// ダイアログの場合はこっち
		//CString strWindowText;
		//GetParent()->GetWindowText(strWindowText);
		//MessageBox(strWindowText);
		::SetWindowLong(GetParent()->m_hWnd, DWL_MSGRESULT, (long)result);
	}

(COMMCTRL.Hより ここから)
//==================== CUSTOM DRAW ==========================================

// custom draw return flags
// values under 0x00010000 are reserved for global custom draw values.
// above that are for specific controls
#define CDRF_DODEFAULT          0x00000000
#define CDRF_NEWFONT            0x00000002
#define CDRF_SKIPDEFAULT        0x00000004


#define CDRF_NOTIFYPOSTPAINT    0x00000010
#define CDRF_NOTIFYITEMDRAW     0x00000020
#if (_WIN32_IE >= 0x0400)
#define CDRF_NOTIFYSUBITEMDRAW  0x00000020  // flags are the same, we can distinguish by context
#endif
#define CDRF_NOTIFYPOSTERASE    0x00000040

// drawstage flags
// values under 0x00010000 are reserved for global custom draw values.
// above that are for specific controls
#define CDDS_PREPAINT           0x00000001
#define CDDS_POSTPAINT          0x00000002
#define CDDS_PREERASE           0x00000003
#define CDDS_POSTERASE          0x00000004
// the 0x000010000 bit means it's individual item specific
#define CDDS_ITEM               0x00010000
#define CDDS_ITEMPREPAINT       (CDDS_ITEM | CDDS_PREPAINT)
#define CDDS_ITEMPOSTPAINT      (CDDS_ITEM | CDDS_POSTPAINT)
#define CDDS_ITEMPREERASE       (CDDS_ITEM | CDDS_PREERASE)
#define CDDS_ITEMPOSTERASE      (CDDS_ITEM | CDDS_POSTERASE)
#if (_WIN32_IE >= 0x0400)
#define CDDS_SUBITEM            0x00020000
#endif


// itemState flags
#define CDIS_SELECTED       0x0001
#define CDIS_GRAYED         0x0002
#define CDIS_DISABLED       0x0004
#define CDIS_CHECKED        0x0008
#define CDIS_FOCUS          0x0010
#define CDIS_DEFAULT        0x0020
#define CDIS_HOT            0x0040
#define CDIS_MARKED         0x0080
#define CDIS_INDETERMINATE  0x0100

typedef struct tagNMCUSTOMDRAWINFO
{
    NMHDR hdr;
    DWORD dwDrawStage;
    HDC hdc;
    RECT rc;
    DWORD dwItemSpec;  // this is control specific, but it's how to specify an item.  valid only with CDDS_ITEM bit set
    UINT  uItemState;
    LPARAM lItemlParam;
} NMCUSTOMDRAW, FAR * LPNMCUSTOMDRAW;



typedef struct tagNMTTCUSTOMDRAW
{
    NMCUSTOMDRAW nmcd;
    UINT uDrawFlags;
} NMTTCUSTOMDRAW, FAR * LPNMTTCUSTOMDRAW;

#endif      // _WIN32_IE >= 0x0300
(COMMCTRL.Hより ここまで)

/*****************************************************************************/
MFC App Wizard で 作成した CMainFrame のポインタを取得する方法

CMainFrame* frame = (CMainFrame*)AfxGetMainWnd();
/*****************************************************************************/
GetModuleFileName を利用して、実行ファイルのフルパス名とファイル名を取得する

    HMODULE hModule = NULL;
    TCHAR lpFilename[_MAX_PATH];
    DWORD nSize = _MAX_PATH;

    DWORD result = ::GetModuleFileName(
        hModule,     // モジュールのハンドル
        lpFilename,  // パスを格納するバッファへのポインタ
        nSize        // バッファのサイズ
    );

    if(result){
        MessageBox(lpFilename);
    }else{
        MessageBox("実行ファイルのパスを取得できませんでした。");
    }

/*****************************************************************************/
SSPanelを利用して背景透過文字列を作成する

ダイアログリソースに、SSPanelコントロールを貼り付け、以下のようにプロパティを設定する。
BackStyle = 1 - ssTransparent
BevelWidth = 0
/*****************************************************************************/
CSSRibbon(SSRibbon Control)のグループについて

プロパティ: GroupAllowAllUp
機能: グループ内のすべてのボタンを押されていない状態に設定できるようにします。

プロパティ: GroupNumber
機能: ボタンが属するグループの番号を設定します。

同じグループ番号を設定すると、ボタンの挙動を独立させることができなくなる。
/*****************************************************************************/
CSSRibbon(SSRibbon Control)にマウスオーバー時のイメージを追加する方法

1. ダイアログリソースに、
   SSRibbonコントロール(オブジェクトID=IDC_SSRIBON)を貼り付け、
   以下のようにプロパティを設定する。
   ActiveColors = FALSE
   AutoSize = 1 - ssPictureToButton
   BackStyle = 1 - ssTransparent
   ButtonStyle = 4 - ssBorderless
   Picture = 通常時の画像
   PictureDisabled = 使用不可時の画像
   PictureDn = ボタン押下時の画像
   PictureDnDisable = マウスオーバー時の画像(本来は使用不可ボタン押下時の画像を設定するためのプロパティ)
   Shape = 透過・マウスオーバー時の範囲に対応する画像

2. MFC Class Wizard にて、ダイアログリソースに対応したCDialogの派生クラス(CToolBarDialog)を作成する。

3. MFC Class Wizard にて、貼り付けたSSRibbonコントロールのメンバ変数を作成する。
   変数名: m_btnChgBg
   カテゴリ: コントロール
   変数のタイプ: CSSRibbon
   このとき、コントロールに対応したC++ラップクラスである CSSRibbon が作成される。

4. CSSRibbonを継承したクラス(CRibbonEx)を作成し、
   マウスオーバー時のイメージを表示するためのメンバ変数・メンバ関数を追加する。
	CRibbonEx() : m_bMouseOver(FALSE) {} // コンストラクタ
	void ChangePictureMouseOver();	// ピクチャーをマウスオーバー用に変更
	void ChangePictureNormal();		// ピクチャーをノーマルに変更
	BOOL m_bMouseOver;	// マウスオーバー状態かどうか

5. コード上にて、CSSRibbonをCRibbonExへ置き換える。

	// ToolBarDialog.h
	// #include "RibbonEx.h" を忘れずに。
	// ダイアログ データ
		//{{AFX_DATA(CToolBarDialog)
		enum { IDD = IDD__TOOLBAR };
		//CSSRibbon	m_btnChgBg; // 変更前
		CRibbonEx	m_btnChgBg; // 変更後
		//}}AFX_DATA

6. MFC Class Wizard にて、IDC_SSRIBON の
   MouseEnterとMouseExitのメッセージに対応した関数を追加する。
   追加した関数内で、CRibbonEx::ChangePictureMouseOver や
   CRibbonEx::ChangePictureNormal を呼び出せば、
   オウスオーバー時に画像を切り替えることができる。

   void CToolBarDialog::OnMouseEnterToolbarChangeBg(short Button, short Shift, long X, long Y)
   {
       m_btnChgBg.ChangePictureMouseOver();
   }
   
   void CToolBarDialog::OnMouseExitToolbarChangeBg(short Button, short Shift, long X, long Y)
   {
       m_btnChgBg.ChangePictureNormal();
   }
/*****************************************************************************/
http://www.codeproject.com/miscctrl/hmxcontrols.asp
Fancy controls

http://www.codeproject.com/miscctrl/balloonhelp.asp
Balloon Help as a non-modal replacement for MessageBox()
/*****************************************************************************/
ディレクトリのツリーを表示するときに使えそうなコントロール等。

http://www.codeproject.com/treectrl/shelltreectrl.asp
CShellTreeCtrl

>A CWaitingTreeCtrl-derived class to display Shell's resources

http://www.codeproject.com/treectrl/pathpicker.asp
Directory and network browsing using a tree control

>An article explaining browsing my computer and the network using a TreeCtrl 

>This dialog class displays a directory tree similar to the one found in the "Find in Files" Browse button as shown in the image above.

http://www.codeproject.com/useritems/drivebrowsingtree.asp
System Drives Browsing Tree

/*****************************************************************************/
SHFileOperation

ファイルのコピー、削除(ファイルをゴミ箱へ移動)、名前の変更・削除等を行うWindowsAPI関数。

http://yokohama.cool.ne.jp/chokuto/urawaza/api/SHFileOperation.html
SHFileOperation

>この関数では、パス名を指定するときにフルパスを使用するべきです。相対パス名の使用はスレッドセーフ(複数のスレッドによるアクセスで問題が生じない方法)ではありません。

>この関数をファイルを削除するのに使用する場合、関数はファイルをごみ箱に移そうとします。ファイルをごみ箱に置かずに完全に削除するには、 DeleteFile 関数を使います。

http://www.ab.wakwak.com/~greenspace/dev-api/theapi/reference/shfo.html
SHFileOperation

>エクスプローラなどで行われる、ファイルコピー、
>削除等の一般的なファイル処理を行うAPIです。
>確認ダイアログの表示なども自動的にしてくれるので
>楽にファイル処理を行うことが出来ます。

/*****************************************************************************/
CWnd::GetWindowRect
>CWnd のスクリーン座標を取得します。
/*****************************************************************************/
CSizingControlBar を利用して、フローティング可能・サイズ変更可能なコントロールバーを作る

CFloatingTestBar: CSizingControlBarG を継承したクラス
CFloatingTestDialog: CDialogを継承したクラス
IDD_FLOATING_TEST: ダイアログのリソースID


FloatingTestBar.h の一部

    // 基本クラスを手軽に切り替えるために
    #ifndef baseCFloatingTestBar
    //#define baseCFloatingTestBar CSizingControlBar
    #define baseCFloatingTestBar CSizingControlBarG
    //#define baseCFloatingTestBar CSizingControlBarCF
    #endif

    class CFloatingTestBar : public baseCFloatingTestBar
    {
    public:
        CFloatingTestBar();
        virtual ~CFloatingTestBar();

    // メンバ変数にダイアログを加える
    private:
        CFloatingTestDialog m_wndChild;

    // OnCreateをオーバーライドする
    protected:
        //{{AFX_MSG(CFloatingTestBar)
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
    }

FloatingTestBar.cpp の一部

    // ON_WM_CREATEを使用
    BEGIN_MESSAGE_MAP(CFloatingTestBar, baseCFloatingTestBar)
        //{{AFX_MSG_MAP(CFloatingTestBar)
        ON_WM_CREATE()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    int CFloatingTestBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
        if (baseCFloatingTestBar::OnCreate(lpCreateStruct) == -1)
            return -1;

        // ダイアログの構築

        SetSCBStyle(GetSCBStyle() | SCBS_SHOWEDGES | SCBS_SIZECHILD);

        if (!m_wndChild.Create(m_wndChild.IDD, this)){
            return -1;
        }
        m_wndChild.ShowWindow(SW_SHOW);

        SetBarStyle(
            GetBarStyle() |
            CBRS_TOOLTIPS |
            CBRS_FLYBY |
            CBRS_SIZE_DYNAMIC);

        return 0;
    }

MainFrm.h の一部

    private:
        CFloatingTestBar* m_pwndCFloatingTestBar;

MainFrm.cpp の一部

    // CMainFrame::CMainFrame()にて、生成
    m_pwndCFloatingTestBar = new CFloatingTestBar();

    // CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)にて、構築
    if(!m_pwndCFloatingTestBar->Create(_T("Floating Test Bar"), this, ID_FLOATING_TEST_BAR)){
        TRACE0("Failed to create FloatingTestBar\n");
        return -1; // fail to create
    }
    EnableDocking(CBRS_ALIGN_ANY); // CMainFrame をドッキング可能にする
    // FloatingTestBarをドッキング可能にする
    m_pwndCFloatingTestBar->EnableDocking(CBRS_ALIGN_ANY);
    // ドッキング位置の設定
    DockControlBar(m_pwndCFloatingTestBar, AFX_IDW_DOCKBAR_TOP);

    // CMainFrame::~CMainFrame() にて、破棄
    if(m_pwndCFloatingTestBar != NULL) delete m_pwndCFloatingTestBar;

/*****************************************************************************/
http://www.datamekanix.com/sizecbar/
CSizingControlBar: resizable control bars

http://www.datamekanix.com/sizecbar/manual.html
CSizingControlBar - manual

http://www.excite.co.jp/world/url/body/?wb_url=http%3A%2F%2Fwww.datamekanix.com%2Fsizecbar%2Fmanual.html&submit=%83E%83F%83u%83y%81%5B%83W%96%7C%96%F3&wb_lp=ENJA&wb_dis=3&wb_co=excitejapan
マニュアルをExcite翻訳したもの
/*****************************************************************************/
http://forums.belution.com/ja/vc/000/082/08s.shtml
CDialogBar の中のCButton の無効化

>だけど、なぜ他のコントロール(オプションボタン、
>Editボックス)は普通にできるのに、この「押しボタン」
>だけが、このような制御を必要とするのですかね。

http://www.microsoft.com/japan/developer/library/vcmfc/_mfcnotes_tn031.htm
テクニカル ノート 31: コントロール バー
/*****************************************************************************/
SSActiveToolBars(Sheridan ActiveToolBars Plus Control) を VC++(Microsoft Visual C++) から利用する例

ボタンクリックで何か動作させる方法

1. [MFC ClassWizard] -> [メッセージマップ]
   オブジェクトID: SSActiveToolBars
   メッセージ: ToolClick
   [関数の追加]

2. [コード編集]

   // インクルードを忘れずに
   #include "sstool.h"

   void CToolBarDialog::OnToolClickSsactivetoolbars(LPDISPATCH Tool) 
   {
       // CSSToolを構築
       Tool->AddRef(); 
       CSSTool t(Tool);
   
       CString id = t.GetId();
   
       if(id == "ID_AAAA"){
           MessageBox("Hello");
       }
   
   }

/*****************************************************************************/
SSActiveToolBars(Sheridan ActiveToolBars Plus Control) を VC++(Microsoft Visual C++) から利用する例

前提: MFC AppWizard(exe) で SDI なアプリケーションを作成する。

1. リソースエディタにて、ダイアログタイプのリソースを挿入する。
   [リソースの挿入] Dialog -> IDD_DIALOGBAR
   ダイアログのプロパティはデフォルト値のままにしておく。

2. ダイアログに SSActiveToolBars を挿入し、SSActiveToolBarsの設定を行う。
   [ActiveXコントロールの挿入] Sheridan ActiveToolBars Plus Control を貼り付ける。
   ここで、メニューバーやツールバー等を作成しておく。

3. ClassWizardにて、ダイアログリソース用の新規クラスを作成する。
   基本クラス: CDialog
   クラス名: CToolBarDialog

4. ClassWizardにて、SSActiveToolBarsコントロールに対応したメンバ変数を追加する。
   ActiveXコントロールがプロジェクトに挿入されていなければ、
   この時点で挿入され、C++ラップクラスが生成される。
   カテゴリ: コントロール
   変数のタイプ: CSSToolBarControl
   変数名: m_ctrlCSSToolBar

5. CMainFrameクラスにメンバ変数を追加し、
   コンストラクタ・デストラクタでオブジェクトの生成と破棄について記述する。

   // ヘッダのインクルードを忘れずに
   #include "ToolBarDialog.h"

   // メンバ変数の追加
   CToolBarDialog* m_pwndToolBarDialog;

   // コンストラクタで生成
   m_pwndToolBarDialog = new CToolBarDialog(this);

   // デストラクタで破棄
   if(m_pwndToolBarDialog != NULL){
       delete m_pwndToolBarDialog;
   }

6. CMainFrame::OnCreateにて、ツールバーとして機能するように記述する。

	// CSSToolBarControl を生成するためだけのDialog
	if (!m_pwndToolBarDialog->Create(this)){
		TRACE0("Failed to create toolbar\n");
		return -1;      // 作成に失敗
	}

	// CMainFrame をドッキング可能にする
	EnableDocking(CBRS_ALIGN_ANY);

	// CSSToolBarControl を CMainFrame とドッキング可能にする
	m_pwndToolBarDialog->m_ctrlCSSToolBar.AttachWindow((long)this->m_hWnd);
	m_pwndToolBarDialog->m_ctrlCSSToolBar.SetVisible(TRUE);

/*****************************************************************************/
MFC AppWizard(exe) で付けたステータスバーとツールバーを消す方法

MainFrameクラス(MainFrm.h)から以下の記述を削除。
関連する変数の部分(OnCreate関数内で使用されている)も削除。

    CStatusBar  m_wndStatusBar;
    CToolBar    m_wndToolBar;
/*****************************************************************************/
MFC AppWizard(exe) で付けたメニューバーを消す方法

CWnd::SetMenuを利用する。

CMainFrame::OnCreate の中で、

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
       return -1;

の直後にでも以下を追加。

    // メニューを削除
    SetMenu(NULL);

/*****************************************************************************/
char str[256];
ofstream a("text.txt");
a << str;
/*****************************************************************************/
http://log4cpp.sourceforge.net/
Log for C++
/*****************************************************************************/
仮想リスト コントロール

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_Virtual_List_Controls.asp
仮想リスト コントロール

>仮想リスト コントロールは、LVS_OWNERDATA スタイルを持つリスト ビュー コントロールです。このスタイルを使用すると、項目数を DWORD で表現できる値までサポートできます。既定では、項目数は int で表現できる値までです。このスタイルの最大の利点は、データ項目のサブセットだけを随時メモリに保存できるという点です。これにより、仮想リスト ビュー コントロールは、データにアクセスする方法が既に適切に確立されている大規模なデータベース情報を操作できます。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcsample/html/vcsmpdbvlist.asp
DBVLIST サンプル : CListView および CDaoRecordset の使用

>DBVLIST サンプルでは、MFC の CListView クラスと CDaoRecordset クラスを使用して、仮想リスト ビュー機能を実装します。この機能は、リスト ビュー コモン コントロールで使用できます。
>このサンプルでは、仮想リストビューを使用して、多量の項目のリストやメモリに一度に収めることができない項目を表示する方法を示します。部門別にフィルタ処理されたデータベース項目 (従業員レコード) を一覧表示します。表示するデータベース項目は、実行時に選択できます。

http://homepage1.nifty.com/takuhiro/technique/programming/virtuallistctrl/
仮想リストコントロールで大量データ表示

http://www.codeguru.com/listview/virtualListview.html
Virtualizing List Views to Handle Large Amounts of Data

http://www.codeguru.com/listview/VirtualListControl.html
MFC Virtual List Control

/*****************************************************************************/
イメージリスト
CImageList

http://yokohama.cool.ne.jp/chokuto/urawaza/imagelist.html
イメージリストを使ってみる

http://yokohama.cool.ne.jp/chokuto/urawaza/api/InitCommonControls.html
InitCommonControls

http://yokohama.cool.ne.jp/chokuto/urawaza/api/InitCommonControlsEx.html
InitCommonControlsEx

CListCtrl::InsertItem や CTreeCtrl::InsertItem で、
イメージリストのインデックスを指定するときに、
通常は0以上のところを-1を設定すると、画像なしの項目となる。
ドキュメントには載っていないようなので、危険かも。

// サンプルソースコード

	CImageList m_imagelist;

	// ImageListの構築
	{
		int cx = 32;
		int cy = 32;
		UINT nFlags = ILC_COLOR32;
		int nInitial = 0;
		int nGrow = 10;
		m_imagelist.Create(cx, cy, nFlags, nInitial, nGrow);
	}

	// イメージの追加	
	{
		CBitmap* pbmImage = new CBitmap();
		CString strFileName("C:\\aaabbb\\1.bmp");
		HBITMAP hBitmap =
			(HBITMAP)LoadImage(
				NULL,
				strFileName,
				IMAGE_BITMAP,
				0,
				0,
				LR_LOADFROMFILE | LR_CREATEDIBSECTION);
		pbmImage->Attach(hBitmap);
		COLORREF crMask = RGB(0,0,0);
		m_imagelist.Add(pbmImage, pbmImage);
	}

	// イメージの追加	
	{
		CBitmap* pbmImage = new CBitmap();
		CString strFileName("C:\\aaabbb\\2.bmp");
		HBITMAP hBitmap =
			(HBITMAP)LoadImage(
				NULL,
				strFileName,
				IMAGE_BITMAP,
				0,
				0,
				LR_LOADFROMFILE | LR_CREATEDIBSECTION);
		pbmImage->Attach(hBitmap);
		COLORREF crMask = RGB(255,255,255);
		m_imagelist.Add(pbmImage, pbmImage);
	}

/*****************************************************************************/
リスト ビュー コントロール
CListCtrl
CListView

http://www.geocities.co.jp/SiliconValley-PaloAlto/6827/Programing/LVITEM.htm
LVITEM

http://yokohama.cool.ne.jp/chokuto/urawaza/struct/LVITEM.html
LVITEM

http://yokohama.cool.ne.jp/chokuto/urawaza/listview1.html
リストビューを作成してみる ACT-1

http://yokohama.cool.ne.jp/chokuto/urawaza/listview2.html
リストビューを作成してみる ACT-2

サンプルソースコード

	// リストビューを構築する
	// リソースエディタでコントロールを貼り付けておけば、構築のコードは不要
	// CListCtrl m_list;
	// m_list.Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

	// イメージ リストをリスト ビュー コントロールに割り当てる
	m_list.SetImageList(&m_imagelist, LVSIL_SMALL);

	// 列を追加
	{
		int nCol = 0;
		LPCTSTR lpszColumnHeading = "name";
		m_list.InsertColumn(nCol, lpszColumnHeading);
	}
	{
		int nCol = 1;
		LPCTSTR lpszColumnHeading = "description";
		m_list.InsertColumn(nCol, lpszColumnHeading);
	}
	
	// 項目の情報を追加
	{
		int nItem = 0;
		LPCTSTR lpszItem = "guitar";
		int nImage = 0;
		m_list.InsertItem(nItem, lpszItem, nImage);

		int nSubItem = 1; // 0だとアイテムラベルを設定することになる
		LPTSTR lpszText = "strings";
		m_list.SetItemText(nItem, nSubItem, lpszText);
	}
	{
		int nItem = 1;
		LPCTSTR lpszItem = "piano";
		int nImage = 1;
		m_list.InsertItem(nItem, lpszItem, nImage);

		int nSubItem = 1; // 0だとアイテムラベルを設定することになる
		LPTSTR lpszText = "keyboard";
		m_list.SetItemText(nItem, nSubItem, lpszText);
	}

/*****************************************************************************/
ツリー ビュー コントロール
CTreeCtrl
CTreeView

サンプルソースコード

	CTreeCtrl m_tree;
	CRect rect(0, 0, 200, 200);
	m_tree.Create( // this は CDialogの派生クラス等
		TVS_HASLINES | TVS_HASBUTTONS, rect, this, TREE_VIEW_ID);

	// イメージリストを設定
	m_tree.SetImageList(&m_imagelist, TVSIL_NORMAL);
	//m_tree.SetImageList(&m_imagelist, TVSIL_STATE);

	// イメージリストには2つの画像が入っているとして……
	int MY_IMAGE          = 0;
	int MY_SELECTED_IMAGE = 1;

	// first
	HTREEITEM hAlphabet
		= m_tree.InsertItem("alphabet", MY_IMAGE, MY_SELECTED_IMAGE, TVI_ROOT, TVI_SORT);
	HTREEITEM hNumber
		= m_tree.InsertItem("number", MY_IMAGE, MY_SELECTED_IMAGE, TVI_ROOT, TVI_SORT);

	//second
	m_tree.InsertItem("A", MY_IMAGE, MY_SELECTED_IMAGE, hAlphabet);
	m_tree.InsertItem("B", MY_IMAGE, MY_SELECTED_IMAGE, hAlphabet);
	m_tree.InsertItem("Y", MY_IMAGE, MY_SELECTED_IMAGE, hAlphabet);
	m_tree.InsertItem("Z", MY_IMAGE, MY_SELECTED_IMAGE, hAlphabet);

	//second
	m_tree.InsertItem("1", MY_IMAGE, MY_SELECTED_IMAGE, hNumber);
	m_tree.InsertItem("5", MY_IMAGE, MY_SELECTED_IMAGE, hNumber);
	m_tree.InsertItem("10", MY_IMAGE, MY_SELECTED_IMAGE, hNumber);

	m_tree.EnsureVisible(hAlphabet);
	m_tree.EnsureVisible(hNumber);

/*****************************************************************************/
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsintro7/html/vxgrflanguageequivalentsprogrammableobjects.asp
Visual Studio 各言語およびライブラリにおける、コントロールとプログラミング可能オブジェクトの比較

>ここでは、Visual Basic 6.0 コントロール、Windows フォーム コントロール、ASP.NET サーバー コントロール、HTML サーバー コントロール、MFC クラス、および ATL クラスの一覧を示します。
/*****************************************************************************/
ビットマップファイルからCBitmapを構築する

#include <afxctl.h>

	CBitmap* pbmImage = new CBitmap();
	CString strFileName("C:\\work\\test.bmp");
	HBITMAP hBitmap =
		(HBITMAP)LoadImage(
			NULL,
			strFileName,
			IMAGE_BITMAP,
			0,
			0,
			LR_LOADFROMFILE | LR_CREATEDIBSECTION);
	pbmImage->Attach(hBitmap);

/*****************************************************************************/
CFrameWnd::ShowControlBar
void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );

>コントロール バーを表示または非表示にします。
/*****************************************************************************/
http://www3.tok2.com/home2/k0me/Tuto/MFC_Tips.html
MFC Tips

>ダイアログバーは、コントロールバーのひとつですが、ダイアログと同じようにリソースを編集してレイアウトを決める事ができます。しかもフレームウインドウに貼り付いたり、浮かせたりする事も出来るので、何かと便利に使えますが、MFCに用意してあるクラス(CDialogBar)が貧弱で、ダイアログバーのクラス自体でダイアログバーのメッセージを受け取れない、DDX(ダイアログデータエクスチェンジ)がない…など、ほとんど使い物にならないのが実状です。ここでは、ダイアログバーを非常に簡単に、且つ美しく使う方法を説明します。
>
>実は、codeguruというサイトに、非常に素晴らしいコードが掲載されています。それが、CInitDialogBarクラスです。詳しくはこちら。このクラスを使うと、上の制限が全くなくなり、しかもClassWizardも完全にだます事ができ、ダイアログをインプリメントするときと全く同じように扱う事ができます。本当にすばらしいです。

http://www.catnet.ne.jp/~mori/vcpp/higi/hh/p_00000012.html
ダイアログバー

/*****************************************************************************/
_exec、_wexec 系関数

>この関数群は新しいプロセスをロードして実行します。
>
>_execl, _wexecl _execv, _wexecv 
>_execle, _wexecle _execve, _wexecve 
>_execlp, _wexeclp _execvp, _wexecvp 
>_execlpe, _wexeclpe _execvpe, _wexecvpe 

#include <process.h>

CString strFilePath("C:\\aa\\DF\\DF.exe");
CString a("C:\\work\\memo.txt");
CString b("C:\\work\\aaa.java");

::_execl(strFilePath, strFilePath, a, b, NULL);

/*****************************************************************************/
http://www.katch.ne.jp/~k_okada/vixhelp/html/Thanks.htm
ViX 謝辞・参考文献
/*****************************************************************************/
http://www.smalleranimals.com/jpegfile.htm
JpegFile - free JPG (and BMP) reading and writing code.
/*****************************************************************************/
http://src.walker.jp/antenna/9.html
ソフトアンテナ - プログラミング
/*****************************************************************************/
http://hp.vector.co.jp/authors/VA016117/coolbar.html
CoolBarを作る

CRebar
/*****************************************************************************/
VBのpictureプロパティ
IPicture
CPicture
CPictureHolder

#include <afxctl.h>

	// 使用例
	CString strFileName("C:\\work\\1.bmp");

	HBITMAP hBitmap =
		(HBITMAP)LoadImage(
			NULL,
			strFileName,
			IMAGE_BITMAP,
			0,
			0,
			LR_LOADFROMFILE | LR_CREATEDIBSECTION);

	CPictureHolder ph;
	if (hBitmap){
		ph.CreateFromBitmap(hBitmap);
	}

	// 何らかのコントロールにセットしてみたり
	m_ctrlHoge.SetPicture((LPDISPATCH)ph.GetPictureDispatch());

参考:
http://www.athomejp.com/goldfish/mfc/cobject/jpegview.html
http://nvexeditor.hp.infoseek.co.jp/programming/ipicture_com.html
http://www.microsoft.com/msj/0999/Visualprog/visualprog0999.aspx
/*****************************************************************************/
wininet.lib リンク

http://www02.so-net.ne.jp/~okuda/tech/memo/strings.html
■ Visual C++ 5.0で扱われる文字列 

http://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode.html
URLエンコーディング

http://www.w3.org/Addressing/URL/url-spec.html

http://www.nttdocomo.co.jp/p_s/imode/spec/useragent.html
/*****************************************************************************/
OLE例外
void AFXAPI AfxThrowOleDispatchException( WORD wCode, LPCSTR lpszDescription, UINT nHelpID = 0 );

定数: vbObjectError = -2147221504
/*****************************************************************************/
http://www.kondo-net.gr.jp/softca/ocx.htm
OCXを作成する
/*****************************************************************************/
http://chinots.s37.xrea.com/xoblite.htm
xobliteというWindowsシェルのお話
/*****************************************************************************/
このソフトウェアの一部は Independent JPEG Group の技術を利用しています。
/*****************************************************************************/
http://www.emaki.minidns.net/Programming/Emaki/snapshot/html/FolderDialog_8cpp-source.html
FolderDialog.cpp

http://www.emaki.minidns.net/Programming/Emaki/snapshot/html/FolderDialog_8h-source.html
FolderDialog.h

http://homepage2.nifty.com/DSS/VCPP/API/SHBrowseForFolder.htm
SHBrowseForFolder(フォルダ選択ダイアログ)

http://yokohama.cool.ne.jp/chokuto/urawaza/api/SHBrowseForFolder.html
SHBrowseForFolder(A)

http://hayakawa.atnifty.com/tips/old/pt-02001.html
SHBrowseForFolder

http://www.yks.ne.jp/~masato/room/diary/dev200003.html
MASATOの開発日記 2000年3月
ディレクトリ(フォルダ)指定ダイアログを開くにはどうしたら良いか?

.NET
	http://www.atmarkit.co.jp/fdotnet/dotnettips/056folderdlg/folderdlg.html
	[フォルダの参照]ダイアログを使用するには?

	>Windowsには、ユーザーにフォルダを選択させるための次の図のような[フォルダの参照]ダイアログが用意されている。これはコモン・ダイアログ・ボックスの1つである。

delphi:
	http://homepage1.nifty.com/MADIA/delphi/Win32API/SHopenFolder.htm
	「フォルダの参照」ダイアログを表示する
/*****************************************************************************/
http://www.sm.rim.or.jp/~shishido/subdir.html
全サブディレクトリ探索
/*****************************************************************************/
GetLogicalDriveStrings
現在利用可能なディスクドライブをドライブ名で取得します。

DWORD GetLogicalDriveStrings(

  DWORD nBufferLength, // size of buffer

  LPTSTR lpBuffer // pointer to buffer for drive strings

);
/*****************************************************************************/
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/TVITEM.html
TVITEM

ツリービューのアイテムの属性を格納した構造体。

>typedef struct tagTVITEM {
>    UINT       mask;           // 有効メンバを示すフラグ
>    HTREEITEM  hItem;          // アイテムのハンドル
>    UINT       state;          // アイテムの状態・イメージ
>    UINT       stateMask;      // state のフラグ
>    LPTSTR     pszText;        // アイテムの文字列
>    int        cchTextMax;     // アイテムの文字列の長さ
>    int        iImage;         // イメージのインデックス(非選択時)
>    int        iSelectedImage; // イメージのインデックス(選択時)
>    int        cChildren;      // 子アイテムを持つかどうかのフラグ
>    LPARAM     lParam;         // アイテムの持つ32ビット値
>} TVITEM, *LPTVITEM;

lParam に、任意のオブジェクトへのポインタを設定することで、オブジェクトとマッピングできる。

HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );

    TVITEM item;
    item.mask = LVIF_TEXT | LVIF_PARAM; // 有効なメンバ(pszText, cchTextMax, lParam)を設定
	item.pszText = "";
	//item.cchTextMax
	item.lParam = (LPARAM)pItemInfo;

http://yokohama.cool.ne.jp/chokuto/urawaza/struct/TVITEMEX.html
TVITEMEX

/*****************************************************************************/
http://www.sam.hi-ho.ne.jp/mi-k/program/non_mfc1.shtml
プロジェクトを作成し、リソースを作成する

>注意:プリコンパイル済みヘッダーを使うときはすべての*.c,*.cppファイルに
>#include "StdAfx.h"
>という行を書く必要があります。これを書かないとそのファイルのコンパイル中に
>fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
>というエラーが表示されます。
/*****************************************************************************/
http://www.ascii.co.jp/pb/msdn/index.html
MSDN Magazine & Microsoft News
/*****************************************************************************/
http://cobalt.nakasha.co.jp/
ナカシャクリエイテブ
/*****************************************************************************/
ユーザー定義のハンドラ

ON_MESSAGE( <message>, <memberFxn> ) afx_msg LRESULT memberFxn(WPARAM, LPARAM); 
ON_REGISTERED_MESSAGE( <nMessageVariable>, <memberFxn> ) afx_msg LRESULT memberFxn(WPARAM, LPARAM); 
ON_THREAD_MESSAGE( <message>, <memberFxn> ) afx_msg void memberFxn( UINT, LONG ); 
ON_REGISTERED_THREAD_MESSAGE( <nMessageVariable>, <memberFxn> ) afx_msg void memberFxn( UINT, LONG ); 
/*****************************************************************************/
http://www.s34.co.jp/cpptechdoc/article/adt/
抽象データ型と Java/C++ そして COM/CORBA

>残念ながらC++ではJavaのinterfaceのような抽象データ型を直接にはサポートしていません。が、それと同等のことなら可能です。一切のメンバ変数を持たず、そして全メンバ関数を純粋仮想関数とするのです。
>
>class Counter {
>public:
>  virtual ~Counter() {}
>  virtual void incr() =0;
>  virtual void decr() =0;
>  virtual long value() const =0;
>};
/*****************************************************************************/
http://www.rainylain.jp/vc/QandA.htm#Font_FixedPitch
固定幅フォントを使用する

>全角が半角の2倍幅となるようにするには、CFont::CreateFontIndirect、CFont::CreateFont、CFont::CreatePointFontIndirect などを使用して FIXED_PITCH を指定する必要がある。

http://yokohama.cool.ne.jp/chokuto/urawaza/struct/LOGFONT.html
LOGFONT

/*****************************************************************************/
AfxGetMainWnd  
CWnd* AfxGetMainWnd( );

戻り値

サーバーがコンテナ内部でインプレイス アクティブなオブジェクトを持ち、かつコンテナがアクティブになっている場合は、インプレイス アクティブなドキュメントを持つフレーム ウィンドウ オブジェクトへのポインタを返します。
/*****************************************************************************/
AfxGetApp  
CWinApp* AfxGetApp( ); 

戻り値

アプリケーションにただ 1 つしかない CWinApp オブジェクトへのポインタを返します。

解説

この関数で返されるポインタは、メイン メッセージのディスパッチ コードや最上位ウィンドウのようなアプリケーション情報にアクセスするために使います。
/*****************************************************************************/
AfxGetInstanceHandle  
HINSTANCE AfxGetInstanceHandle( );

戻り値

アプリケーションの現在のインスタンスへの HINSTANCE を返します。MFC の USRDLL バージョンを使ってリンクされた DLL の内部から呼び出された場合は、DLL への HINSTANCE を返します。

解説

現在のアプリケーションのインスタンス ハンドルを取得します。MFC の UDRDLL バージョンを使ってリンクされた DLL の内部から呼び出されたとき以外は、AfxGetInstanceHandle は常に実行可能なアプリケーション (.EXE) の HINSTANCE を返します。UDRDLL バージョンを使った場合は、DLL への HINSTANCE を返します。
/*****************************************************************************/
問題:
VC++6でビルド時(リンク中)にエラーが発生。
>--------------------構成: test - Win32 Debug--------------------
>コンパイル中...
>test.cpp
>リンク中...
>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) はすでに LIBCMTD.lib(new.obj) で定義されています
>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) はすでに libcpmtd.lib(delop.obj) で定義されています
>Debug/test.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました
>
>test.exe - エラー 3、警告 0

対処方法:
[プロジェクト] -> [設定] -> [リンク] の [オブジェクト/ライブラリ モジュール] に
 Nafxcwd.lib Libcmtd.lib を追加。

参考資料:
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q148/6/52.asp&NoWebContent=1
マイクロソフト サポート技術情報 - 148652
PRB: LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries

>CAUSE
>The CRT libraries use weak external linkage for the new, delete, and DllMain functions. The MFC libraries also contain new, delete, and DllMain functions, which requires MFC to be linked before the CRT libraries. 

http://hornet-web.hp.infoseek.co.jp/tips/tips.html#10
inuo's home page - 10.VCでのnew,deleteのリンクエラー

>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
>が出たら
>プロジェクト→設定→LINKタブのObject/Library modulesに nafxcwd.lib Libcmtd.lib を入れてみる(要はリンクの順番を変えてみる) 
/*****************************************************************************/
http://forums.belution.com/ja/vc/000/056/57s.shtml
[00005657](SET)] #includeでの質問です。

>ヘッダファイルには,通常
>・名前空間
>・型定義
>・テンプレート宣言,定義
>・関数宣言
>・インライン関数定義
>・データ宣言 (extern int a;等)
>・定数定義
>・列挙
>・名前宣言
>・インクルードディレクティブ
>・マクロ定義
>・条件コンパイルディレクティブ
>・コメント
>などを含めます。
>#プログラミング言語C++ 第3版 9.2.1 ヘッダファイルより
>なので,構造体の宣言(C)or定義(C++)もヘッダファイルで書くのが普通です。
>
>ただし,
>・通常の関数定義
>・データ定義 (int a;等)
>・集約的な定義 (int tbl[] = {1, 2, 3};等)
>・名前なし名前空間
>・エキスポートされたテンプレート定義
>などは避けるべきと,同書には書かれています。
>
>
>> 定義というのは、仕様を書くということだとおもいますが・・・。
>
>違います。定義というのは,宣言の内,
>・変数のメモリを確保する宣言
>・関数本体を含む関数宣言
>・列挙定数やtypedef名の宣言
>です。
>#Cから引っ張ってきたので,C++では色々異なります。
>
>C言語のレベルで考えれば,最後を除いてヘッダファイルに定義は書かないのが普通です。

/*****************************************************************************/
MFCを使用したプログラム用のプロジェクト作成方法
[ファイル] -> [新規作成] -> [Win32 Application]
[プロジェクト] -> [設定] -> [C/C++] -> [コード生成] -> [使用するランタイムライブラリ]でマルチスレッドを選択しておく。
/*****************************************************************************/
http://www.tim.hi-ho.ne.jp/gonbuto/memo/nt-esc.txt
WindowsNTのコマンドプロンプトでANSIのエスケープシーケンスを動かす方法
WindowsNTノコマンドプロンプトデANSIノエスケープシーケンスヲ動カス方法
/*****************************************************************************/
[MFC]CStringの実装
C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\STRCORE.CPP
/*****************************************************************************/
http://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/main.html
独習C++ 学習記録
/*****************************************************************************/
[C++]例外

http://www.birdport.jp/info/exception.htm -> http://www.parof.jp/

http://web.archive.org/web/20041026002541/http://www.birdport.jp/info/exception.htm
http://web.archive.org/web/20040603225503/http://www.birdport.jp/include/bpexception.h
Java的例外処理のススメ
/*****************************************************************************/
[C++]名前空間(namespace)

http://www.ksky.ne.jp/~seahorse/cpp/namespace.html
移植性の高いプログラムの書き方
namespace編

http://www.ksky.ne.jp/~seahorse/cpp/using.html
 移植性の高いプログラムの書き方
「using指令を使うときの注意点」編

http://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/1301.html
独習C++ 学習記録 - 13.1 名前空間
/*****************************************************************************/
cppunit

http://www.s34.co.jp/cpptechdoc/misc/cppunit_guide/index.html
CppUnit 導入ガイド

http://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/
CppUnit 入門

http://www.dicre.com/author/CppUnit.htm
自動テスト:CppUnitをVisual-C++で使う

http://www.shibu.jp/cppunit/tutorial
子河童1.6とCppUnit-1.9.4を使った開発、VC++編
/*****************************************************************************/
[VC]#pragma data_seg

// sharedという名前のデータセクションを作成する。
#pragma data_seg ("shared")
int count = 0;
#pragma data_seg ()

[プロジェクト] -> [設定] -> [リンク] -> [プロジェクト オプション] に以下のリンカ引数を追加する。
/SECTION:shared,RWS

RWSの意味: R(read), W(write), S(share)

/*****************************************************************************/
WINUSER.hより
/*
 * NOTE: All Message Numbers below 0x0400 are RESERVED.
 *
 * Private Window Messages Start Here:
 */
#define WM_USER                         0x0400

/* 独自にメッセージを定義 */
#define WM_MY_MESSAGE1 (WM_USER + 0)
#define WM_MY_MESSAGE2 (WM_USER + 1)
#define WM_MY_MESSAGE3 (WM_USER + 2)
#define WM_MY_MESSAGE4 (WM_USER + 3)
#define WM_MY_MESSAGE5 (WM_USER + 4)
/*****************************************************************************/
[VC]マルチスレッド対応プログラムの環境設定
[プロジェクト] -> [設定] -> [C/C++]
カテゴリ: コード生成
使用するランタイム ライブラリ: マルチスレッド
使用するランタイム ライブラリ: マルチスレッド(デバッグ)
/*****************************************************************************/
http://www.aa.alpha-net.ne.jp/njunpc/
BatchGOO!

ImageFormatChangerツール
/*****************************************************************************/
「MSDNライブラリ」より
>ブラシの使用
>"ブラシ" は、Win32 ペースのアプリケーションが多角形、楕円、パスの内側を塗りつぶすために使用するグラフィックス ツールです。ドロー アプリケーションは、ブラシを使って図形を塗りつぶします。また、ワード プロセッサ アプリケーションはルーラーの塗りつぶしに、CAD (computer-aided design) アプリケーションはクロス セクション ビュー内の塗りつぶしに、表計算アプリケーションは円グラフのセクションや棒クラフの棒の塗りつぶしに、それぞれブラシを使用します。
/*****************************************************************************/
wsprintf関数
指定された引数を書式制御文字列にしたがってフォーマットし、バッファに格納する。
数値等を文字列に変換する際に使用する。
/*****************************************************************************/
http://www.tietew.jp/cppll/archive/84
[cppll:0084] <ref> オススメの本

>プログラミング言語C++ 第3版 ISBN4-7561-1895-X 定番
>Effective C++ 改訂2版       ISBN4-89052-401-0 必携
>More Effective C++          ISBN4-7561-1853-4 ちょっとオタッキー
>デザインパターン改訂版      ISBN4-7973-1112-6 必携
>C++ライブラリハンドブック   ISBN4-87966-776-5 標準C++lib.のリファレンス
>C++の進化                   ISBN4-89052-515-7 現在にいたるまでの紆余曲折
>C++プログラミングの筋と定石 ISBN4-8101-8063-8 かなり定番
>C++言語書法                 ISBN4-8101-8092-1 ライブラリの作り方
>The Design and Evolution of C++ ISBN0-201-54330-3
>現実的なC++プログラミング     ISBN4-89052-485-1
>注解C++リファレンスマニュアル ISBN4-8101-8027-1
>STLによるコンポーネントデザイン  ISBN4-7561-3422-X
>C++基礎講座 ISBN4-8443-1308-8
>C++実用講座 ISBN4-8443-1309-6
>C++ FAQ 第2版 ISBN4-89471-194-X 
>C++再考 - RUMINATIONS ON C++ - ISBN4-7952-9721-5 
/*****************************************************************************/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/nilab-22/ref=nosim/
Effective STL―STLを効果的に使いこなす50の鉄則
スコット メイヤーズ (著), Scott Meyers (原著), 細谷 昭 (翻訳)
価格: ¥3,200
単行本: 258 p ; サイズ(cm): 23
出版社: ピアソンエデュケーション ; ISBN: 4894714108 ; (2002/01)
/*****************************************************************************/
クリップボードビューア 履歴

WinNT/9xの「クリップボードビューア」は、
Windows2000で「クリップブック」となっている。
クリップブック: C:\WINNT\system32\clipbrd.exe
/*****************************************************************************/
ウインドウハンドル(HWND)からインスタンスハンドル(HINSTANCE)を取得する方法
void test(HWND hwnd){
	HINSTANCE hInstance;
	hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
}
/*****************************************************************************/
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20030804/1/
“エンジニアの幸せ”を味わえるプログラミング言語Ruby
/*****************************************************************************/
透過GIFを作成
1. gifファイルをIrfanViewで作成
2. ViXでPNG保存しようとすると、背景色のパレット番号がわかる。
3. gifファイルを保存する際に、背景色のパレット番号を透過色として設定
/*****************************************************************************/
http://www2s.biglobe.ne.jp/~n_kawa/topics/paint.htm
GIFとJPEGが保存できるペイント
/*****************************************************************************/
http://www.chizumaru.com/
ちず丸
/*****************************************************************************/
http://java.sun.com/j2ee/sdk_1.3/ja/ja_sup_webpage.html
J2EE SDK 日本語版追補 バージョン 1.3.1 
/*****************************************************************************/
http://www.st.ryukoku.ac.jp/~kjm/ms-windows/dcom/
DCOM を無効にする方法

http://itpro.nikkeibp.co.jp/members/NBY/techsquare/20030717/1/
DCOMはやっぱり危険,IE/Officeを遠隔から操作できる(上)

http://itpro.nikkeibp.co.jp/members/NBY/techsquare/20030717/2/
DCOMはやっぱり危険,IE/Officeを遠隔から操作できる(中)

http://itpro.nikkeibp.co.jp/members/NBY/techsquare/20030717/3/
DCOMはやっぱり危険,IE/Officeを遠隔から操作できる(下)

http://www.microsoft.com/windows2000/ja/server/help/dcomcfg_dcom_disable_dcom.htm
DCOM を無効にするには
/*****************************************************************************/