0

最近WinAPIの勉強を始めました。チュートリアルの上位 10 件の検索結果を調べた後でも、ウィンドウごとに複数のコントロールのコードをどこに追加するのか、まだ混乱しています。たとえば、2 つ目のボタンを追加したい場合、どのようなコードをどこに配置しますか?

I の場合、コールバックにandを#define IDC_BUTTON WM_USER + 1追加してから、次のように呼び出します。HINSTANCE hIns;HWND hButton;

case WM_CREATE:
    hIns=((LPCREATESTRUCT)lParam)->hInstance;
    hButton=CreateWindow("Button","Click Me",WS_CHILD|WS_VISIBLE,70,60,150,30,hwnd,(HMENU)IDC_BUTTON,hIns,0);
break;

それは機能し、ボタンがウィンドウに表示されます。しかし、2 番目のものを追加しようとすると、名前を変更しても何も表示されません。

#define IDC_BUTTON2 WM_USER + 2
+
HINSTANCE hIns;
HWND hButton2;

case WM_CREATE:
   hIns=((LPCREATESTRUCT)lParam)->hInstance;
   hButton=CreateWindow("Button","Click Me",WS_CHILD|WS_VISIBLE,70,60,150,30,hwnd,(HMENU)IDC_BUTTON,hIns,0);
   hButton2=CreateWindow("Second","Press here",WS_CHILD|WS_VISIBLE,170,160,250,130,hwnd,(HMENU)IDC_BUTTON2,hIns,0);
   break;

最初のボタンは正常に表示されますが、2 番目のボタンはそうではありません (座標も異なります)。ここで何が間違っていますか?ありがとう!

編集:コード内のhIns2をに置き換えました。hIns

4

2 に答える 2

3
 hButton2=CreateWindow("Second","Press here",WS_CHILD|WS_VISIBLE,...);

これを根本から解決しましょう。あなたが間違っている根本的なことは、エラーをチェックする必要性を完全に無視していることです。CreateWindow() は、失敗すると NULL を返します。GetLastError() は、問題を示すエラー コードを返します。同じエラー コードは、"@err" 疑似変数を使用してデバッガーにも表示されます。

WinError.h SDK ヘッダーに次のように記述されているエラー 1407 が発生したことがすぐにわかります。

//
// MessageId: ERROR_CANNOT_FIND_WND_CLASS
//
// MessageText:
//
// Cannot find window class.
//
#define ERROR_CANNOT_FIND_WND_CLASS      1407L

これにより、CreateWindow() 呼び出しでクラス名を変更したことが明確になります。

特にwinapiプログラミングを始めたばかりの場合は、エラーチェックをスキップしないでください。ユーザーのマシンで問題が発生したときに、プログラムが正常に失敗するのを許容するだけでなく、コードのバグを診断するのにも非常に役立ちます。

于 2013-01-17T15:39:30.063 に答える