WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート C++

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

VisualC++を使っていて何かのショートカットを押してしまったらしくタブが「→」にスペースが「・」になってしまった。
vcpp.jpg
見づらいです。直すには
編集>詳細>スペースの表示
です。ショートカットはCtrl+RとCtrl+Wを連続で押します。
二つの組み合わせを連続で押すショートカットなんてはじめて見ました。しかも、自分が間違えてそれを押したなんて・・・

    このエントリーをはてなブックマークに追加

JUnitやPHPUnitと同じような単体テストのフレームワークCppUnit。これが元祖なのかな?Javaかな?まあ、それはいいとして、無料のVisual C++ 2008 ExpressEdition(以下VC++ee)でビルドしてみました。この辺が参考になります。

まずダウンロードします。解凍し適当な場所に置いたらcppunit\src\CppUnitLibraries.dswをVC++eeで開きます。古いバージョン用のプロジェクトなので変換のダイアログが出ますので「すべてはい」を押して変換します。こんな感じのソリューションが読み込まれると思います。
solution.jpg

ビルドします。
ビルドメニューからバッチビルドを選択してcppunitのDebugとReleaseにチェックを入れビルドします。
build.jpg

ビルドが終了したら、ここでいったんこのソリューションを閉じます。そして新規にプロジェクトを作成します。とりあえず最小のテストをするということでWin32コンソールアプリケーション>空のプロジェクトを作成しましょう。

このプロジェクトがcppunitのヘッダーファイルと先ほどビルドしたライブラリを読めるようにしなければなりません。まずヘッダーファイルへのインクルードパスを通します。プロジェクト毎に追加もできますが良く使うと思われるので今回は全プロジェクトで読めるようにしてしまいましょう。
ツール>オプション
を開いてcppunit\includeをインクルードパスに追加します。
include.jpgこのままこのダイアログでライブラリフォルダも追加できます。右のプルダウンをライブラリファイルに切り替えてインクルードの時と同じような感じでcppunit\libを追加します。

後もうひとつ、リンカにライブラリを追加しないといけません。ソリューションウィンドウから先ほど作成したプロジェクトを右クリックしプロパティを出します。
リンカ>入力を選択し追加の依存ファイルにcppunitd.libを指定します。
link.jpg

これで準備は完了です。あとはテスト用のクラスとmain関数を作ってやれば動きます。
FirstTest.h


#include

class FirstTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( FirstTest );
CPPUNIT_TEST( testFirst );
CPPUNIT_TEST_SUITE_END();

public:
void setUp();
void tearDown();
void testFirst();
};

CPPUNIT_TEST_SUITE_REGISTRATION( MoneyTest );


void MoneyTest::setUp(){ }

void MoneyTest::tearDown(){ }

void MoneyTest::testFirst()
{
CPPUNIT_ASSERT_EQUAL( 100, 100 );
}
main.cpp

#include
#include
#include
#include

int main(int argc, char* argv[])
{
CppUnit::TextUi::TestRunner runner;
runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );
runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), std::cerr ) );
bool wasSucessful = runner.run();

return wasSucessful ? 0 : 1;
}
Win32APIのアプリの場合どうするのでしょうか?・・・近々アップします。





    このエントリーをはてなブックマークに追加

最近C++でウィンドウズアプリ開発に挑戦・・・というか、勉強しています。
どうせならネイティブアプリと思うし、やっぱりWindows根元の部分の理解が進むという意見もありWin32APIでやってます。

まず、Windowを作る部分ですが、これを使いまわせるようにクラス化をしようと思います。で、問題になったのがプロシージャの処理です。ウィンドウプロシージャは


typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
こんな定義になってます。で、Windowクラスメンバ関数のポインタは

LRESULT (Window::*windowProc)(HWND, UINT, WPARAM, LPARAM);
なので、当然ですがWNDCLASSEX.lpfnWndProcには代入できません。代入するにはstaticで宣言する必要があります。

ただ、staticにしてしまうと、staticなプロパティにしかアクセスできないし、全てのインスタンスで共用されてしまうので継承して使いまわすことができません。

そこでインスタンス自身のポインタをstaticなプロパティに保持してstaticなwindowProcの中から呼び出せないか試してみました。※これではまた、別々のインスタンスを保持できません。まさにstatic地獄

こちらのサイトを参考にSetWindowLong/GetWindowLongをつかって実現してみました。

class Window
{
protected:
virtual LRESULT proc(UINT uMsg, WPARAM wParam, LPARAM lParam){}
private:
HWND hWnd;
WNDCLASSEX wc;
static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
public:
Window(HINSTANCE hInstance, PTSTR appName);
bool createWindow(bool show=true);
}
実装はこんな感じです。

#include "Gomo/Window.h"

Window::Window(HINSTANCE hInstance, PTSTR appName)
{
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = windowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = appName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

selfInstance = this;
}

LRESULT CALLBACK Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Window* instance = (Window*)GetWindowLong( hWnd, GWL_USERDATA );

if(instance)
{
return instance->prop(uMsg, wParam, lParam);
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

bool Window::createWindow(bool show)
{
//CreateWindowの処理
SetWindowLong( hWnd, GWL_USERDATA, (LONG)this );
}
実際動かしてるものは、プロシージャでswitch文を使いたくなかったのでもうちょっと複雑になってます。話を簡単にするため細かいところははしょって書き換えてますので、コンパイル通らないかもしれません。

まだ、C++は良くわかってないので無茶をしてるかもしれませんが、一応動いてるようです。突込みがあったらコメントいただけると幸いです。

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。