Win32 MessageBoxについて(C++)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
陽のヒカリ

Win32 MessageBoxについて(C++)

#1

投稿記事 by 陽のヒカリ » 14年前

初めて掲示板利用します。
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++)

#2

投稿記事 by 陽のヒカリ » 14年前

本人です。
追記:
ポインタのところが自信がないので、間違っていたら教えてください(一応元の指しているaを変えないためにポインタにしたつもりです)

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#3

投稿記事 by h2so5 » 14年前

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

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

コード:

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

陽のヒカリ

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

#4

投稿記事 by 陽のヒカリ » 14年前

ありがとうございます。
>>逆ではないでしょうか。元の指している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);


}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 14年前

質問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);
 
 
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

陽のヒカリ

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

#6

投稿記事 by 陽のヒカリ » 14年前

陽のヒカリ さんが書きました:ありがとうございます。
>>逆ではないでしょうか。元の指している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);


}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 14年前

少し訂正。投稿したコードの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);
 }
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

陽のヒカリ

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

#8

投稿記事 by 陽のヒカリ » 14年前

>>softya(ソフト屋)さん
ありがとうございます、どちらも見ました。
おかげで解決しました。
ssstreamについて勉強したいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る