情報が役に立ったら、ぜひ、
をクリックして、ポイントを贈ってください。
| サイト | 概要 |
| Roy.'s Home Page | WTLの講座があります |
| The So-Software Studio | コントロールの使い方が分かり易く解説されています。 |
| Virtual Truth Lab | ATLのいくつかのクラスの使い方が解説されています。 |
| 話題 | 更新日時 | 概要 |
| インストール | 2004/03/25 | WTL7.1のインストール |
| デバッグ用関数 | 2004/03/25 | ATLTRACE2,_ATL_DEBUG_INTERFACES,_ATL_DEBUG_QI |
| ダイアログを作る | 2004/03/25 | ダイアログを作る |
| Editコントロール | 2004/03/25 | Editコントロールから文字列を取得、出力する |
| Static Text | 2004/04/01 | Static Textに出力する |
| コンボボックス | 2004/04/20 | コンボボックスを使う |
| 2つのダイアログ | 2004/04/15 | モーダルダイアログと、モードレスダイアログの違い |
| ダイアログの追加 | 2004/04/15 | アプリケーションにダイアログを加える方法 |
| コモンダイアログ | 2004/03/25 | コモンダイアログ(ファイルを開く) |
| Windowsの文字と文字列に関して | 2004/03/31 | Windowsで扱う文字と文字列の定義 |
| 文字列関数 | 2004/04/26 | Windowsの文字や文字列関数 |
| STL、標準Cについて | 2004/04/22 | デバッグ時には問題ないのに、リリース時にはエラー |
| COMのメモリの管理 | 2004/04/16 | [in],[out],[in,out]の意味 |
| CComPtr | 2004/04/14 | CComPtrを使う |
| 便利な使い方 | 2004/04/01 | 便利な方法 |
| 話題 | 更新日時 | 概要 |
| GraphEdit | 2004/04/09 | DirectShowを使ったアプリケーションのデバッグに便利 |
| DirectShow 基底クラス | 2004/04/22 | 基底クラスを使うには |
| AM_MEDIA_TYPE | 2004/05/09 | AM_MEDIA_TYPEを使うときの注意 |
WTLをインストールしたフォルダにある\AppWiz70\Files\Templates\1033\を
\AppWiz70\Files\Templates\1041\にコピーする。
\AppWiz70\Files\Templates\1041\root.rcを編集する。
root.rc
20行目
旧)LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
新)LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
21行目
旧)#pragma code_page(1252)
新)#pragma code_page(932)
フォントの変更
MS Sans Serif から MS UI Gothic に変更。
\AppWiz70\setup71.jsを実行して、Visual Studioの設定を変える。
Visual Studioを実行して、WTL用のWizardがあることを確認する。
Visual Studioを実行し、ツール−>オプションを選択。
プロジェクト−>VC++ディレクトリで
ディレクトリを表示するプロジェクトのインクルードファイルを選択
インストールしたWTLのincludeディレクトリを設定
CEdit cEditTest1,cEditTest2;
TCHAR a[256];
cEditTest1.Attach(GetDlgItem(IDC_EDIT1));
cEditTest2.Attach(GetDlgItem(IDC_EDIT2));
cEditTest1.GetWindowText(a,256);
cEditTest2.SetWindowText(a);
CStringを使えないかと思いましたが、GetWindowTextのキャストが、うまくいきません。調査中。
CStatic cLabel;
cLabel.Attach(GetDlgItem(IDC_STATIC));
cLabel.SetWindowText(_T("abc"));
Static Textに、”abc”が表示されます。
CComboBox cmbProperty;
cmbProperty.Attach(GetDlgItem(IDC_CMB_DEVICE));
cmbProperty.ResetContent(); // リストを削除する。
cmbProperty.AddString(_T("フィルタ設定")); // リストに追加する
cmbProperty.SetCurSel(0) // 指定の項目を表示する
ユーザーの入力に関する操作
int no = cmbProperty.GetCurSel(); // 選択された項目の番号を得る
デフォルトでは、リストに項目を追加すると、並べ替えられてしまうことに注意します。並べ替えを止めるには、プロパティで、SortをFalseにします。
ATLTRACE2( exp );
ATLTRACE2(
DWORD category,
UINT level,
LPCSTR lpszFormat,
...
);
パラメータ
ATL ヘッダー ファイルをインクルードする前にこのマクロを定義して、コンポーネントのインターフェイスでの AddRef 呼び出しと Release 呼び出しをすべて出力ウィンドウにトレースします。
#define _ATL_DEBUG_INTERFACES
QueryInterface への呼び出しをすべて出力ウィンドウに書き込みます。
#define _ATL_DEBUG_QI
#include "atldlgs.h"
//ファイルを開く
CFileDialog dlg(TRUE, _T("txt"), NULL, OFN_HIDEREADONLY | OFN_CREATEPROMPT,
_T("テキスト ファイル (*.txt)\0*.txt\0すべてのファイル (*.*)\0*.*\0\0"));
if(dlg.DoModal() == IDOK){
ATLTRACE2(_T("ファイル名:%s\nパス:%s"), dlg.m_szFileTitle, dlg.m_szFileName);
}
//名前を付けて保存
CFileDialog dlg(FALSE, _T("txt"), NULL, OFN_HIDEREADONLY | OFN_CREATEPROMPT,
_T("テキスト ファイル (*.txt)\0*.txt\0すべてのファイル (*.*)\0*.*\0\0"));
if(dlg.DoModal() == IDOK){
ATLTRACE2(_T("ファイル名:%s\nパス:%s"), dlg.m_szFileTitle, dlg.m_szFileName);
}
複数の拡張子を表示するには、;で区切ります。| 名前 | 意味 |
|---|---|
| TCHAR m_szFileTitle | ファイル名のみ |
| TCHAR m_szFileName | パス付きのファイル名 |
| 型 | 意味 | 標準C++ |
|---|---|---|
| TCHAR | UNICODEが定義されている場合 WCHAR それ以外 CHAR |
wchar_t char |
| WCHAR | 16-bit Unicode | wchar_t |
| CHAR | 8-bit ANSI | char |
| 型 | 意味 | 標準C++ |
|---|---|---|
| LPTSTR | UNICODEが定義されている場合 LPWSTR それ以外 LPSTR |
wchar_t* char* |
| LPWSTR | 16-bit Unicode 文字列の最後に\0のある文字列 | wchar_t* |
| LPSTR | 8-bit 文字列の最後に\0のある文字列 | char* |
| LPCTSTR | UNICODEが定義されている場合 LPCWSTR それ以外 LPCSTR |
const wchar_t* const char* |
| LPCWSTR | 16-bit Unicode 文字列の最後に\0のある文字列 | const wchar_t* |
| LPCSTR | 8-bit 文字列の最後に\0のある文字列 | const char* |
| BSTR | 文字列内に、NULL文字を含むことのできる文字列 OLECHAR FAR*,LPWSTRなどの別名 他の文字列からの変換には、CComBSTRクラスを使う。 逆の変換には、COLE2Tなどを使う。 |
(wchat_t*) |
| マクロ | 意味 | 文字 | 標準C++ |
|---|---|---|---|
| _T('x') |
UNICODEが定義されているかどうかで、動作が異なる つまり、環境の違いを吸収してくれる |
ワイド文字(16-bit Unicode) | L'x' |
| 8-bit 文字 | 'x' |
| マクロ | 意味 | 文字 | 標準C++ |
|---|---|---|---|
| _T("x") |
UNICODEが定義されているかどうかで、動作が異なる つまり、環境の違いを吸収してくれる |
ワイド文字列(16-bit Unicode) | L"x" |
| 8-bit 文字列 | "x" |
| 型 | Win32 API | C (拡張) | C |
|---|---|---|---|
| TCHAR | wsprintf | _sntprintf | _stprintf |
| WCHAR | wsprintfW | _snwprintf | swprintf |
| CHAR | wsprintfA | _snprintf | sprintf |
char s[] = "computer";
char buffer[200];
int Used;
Used = _snprintf(&buffer[0], sizeof(buffer), "String: %s\n", s); // &buffer[0] は、buffer でも良い
buffer[sizeof(buffer) - 1] = 0; // バッファサイズより、文字列が大きくなった場合への対応。
// 常にバッファの最後には、0を設定しておく。
ICreateDevEnum *pDevEnum = NULL; CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pDevEnum); pDevEnum->Release();CComPtrを使う場合
CComPtr <ICreateDevEnum> pDevEnum; // =NULLは不要。 CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pDevEnum);ソースを調べると、ベースクラスで、ポインタが初期化(NULL)されているので、NULLは不要です。Release()も不要です。
ULONG cFetched;
CComPtr <IEnumMoniker> pClassEnum; // こちらは問題なし
CComPtr <IMoniker> pIMoniker; // 下の使い方で問題あり
while(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK) // 2度目のループでエラー
{
}
この場合、ポインタを使い、次のようにします。
ULONG cFetched;
CComPtr <IEnumMoniker> pClassEnum; // こちらは問題なし
IMoniker *pIMoniker; // ポインタを使う
while(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->Release();
}
CComPtrを使うなら、次のようにするようです。あまり、CComPtrの利点を感じません。
ULONG cFetched;
CComPtr <IEnumMoniker> pClassEnum;
CComPtr <IMoniker> pIMoniker;
while(pMoniker.Release(), pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
}
参考までに、”,”は、文をグループ化する書き方です。意味的には、以下と同等です。
func()
{
pMoniker.Release();
return pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK;
}
while(func())
次のやり方でも、良いかもしれません。
ULONG cFetched;
CComPtr <IEnumMoniker> pClassEnum;
CComPtr <IMoniker> pIMoniker;
while(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker.Release();
}
zen
WTLのヘッダファイルをプロジェクトに追加する
WTLのヘッダファイルをプロジェクトに追加しておくと、クラスビューでWTLに関する情報が得られて便利です。
ソリューション エクスプローラで、Header Filesに、WTLフォルダを作成し、その中にWTLのincludeディレクトリにあるヘッダファイルを追加します。
グリッドの設定
メニュー
書式−>ガイドの設定
グリッドを設定できます。
プリコンパイルヘッダを使う
WTLやSDKのヘッダファイルのように、変更しないようなファイルは、stdafx.hに含めておくと、コンパイルが速くなり便利です。
ブラウザ情報を使う
デバッグのときには、ブラウザ情報があると参照している部分を調べやすくなります。
プロパティで、「全般」−>「ブラウザ情報のビルド」を「はい」にします。「C/C++」−>「ブラウザ情報を作成する」を作成にする。
使い方は、メニューの「編集」−>「検索と置換」−>「シンボルの検索」で、検索し、検索結果のリストをクリックすると、参照している場所を表示させることができます。
DWORD dwRegister;
HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
IMoniker * pMoniker;
IRunningObjectTable *pROT;
if (FAILED(GetRunningObjectTable(0, &pROT))) {
return E_FAIL;
}
WCHAR wsz[256];
wsprintfW(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if (SUCCEEDED(hr)) {
hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}
void RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
使うときは、フィルタグラフ作成後に、AddToRotを実行し、Releaseの前に、RemoveFromRotを実行するようにプログラムを記述します。
IGraphBuilder * g_pGraph = NULL;
CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &g_pGraph);
AddToRot(g_pGraph, &dwRegister);
...
RemoveFromRot(dwRegister);
g_pGraph->Release();