ページ 11

Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 20:38
by 陽のヒカリ
初めて掲示板利用します。
C++の質問掲示板が見当たらなかったのでこちらに書き込みました。
DirectX11 でゲームを開発しようとは思っているのですが、DirextX11 sample Browser のサンプルコードの中のオブジェクトのビット数を外に関数を作って調べられないかどうかでつまづいています。
つまり、1度作ったらコピペで応用できるようにしたいなと思っています。
MessageBoxを使って調べようとしてるのですが、うまく作動してくれません。
OS: windows 7;
コンパイラ(?):VC++2010 Express
文字コード: Unicode
できればdirectX11 sampleがUnicodeで書かれているので、文字コードを変えずに教えて頂けると嬉しいです。

コード:



#include <windows.h>
#include <string.h>
#include <iostream>
#include <tchar.h>

LPCWSTR tptchar(int* x)
{
	char * str = new char[*x / 10];
	TCHAR * tchar = new TCHAR[ *x /10];
	
	memset(tchar,'\0' , sizeof(tchar));
	 _itoa(*x, str, 10);
	 MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,str,strlen(str),tchar,(sizeof tchar)/2);
	
	 
	 return (LPCWSTR) *tchar;
	 
}

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		LPSTR lpCmdLine ,
		int nCmdShow ) 
{
	int a = 10;
	MessageBox(NULL,  tptchar(&a) , TEXT("world!"), MB_OK);


}

//メッセージボックスはでましたが、tptcharで求めたはずの"10"が表示されません。どうしてでしょうか?(質問1)
//tptchar()とWinMainの順番を逆にすると
//次のエラーが出ます。(デバックが正常終了します)
//MessageBox(NULL,tptchar(&a),...の行で'tptchar': 識別子が見つかりませんでした
//どうしてでしょうか?(質問2)
//

//#includeは同上
int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		LPSTR lpCmdLine ,
		int nCmdShow ) 
{
	void func();
}

void func()
{ 
	MessageBox(NULL,TEXT("hello") ,TEXT("world!"), MB_OK);
}

//コンパイルは通るのですが、メッセージボックスが表示されません。
//もしかして、メッセージボックスはWinMain関数上に書かなければならないのでしょうか?(質問3)
//DirectX11 sample browser sample 05 のwWinMain関数の後のHRESULT InitDevice()の{}の中にMwssageboxを
//書いたところ正常に動いたのですが…

//その他アドバイスがあればよろしくお願いします。
//


Re: Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 20:40
by 陽のヒカリ
本人です。
追記:
ポインタのところが自信がないので、間違っていたら教えてください(一応元の指しているaを変えないためにポインタにしたつもりです)

Re: Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 21:11
by h2so5
陽のヒカリ さんが書きました: ポインタのところが自信がないので、間違っていたら教えてください(一応元の指しているaを変えないためにポインタにしたつもりです)
逆ではないでしょうか。元の指しているaを変えたい時にポインタで渡すのが普通だと思いますが。

また、この行はいったい何のための処理なんでしょうか?

コード:

    char * str = new char[*x / 10];
    TCHAR * tchar = new TCHAR[ *x /10];

Re: Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 21:30
by 陽のヒカリ
ありがとうございます。
>>逆ではないでしょうか。元の指しているaを変えたい時にポインタで渡すのが普通だと思いますが。
そうなんですか、勘違いして覚えてしまってました。
参照に直しておきます。
>>また、この行はいったい何のための処理なんでしょうか?
配列を動的に確保しようと思ったのですが…
文字の(?)配列のときは普通にchar star[10]; TCHAR[10]のようにしたほうがいいでしょうか?
実はどちらも試してみたのですが、うまくいかなくて…

コード:

//指摘されたところを直してみました。
#include <windows.h>
#include <string.h>
#include <iostream>
#include <tchar.h>

LPCWSTR tptchar(int* x)
{
	char str[10];
	TCHAR tchar[10];
	
	memset(tchar,'\0' , sizeof(tchar));
	 _itoa(*x, str, 10);
	 MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,str,strlen(str),tchar,(sizeof tchar)/2);
	
	 
	 return (LPCWSTR) *tchar;
	 
}

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		LPSTR lpCmdLine ,
		int nCmdShow ) 
{
	int a = 10;
	MessageBox(NULL,  tptchar(&a) , TEXT("world!"), MB_OK);


}

