-->

VisualC++メモランダム



2004/03/25

デフォルト引数と派生について

デフォルト引数が使えるのは、呼び出した時のクラスで宣言されている場合です。
例)
派生先のクラスで呼び出す
class CTestParent {
public:
	virtual void test(int i) = 0;
};

class CTestChild : public CTestParent {
public:
	virtual void test(int i = 0);
};

CTestChild objTest;
objTest.test();
	
×
class CTestParent {
public:
	virtual void test(int i = 0) = 0;
};

class CTestChild : public CTestParent {
public:
	virtual void test(int i);
};

CTestChild objTest;
objTest.test();
	
派生元クラスからポリモーフィックに呼び出す
class CTestParent {
public:
	virtual void test(int i= 0) = 0;
};

class CTestChild : public CTestParent {
public:
	virtual void test(int i);
};

CTestChild objTest;
CTestParent* pTest = &objTest;
pTest->test();
	
×
class CTestParent {
public:
	virtual void test(int i) = 0;
};

class CTestChild : public CTestParent {
public:
	virtual void test(int i= 0);
};

CTestChild objTest;
CTestParent* pTest = &objTest;
pTest->test();
	

2004/03/25

VC6で[ビルド][プロファイル]がディスエイブルになっている

レジストリに以下の値を登録すれば使えるようになります。
以下のレジストリ位置に
	HKEY_CURRENT_USER
	  |-Software
	    |-Microsoft
	      |-DevStudio
	        |-6.0
	          |-General
DWORD値で ProfilerInstalled キーを追加し、値を 1 とする。
詳しくはここを参照
Visual C++ のprofile機能(プロファイラ)を使ってみたい
http://www.cmpt.phys.tohoku.ac.jp/~genya/vcprof.html

2004/03/10

std::stringにnullを代入すると落ちる

以下のようなコードは実行時に落ちます。
	std::string strTest;
	strTest = (char*)0;
動作として strTest.clear() と同じだと思ってましたが違うようです。

2004/01/28

ウインドウを常に最前面に出しておく方法

以下のように指定する。
	CWnd* pMainWnd = AfxGetMainWnd();
	pMainWnd->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
元に戻す場合
	CWnd* pMainWnd = AfxGetMainWnd();
	pMainWnd->SetWindowPos(&wndTopNoMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

2003/12/18

std::vector<std::vector<int>>がコンパイルを通らない現象の対処方法

STLのコレクションにコレクションを入れようとするとコンパイルが通りません。
たとえばこんなんだと、
	std::vector<std::vector<int>> ivecvec;	// ぶぶー
	ivecvec.resize(10);
	ivecvec[0].resize(10);
	ivecvec[0][0] = 10;
最初の行でいきなりコンパイルエラーです。
で、対処方法は、中に入るコレクションに別名をつけることで解決できます。
こんな風に
	typedef std::vector<int> ivec;	// ここで別名をつける
	std::vector<ivec> ivecvec2;	// 別名で要素を指定
	ivecvec2.resize(10);
	ivecvec2[0].resize(10);
	ivecvec2[0][0] = 10;
(追加:2004/01/28)
別の方法が見つかりました。
以下の方法でも解決できます。
	std::vector<std::vector<int> > ivecvec;	// OK!
	ivecvec.resize(10);
	ivecvec[0].resize(10);
	ivecvec[0][0] = 10;
エラーになる原因は、">>"が演算子として認識されてしまうからのようです。
明示的にスペースで区切ってやれば正しく認識されます。

2003/10/17

クリップボードに文字列形式のデータが入っているかどうか確認する方法

IsClipboardFormatAvailable(CF_TEXT) を使う

2003/10/14

ウインドウの最小サイズ最大サイズを制限する方法

メッセージハンドラに ON_WM_GETMINMAXINFO() をとうろくし、OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI ) を実装する。
中の処理は以下のようにすればよい。
	// 最小ウインドウサイズを設定
	lpMMI->ptMinTrackSize.x = 500;
	lpMMI->ptMinTrackSize.y = 400;
	// 最大ウインドウサイズを設定
	lpMMI->ptMaxTrackSize.x = 1024;
	lpMMI->ptMaxTrackSize.y = 768;
	// 設定してから基底クラスのメソッドを呼び出す
	CDialog::OnGetMinMaxInfo(lpMMI);

2003/09/04

アプリケーション起動時に新規ドキュメントを開かない方法

CWinApp::InitInstance()内でProcessShellCommand()する前にcmdInfo.m_nShellCommandをCCommandLineInfo::FileNothingに入れ替えればよい

新規ドキュメント作成時のデフォルトのドキュメントタイトルを変える方法

OnNewDocument()でCDocument::OnNewDocument()後にSetTitle()で設定すればよい

2002/10/25

全角文字の判定方法

全角文字(2バイト文字)は、_ismbblead(), _ismbbtrail() で調べます。
ほかにもいろいろあり、_ismbb系ルーチンとしてMSDNにまとめられてあります。

2002/03/06

VC++で拡張されているSTL(functional)

VC++では独自にSTLが拡張され便利なテンプレートが増えています。その中でも関数をオブジェクトとして扱うのに便利なものが<functional>として用意されています。
特に mem_fun_ref は強力。メンバメソッドを関数オブジェクトとして使えるようにします。 詳細はもっと勉強してからまとめます。今のところ詳しくはMSDNを見て下さい。

2001/10/23

クラッシュダンプの利用方法

VC++で作ったプログラムがクラッシュしたときにクラッシュダンプを吐かせてデバッグできるようにする方法
以下の手順で準備する。
  1. レジストリにエントリを追加
    HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Debug に "値"もしくは"DWORD"で、 CrashDumpEnabled という名前を設定、値に1を記述する。
  2. Drwtsn32.exe (ドクターワトソン)を起動し、クラッシュダンプの出力先を指定する。
    クラッシュするEXEファイルがあるフォルダを指定すると便利
  3. 標準のデバッガをドクターワトソンに設定する
    クラッシュ時に「デバッグ」ボタンを押したときに起動するプログラムをドクターワトソンに設定する
    Drwtsn32 -i
    元に戻す場合は、VC++の[ツール(T)]→[オプション(O)]→[デバッグ]タブの中の[ジャストインタイムデバッグ(J)]にチェックをすれば標準のデバッガがVC++になる
デバッグをする手順は、
  1. プログラムを動かしクラッシュさせる
  2. VC++を起動し、[ファイル(F)]→[ワークスペースを開く(W)]で拡張子を[*.dmp]に指定してクラッシュダンプファイルを開く
  3. コールスタックや変数ウインドウも有効なのでデバッグを行う
    ただし、クラッシュした時点の状況を再現しただけなのでブレイクポイントを置いたりステップ実行したりはできない

ユーザ定義ワードの設定方法

デベロッパースタジオ上で自分の設定したワードに文字をつける方法
usertype.dat というテキストファイルを用意する
色を付けたいワードを1行に1つずつ記述する
Msdev.exe と同じフォルダに格納する(デフォルトなら C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin になる)

----/--/--

リンク集