環境は 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;
などの処理は間違いないはずです。
}
No.1ベストアンサー
- 回答日時:
こんにちは。
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;
}
こんにちは!!☆
的確なアドバイスありがとうございました!!
WM_INITDIALOGはCreateDialog()等で作成した時のものです。
CreateWindow()なので、WM_NCCREATE/WM_CREATEのどちらかなのでは
という点は今まで意識することなくプログラミングを
行っていました^^;;
すごい本当に勉強になりましたm(____)m
無事に値をわたすことができました!!!
ちなみにもしもこの質問をまたみていたらでいいのですが、
CreateWindowの最後の引数には構造体ではなくて
「class」も(おそらくポインタ渡しになるとおもいます)
渡すことはできるのでしょうか?
一応ためしたみたところ、コンパイルは通るのですが、
そのあと、どうやって制御procで値を受け取ったり
使うのかが構造体と同様にいまいちわかっていないです。
No.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;
}
こんばんは☆
丁寧に説明ありがとうございました!
32ビット迄のデータなら何でも良いです(win32の場合)。
ということなんですね!
大変勉強になりました!!
ありがとうございます☆
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- PHP データベースを用いたwebページ 1 2022/12/27 20:12
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- Excel(エクセル) 何方か知恵をください… 下記のシート1にシート2のDATAを表示させたいです。 (シート1の2行目の 6 2022/03/28 17:27
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の関数と配列に関する質問
-
セグメントエラー
-
fopne で失敗する原因
-
main(int argc,char **argv[])...
-
ポインタ同士の割り算
-
C/C++言語 の 浮動小数点定数/...
-
popenした子プロセスのプロセス...
-
VC++6.0 MFC ダイアログバーを...
-
参照型で受け取った引数をポイ...
-
voidポインタ
-
DLL<->VB間での受け渡し(文字...
-
c言語で任意のファイルから読み...
-
C言語での`void**`の意味
-
C言語で構造体の参照渡しができ...
-
init関数の意味
-
C言語、配列とポインタとアスタ...
-
C言語のポインタとスタックポイ...
-
ポインタのポインタを引数にも...
-
x64プログラムでアドレスが32bi...
-
C言語 ポインタ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
NULLとブランクの違い
-
エラーの意味
-
DLL<->VB間での受け渡し(文字...
-
ハンドル、アドレス、ポインタ...
-
【C言語】戻り値が構造体の関数
おすすめ情報