Re: Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 21:34
by softya(ソフト屋)
質問3に関しては、WinMainのvoid func();は関数のプロトタイプで関数の呼び出しではありません。

それと、ややこしいことをしてますが<sstream>を使ったほうがキレイに書けるのでおすすめします。
「C++編(標準ライブラリ) 第32章 文字列ストリーム」
http://www.geocities.jp/ky_webid/cpp/library/032.html

C言語的に書く必要はないと思います(勉強のためなら別ですが)

コード:

#include <windows.h>
#include <string.h>
#include <iostream>
#include <sstream>
#include <tchar.h>
 
int WINAPI WinMain(
        HINSTANCE hInstance ,
        HINSTANCE hPrevInstance ,
        LPSTR lpCmdLine ,
        int nCmdShow ) 
{
	std::wostringstream outs;

    int a = 10;
	outs << a ;
	std::wstring msg = outs.str();
	MessageBox(NULL, msg.c_str() , TEXT("world!"), MB_OK);
 
 
}

Re: Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 21:35
by 陽のヒカリ
陽のヒカリ さんが書きました:ありがとうございます。
>>逆ではないでしょうか。元の指しているaを変えたい時にポインタで渡すのが普通だと思いますが。
そうなんですか、勘違いして覚えてしまってました。
参照に直しておきます。
>>また、この行はいったい何のための処理なんでしょうか?
配列を動的に確保しようと思ったのですが…
文字の(?)配列のときは普通にchar star[10]; TCHAR[10]のようにしたほうがいいでしょうか?
実はどちらも試してみたのですが、うまくいかなくて…

コード:

//指摘されたところを直してみました。
#include <windows.h>
#include <string.h>
#include <iostream>
#include <tchar.h>

LPCWSTR tptchar(int* x)
{
	char str[10];
	TCHAR tchar[10];
	
	memset(tchar,'\0' , sizeof(tchar));
	 _itoa(*x, str, 10);
	 MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,str,strlen(str),tchar,(sizeof tchar)/2);
	
	 
	 return (LPCWSTR) *tchar;
	 
}

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		LPSTR lpCmdLine ,
		int nCmdShow ) 
{
	int a = 10;
	MessageBox(NULL,  tptchar(&a) , TEXT("world!"), MB_OK);


}
直し忘れがあったのでもう一度。

コード:


#include <windows.h>
#include <string.h>
#include <iostream>
#include <tchar.h>

LPCWSTR tptchar(int& x)
{
	char str[10];
	TCHAR tchar[10];
	
	memset(tchar,'\0' , sizeof(tchar));
	 _itoa(x, str, 10);
	 MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,str,strlen(str),tchar,(sizeof tchar)/2);
	
	 
	 return (LPCWSTR) *tchar;
	 
}

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		LPSTR lpCmdLine ,
		int nCmdShow ) 
{
	int a = 10;
	MessageBox(NULL,  tptchar(a) , TEXT("world!"), MB_OK);


}

Re: Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 21:43
by softya(ソフト屋)
少し訂正。投稿したコードのTCHAR非依存を徹底しました。 ※元はNo.5です。

コード:

#include <windows.h>
#include <string.h>
#include <iostream>
#include <sstream>
 
int WINAPI WinMain(
        HINSTANCE hInstance ,
        HINSTANCE hPrevInstance ,
        LPSTR lpCmdLine ,
        int nCmdShow ) 
{
    std::wostringstream outs;
 
    int a = 10;
    outs << a ;
    std::wstring msg = outs.str();
    MessageBoxW(NULL, msg.c_str() , L"world!", MB_OK);
 }

Re: Win32 MessageBoxについて(C++)

Posted: 2012年5月14日(月) 21:57
by 陽のヒカリ
>>softya(ソフト屋)さん
ありがとうございます、どちらも見ました。
おかげで解決しました。
ssstreamについて勉強したいと思います。