アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境は Windows/VS2005です。

//■ヘッダーでの構造体の定義です。
typedef struct Common_Data
{

int ErrorKind;
int ErrorPoint;
int ErrorVariation;

}COMMON_DATA, *P_____COMMONDATA, FAR *P_COMMONDATA;


//■関数呼び出す
COMMON_DATA CommonData;

//■ここで値を代入する。
CommonData.ErrorKind=100;
CommonData.ErrorPoint=123;
CommonData.ErrorVariation=456;

//■最後の引数でCommonDataを渡す
hWnd = CreateWindow(szClassNme,
"タイトルバーのないウィンドウ", //タイトルバーに表示されます
WS_POPUP, //ウィンドウの種類
250,//X座標
250,//Y座標
500,//幅
160,//高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
&CommonData);


//■そしてWindowを制御する以下の関数の中で
LRESULT CALLBACK WndProcCommonErrorWindow(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

P_COMMONDATA Common_Data;

switch (message) {
case WM_INITDIALOG:
Common_Data=(P_COMMONDATA)lParam;
#ifdef _WIN64
SetWindowLongPtr(hWnd,DWLP_USER,(LONG_PTR)Common_Data);
#else
SetWindowLong(hWnd,DWL_USER,(LONG)Common_Data);
#endif


wsprintf(FinalOutput,"%d-%d-%d",Common_Data->ErrorKind,Common_Data->ErrorPoint,Common_Data->ErrorVariation);
MessageBox(NULL,FinalOutput,"File Error",MB_OK);
break;


としても、値がゴミデータがはいってしまっているというか正しく表示できません。
本来ならば、100-123-456と表示されるのが目的です。

データの受け渡しのところで失敗しているのはなんとなくわかるのですが、どのようにすればlParamに受け渡して、それを取得できるのか分かりません。
どなたかご教授ご指導願いますm(____)m

*実際にWindowは出ます。

myProg.style =CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS;
myProg.lpfnWndProc =WndProcCommonErrorWindow;
myProg.cbClsExtra =0;
myProg.cbWndExtra =0;
myProg.hInstance =CommonClass.GetInstance();
myProg.hIcon =NULL;
myProg.hCursor =LoadCursor(NULL, IDC_ARROW);
myProg.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
myProg.lpszMenuName =NULL;
myProg.lpszClassName =szClassNme;
などの処理は間違いないはずです。

















}

A 回答 (2件)

 こんにちは。

御礼頂きました。

 32ビット迄のデータなら何でも良いです(win32の場合)。
 「WM_CREATEを通過した後、構造体のポインタが手元に無いから操作出来ない」と言う事でしょうか。
 でしたら、SetWindowLongPtr()でhWndに向かって構造体のポインタを入れたのですから、使用する時にはGetWindowLongPtr()でhWndからポインタを取り出せば良いのです。

 http://msdn.microsoft.com/ja-jp/library/cc364762 …

 //例えば、マウスが動いた時に、 
case WM_MOUSEMOVE:
{
//取り出す
P_COMMONDATA Common_Data = (P_COMMONDATA)GetWindowLongPtr(hWnd, GWLP_USERDATA);

//構造体ならば、メンバ変数を使用する等
wsprintf(FinalOutput,"%d-%d-%d",Common_Data->ErrorKind,Common_Data->ErrorPoint,Common_Data->ErrorVariation);

//クラスならば、メンバ関数を呼び出す等
Common_Data->CallMouseMove(/*パラメータ*/);

break;
}
    • good
    • 0
この回答へのお礼

こんばんは☆

丁寧に説明ありがとうございました!
 32ビット迄のデータなら何でも良いです(win32の場合)。
ということなんですね!
大変勉強になりました!!

ありがとうございます☆

お礼日時:2010/04/03 21:47

 こんにちは。



 WM_INITDIALOGはCreateDialog()等で作成した時のものです。
 CreateWindow()なので、WM_NCCREATE/WM_CREATEのどちらかなのでは。
 http://msdn.microsoft.com/en-us/library/ms632619 …

case WM_CREATE:
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
P_COMMONDATA Common_Data = (P_COMMONDATA)lpcs->lpCreateParams;

//何かをする
SetWindowLongPtr(hWnd, GWL_USERDATA, (LONG_PTR)Common_Data);

break;
}
    • good
    • 0
この回答へのお礼

こんにちは!!☆


的確なアドバイスありがとうございました!!
WM_INITDIALOGはCreateDialog()等で作成した時のものです。
 CreateWindow()なので、WM_NCCREATE/WM_CREATEのどちらかなのでは

という点は今まで意識することなくプログラミングを
行っていました^^;;

すごい本当に勉強になりましたm(____)m

無事に値をわたすことができました!!!

ちなみにもしもこの質問をまたみていたらでいいのですが、

CreateWindowの最後の引数には構造体ではなくて
「class」も(おそらくポインタ渡しになるとおもいます)
渡すことはできるのでしょうか?

一応ためしたみたところ、コンパイルは通るのですが、

そのあと、どうやって制御procで値を受け取ったり
使うのかが構造体と同様にいまいちわかっていないです。

お礼日時:2010/04/03 13:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!