2

私はC#から来ており、これは非常に新しいので、ご容赦ください。

MainWindowいくつかのプライベートHWND変数を持つクラスがあります。1つはウィンドウ自体用で、もう1つは各コントロール用です。私はそれらを追跡する必要があると思いますか、それとも後で物事が簡単になると思いますか?

とにかく、私は持っています:

class GUIMain
{
private:
    HINSTANCE hInstance;
    HWND hWnd; // The windows itself
    HWND cmdGenerate, cmdQuit; // 2 buttons

initialise(HWND hWnd)呼び出されるプライベートメソッドがWM_CREATEあり、すべてのコントロールがウィンドウに追加されます。

void MainWindow::initialise(HWND hWnd)
{
  this->hWnd = hWnd;

  cmdGenerate = CreateWindow(TEXT("BUTTON"), TEXT("&Generate..."),
                             WS_VISIBLE | WS_CHILD,
                             6, 6, 150, 25,        
                             hWnd, (HMENU)1, 0, 0);

  cmdQuit     = CreateWindow(TEXT("BUTTON"), TEXT("&Quit"),
                             WS_VISIBLE | WS_CHILD,
                             6, 37, 150, 25,        
                             hWnd, (HMENU)2, 0, 0);
}

ただし、これはウィンドウにボタンを配置していないようです。実際、デバッグすると、最初の行を超えていないことがわかります。奇妙なのは、これに変更すると、次のようになります。

void MainWindow::initialise(HWND hWnd)
{
  //this->hWnd = hWnd;

  /*cmdGenerate = */CreateWindow(TEXT("BUTTON"), TEXT("&Generate..."),
                                 WS_VISIBLE | WS_CHILD,
                                 6, 6, 150, 25,        
                                 hWnd, (HMENU)1, 0, 0);

  /*cmdQuit     = */CreateWindow(TEXT("BUTTON"), TEXT("&Quit"),
                                 WS_VISIBLE | WS_CHILD,
                                 6, 37, 150, 25,        
                                 hWnd, (HMENU)2, 0, 0);
}

うまくいくようです。

HWNDロジックは、プライベート変数にCreateWindow関数returnの値を割り当てることが問題を引き起こしていることを示唆しているように見えますが、私は以前にこれを行ったことがあり、問題はありませんでしたか?

以前のコードとこのコードの唯一の違いは、現在はクラスを使用しているのに対し、以前(学習中)はすべてをWinMainとに入れていたということWndProcです。

WinMain: http: //pastebin.com/j54vW9gc
ヘッダーファイル: http: //pastebin.com/cUs4vVJ6
CPPファイル:http://pastebin.com/B5KUXTvx

4

1 に答える 1

6

C++用に設計されていないwin32の世界へようこそ。それは良い最初の試みです。汎用フレームワークを作成しようとするクラスを何百回もやり直してから、もう時間の価値がないと言いました。

WinMain()も役立ちますが、私が目にする大きな問題は、への呼び出しCreateWindowEx()です。送信する最後のパラメーターは0です。後でそれを取得するときよりも、SetWindowLong(hWnd, GWL_USERDATA, (long) ((LPCREATESTRUCT)lParam)->lpCreateParams);クラスへのポインターであると言っています。あなたが持っているつもりでした:

         hWnd = CreateWindowEx(0, TEXT("AS2MainWindow"),
                                              TEXT("AS2"),
                                              WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
                                              CW_USEDEFAULT, CW_USEDEFAULT,
                                              824, 350,
                                              0, 0,
                                              hInstance, this);

他の問題を探しています。それが役立つかどうかを確認してください。多分あなたの投稿でない場合はあなたのmain()

追加: CreateWindowEx

HWND WINAPI CreateWindowEx(
  __in      DWORD dwExStyle,
  __in_opt  LPCTSTR lpClassName,
  __in_opt  LPCTSTR lpWindowName,
  __in      DWORD dwStyle,
  __in      int x,
  __in      int y,
  __in      int nWidth,
  __in      int nHeight,
  __in_opt  HWND hWndParent,
  __in_opt  HMENU hMenu,
  __in_opt  HINSTANCE hInstance,
  __in_opt  LPVOID lpParam
);

最後のパラメーターlpParamはオプションです。したがって、0に設定しても、何も害はありませんでした。WM_NCCREATEしかし、これはあなたがあなたのまたはに何かを「送る」方法ですWM_CREATE。任意のLPVOIDにすることができます。Cでは、構造体または必要なものへのポインターを送信できます。この場合、ウィンドウに関するオブジェクトへのポインタを送信します。

WM_NCCREATEまたはWM_CREATEでこのパラメーターを取得するには、以下のコードを使用します。

(long) ((LPCREATESTRUCT)lParam)->lpCreateParams);

つまり、にキャストlParamするというpointerことCREATESTRUCTです。それから得るlpCreateParamsより。それをにキャストしlongます。これは、私がこのわかりにくいコードを書いた方法とは少し異なります。あなたがそれをいくつかのステップに分割するならば、それはより簡単に見えます。ここでさらに説明が必要な場合はお知らせください。

以下の全体像を把握するために、CreateStructの定義を示します。lpCreateParamsだけではありません。(これは、クラスへのポインターとして選択しました)。

typedef struct tagCREATESTRUCT {
  LPVOID    lpCreateParams;
  HINSTANCE hInstance;
  HMENU     hMenu;
  HWND      hwndParent;
  int       cy;
  int       cx;
  int       y;
  int       x;
  LONG      style;
  LPCTSTR   lpszName;
  LPCTSTR   lpszClass;
  DWORD     dwExStyle;
} CREATESTRUCT, *LPCREATESTRUCT;

これをすべて理解した後。ATLサンキングをチェックしてください。すべてのコードをクラス内に配置したい場合は、この方法を使用してください。クラスに含まれている必要のないすべてのコードから離れる方がよいと思います。私が書いているプログラムによって異なります。

于 2011-11-07T04:57:51.550 に答える